Forum Programmation.java Question sur la transformée de Fourier

Posté par  .
Étiquettes : aucune
0
3
déc.
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.
  • # c'est le padding

    Posté par  . Évalué à 3.

    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

      Posté par  . Évalué à 2.

      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...)
      • [^] # Re: c'est le padding

        Posté par  (site web personnel) . Évalué à 2.

        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.
        • [^] # Re: c'est le padding

          Posté par  . Évalué à 1.

          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
          • [^] # Re: c'est le padding

            Posté par  . Évalué à 1.

            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.
  • # normal !

    Posté par  . Évalué à 2.

    Bonjour,

    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  . Évalué à 1.

      cf Théorème de Shannon et le repliement du spectre, regarde les différentes fenêtre hamming, haning à appliquer

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.