Fft (transformée de fourier rapide)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 43 768 fois - Téléchargée 32 fois

Contenu du snippet

Comme promis, voici le code de la FFT commenté. Il n'est pas optimisé, mais tourne bien (d'autres versions de cette méthode à suivre).
Bonne lecture !

Source / Exemple :


public double[] Calcul_FFT(double[] donnees)
{
	nb_donnees	= donnees.Length;		// longueur tableau de données
	fft		= new double[nb_donnees];	// Tableau final.
	indices_fft	= new int[nb_donnees];	// tableau d'indices du Reverse Carry

	indices_fft	= Reverse_Carry(nb_donnees); // Fonction de calcul du Rev Carry

	fft_r = new double[nb_donnees];		// tableau d'indices Réels.
	fft_i = new double[nb_donnees];		// tableau d'indices Imaginaires.

	// création des tableaux Réels / Imaginaires
	for(int cptr_mixage = 0 ; cptr_mixage < nb_donnees ; cptr_mixage++)
	{
		fft_r[cptr_mixage] = Variables.donnees[indices_fft[cptr_mixage]];
		fft_i[cptr_mixage] = 0;
	}

	// rang de l'algorithme (Papillon) - ici, 9 pour 1024 données
	for(int rang_fft = 0, cptr_resultat = 0 ; rang_fft < 10 ; rang_fft++)
	{
		omega_fft	= Math.PI/(Math.Pow(2, rang_fft));	// calcul de Omega
		cptr_resultat	= 0;			// compteur de tableau après calcul - Initialisation

		while(cptr_resultat < 1024)		// Parcours du tableau
		{
			for(int largeur = 0 ; largeur < (int) Math.Pow(2, rang_fft) ; largeur++, cptr_resultat++)
			{
				bn_fft_ind	= cptr_resultat + (int) Math.Pow(2, rang_fft);	// Calcule l'indice des impairs
				
				fac_cos		= Math.Cos(omega_fft*largeur);	// Calcule le Cosinus
				fac_sin		= Math.Sin(omega_fft*largeur);		// Calcule le Sinus

				an_fft_r		= fft_r[cptr_resultat];			// a(n) - PAIR / REEL
				an_fft_i		= fft_i[cptr_resultat];			// a(n) - PAIR / IMAGINAIRE
				bn_fft_r		= fft_r[bn_fft_ind];			// b(n) - IMPAIR / REEL
				bn_fft_i		= fft_i[bn_fft_ind];			// b(n) - IMPAIR / IMAGINAIRE

				fft_r[cptr_resultat]	= an_fft_r + bn_fft_r*fac_cos + bn_fft_i*fac_sin;	// Partie réelle de A(k) - (somme)
				fft_i[cptr_resultat]	= an_fft_i + bn_fft_i*fac_cos - bn_fft_r*fac_sin;	// Partie imaginaire de A(k) - (somme)
				fft_r[bn_fft_ind]		= an_fft_r - bn_fft_r*fac_cos - bn_fft_i*fac_sin;	// Partie réelle de B(k) - (différence)
				fft_i[bn_fft_ind]		= an_fft_i - bn_fft_i*fac_cos + bn_fft_r*fac_sin;	// Partie imaginaire de B(k) - (différence)
			}
			cptr_resultat = bn_fft_ind+1;	// Après la fin de chaque trame (2, 4, 8, 16...), passe à la suivante
		}
	}

	//----------------------------------------------------------------------------------------------------------------------
	for(int cptr_fft = 0 ; cptr_fft < nb_donnees ; cptr_fft++)		// Boucle de calcul des Amplitudes totales.
	{
		fft[cptr_fft] = Math.Pow(fft_r[cptr_fft], 2) + Math.Pow(fft_i[cptr_fft], 2);
	}

	return fft;
}

A voir également

Ajouter un commentaire Commentaires
tulerpeton
Messages postés
3
Date d'inscription
mercredi 15 mars 2006
Statut
Membre
Dernière intervention
22 juin 2009

5 mars 2008 à 10:29
L'auteur de cet article n'a pas compris la différence entre la fréquence et la phase d'un signal. De plus, le code est incomplet et le calcul de la dernière boucle est faux.
silfrides
Messages postés
1
Date d'inscription
mercredi 3 janvier 2007
Statut
Membre
Dernière intervention
3 janvier 2007

3 janv. 2007 à 17:41
bjr.l'amplitude calculé dans la derniere boucle, quelle est son unité?
philo69
Messages postés
1
Date d'inscription
lundi 9 octobre 2006
Statut
Membre
Dernière intervention
9 octobre 2006

9 oct. 2006 à 03:01
Slt Johan
Je te propose ce lien:
www.unilim.fr/pages_perso/jean.debord/math/fourier/fft.htm

Moi aussi je pose la même question que toi!! Si t'arrives à comprendre, stp, fais moi part: gentilphilo(at)yahoo.fr
remplace (at) par @ bien sûr!
A+
lumesh
Messages postés
564
Date d'inscription
jeudi 21 février 2002
Statut
Membre
Dernière intervention
7 novembre 2008

15 oct. 2005 à 14:38
0 et 1 son les vumetres 0: gauche et 1: droit
toutiwai
Messages postés
4
Date d'inscription
samedi 6 mars 2004
Statut
Membre
Dernière intervention
6 août 2005

6 août 2005 à 00:24
Moi aussi je suis intéressé par ce "ReverseCarry" même si pense savoir ce que c'est!
Par contre j'ai une question: comment interpréter les résultats de la FFT ? Je comprendsbien qu'on recoit un tableau de la même taille que celui fourni en entrée, j'ai cru comprendre que chaque valeur correspond à l'amplitude en fonction de la fréquence (qui dépend sans doute du n° de la case dans le tableau)...
Pouvez-vous m'expliquer la signification des valeurs pour les cases 0 et 1 du tableau résultat pour, par exemple un fichier son 16bits 44100Hz avec une FFT sur 1024 bits ?
Merci d'avance!

Johan
Afficher les 9 commentaires

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.

Du même auteur (Nils_Reco_Vocale)