FFT-анализ с помощью JavaScript: как найти конкретную частоту?

У меня следующая проблема: я анализирую аудиоданные с помощью javascript и FFT. Я уже могу записать данные БПФ в массив:

audioCtx = new AudioContext();
analyser = audioCtx.createAnalyser();
source = audioCtx.createMediaElementSource(audio);
source.connect(analyser);
analyser.connect(audioCtx.destination);
analyser.fftSize = 64;

var frequencyData = new Uint8Array(analyser.frequencyBinCount);

Каждый раз, когда я хочу получить новые данные, я звоню:

analyser.getByteFrequencyData(frequencyData);

Переменная «аудио» — это mp3-файл, определенный в HTML:

<audio id="audio" src="test.mp3"></audio>

Все идет нормально.

Теперь моя проблема в том, что я хочу проверить, включает ли текущий массив «frequencyData» определенную частоту. Например: я размещаю сигнал 1000 Гц где-то в mp3-файле и хочу получить уведомление, если эта часть mp3-файла в данный момент находится в массиве «frequencyData».

На первом этапе это помогло бы мне решить проблему, когда важная часть mp3-файла содержит только сигнал 1000 Гц. На втором этапе я также хотел бы найти часть, если есть наложение с музыкой.


person Chrisi    schedule 25.09.2015    source источник


Ответы (1)


frequencyData — это массив амплитуд, и каждый элемент массива в основном представляет собой диапазон частот. Размер каждого диапазона определяется частотой дискретизации, деленной на количество точек БПФ, 64 в вашем случае. Итак, если ваша частота дискретизации была 48000, а размер БПФ — 64, то каждый элемент покрывает диапазон 48000/64 = 750 Гц. Это означает, что frequencyData[0] — это частоты 0–750 Гц, frequencyData[1] — 750–1500 Гц и так далее. В этом примере присутствие тона 1 кГц будет рассматриваться как пик в первом бине. Также при таком маленьком БПФ вы, наверное, заметили, что разрешение очень грубое. Если вы хотите увеличить разрешение по частоте, вам нужно будет выполнить большее БПФ.

person jaket    schedule 26.09.2015
comment
Я думаю, что это верно лишь отчасти! Я понял, что если размер БПФ равен 64, вы получите 32 бина. Таким образом, массив составляет половину размера. И из этой половины размера актуальна только первая половина, потому что мы не слышим частоты выше 20000 Гц. Единственное, чего мне все еще не хватает, так это того, какие данные содержит массив. Я знаю, что он содержит числа от 0 до 255. Но определяют ли эти числа громкость? - person Chrisi; 27.09.2015
comment
Громкость по сравнению с другим числом в массиве, а не абсолютная громкость, конечно! - person Chrisi; 27.09.2015
comment
Если данные о частоте, возвращаемые вашей библиотекой, составляют только половину указанного вами размера БПФ, тогда данные о частоте, которые вернула ваша библиотека БПФ, представляют собой данные о частоте между 0 Гц и Fs/2, где Fs — частота дискретизации. функция реальна (как в случае со звуком), тогда полный частотный спектр может быть реконструирован из частотных данных в диапазоне от 0 Гц до Fs/2, поэтому дополнительные выборки не нужны. Обратите внимание, что расстояние между частотными элементами по-прежнему будет Fs/(FFT Size), как заявил Джакет. - person KillaKem; 27.09.2015
comment
Числа, которые вы получаете из метода БПФ, представляют собой амплитуду определенных частот в звуке, а не громкость. Строго говоря, громкость — это воспринимаемая величина, и разные частоты воспринимаются ухом по-разному, поэтому вы отклоняетесь от стандартной шкалы частот. к шкале восприятия, такой как шкала MEL, прежде чем вы сможете правильно проанализировать громкость компонентов. Однако на практике вы можете просто предположить, что амплитуда представляет громкость различных частот, и просто использовать ее для многих приложений, таких как визуализация звука. - person KillaKem; 27.09.2015