Dll effectuant une transformée de fourier rapide

Soyez le premier à donner votre avis sur cette source.

Vue 7 513 fois - Téléchargée 703 fois

Description

Le programme sous nasm effectue une analyse fréquencielle par transformée de Fourier rapide. Les données d'origine sont placées dans une matrice A(2,n) avec n=2^p. A(1,1) contient la partie réelle du premier point, A(2,1) est la partie imaginaire de ce premier point. A(1,2) est la partie réelle du deuxième point et A(2,2) est la partie imaginaire.Etc...
L'appel à la fonction tfr (traitement de Long)s'effectue en donnant 3 paramètres:
- le nombre de valeurs - passage par valeur (n<=65536)
- le premier élément du tableau A(1,1)- passage par référence
- le sens de la transformation (sens direct valeur positive, sens inverse valeur négative) - passage par valeur
Pour la fonction tfrf (flottants simple précision)le nombre de valeurs doit être inférieur à 2^30

Conclusion :


J'ai créé cette dll pour analyser les fichiers wav. Les données sonores sont sauvegardées sous forme de word "voix gauche","voix droite" par point de mesure.
La dll demande 2 dwords par point (partie réelle, partie imaginaire )- La variable contenant les valeurs est modifiée et contient la transformée (partie réelle et imaginaire) au retour.

Dim A(1 To 2, 1 To 65536) As Long rem A(i,j)doit être compris entre -32768 et 32767

Call tfr(65536, A(1, 1), 0) rem appel de la fonction pour une transformée direct
Call tfr(65536, A(1, 1), -1) rem appel de la fonction pour une transformée inverse

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cs_Nasman
Messages postés
202
Date d'inscription
mardi 17 mai 2005
Statut
Membre
Dernière intervention
29 septembre 2008
-
J'ai oublié de préciser que le nombre de valeurs doit être une puissance de deux. A priori la dll devait fonctionner à partir de n=2 mais celà n'aurait pas beaucoup de sens. L'algorythme utilisé est décrit dans le document suivant

http://membres.lycos.fr/huckphilippe/fft.zip

La permutation des indices à la fin des calculs doit s'effectuer en utilisant une variable intermédiaire pour éviter une double permutation. Par exemple pour 16 valeurs:
0 0000 permute avec 0 0000
1 0001 8 1000
2 0010 4 0100
3 0011 12 1100
4 0100 2 0010
5 0101 10 1010
6 0110 6 0110
7 0111 14 1110
8 1000 1 0001
9 1001 9 1001
10 1010 5 0101
11 1011 13 1101
12 1100 3 0011
13 1101 11 1011
14 1110 7 0111
15 1111 15 1111

Permuter sur la moitié des indice ne permet pas de résoudre le problème: la permutation de 2 donnerait 4 qui redonnerait 2
cs_bicoun
Messages postés
2
Date d'inscription
jeudi 3 juillet 2003
Statut
Membre
Dernière intervention
30 juin 2017
-
Ca tourne tres bien, et surtout tres vite (rien a voir avec certain bout de code en C).

Mais j'ai du mal a interprétrer les résultats de mon essai:Je rentre un signal composé de 2 sinus (f0 200Hz et f1 1000Hz)
Après le passage dans la fct de FFT, je trouve bien 2 raies , mais à 4 fois la fréquence (800 et 4000 Hz).J'ai pris un DeltaF de VitesseDigit / NbPoints 1e6 / 65536 15.3 Hz
pour reconstruire mon echelle en fréquence.

Quelqu'un a une idée pour expliquer et corriger ce facteur 4?
Merci pour vos réponses.
cs_Nasman
Messages postés
202
Date d'inscription
mardi 17 mai 2005
Statut
Membre
Dernière intervention
29 septembre 2008
-
Bonjour BICOUN,

La formule pour trouver la fréquence en fonction de l'indice est la suivante:

f=indice*Fe/n
où Fe est la fréquence d'échantillonnage de ton signal et n le nombre de points mesurés (puissance de 2)

Si tu effectue un échantilonnage à 44100Hz durant 0,5s, tu auras 0,5*44100 =22050 mesures dont seules 16384 seront utilisées - soit une durée utile de 16384/44100 = 0,371s. Ton pas temporel sera de 1/44100 = 22,68µs.
Si au sortir de ta transformation de Fourier tu a un pic à l'indice i=372 alors la fréquence correspondante sera de
f 372*44100/16384 1001,29Hz
Ton pas fréquenciel est de 44100/16384 = 2,69Hz
Pour améliorer la résolution tu peux:
- augmenter la durée (nombre de points) pour la même fréquence d'échantillonnage
- diminuer la fréquence d'échantillonnage (pour la même durée)
Il faut faire attention au fait que l'analyse n'est valable que jusqu'à Fe/2 (ici 22050 Hz), si tu réduit la fréquence d'échantillonnage à 8000 Hz (par exemple), ta résolution sera de 0,488 Hz mais ton analyse spectrale sera limité à 4000Hz

J'espère que ces explication te permettrons de voir l'origine de ton pb

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.