Création d'un spectrogramme

10

J'ai essayé de trouver la logique de cette tâche et je prévois d'utiliser le package source KissFFT pour effectuer la transformation rapide de Fourier. Veuillez me faire savoir si cela semble correct:

  1. Allouez une structure FFT, c.-à-d. kiss_fft_alloc(N,0,NULL,NULL)Nest la taille de la fenêtre que j'utilise. Le tampon d'entrée sera un tableau d' Néléments de type kiss_fft_scalar. Le tampon de sortie sera un tableau d' N/2 + 1éléments de type kiss_fft_cpx.
  2. Décoder N(taille de la fenêtre) le nombre d'échantillons PCM.
  3. Pour chaque échantillon PCM, faites la moyenne de l'amplitude de chaque canal (échantillons non signés) et une échelle de 0 à 2 (divisez par 65536.0), en stockant le résultat dans le tampon d'entrée.
  4. Effectuez un fenêtrage (c.-à-d. Hanning) sur le tampon d'entrée.
  5. Effectuez une transformation de Fourier rapide sur le tampon d'entrée, en stockant dans le tampon de sortie. Puisque j'utilise des valeurs réelles en entrée, je peux utiliser kiss_fftr().
  6. Pour les N/2valeurs de sortie, obtenez la magnitude au carré des données transformées et convertissez les valeurs en échelle dB avec la formule suivante: 10 * log10 (re * re + im * im)
  7. Tracez les N/2valeurs de l'étape 6.
  8. Jeter la première moitié du tampon d'entrée, décoder les échantillons PCM suivants (taille de fenêtre / 2) et effectuer la mise à l'échelle et le fenêtrage des données. Cela devrait effectivement faire glisser la fenêtre de saisie et éviter d'avoir à refaire des calculs sur des échantillons PCM traités.
  9. Passez à l'étape 5 en répétant ces étapes jusqu'à ce que tous les échantillons soient traités.
  10. Libérez la mémoire utilisée de kiss_fft_alloc().

Il a été suggéré de soustraire une valeur de la fenêtre d'entrée avant d'effectuer la FFT, de sorte que la valeur DC résultante ait une magnitude de zéro. Dois-je soustraire la moyenne ou la moyenne des données d'entrée?

De plus, quelles sont les choses dont je dois tenir compte lorsque je choisis une taille de fenêtre? En plus du fait qu'il doit s'agir d'un nombre pair selon les instructions de KissFFT, y a-t-il un avantage à utiliser une petite taille de fenêtre, c'est-à-dire. fournira-t-il un meilleur graphique? Je suppose qu'une grande taille de fenêtre réduit le nombre de FFT qui doivent être effectuées, est-ce le seul avantage d'utiliser une grande taille de fenêtre?

x

Merci d'avance pour tous les conseils que vous pouvez fournir.

raynebc
la source

Réponses:

8

Ça me va plutôt bien. À l'étape 3, cependant, vous voulez réellement mettre le signal à l'échelle de -1 à 1, sinon vous ajoutez DC. Vous avez mentionné la soustraction de la moyenne - je ne recommanderais pas de le faire pour un spectrogramme, car cela filtre efficacement DC, que le spectrogramme devrait montrer s'il est là.

Le choix d'une taille de fenêtre est une question de compromis. Une fenêtre plus grande vous donnera une résolution de fréquence plus nette, mais une résolution temporelle plus floue. Une fenêtre plus courte vous donnera le contraire: une résolution temporelle plus nette mais une résolution de fréquence plus floue. Le choix approprié de la taille de la fenêtre dépendra des données que vous essayez d'analyser. En règle générale, ce sera une puissance de 2 simplement parce que les FFT ont tendance à aimer des puissances de 2. Une règle empirique décente est que votre fenêtre doit être au moins environ deux fois plus longue que la période de la fréquence la plus basse que vous souhaitez pouvoir avec précision. résoudre.

Vous vous demandez peut-être s'il est possible de mieux gérer ce compromis, et il existe des techniques pour cela: elles impliquent généralement de calculer des spectrogrammes avec plusieurs tailles FFT différentes à la fois, et de les combiner. Il y a de bonnes informations visuelles sur cette page Web: http://www.izotope.com/tech/aes_adapt/

Si la taille de votre fenêtre est trop petite, deux fréquences très proches peuvent être indiscernables car elles se retrouvent toutes deux dans le même bac FFT. Si la taille de votre fenêtre est trop grande, deux événements proches dans le temps peuvent être combinés ou un transitoire brutal peut se transformer en une attaque progressive. Consultez cette page Web que j'ai publiée pour voir comment le visualiser.

Une taille de fenêtre plus grande ne réduit pas nécessairement le nombre de FFT. Vous avez choisi de calculer un spectrogramme en utilisant une transformée de Fourier de courte durée où il y a un chevauchement de la moitié de la taille FFT. Vous pouvez utiliser un facteur de chevauchement plus élevé si vous le souhaitez. Le choix d'une taille de fenêtre est beaucoup plus une question de compromis temps / fréquence que le nombre de FFT que vous devez calculer. En concevant un spectrogramme (ou n'importe quel STFT), vous pouvez penser à choisir la taille de votre fenêtre et la taille du saut , la distance entre les blocs, comme paramètres indépendants.

Lorsque vous le tracez, le temps est généralement sur l'axe x, la fréquence est sur l'axe y (généralement une échelle logarithmique, une échelle Mel, etc., plutôt qu'une échelle linéaire), puis les amplitudes sont représentées avec une intensité de couleur, c'est-à-dire les couleurs très sombres correspondent à de petites grandeurs et les couleurs très vives correspondent à de grandes grandeurs.

schnarf
la source
Votre lien semble être mort. Pourriez-vous le mettre à jour?
Daniel Wolf