12
votes

Convertir une FFT en un spectrogramme

J'ai un fichier audio et je suis itération dans le fichier et en prenant 512 échantillons à chaque étape, puis en les faisant passer à travers une FFT.

J'ai les données en tant que bloc 514 flotte long (à l'aide de IPPSFFTFWD_RTOCCS_32F_I) avec Composants réels et imaginaires entrelacés.

Mon problème est que dois-je faire avec ces numéros complexes une fois que je les ai? Pour le moment que je fais pour chaque valeur xxx

ceci donne quelque chose de légèrement utilisable, mais je préfère avoir une façon d'obtenir les valeurs dans la plage de 0 à 1. Le Le problème avec lui ci-dessus est que les sommets se retrouvent vers 9 ou plus. Cela signifie que les choses deviennent vicieusement saturées et que d'autres parties du spectrogramme montrent à peine malgré le fait qu'ils semblent être assez forts lorsque j'exécute l'audio via Spectrogramme de l'audition. J'avoue pleinement que je ne suis pas sûr à 100% des données renvoyées par la FFT (autre que celle-ci représente les valeurs de fréquence du bloc long de 512 échantillons que je passe). Surtout, ma compréhension manque de ce que représente exactement le numéro Compex.

Des conseils et de l'aide seraient très appréciés!

Edit: juste pour clarifier. Mon gros problème est que les valeurs FFT renvoyées n'ont pas de sens sans une idée de ce que l'échelle est. Quelqu'un peut-il me diriger à travailler cette échelle?

Edit2: Je suis vraiment beaux résultats en procédant comme suit: xxx

à mon œil cela même On dirait mieux que la plupart des autres implémentations de spectrogrammes que j'ai examinées.

Y a-t-il quelque chose majeur mal avec ce que je fais?


2 commentaires

Vous faites la bonne chose pour obtenir la magnitude du nombre complexe. Vous avez juste besoin de trouver l'échelle de ces numéros (complexes) (0-1, 0-255, ..?), Voir les documents de votre fonction FFT pour cela. Si la plage est trop grosse pour votre goût, vous devez vous aider, comme suggéré ci-dessous.


Probablement pas important pour votre utilisation, mais vous pouvez également normaliser les valeurs de domaine de fréquence (c.-à-d. Les valeurs que vous obtenez de la FFT) en les divisant par la largeur FFT. (c.-à-d. Le plus large que votre FFT est, plus les valeurs dans les différents seaux de fréquences seront les plus grandes)


5 Réponses :


1
votes

Si vous obtenez des résultats étranges, une chose à vérifier est la documentation de la bibliothèque FFT pour voir comment la sortie est emballée. Certaines routines utilisent un format emballé dans lequel les valeurs réelles / imaginaires sont entrelées ou peuvent commencer à l'élément N / 2 et enroulez-la.

