Как сгенерировать звуковой спектр с помощью fft в C ++?

Я хочу создать звуковой спектр (как показано в этом видео) аудио в формате mp3 файл. В основном эта проблема требует расчета fft звукового сигнала. Как мне запрограммировать это на C / C ++?

Я просмотрел пару библиотек с открытым исходным кодом, таких как FFTW, и я действительно не знаю, как используйте их для моей проблемы. Любая помощь будет принята с благодарностью. Заранее спасибо!


person MRashid    schedule 13.01.2011    source источник
comment
Вы уже знаете C или C ++? Если нет, то, вероятно, лучше начать с чего-нибудь попроще ...   -  person Oliver Charlesworth    schedule 13.01.2011
comment
Ознакомьтесь с stackoverflow.com/questions/604453/   -  person Mark Ransom    schedule 13.01.2011
comment
Вы что-нибудь знаете о DSP? FFTW - фантастический инструмент, но, если вы ничего не знаете о преобразованиях Фурье / управлении окнами / разрешениях и т. Д. будет очень сложно что-либо производить.   -  person cmannett85    schedule 13.01.2011
comment
БПФ - это простая часть (и определенно не последнее слово) оценки плотности спектра мощности. Есть много других соображений, особенно окон. Google Slepian window, чтобы найти надежные методы, минимизирующие утечку энергии.   -  person Alexandre C.    schedule 13.01.2011
comment
Пожалуйста, отредактируйте свой вопрос, чтобы отобразить код, который у вас есть. Вы должны включить хотя бы схему (но предпочтительно минимальный воспроизводимый пример) кода, с которым у вас возникли проблемы. , тогда мы можем попытаться помочь с конкретной проблемой. Вам также следует прочитать Как задать вопрос.   -  person Toby Speight    schedule 20.06.2017


Ответы (1)


Уже есть довольно много похожих / связанных вопросов по SO, которые стоит прочитать, поскольку ответы содержат много полезной информации и советов, но, по сути, вам нужно сделать это:

  • преобразовать аудиоданные в формат, необходимый для БПФ (например, int -> float, отдельные каналы L / R)
  • примените подходящую оконную функцию (например, Hann aka Hanning window)
  • применить БПФ (примечание: при использовании типичного комплексного БПФ установите мнимые части входного массива равными нулю)
  • вычислить величину первых N / 2 выходных бинов БПФ (sqrt(re*re + im*im))
  • опционально преобразовать величину в шкалу дБ (логарифм) (20 * log10(magnitude))
  • построить N / 2 (log) значения магнитуды

Обратите внимание, что хотя FFTW является очень хорошим и очень быстрым FFT, он может быть немного ошеломляющим для новичка - он также очень дорог, если вы хотите включить его как часть коммерческого продукта - я рекомендую начать с KissFFT.

person Paul R    schedule 13.01.2011
comment
+1 - Единственное, что я бы добавил, это первый шаг к отделению левого (или правого, неважно) канала от аудиофайла. И еще +1, если бы я мог использовать KissFFT, прежде чем убирать с FFTW. - person mtrw; 13.01.2011
comment
@mtrw: спасибо за комментарии - добавлено примечание о разделении каналов L / R на первом шаге - person Paul R; 13.01.2011
comment
Я бы только добавил, что вы можете упростить, если выполняете шкалу журнала - вместо вычисления величины (с помощью sqrt), а затем масштабирования 20*log10, возьмите квадрат величины (пропуская sqrt), а затем масштабируйте 10*log10. Математически эквивалентен, но избавляет от ненужных sqrt вызовов. - person Mark Ransom; 14.01.2011
comment
@Mark: да, хороший момент, вы можете сразу перейти к дБ без sqrt, если вам не нужна линейная величина. - person Paul R; 14.01.2011
comment
@PaulR Что такое отдельные каналы L / R? Я новичок в том, что касается БПФ, и я начал читать по этой теме, так что мне просто любопытно? - person SayeedHussain; 01.08.2013
comment
Это просто левый / правый стереоканалы, которые вы получаете в большинстве звуковых файлов или аудиовходов - вам нужно обрабатывать левый и правый каналы отдельно. - person Paul R; 02.08.2013
comment
Почему величина частотных составляющих преобразуется в дБ с использованием соглашения о величине поля, а не в качестве величины мощности? Я думал, что интенсивность звука измеряется как мощность? То есть, почему 20 * log10 (величина) вместо 10 * log10 (величина)? - person A. Levy; 10.07.2015
comment
@ A.Levy: ну вот как я об этом думаю: входные сигналы - это напряжения, мощность пропорциональна V ^ 2, поэтому для получения мощности в дБ нужно 20 * log10, а не 10 * log10. - person Paul R; 10.07.2015