Построение аудио спектра

Я пытаюсь реализовать приложение, которое отображает спектр аудио с использованием басового аудио ( http://www.un4seen.com/). Я понимаю, что мне придется:

  1. Получить данные FFT из потока float[] buffer = new float[256]; Bass.BASS_ChannelGetData(дескриптор, буфер, (int)(BASS_DATA_FFT_COMPLEX|BASS_DATA_FFT_NOWINDOW));

  2. Для каждого БПФ вычислите его величину

  3. Примените оконную функцию к БПФ (Ханнинг или Хэмминг подойдут)

  4. затем нарисуйте красивый анализ спектра

Проблема, однако, заключается в том, что:

  • Похоже, что BASS_DATA_FFT_COMPLEX BassData недоступен. Я могу видеть, что он должен быть доступен в документации http://www.bass.radio42.com/help/html/a13cfef0-1056-bb94-81c4-a4fdf21bd463.htm но я не могу использовать его, так как я получаю сообщение об ошибке BassData не включает такое перечисление
  • Кроме того, мне интересно, правильно ли то, что я делаю. Чтобы построить спектр, я должен просто нанести на график величину БПФ или сравнить ее с частотой этого БПФ? В этом случае, как бы я получить частоту, соответствующую этому FFT? Я не возражаю против любого кода, снятого с любого языка (C/C++, C#, VB, Java и т. Д.)

Примечание: я не уверен, помогает ли это, но это то, что я использую: построение графиков с помощью элемента управления Microsoft Chart. C# с BASS.NET API от http://www.bass.radio42.com/ Любая помощь и предложения высоко ценится

1 ответ

Решение

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

1. acquire time domain data
2. apply window function
3. calculate FFT
4. calculate log magnitude of FFT (log(re*re+im*im))
5. plot log magnitude (with appropriate scaling) against frequency

Обратите внимание, что использование логарифма для оси Y дает dB шкала, которая является более естественным и полезным способом просмотра амплитуды звука, чем шкала линейной величины.

Обычно для визуализации звука и т. Д. Вы применяете шаги 1 - 5 выше для последовательных блоков данных временной области, как правило, с перекрытием 50%.

Другие вопросы по тегам