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:
- Allouez une structure FFT, c.-à-d.
kiss_fft_alloc(N,0,NULL,NULL)
OùN
est la taille de la fenêtre que j'utilise. Le tampon d'entrée sera un tableau d'N
éléments de typekiss_fft_scalar
. Le tampon de sortie sera un tableau d'N/2 + 1
éléments de typekiss_fft_cpx
. - Décoder
N
(taille de la fenêtre) le nombre d'échantillons PCM. - 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.
- Effectuez un fenêtrage (c.-à-d. Hanning) sur le tampon d'entrée.
- 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()
. - Pour les
N/2
valeurs 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)
- Tracez les
N/2
valeurs de l'étape 6. - 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.
- Passez à l'étape 5 en répétant ces étapes jusqu'à ce que tous les échantillons soient traités.
- 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?
Merci d'avance pour tous les conseils que vous pouvez fournir.
la source