web-dev-qa-db-fra.com

Comment générer le spectre audio en utilisant fft en C ++?

Je veux générer un spectre audio (comme vu dans cette vidéo ) d'un fichier audio mp3. Fondamentalement, ce problème nécessite de calculer le fft du signal audio. Comment puis-je programmer cela en C/C++?

J'ai regardé quelques bibliothèques open source telles que FFTW et je ne sais vraiment pas comment les utiliser pour mon problème. Toute aide serait grandement appréciée. Merci d'avance!

31
MRashid

Il y a pas mal de questions similaires/connexes sur SO déjà qui valent bien la peine d'être lues car les réponses contiennent beaucoup d'informations et de conseils utiles, mais en gros, vous devez le faire:

  • convertir les données audio au format requis par la FFT (par exemple int -> float, canaux L/R séparés)
  • appliquer une fonction appropriée fonction de fenêtre (par exemple fenêtre de Hann aka Hanning )
  • appliquer la FFT (NB: si vous utilisez une FFT complexe à complexe typique, mettez à zéro les parties imaginaires du tableau d'entrée)
  • calculer l'amplitude des premiers N/2 bacs de sortie FFT (sqrt(re*re + im*im))
  • convertir éventuellement la magnitude en échelle dB (log) (20 * log10(magnitude))
  • tracer les valeurs de magnitude N/2 (log)

Notez que bien que la FFTW soit une très bonne et très rapide FFT, elle peut être un peu écrasante pour un débutant - elle est également très coûteuse si vous souhaitez l'inclure dans le cadre d'un produit commercial - je recommande de commencer par KissFFT = à la place.

52
Paul R