Programmation.java : Question sur la transformée de Fourier
Posté par Manuel Dahmen (page perso, ) le 03 décembre 2007
Bonsoir,
J'écris un programme d'analyse musicale qui utilise la transformation de Fourier (fft) telle que je l'ai trouvée sur http://www.dspdimension.com/ ( http://www.dspdimension.com/admin/dft-a-pied/ ). Je l'ai adaptée en Java et j'ai quelques problèmes. Vu que cette implémentation de la fft demande que le nombre d'échantillons soient une puissance de 2 je mets les échantillons dans un tableau puis je le remplis avec des zéros pour qu'il ait la bonne taille (2^N).
Une chose bizarre se produit c'est que dans les hautes fréquences (19, 20 kHz et plus) on retrouve les valeurs des basses fréquences dans le spectrogramme et je trouve ça assez étrange.
Je peux montrer le source s'il le faut.
Je suis également à la recherche d'autres algorithmes pour les tester et comparer résultats et performances et contraintes. En particulier la contrainte d'avoir une taille de données d'une puissance de 2 m'embête un peu. Wikipedia décrit plusieurs algoriothmes mais il n'y a pas de code source.
J'écris un programme d'analyse musicale qui utilise la transformation de Fourier (fft) telle que je l'ai trouvée sur http://www.dspdimension.com/ ( http://www.dspdimension.com/admin/dft-a-pied/ ). Je l'ai adaptée en Java et j'ai quelques problèmes. Vu que cette implémentation de la fft demande que le nombre d'échantillons soient une puissance de 2 je mets les échantillons dans un tableau puis je le remplis avec des zéros pour qu'il ait la bonne taille (2^N).
Une chose bizarre se produit c'est que dans les hautes fréquences (19, 20 kHz et plus) on retrouve les valeurs des basses fréquences dans le spectrogramme et je trouve ça assez étrange.
Je peux montrer le source s'il le faut.
Je suis également à la recherche d'autres algorithmes pour les tester et comparer résultats et performances et contraintes. En particulier la contrainte d'avoir une taille de données d'une puissance de 2 m'embête un peu. Wikipedia décrit plusieurs algoriothmes mais il n'y a pas de code source.
> Lire le message (7 commentaires, moyenne: 1,7).
Vous avez demandé le commentaire #887006.



c'est le padding
Les zéros que tu rajoutes, ils modifient le signal. Ils créent un plat, et la transformée de fourier aime pas trop les plats : elle oscille toujours, avec dans le cas des plats des effets problématiques.
Je soupçonne que c'est pareil pour la fft (transformée de fourier discrète).
En gros : soit tu utilises cet algo et tu te plies aux contraintes (puissances de 2), soit tu trouves un autre algo.
[^]Re: c'est le padding
Ok merci pour la réponse.
Dans certains cas je peux me plier à cette contrainte (si je sélectionne une partie d'un fichier son et que j'en fais la fft, je peux tjs étendre la sélection jusqu'à la prochaine puissance de 2 ou la réduire jusqu'à la précédente si je déborde les bornes du fichier), dans d'autres c 'est plus difficile par exemple si je veux faire la fft de tout un fichier.
Enfin je vais étudier les algorithmes de la fft sur Wikipedia. Y a-t-il moyen de déduire les algo des définitions ou c'est juste informatif?.
J'ai trouvé fftw. Wikipedia dit que c'est l'implémentation la plus rapide de la fft et il n'y a pas cette contrainte de puissance de 2et je crois qu'il y a des bindings pour Java. Je vais y jeter un coup d'oeil.
Sur ce bonne nuit et à bientôt
--
fog
(désolé pour la signature elle date faut que j'en trouve une meilleure...)
Chez µa
[^]Re: c'est le padding
FFT c'est fast fourrier transform, c'est le nom d'un algorithme qui découpe l'échantillon en 2 à chaque étape.
Si tu trouve un autre algorithme, il ne s'agira pas de fft, mais de ft tout court.
Pour retrouver une puissance de 2 tu as plusieurs solutions (a toi de voir si elles valent le coup)
* réduire l'échantillon (on coupe les derniers octets)
* changer la fréquence d'échantillonage par interpolation (on rajoute des octets par calcul, comme lorsqu'on agrandit les images)
* faire du padding avec les premières valeurs de l'échantillon (tu auras moins d'artefact, mais tu en auras toujours)
Et enfin, sachant que le signal que tu vas analyser n'est pas purement périodique, pense à lui appliquer une fenêtre pour éviter de voir apparaitre des fréquence qui n'existent pas.
Vous admin ? http://linux-attitude.fr
[^]Re: c'est le padding
J'avais pas pensé au ré-échantillonnage ça a l'air intéressant. Pour le moment j'étends la sélection d'échantillons pour avoir une puissance de 2 et si je ne peux pas le faire (sélection conforme à la contrainte 2^N qui est plus grande que le fichier) je fais du padding. J'ai tjs le problème d'effet miroir mais ça ne me pose plus de gros problèmes, au pire je ne prends que la moitié du tableau retourné par la fft. N'empêche je maîtrise pas tout...
A propos du fenêtrage je ne sais pas de quoi il s'agit d'après ce que tu dis c'est un algorithme qui vient après la fft mais tu peux m'expliquer en 2 mots en quoi ça consiste? Avant que je fasse des recherches...
Merci.
--
fog
Chez µa
[^]Re: c'est le padding
http://fr.wikipedia.org/wiki/Fen%C3%AAtrage
En 2 mots: une transformée de fourrier s'applique en théorie à un signal entier, ie pour des temps de -infini à +infini. Or quand tu prends un morceau de signal, tu ne respectes plus cette règle, et tu introduit notamment des discontinuités très importantes aux limites temporelles de ta fenêtre (ie au début et à la fin de ta fenêtre). Les fonctions d'apodisation permettent d'arrondir les limites et donc de diminuer l'influence de ces discontinuités.