Comment dessiner un spectre de fréquence à partir d'une transformée de Fourier
Je veux tracer le spectre de fréquence d'un fichier de musique (comme par exemple dans Audacity). Donc je veux la fréquence en Hertz sur l'axe des x et l'amplitude (ou desibel) sur l'axe des y.
Je divisez la chanson (environ 20 millions d'échantillons) dans des blocs de 4096 échantillons à la fois. Ces blocs entraînera 2049 (N/2 + 1) nombres complexes (sinus et cosinus -> partie réelle et imaginaire). Alors maintenant que j'ai ces milliers de 2049-tableaux, comment les combiner?
Permet de dire que je ne la FFT 5000 fois, résultant en 5000 2049-des tableaux de nombres complexes. Dois-je en plus de toutes les valeurs de l'5000 tableaux et ensuite prendre l'ampleur du combiné 2049-tableau? Puis-je sacle l'axe des x, avec les chansons de taux d'échantillonnage /2 (par exemple: 22050 pour un 44100hz fichier)?
Toute information sera appriciated
OriginalL'auteur goocreations | 2012-05-19
Vous devez vous connecter pour publier un commentaire.
Quelle application utilisez-vous pour cela? Je suppose que vous êtes de ne pas faire cela à la main, voici donc un Matlab exemple:
>> fbins = fs/N * (0:(N/2 - 1)); % Where N is the number of fft samples
maintenant, vous pouvez effectuer
>> plot(fbins, abs(fftOfSignal(1:N/2)))
Volé
edit: check this out http://www.codeproject.com/Articles/9388/How-to-implement-the-FFT-algorithm
fs = fréquence d'échantillonnage, 0:x = toutes les étapes de zéro à x, même pour 1:N/2. abs = valeur absolue. La fin est plot(x,y), de sorte fbins est x et le reste y est
Déposez un lien pastebin avec votre C-code la prochaine fois, je suis un peu curieux de savoir comment vous allez résoudre ce problème 🙂
Je suis toujours à la recherche, donc je ne peux pas donner un code encore. Ainsi, toutes les idées sont plus que bienvenus!
Je suis plus dans embarqué C, pas du C++, donc je suis juste curieux. espérons que d'autres peuvent fournir plus. peut-être que vous pourriez aider, en décrivant ce système d'exploitation/plateforme vous travaillez sur
OriginalL'auteur chwi
Wow j'ai écrit à la charge au sujet de cette tout récemment.
J'ai même tourné dans un post de blog disponibles ici.
Mon explication est penchée vers spectrogrammes mais il est tout aussi facile de rendre un graphique comme vous décrivez!
OriginalL'auteur Goz
Je ne pourrais pas être correcte sur ce point, mais pour autant que je suis au courant, vous avez 2 façons pour obtenir le spectre de l'ensemble de la chanson.
1) Faire un seul FFT sur l'ensemble du morceau, ce qui vous donnera une très bonne résolution en fréquence, mais est en pratique pas efficace, et vous n'avez pas besoin de ce genre de résolution, de toute façon.
2) Diviser en petits morceaux (comme 4096 échantillons de blocs, comme vous l'avez dit), obtenir la FFT pour chacun de ceux-ci et moyenne des spectres. Vous allez faire des compromis sur la résolution de fréquence, mais de rendre le calcul plus facile à gérer (et aussi diminuer la variance du spectre). Wilhelmsen tout lien est décrit comment faire pour calculer une FFT en C++, et je pense que certains de la bibliothèque existe déjà pour le faire, comme FFTW (mais je n'ai jamais réussi à le compiler, pour être juste,=) ).
Pour obtenir l'amplitude du spectre, la moyenne de l'énergie (carré de l'amplitude) sur l'ensemble des vous des morceaux pour tous les bacs. Pour obtenir le résultat en dB, à seulement 10 * log10 les résultats. C'est bien sûr en supposant que vous n'êtes pas intéressé par le spectre de phase. Je pense que ceci est connu comme la Barlett de la méthode.
Je voudrais faire quelque chose comme ceci:
Espère que cela répond à votre question.
Edit: Goz post va vous donner beaucoup d'informations sur la question =)
OriginalL'auteur tthegarde
Couramment, vous prenez juste l'un des tableaux, correspondant au point dans le temps de la musique dans lequel vous êtes intéressé. Le vous de calculer le journal de l'ampleur de chaque complexe de l'élément de tableau. La parcelle du N/2 résultats que les valeurs de Y, et l'échelle de l'axe des X de 0 à Fs/2 (où Fs est la fréquence d'échantillonnage).
Si la durée de la FFT est N, pourquoi tu ne tracer que N/2?
Pour strictement réel données d'entrée, de la 2e moitié d'une FFT résultat est tout simplement le miroir à conjugaison de la première moitié (par exemple redondant). La moitié au-dessus de N/2 est seulement utile (différent) si les données du domaine temps est complexe (les deux composantes réelle et imaginaire non nulle).
OriginalL'auteur hotpaw2