Как я могу играть один тон или пользовательскую волну с Delphi? - PullRequest
8 голосов
/ 11 декабря 2011

Я посмотрел какой-то код, похоже, что все создает волны математической функции, но я хочу один тон или собственную волну, созданную с помощью отдельных одиночных тонов.

Я прочитал это Как я могу генерировать непрерывные тоны различных частот?

Что близко к моему ответу. Предполагается, что я буду использовать waveOutWrite, как в приведенной выше ссылке, я не могу понять, как рассчитывается amp / freq для каждого сэмпла в HWAVEOUT.

В коде по ссылке это сделано так: Samples[i] := round(vol*sin(omega*t));

Если я хочу использовать частоту 15 кГц с одним усилителем (неважно, какой), как рассчитать сэмпл [1]?

1 Ответ

9 голосов
/ 11 декабря 2011

Непрерывная (во времени) синусоида может быть определена как A*sin(2*PI*f*t), где A - некоторая амплитуда, PI - это, ну, 3.14 ..., f - частота тона в герцах и t - это время в секундах.

Теперь, поскольку у вас нет непрерывного времени, поскольку ваше время дискретно, вы заменяете dt*i вместо t и получаете A*sin(2*PI*f*dt*i), где dt - время между выборками или 1/sample rate и i - номер выборки.Вы можете записать это как A*sin(2*PI*(f/Fs)*i).Помните, что после выбора определенной частоты дискретизации Fs (в сэмплах / секунду или просто в Гц) самый высокий тон никогда не может превышать Fs/2 Гц.

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