Fast fourier transform

Signaler
Messages postés
295
Date d'inscription
dimanche 4 mai 2003
Statut
Membre
Dernière intervention
6 décembre 2010
-
Messages postés
295
Date d'inscription
dimanche 4 mai 2003
Statut
Membre
Dernière intervention
6 décembre 2010
-
Salut.
J'ai pris une source de fft mais je n'ai pas compris un truc:
Je me retrouve avec deux tableaux de sortie (reel et imaginaire en floats).
Je n'ai pas comrpis comment et dans quelle ordre ercuperer les frequence svp.
Que signifie ceci:

for (i=0;i<1024;i++){
mag=(float)(sqrt(pow(RealOut[i],2)+pow(ImageOut[i],2)));
freq=(float)((44100*(i+1))*2);
   freq/=Buffer.dwBufferLength;
}

Merci a vous.

4 réponses

Messages postés
142
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
29 janvier 2016
1
Salut.



<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /?>
 




FFT produit une suite de vecteurs  complexes de la forme x+iy, ( i=opérateur qui appliqué à un vecteur le fait pivoter de 90° , c'est pourquoi l'appliquer 2 fois revient à multiplier par -1).



 




Le module de (x+iy)= racine carrée de (x2+y2 ) appelé ici  mag  dans la ligne 2. (théorème de Pythagore)



 




FFT agit sur une suite de valeurs d'une grandeur, prises à  intervalles égaux pendant une durée T,la fréquence associée à chaque vecteur  dépend donc de la valeur de T et du nombre de valeurs. D'où les  lignes 3 et 4.  Pour les décoder il faudrait afficher tout le code : on utile parfois des artifices de calcul pour gagner de la place ou du temps.



 J'espère que celà répond à la question.
Messages postés
295
Date d'inscription
dimanche 4 mai 2003
Statut
Membre
Dernière intervention
6 décembre 2010

Donc je recupere les valeurs des tableaux RealOut et ImagOut.

//Je fais une boucle de 1024
for (i=0;i<1024;i++){
//je calcule le module
mag=(float)(sqrt(pow(RealOut[i],2)+pow(ImageOut[i],2)));

//ensuite l'amplitude pour chaque frequence de i ?

freq=(float)((44100*(i+1))*2);
   freq/=Buffer.dwBufferLength;
}
Messages postés
142
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
29 janvier 2016
1
module =amplitude
En principe il  faut creer deux vecteurs un pour l'amplitude  mag [n] et un pour la fréquence freq[n].
Et dans la boucle remplacer mag par mag[i] et freq par freq[i]  pour obtenir un spectre de fréquences.
Messages postés
295
Date d'inscription
dimanche 4 mai 2003
Statut
Membre
Dernière intervention
6 décembre 2010

Salut.
Micro eteint je trouve
 pendant la boucle i= 2 je fais une pause:

mag[i]=(float)(sqrt(pow(RealOut[i],2)+pow(ImageOut[i],2)));
freq[i]=(float)((44100*(i+1))*2);
   freq[i]/=Buffer.dwBufferLength;

mag[i]= 399414.
freq[i]=258.398

Je ne comprend pas , le micro est sur off je devrais avoir 0.
Merci .