Простой колебательный генератор в C - PullRequest
1 голос
/ 21 ноября 2010

Я должен запрограммировать цифровой синтезатор для школьного выпускного проекта, и хотя я знаю большую часть теории, касающейся синтезаторов в целом, я должен признаться, что я новичок в программировании.Я должен сделать это на C, как указано в названии.Самый простой способ сделать это, кажется, с помощью волновых генераторов, так что я могу использовать линейную волну в качестве основы для огибающей ADSR.Тем не менее, я понятия не имею, как убедиться, что он находится в правильном поле.Можно легко изменить относительную высоту осциллятора, изменив счетчик приращений, но как определить абсолютную высоту осциллятора?

J.Midtgaard

1 Ответ

4 голосов
/ 21 ноября 2010

Вам нужно знать частоту дискретизации аудио потока, который вы производите.Если ваша частота дискретизации равна fs , и вы пытаетесь воспроизводить тон с частотой f , то вам необходимо производить полный цикл (период) каждые fs. / f образцов.Кроме того, во время каждого аудиосэмпла вы должны продвигаться на f / fs одного цикла.Таким образом, если ваш волновой стол содержит n записей, представляющих полный цикл, то вам нужно продвинуться на n * f / fs записей нааудиосэмпл.

Например, для фс = 44,1 кГц, f = 1 кГц, n = 1024, ваш прирост должен быть 1024 *1000/44100 = 23,22 записи на выборку.

Обратите внимание, что обычно вы получаете нецелое значение приращения.Чтобы получить правильную высоту звука, вы не должны округлять это значение при увеличении.Вместо этого вы должны округлять только при преобразовании значения вашего аккумулятора в значение индекса таблицы.(Более сложный подход - это своего рода интерполяция между записями.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...