IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Traitement du signal Discussion :

[Signal] FFT audio : comment ca marche ?


Sujet :

Traitement du signal

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 89
    Points : 37
    Points
    37
    Par défaut [Signal] FFT audio : comment ca marche ?
    Bonjour à tous,
    je vous écris car je dois dans mon application développer un Vumetre qui permet de visualiser une fréquence spécifique extraite d'un son en cours de lecture.

    j'utilise DirectSound pour lire le son et je possède un buffer circulaire qui simule le comportement du buffer circulaire DirectSound me permettant d'obtenir chaque octet en cours de lecture.

    j'ai donc à l'heure actuelle un vumetre qui permet de visualiser le signal global de mon son en cours de lecture. J'ai cherché du côté de Fourier avec la FFT rapide de Fourier mais je ne comprend pas comment l'appliquer à mon cas!

    Pourriez-vous m'aider ? J'ai trouvé l'algorithme FFT mais je ne vois pas comment on l'utilise. Par où fournis-t-on les octets et par où fournis-t-on la fréquence à isoler désirée ? Puis-je directement utiliser les octets en entrée?

    Merci de votre aide, je ne trouve pas grand chose en documentation. Merci

  2. #2
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 89
    Points : 37
    Points
    37
    Par défaut
    Merci c'est très gentil, mais ca ne m'aide pas trop trop;
    J'ai trouvé cela : http://www.unilim.fr/pages_perso/jea...t.htm#section2

    Mais c'est pareil, c'est l'utilisation que je ne sais pas faire.

  4. #4
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 945
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 945
    Points : 5 659
    Points
    5 659
    Par défaut
    Qia,
    Citation Envoyé par mbsofts
    Pourriez-vous m'aider ? J'ai trouvé l'algorithme FFT mais je ne vois pas comment on l'utilise. Par où fournis-t-on les octets et par où fournis-t-on la fréquence à isoler désirée ? Puis-je directement utiliser les octets en entrée?
    On ne "fournit" pas des octets à un algorithme, mais à son implémentation.

    Pas besoin de chercher bien longtemps pour trouver une fft implémentée dans n'importe quel langage que tu désires, en général avec un petit mode d'emploi, même si parfois c'est très bref.
    Si les cons volaient, il ferait nuit à midi.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 89
    Points : 37
    Points
    37
    Par défaut
    oui bien sûr j'en trouve, mais en C avec plein d'autres fonctions comme l'équalisation. Il m'est donc difficile d'isoler cki correspond à l'équaliser et au vumetre. C'est là que je demande votre aide : c'est très théorique et je ne sais pas comment m'y prendre:

    Fourier sert à décomposer une signal complexe en sinusoides d'après ce que j'ai compris : 1 sinusoide = 1 fréquence !(?) Ca voudrais donc dire que mon vumetre pour une certaine fréquence aura des évolutions de hauteur linéaires ! ou faudra-t-il faire la moyenne des quelques fréquences avant et aprés la fréquence voulue? Vous voyez ce que je veux dire?

  6. #6
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par mbsofts
    Fourier sert à décomposer une signal complexe en sinusoides d'après ce que j'ai compris
    En fait, ca fait un changement de repère: Volume(temps) -> Puissance(frequence).

    Après la FFT, tu as un tableau S[f] qui te donne l' "importance" de chaque frequence "f".

    1 sinusoide = 1 fréquence !(?)
    Oui.

    Ca voudrais donc dire que mon vumetre pour une certaine fréquence aura des évolutions de hauteur linéaires ! ou faudra-t-il faire la moyenne des quelques fréquences avant et aprés la fréquence voulue? Vous voyez ce que je veux dire?
    oui, il faudra comptabiliser aussi les frequences voisines dans ton vuemetre.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 89
    Points : 37
    Points
    37
    Par défaut
    merci c'est déjà plus clair.
    En gros après la "magique" fftw je récupère un tableau de fréquences à partir de mon octet fourni !

    C'est assez simple comme cela, il faudra juste ensuite que je récupère les valeurs proches de ma valeur de fréquence désirée; que j'en fasse la moyenne, j'obtiendrai ainsi une puissance; laquelle varie pour un 8 bits de -127 à +128 ou de 0 à 255 en non signé.. et que je fasse ca à chaque octet de mon son en temps réel (ou groupe d'octets).

    Ma dernière question (après je pense pouvoir me débrouiller) :quelle unité FFTW dois-je prendre pour Delphi 2006 ? J'en ai trouvé plusieurs versions sur le web.

    Et enfin, pourquoi une notion de nombre complexes pour du son? Comment je fais pr prendre mon octet et aboutir à mon tableau de puissances en fonction de la fréquence ?

    (je ne vous demande pas la solution précodée, juste des pistes; j'ai passé cette semaine sur cela, j'avoue avoir tout vu sans avoir trop avancé.. )

    Merci à ceux qui m'ont déjà aidé et aux prochains !

  8. #8
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par mbsofts
    merci c'est déjà plus clair.
    En gros après la "magique" fftw je récupère un tableau de fréquences à partir de mon octet fourni !
    Non, pas a partir d'un seul octet. Tu dois lui passer ton buffer de valeurs. Plus il y a d'octet, meilleur sera ton estimation des frequences.

    Citation Envoyé par mbsofts
    Ma dernière question (après je pense pouvoir me débrouiller) :quelle unité FFTW dois-je prendre pour Delphi 2006 ? J'en ai trouvé plusieurs versions sur le web.
    aucune idée.

    Citation Envoyé par mbsofts
    Et enfin, pourquoi une notion de nombre complexes pour du son? Comment je fais pr prendre mon octet et aboutir à mon tableau de puissances en fonction de la fréquence ?
    Ah... toujours la bonne vieille meme question. En fait, l'algo de la FFT est un calcul de DFT complexe.

    Et c'est plus simple/rapide de faire une FFT (donc réel+complexe) puis virer la partie complexe que de calculer seulement une DFT réelle.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 89
    Points : 37
    Points
    37
    Par défaut
    Oui ca paraît simple comme cela.
    Mais quelle est la méthode à employer?

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 89
    Points : 37
    Points
    37
    Par défaut
    je suis un peu perdu. J'ai trouvé ca :
    http://www.programmersheaven.com/dow.../download.aspx

    Est-ce que je suis sur la bonne voie ?
    Quelle procédure dois-je utiliser ? Merci de votre aide sincèrement; car j'ai du mal à saisir.

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 89
    Points : 37
    Points
    37
    Par défaut
    Du nouveau, j'essaie de pas trop vous demander de trucs et j'essaye de cibler le + possible mes questions pour vous éviter de n'avoir trop de choses à m'expliquer :

    J'ai à l'heure actuelle un tableau d'octets d'une taille de 512 issu d'un fichier son WAVE. Le but est de créer, je le rappelle un Vumetre d'une certaine fréquence.

    Ce tableau (array of Byte pour du 8 bits) je le lis et je transmet ses valeurs dans la partie imaginaire de mon paquet record :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      TComplex = packed record
        Re: TFloat; 
        Im: TFloat;
    ca donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var
       FFTSource, FFTDest               : array of TComplex;
     
    SetLength(FFTSource, FSampleIntervalMeasure);
       SetLength(FFTDest  , FSampleIntervalMeasure);
     
       for nI := 0 to FSampleIntervalMeasure-1 do begin
          FFTSource[nI].Re := nI;
          FFTSource[nI].Im := Buf8[nI];
       end;
    Je transmet ca ensuite dans la fonction ForwardFFT que j'ai récupérée ici.

    J'obtiens un tableau de valeurs, mais j'avoue ne rien comprendre à ce qu'il représente donc voilà, help me please ! J'espère toucher le but ! Comment extraire que LA fameuse fréquence que je veux suivre ? Par exemple suivre l'évolution de la fréquence 4560 hertz ?

    Merci de votre aide

  12. #12
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Tu avais toi-même posté un lien qui répond a ta question:

    http://www.unilim.fr/pages_perso/jea...t.htm#section4

    (point 6)
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 89
    Points : 37
    Points
    37
    Par défaut
    oui c'est exact, il y a tout dans ce document très bien fait d'ailleurs !
    Seul hic, je n'ai pas la fréquence de Nyquist, du moins, elle est fausse ! Cela veut-il donc dire que je me suis trompé ? ou bien que j'ai une mauvaise librairie FFT ?

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 89
    Points : 37
    Points
    37
    Par défaut


    Je pensais avoir réussi et bien non, j'ai généré un signal sinusoidal comme ci-dessus avec SoundForge Démo. LA fréquence de la sinusoide est de 5770 Hz. J'ai regardé le contenu de mon tableau après application de la fonction FFT (je devrai donc avoir un listing des fréquences avec un 0,0xx de représentation dans mon signal mis à part pour le fameux 5770 Hz et bien non; avec une fonction (ForwardFFT) j'ai des 0.0xx partout; avec l'autre (InverseFFT), j'ai des valeurs partout !!!

    Merci de m'aider et si quelqu'un a une fonction FFT sous Delphi qui fonctionne, je suis preneur pour réessayer.

  15. #15
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       for nI := 0 to FSampleIntervalMeasure-1 do begin
          FFTSource[nI].Re := nI;
          FFTSource[nI].Im := Buf8[nI];
       end;
    Delphi c'est pas trop mon truc, mais je pense que y a comme une erreur.

    Ton signal d'origine est réel (comme la plupart des signaux physique). Donc tu dois initialiser ton tableau en mettant les octets de ton signal dans la partie reelle et mettre la partie imaginaire a 0.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 89
    Points : 37
    Points
    37
    Par défaut
    oui j'ai effectivement vu cela, et c'est déjà corrigé merci

  17. #17
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 89
    Points : 37
    Points
    37
    Par défaut
    voici mon code actuel:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    SetLength(FFTSource, FSampleIntervalMeasure);    
    SetLength(FFTDest  , FSampleIntervalMeasure);  
     
    for nI := 0 to FSampleIntervalMeasure-1 do begin
          FFTSource[nI].Re := Buf8[nI];  
          FFTSource[nI].Im := 0;         
    end;
     
    FFTs.ForwardFFT(FFTSource,FFTDest,FSampleIntervalMeasure);
    SetLength(TabFreq, FSampleIntervalMeasure div 2);
     
    nI  := 0;
    nI2 := 0;
    while nI < FSampleIntervalMeasure do
    begin
            if FFTDest[nI].Re > 0 then begin
               TabFreq[nI2].Freq  := trunc((44100 * nI) / FSampleIntervalMeasure);
               TabFreq[nI2].Count :=  sqrt(FFTDest[nI].Re*FFTDest[nI].Re);
               Inc(nI2, 1);
    end;
    Inc(nI, 1);
     
    end;
    1) Je transmet mon tableau d'octets à mon tableau de complexes. Ma valeur réelle correspond à mon octet, ma valeur imaginaire vaut 0.

    2) J'execute la fonction ForwardFFT qui est censée appliquer la transformée de fourier.

    3) Je construit un tableau censé contenir pour chaque fréquence (freq) en Hz, sa représentativité dans le signal (count)

    Voilà, je ne comprend pas pourquoi ce n'est pas bon... est-ca ma fonction qui est fausse ?? Car je n'ai pas la fréquence de Nyquist juste ! (je rappelle, cette constante se trouve à l'indice n/2 du tableau et correspond à la moitié du taux d'échantillonnage du son utilisé).

    Merci de votre aide

  18. #18
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    1/ tu dois parcourir ton tableau seulement entre 0 et FSampleIntervalMeasure/2. La seconde moitié du tableau contient des frequences "negatives" (merci la FFT complexe) qui n'existent pas dans ton signal réel.

    2/ la contribution pour chaque frenquence c'est: Racine(reel²+imag²)

    3/ Qu'est ce que tu veux dire par "la frequence de Nyquist n'est pas juste" ?
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  19. #19
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 89
    Points : 37
    Points
    37
    Par défaut
    1) ok mais les valeurs sont mélangées... j'ai pas une moitié positive et l'autre négative...
    2) oui ok, mais mes imaginaires valent 0 ca ne sert donc à rien que je les mette ! (?)
    3) je devrais avoir pour valeur de fréquence au rang n/2 la moitié de la fréquence d'échantillonnage du son.

  20. #20
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Houla...

    Citation Envoyé par mbsofts
    1) ok mais les valeurs sont mélangées... j'ai pas une moitié positive et l'autre négative...
    Le tableau de sortie que tu recuperes contient N elements de type complexes.
    Les elements 0 a N/2 de ce tableau, representent la contribution des frequences de 0 a 44100/2.

    D'ou la formule generale, Freq[i]=44100*i/N, avec i le numero d'indice dans le tableau.

    Les elements N/2 a N de ce tableau, oublie les.

    Edit: je viens de voir que dans ton code tu as déja retaillé ton tableau de sortie, donc tu peux le parcourir entierement.
    SetLength(TabFreq, FSampleIntervalMeasure div 2);
    2) oui ok, mais mes imaginaires valent 0 ca ne sert donc à rien que je les mette ! (?)
    Les Complexes que tu as récupérés dans ton tableau de sortie n'ont pas toujours des parties imaginaires a 0. (c'est dans le tableau "d'entrée" que tu as forcé les parties imaginaires a 0)

    3) je devrais avoir pour valeur de fréquence au rang n/2 la moitié de la fréquence d'échantillonnage du son.
    C'est le cas. L'element d'indice n/2 correspond a la frequence 44100/2. Pour autant, on ne peut rien dire sur la "valeur" de l'element n/2
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 4 1234 DernièreDernière

Discussions similaires

  1. [Audio] JAVA SOUND comment ca marche?
    Par billynirvana dans le forum Multimédia
    Réponses: 3
    Dernier message: 04/11/2008, 13h03
  2. FFT IJ.plugin.FFTMath Comment ça marche ?
    Par philippe13 dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 20/06/2007, 19h11
  3. [SYNEDIT] -> Comment ça marche ?
    Par MaTHieU_ dans le forum C++Builder
    Réponses: 2
    Dernier message: 18/01/2004, 19h11
  4. [TP][Turbo Vision] comment ça marche ??
    Par Costello dans le forum Turbo Pascal
    Réponses: 7
    Dernier message: 05/08/2003, 00h24
  5. [update][req. imbriquee] Comment ca marche ??
    Par terziann dans le forum Langage SQL
    Réponses: 3
    Dernier message: 11/07/2003, 12h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo