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.
# c'est le padding
Posté par mickabouille . Évalué à 3.
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
Posté par fog . Évalué à 2.
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...)
[^] # Re: c'est le padding
Posté par peck (site web personnel) . Évalué à 2.
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.
[^] # Re: c'est le padding
Posté par fog . Évalué à 1.
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
[^] # Re: c'est le padding
Posté par left . Évalué à 1.
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.
# normal !
Posté par gringonz . Évalué à 2.
A mon avis cela ne provient pas du zero padding qui est une
opération classique pour faire une FFT qui est un algo qui exige une
puissance de 2 echantillons pour calculer la TFD. le zero padding
n'enleve pas de l'information puisque il ne suprime pas une partie
du signal ca ajoute juste une partie sans information. Ca produit
un effet gènant seulement sur un signal périodique mais n'est pas
pire qu'une troncature temporelle mal faite.
En fait ce que tu
observe est normal : si tu prends N echantillons dans ton signal, la TFD
te donne N echantillons dans le spectre mais :
1) le spectre est périodique de période N donc avec N points
tu ne vois que la premiere periode.
2)un signal audio est réel donc sa TFD est paire : moralité
les points correspondant aux fréquences négative (qui n'apparaissent
pas ) sont identiques à ceux des fréquences positives. Mais comme
le spectre est périodique, ces points se retrouvent en fin du spectre.
En gros avec N point dans le spectre, seuls les N/2 premiers sont
suffisants puisque les N/2 suvant sont l'image des N/2 premiers :
l'amplitude de la raie pour n=1 egal amplitude de la raie pour N-1
idem avec n=2 et N-2 ....
d'ailleurs fais un essai avec scilab par exemple c'est exactement
ce que l'on observe.
pour masquer cet effet il te suffit donc de n'afficher que les N/2 points
apres c'est redondant !
Si ca peut aider
[^] # Re: normal !
Posté par wxuserbrest . Évalué à 1.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.