Как создать файл .wav с настраиваемой частотой тона / волны?

У меня проблема с генератором волн. Я пытаюсь создать файл .wav со звуком заданной частоты. Код, который я использую:

$freqOfTone = 21000;
$sampleRate = 44100;
$samplesCount = 80000;

$amplitude = 0.25 * 32768;
$w = 2 * pi() * $freqOfTone / $sampleRate;

for ($n = 0; $n < $samplesCount; $n++)
{
    $data->samples[1][] = 32768 + (int)($amplitude *  sin($n * $w));
}

К сожалению, выходная волна неправильная, я получаю несколько частот вместо одной: http://i49.tinypic.com/ab1nx0.png

Это должно выглядеть так: http://i50.tinypic.com/33zbslk.png

Где я что-то не так делаю? :(


person Sirtarius    schedule 06.10.2012    source источник
comment
Ваш код выглядит неплохо. Считали ли вы, что проблема может заключаться в записи данных или их формате? Знаковые и беззнаковые, битовая глубина и т. Д.   -  person Brad    schedule 06.10.2012
comment
Может ли это быть проблемой наложения спектров из-за того, что samplesCount не кратен периоду волны - попробуйте отрегулировать этот параметр.   -  person moonwave99    schedule 06.10.2012
comment
@ moonwave99 Я изменил $ samplesCount на 88200. Это не решает проблему. Выходной файл выглядит так же ... Думаю, количество отсчетов не должно влиять на частоту волны.   -  person Sirtarius    schedule 06.10.2012
comment
@Sirtarius, А можно где-нибудь пример файла WAV выложить?   -  person Brad    schedule 06.10.2012
comment
Дело в том, что если вы не генерируете полнопериодный [от 0 до 2pi] сэмпл своей волны, вы фактически обрабатываете его прямоугольным окном и запускаете спектральная утечка, которую вы получаете, исходя из своих фотографий.   -  person moonwave99    schedule 06.10.2012
comment
@moonwave: 88200 сэмплов - это два полных периода.   -  person Ignacio Vazquez-Abrams    schedule 06.10.2012
comment
@Brad Да, конечно: sentpace.com/file/rkxb0z   -  person Sirtarius    schedule 06.10.2012
comment
@ IgnacioVazquez-Abrams Я знаю, но вопрос предоставляет 80k в качестве значения - я просто объяснял, как управление окнами влияет на спектр; не то чтобы я утверждаю, что это ответ на проблему, просто попытался дать подсказку в качестве комментария;)   -  person moonwave99    schedule 06.10.2012


Ответы (2)


При такой частоте дискретизации желаемая частота слишком близка к частоте Найквиста для правильной выборки. Я рекомендую вам использовать для этого частоту дискретизации 96 кГц.

person Ignacio Vazquez-Abrams    schedule 06.10.2012
comment
Хм ... Я бы хотел остаться со своими 44,1кГц. Есть ли способ рассчитать ближайшую доступную частоту тона? - person Sirtarius; 06.10.2012
comment
Чтобы получить какое-либо правильное разрешение, у вас должно быть как минимум 4 отсчета за период, что соответствует частоте 11,025 кГц. Это может показаться низким, но имейте в виду, что полоса пропускания 44,1 кГц была выбрана для записи музыки, а не для экспериментов с высокими частотами. - person Ignacio Vazquez-Abrams; 06.10.2012

В конце концов, я кое-чего добился, но мое решение немного отличается от того, что я имел в виду ... В любом случае, я взял образцы и пропустил их через высокочастотный фильтр. Сигнал немного искажен, но все же достаточно хорош для моей цели :)

person Sirtarius    schedule 21.10.2012