Pour un chèque de santé mentale, je suggérerais de créer des données d'échantillonnage avec des caractéristiques connues, par exemple FS / 2, FS / 4 (FS = Fréquence de l'échantillon) et comparez la sortie de la routine FFT avec ce que vous attendez. Essayez de créer à la fois un sinus et un cosinine à la même fréquence, car ils doivent avoir la même ampleur dans le spectre, mais avoir des phases différentes (c'est-à-dire que le realvalue / Imagvalue diffère, mais la somme des carrés devrait être la même.

Si vous avez l'intention d'utiliser la FFT, vous devez vraiment savoir comment cela fonctionne de manière mathématique, sinon vous êtes susceptible de rencontrer d'autres problèmes étranges tels que l'aliasing.


1 commentaires

Eh bien, j'ai vérifié le profil. Mon problème est que les chiffres que je reçoivent de la FFT ne signent pas de sens sans aucune idée de ce que la balance représente. Je vais mettre à jour ma question initiale.



11
votes

La chose habituelle à faire pour obtenir tout un FFT visible est de prendre le logarithme de la magnitude.

Donc, la position du tampon de sortie vous indique quelle fréquence a été détectée. La magnitude (norme L2) du nombre complexe vous indique la force de la fréquence détectée et la phase (arctangent) vous donne des informations qui sont beaucoup plus importantes dans l'espace image que l'espace audio. Étant donné que la FFT est discrète, les fréquences sont passées de 0 à la fréquence Nyquist. En images, le premier terme (DC) est généralement le plus grand, et donc un bon candidat à utiliser dans la normalisation si c'est votre objectif. Je ne sais pas si cela est également vrai pour l'audio (j'en doute)


6 commentaires

Réponse intéressante. Notez juste qu'en audio, il n'y a normalement aucune valeur CC (il détruirait vos haut-parleurs si vous laissez à travers votre ampli), c'est purement ac.


Quoi qu'il en soit, à la recherche de la valeur maximale est une opération assez courte (comparée à la FFT).


idito sur l'utilisation de la balance de journal (et trouvant le maximum)


@Wim je suis heureux d'entendre que mon intuition n'est pas complètement de Haywire.


En audio, la phase est importante pour pouvoir récupérer du spectre au signal d'origine, c'est-à-dire. C'est pourquoi vous ne pouvez pas reconstruire le signal d'origine d'un spectre uniquement. Mais ce n'est pas ce que tu fais habituellement avec spectre :)


Bien log10 (sqrt (réel ^ 2 + imag ^ 2)) donne définitivement des résultats plus jolis ...



7
votes

Pour chaque fenêtre de 512 échantillons, vous calculez la magnitude de la FFT comme vous l'avez fait. Chaque valeur représente la magnitude de la fréquence correspondante présente dans le signal. xxx

Nous devons maintenant comprendre les fréquences.

puisque le signal d'entrée est de valeurs réelles, La FFT est symétrique autour du milieu (composant NYQUIST) avec le premier terme étant le composant CC. Connaître la fréquence d'échantillonnage du signal FS , la fréquence nyquiste est FS / 2. Et donc pour l'index k , la fréquence correspondante est k * fs / 512

donc pour chaque fenêtre de longueur 512, nous obtenons les magnitudes à fréquence spécifiée. Le groupe de ces fenêtres consécutives forme le spectrogramme.


0 commentaires

5
votes

Il y a quelques points que je pense que vous trouverez utile.

Le FT en avant aura tendance à donner des nombres plus importants dans la sortie que dans l'entrée. Vous pouvez y penser comme toute l'intensité à une certaine fréquence affichée à un endroit plutôt que d'être distribuée via le jeu de données. Est-ce que cela compte? Probablement pas parce que vous pouvez toujours réduire les données pour répondre à vos besoins. Une fois, j'ai écrit une paire FFT / IFFT entier et chaque passage requis pour prévenir le débordement entier.

Les données réelles qui sont votre entrée sont converties en quelque chose qui est presque complexe. Comme il s'avère que la mémoire tampon [0] et la mémoire tampon [N / 2] sont réelles et indépendantes. Il y a une bonne discussion sur ici .

Les données d'entrée sont des valeurs d'intensité de son prise au fil du temps, espacées également. Ils sont dit, suffisamment de manière appropriée, dans le domaine temporel. La sortie de la FT est dit dans le domaine de fréquence car l'axe horizontal est une fréquence. L'échelle verticale reste l'intensité. Bien que ce ne soit pas évident des données d'entrée, il existe également des informations de phase dans l'entrée. Bien que tout le son soit sinusoïdal, il n'y a rien qui fixe les phases des ondes sinusoïdales. Ces informations de phase apparaissent dans le domaine de fréquence comme les phases des numéros complexes individuels, mais nous ne nous en soucions souvent pas à ce sujet (et souvent nous le faisons aussi!). Cela dépend juste de ce que vous faites. Le calcul xxx

récupère les informations d'intensité, mais rejette les informations de phase. Prendre le logarithme essentiellement atténue les gros sommets.

J'espère que c'est utile.


1 commentaires

Alors, comment puis-je l'utiliser sans supprimer les informations de phase? Et comment la phase est-elle applicable à un spectre?



6
votes

Pour que les gens savent que j'ai fait beaucoup de travail sur tout ce problème. La principale chose que j'ai découverte est que la FFT nécessite une normalisation après le faire.

Pour ce faire, vous avez moyennant toutes les valeurs de votre fenêtre Vector ensemble pour obtenir une valeur quelque peu moins de 1 (ou 1 si vous utilisez une fenêtre rectangulaire). Vous divisez ensuite ce numéro par le nombre de bacs de fréquence que vous avez post la transformation FFT.

Enfin, vous divisez le nombre réel renvoyé par la FFT par le numéro de normalisation. Vos valeurs d'amplitude doivent maintenant être dans la gamme -Inf à 1 gamme. Journal, etc., comme vous voulez. Vous travaillerez toujours avec une gamme connue.


0 commentaires