|
3 / 3 / 0
Регистрация: 02.03.2015
Сообщений: 21
|
|
Генератор звукового сигнала11.08.2016, 12:38. Показов 12187. Ответов 73
Метки нет (Все метки)
Здравствуйте, кто может помочь написать простенький генератор сигнала, синус. Важна любая помощь. По интернетам смотрел информации мало. Если у кого-то есть желание, может в личку написать, может договоримся.
1
|
|
| 11.08.2016, 12:38 | |
|
Ответы с готовыми решениями:
73
ВЧ фильтрация звукового сигнала Фильтрация звукового сигнала Отсчёты звукового сигнала |
|
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
|
|
| 23.11.2016, 15:54 | |
|
Помогите пожалуйста,как её правильно рассчитать и согласовать. Если Вас не затруднит,дайте пожалуйста пример кода,который делает это. Что касается setVolume,я имею в виду другое. Как сделать так,чтобы звук был слышен не в левом канале или в правом,а где-то посередине.
0
|
|
|
Модератор
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,450
|
|
| 23.11.2016, 16:22 | |
|
1
|
|
|
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
|
|
| 23.11.2016, 16:47 | |
|
Я Вас не совсем понял. Просто если я поставлю одинаковую громкость на 2 канала,то звук и будет звучать в 2-х каналах,а мне нужно чтобы он звучал,к примеру,посередине. Ещё подскажите пожалуйста,если Вы знайте,формулу для расчёта амплитуды,просто хочется избавиться от щелчков во время воспроизведения звука.
0
|
|
|
Модератор
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,450
|
|
| 23.11.2016, 16:56 | |
|
КАВ
про согласование фаз. пусть есть сигнал y = a sin ( 2 pi (f t + p) ), a - амплитуда pi - число пи f - частота [Гц] f = 1 / T, T - период [с] t - время [с] p - фаза [доли периода] пусть мы генерируем этот сигнал в течение времени D на этом времени укладывается n = D / T периодов. так же останется хвост. его можно получить выделив дробную часть n. это хвост будет в долях периода. по этой величине мы сможем понять -были ли мы на подъеме в области положительных амплитуд (T < 0.25) -были ли мы на спуске в области положительных амплитуд (0.25 < T < 0.5) -были ли мы на спуске в области отрицательных амплитуд (0.5 < T < 0.75) -были ли мы на подъеме в области отрицательных амплитуд (0.75 < T) амплитуду в конце мы знаем. область мы знаем. из уравнения сигнала можно получить фазу которая правильно пристыкует новый сигнал к тому который отзвучал Добавлено через 1 минуту КАВ, если громкость одинаковая в обоих каналах человек воспринимает это так как будто источник звука находится между левым и правым динамиком
1
|
|
|
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
|
|
| 23.11.2016, 23:05 | |
|
Я Вас не совсем понял. Согласно Вашему уравнению y = a*sin ( 2*pi*(f*t + p) f умножается на t,а потом к этому прибавляется p. f по Вашей формуле равно 1/T. Но я не понял,как рассчитать T. Также мне не понятно,чем отличается время D от времени t? Ещё не понятно,какое значение можно подставить в качестве a. Вроде все подставляют 32767,но я не уверен,правильно ли это. Как потом Ваше уравнение применить,учитывая,что у нас есть frequency и samplerate,где frequency - Частота звукового сигнала в герцах,а sampleRate частота дискретизации. Помогите пожалуйста вывести общую формулу для генерации звука в каждом бите,чтобы звуковые сигналы правильно стыковались. Заранее огромное спасибо за помощь.
Добавлено через 4 часа 20 минут Ещё хочу спросить,что значит начальная фаза. Просто в начале Вы писали,что её нужно задавать,а в последнем сообщении Вы писали,что её нужно вычислять. Если её нужно задавать в формуле,то какую фазу лучше задать? Предыдущие вопросы остаются актуальны.
0
|
|
|
Модератор
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,450
|
|
| 24.11.2016, 09:57 | |
|
КАВ, фазу нужно вычислить по текущему сигналу что бы задать ее следующему сигналу. Период не нужно знать - я просто написал соотношение между частотой и периодом. Период - это время за которое происходит возврат амплитуды в исходное состояние, посмотрите литературу по математике раздел где рисуют графики синуса и подобного. Продолжительность - это то сколько звучит сигнал. А время - это аргумент функции. Если подставить вместо t D получим амплитуду в конце сигнала.
Добавлено через 3 часа 6 минут КАВ, амплитуду (a) вы можете задать какую вам хочется. задавая 32767 вы просто будете получать 16 битный сигнал с максимальной громкостью (которую потом дополнительно можно будет менять задавая громкость на самом устройстве). что касается дискретизации 48 кГц то тут дело обстоит так: уравнение дает зависимость амплитуды от времени. каждую секунду вы должны разбить на 48 000 отсчетов и посчитать в полученных точках (t) амплитуду Добавлено через 1 минуту КАВ, я могу написать за вас код, но тогда я украду у вас радость познания и творения)
1
|
|
|
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
|
|
| 24.11.2016, 10:29 | |
|
То есть в качестве f можно подставить частоту делённую на частоту дискретизации и в качестве фазы следующего сигнала подставлять фазу предыдущего сигнала,правильно ли я Вас понял? Извините пожалуйста за очень глупый вопрос,но как вывести фазу из того уравнения,которое Вы давали раньше?
0
|
|
|
Модератор
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,450
|
|
| 24.11.2016, 10:42 | |
|
КАВ
имеем y = a sin ( 2 pi (f t + p) ) для того что бы получить блок данных который будет восприниматься устройством как звук с частотой дискретизации 48 кГц продолжительностью D мы считаем y для t равного 0 dt dt * 2 dt * 3 ... D где dt = 1 / 48000 - float естественно в самом конце мы будем иметь y = a sin ( 2 pi (f D + p) ) - мы подставили вместо t значение D именно с такой начальной амплитуды должен стартовать следующий звук. кроме амплитуды нам нужно знать характер ее изменения что бы не попасть на ситуацию когда она снижалась, а мы будем генерировать звук начинающийся с нужной амплитуды, но при этом она будет возрастать, что может восприниматься человеческим ухом как разновидность артефакта. выразим фазу из уравнения очевидно будет что то вроде p = arcsin (y / a) / (2 pi) у этой фазы может быть двойник соответствующий такой же амплитуде но другой области. по идее эта фаза будет расположена симметрично "горбу" волны
1
|
|
|
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
|
||||||
| 24.11.2016, 12:26 | ||||||
|
Подскажите пожалуйста,как считать фазу для первого сигнала. Пока что я прибавил к нему 0.1 в качестве фазы,но теперь звука вообще не слышно. Ниже будет мой код,который заполняет массив с данными,согласно Вашим рассуждениям.
0
|
||||||
|
Модератор
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,450
|
|
| 24.11.2016, 12:35 | |
|
КАВ, для самого первого фаза может быть какой угодно например ноль. фаза нужна лишь для последующих сигналов. кстати, что бы было быстрее и понятнее - предлагаю вам генерировать звуки с продолжительностью исключительно кратной периоду. тогда они все будут стыковаться по нулевой возрастающей амплитуде и не нужно будет ничего считать. ну а с добавкой +/- периода к времени звучания я думаю кошмара не будет
1
|
|
|
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
|
|
| 24.11.2016, 13:05 | |
|
Просто хотелось бы понять,почему так,как я написал в коде выше не работает и генерировать звуки не только кратные периоду,но и любой другой длинны
0
|
|
|
Модератор
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,450
|
|
| 24.11.2016, 13:28 | |
|
КАВ, имхо не цепляйтесь за точную длину - что для вас такого случиться если в самом худшем случае вы получите звук на 60 мс дольше или короче? я вам больше скажу - никто не узнает об этом - ведь это длина блока данных. вы можете выбрать ее любой. вы можете даже плавно менять частоту при генерации блока данных. зато реализация при "удобной" длине этого чисто технического "отреза" звука будет в разы проще
1
|
|
|
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
|
|
| 24.11.2016, 14:55 | |
|
vxg,
Добавлено через 46 минут Я исправил формулу для генерации звука,и теперь она выглядит так: sample[i] = (short) (32767*Math.sin(2* Math.PI*(frequency*i*1/48000))*0x7FFF); Но когда я подставляю туда амплитуду 32767,звук очень сильно искажается. Также я не совсем понял,как считать фазу для следующего сигнала,ведь Вы писали,что фаза следующего сигнала вычисляется по предыдущему сигналу,но ведь фаза предыдущего сигнала равна 0,значит фаза следующего сигнала тоже будет равна 0.,так как она по Вашим рассуждениям равна фазе предыдущего сигнала. Правильно ли я Вас понял,что фаза должна меняться в каждом бите.
0
|
|
|
Модератор
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,450
|
|
| 24.11.2016, 15:09 | |
|
КАВ, зачем вы дважды умножаете на амплитуду? 32767 = 0x7FFF. сейчас нарисую для тех кто думает глазом
1
|
|
|
Модератор
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,450
|
|
| 24.11.2016, 16:09 | |
|
КАВ, см рисунок
на нем два сигнала: -первый сигнал (синий) с частотой 1 Гц имеет период 1 с (по оси икс отложено время по оси игрек уровень сигнала) -второй сигнал (красный) с частотой 2 Гц имеет период 2 с стыкуем их: -на первом мы стыкуем сигналы как попало - в результате в точке переключения имеем щелчок связанный с тем что уровень сигнала меняется скачком -на втором рисунке мы стыкуем при помощи первой вычисленной фазы - видно что вычисленных фаз две - они расположены симметрично экстремума - обе фазы подходят нам по уровню сигнала однако видно что первая фаза меняется не в том направлении -на третьем рисунке мы стыкуем при помощи второй вычисленной фазы - она правильно продолжает форму кривой -на четвертом рисунке мы стыкуем при помощи подбора длительности - незначительно сократив длительность первого сигнала мы сделали ее кратной периоду - благодаря этому в точке стыковки мы сразу имеем одинаковый уровень сигнала (ноль) и верное направление изменения сигнала
1
|
|
|
Модератор
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,450
|
|
| 24.11.2016, 16:17 | |
|
...естественно второй сигнал думает что отсчет времени для него пошел с нуля, а не с 2,4 с
1
|
|
|
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
|
||||||||||||
| 25.11.2016, 10:00 | ||||||||||||
|
Огромное Вам спасибо за пояснение. Просто когда мне нужно было сгенерировать звуковой сигнал,я искал в нете генераторы звука,но не понимал формулы,которые используются в коде и как это работает. Теперь благодаря Вам я начал понимать,как это работает. Помогите всё-таки пожалуйста с кодом. Просто раз я уже начал разбираться с этим,хочется разобраться,как это работает. Я по Вашим рассуждениям доработал код,но треск так и остался. Его неслышно только первые несколько звуков. Переменную с фазой я объявил в классе. Заранее благодарю Вас за помощь и за понимание ситуации.
Добавлено через 14 часов 14 минут Кстати какую задержки Вы бы посоветовали поставить,близкую к 200 мс,чтобы не было щелчков? Просто может проблема совсем не в том,что Вы говорили. Если ближайшая задержка,которая подходит для генерации звука больше 1000,То напишите пожалуйста код,который правильно генерирует звуки. Заранее благодарю Вас за помощь.
0
|
||||||||||||
|
Модератор
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,450
|
|
| 25.11.2016, 10:35 | |
|
1
|
|
|
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
|
|
| 25.11.2016, 10:38 | |
|
Задержка звука
0
|
|
|
Модератор
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,450
|
|
| 25.11.2016, 10:47 | |
|
1
|
|
| 25.11.2016, 10:47 | |
|
Помогаю со студенческими работами здесь
40
Воспроизведение звукового сигнала
Визуализация спектра звукового сигнала Спектр цифрового звукового сигнала Считывание частоты звукового сигнала Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|
|
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога
Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
|
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога
Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|