web-dev-qa-db-ja.com

C ++でfftを使用してオーディオスペクトルを生成する方法

Mp3オーディオファイルのオーディオスペクトラム( このビデオ を参照)を生成したい。基本的にこの問題は、オーディオ信号のFFTを計算する必要があります。 C/C++でこれをどのようにプログラムしますか?

[〜#〜] fftw [〜#〜] などのいくつかのオープンソースライブラリを見てきましたが、これらのライブラリを使用して問題を解決する方法が本当にわかりません。どんな助けでも大歓迎です。前もって感謝します!

31
MRashid

SO)には類似の質問や関連する質問がかなりあります。回答には多くの有用な情報やアドバイスが含まれているため、読む価値がありますが、基本的には次のようにする必要があります。

  • オーディオデータをFFTで必要な形式に変換します(例:int-> float、個別のL/Rチャネル)
  • 適切な ウィンドウ関数 を適用します(例 Hann aka Hanning window
  • fFTを適用します(注意:一般的な複素数から複素数へのFFTを使用する場合、入力配列の虚数部をゼロに設定します)
  • 最初のN/2 FFT出力ビンの大きさを計算します(sqrt(re*re + im*im)
  • オプションで、大きさをdB(log)スケールに変換します(20 * log10(magnitude)
  • n/2(対数)の大きさの値をプロットする

FFTWは非常に優れた非常に高速なFFTですが、初心者には少し圧倒される可能性があることに注意してください。これを商用製品の一部として含めようとすると、非常にコストが高くなります。 KissFFT =代わりに。

52
Paul R