Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

LA TRANSFORMÉE DE FOURIER RAPIDE À UNE DIMENSION


Information sur la source

Description

La transformée de Fourier rapide qui réduit l'algorithme de Fourier en 2 log(2) au lieu de 2^N. elle peut etre utiliser en traitement du signal ou autre application mathématique


 

Source

  • bool FFT(int dir,int m,double *x,double *y)
  • {
  • long nn,i,i1,j,k,i2,l,l1,l2;
  • double c1,c2,tx,ty,t1,t2,u1,u2,z;
  • /* Calculate the number of points */
  • nn = 1<<m;
  • /* Do the bit reversal */
  • i2 = nn >> 1;
  • j = 0;
  • for (i=0;i<nn-1;i++) {
  • if (i < j) {
  • tx = x[i];
  • ty = y[i];
  • x[i] = x[j];
  • y[i] = y[j];
  • x[j] = tx;
  • y[j] = ty;
  • }
  • k = i2;
  • while (k <= j) {
  • j -= k;
  • k >>= 1;
  • }
  • j += k;
  • }
  • /* Compute the FFT */
  • c1 = -1.0;
  • c2 = 0.0;
  • l2 = 1;
  • for (l=0;l<m;l++) {
  • l1 = l2;
  • l2 <<= 1;
  • u1 = 1.0;
  • u2 = 0.0;
  • for (j=0;j<l1;j++) {
  • for (i=j;i<nn;i+=l2) {
  • i1 = i + l1;
  • t1 = u1 * x[i1] - u2 * y[i1];
  • t2 = u1 * y[i1] + u2 * x[i1];
  • x[i1] = x[i] - t1;
  • y[i1] = y[i] - t2;
  • x[i] += t1;
  • y[i] += t2;
  • }
  • z = u1 * c1 - u2 * c2;
  • u2 = u1 * c2 + u2 * c1;
  • u1 = z;
  • }
  • c2 = sqrt((1.0 - c1) / 2.0);
  • if (dir == 1)
  • c2 = -c2;
  • c1 = sqrt((1.0 + c1) / 2.0);
  • }
  • /* Scaling for forward transform */
  • if (dir == 1) {
  • for (i=0;i<nn;i++) {
  • x[i] /= (double)nn;
  • y[i] /= (double)nn;
  • }
  • }
  • return true;
  • }
bool FFT(int dir,int m,double *x,double *y)
{
	long nn,i,i1,j,k,i2,l,l1,l2;
	double c1,c2,tx,ty,t1,t2,u1,u2,z;

	/* Calculate the number of points */
	nn = 1<<m;

	/* Do the bit reversal */
	i2 = nn >> 1;
	j = 0;
	for (i=0;i<nn-1;i++) {
		if (i < j) {
			tx = x[i];
			ty = y[i];
			x[i] = x[j];
			y[i] = y[j];
			x[j] = tx;
			y[j] = ty;
		}
		k = i2;
		while (k <= j) {
			j -= k;
			k >>= 1;
		}
		j += k;
	}

	/* Compute the FFT */
	c1 = -1.0;
	c2 = 0.0;
	l2 = 1;
	for (l=0;l<m;l++) {
		l1 = l2;
		l2 <<= 1;
		u1 = 1.0;
		u2 = 0.0;
		for (j=0;j<l1;j++) {
			for (i=j;i<nn;i+=l2) {
				i1 = i + l1;
				t1 = u1 * x[i1] - u2 * y[i1];
				t2 = u1 * y[i1] + u2 * x[i1];
				x[i1] = x[i] - t1;
				y[i1] = y[i] - t2;
				x[i] += t1;
				y[i] += t2;
			}
			z =  u1 * c1 - u2 * c2;
			u2 = u1 * c2 + u2 * c1;
			u1 = z;
		}
		c2 = sqrt((1.0 - c1) / 2.0);
		if (dir == 1)
			c2 = -c2;
		c1 = sqrt((1.0 + c1) / 2.0);
	}

	/* Scaling for forward transform */
	if (dir == 1) {
		for (i=0;i<nn;i++) {
			x[i] /= (double)nn;
			y[i] /= (double)nn;
		}
	}

   return true;
}

Commentaires et avis

signaler à un administrateur
Commentaire de lpikachu58 le 24/03/2004 14:26:04

Ah oui encore une précision c'est l'algorithme d'ashley et cohl qui utilise l'algo du papillon.

signaler à un administrateur
Commentaire de LordBob le 24/03/2004 21:06:24

je suis contre les MFC, mais la je n'ai rien d'autre a dire que BRAVO !!!
excelente source !!!

signaler à un administrateur
Commentaire de lpikachu58 le 25/03/2004 09:38:27

merci mais la c'est du C tout a fait standart

signaler à un administrateur
Commentaire de LordBob le 25/03/2004 16:48:19

excuse moi c'est parce que en fait je me suis trompé de source !!! (j'ai honte) désoler

signaler à un administrateur
Commentaire de lpikachu58 le 26/03/2004 09:05:34

pas de mal

signaler à un administrateur
Commentaire de MangaII le 29/03/2004 12:49:49

Salut !
J'ai qques lacunes en math ! malgrès mon BTS info !
Si mes souvenirs son bons, la transformée de fourier appliquée à un signal sonore te permet d'avoir les fréquences des armoniques !
Donc, le spectre du son !
donc, à la compression MP3 ! enfin ! c'est pas la que je ve en venir !

Je voulais savoir si ton code permet de retrouver les armoniques d'un son à un instant T (ou sur qques ms), en vue de faire un spectre, ou seulement pour déctecter une certaine fréquence (les basses en particulier).
Merci d'avance !
A+ NICO !

signaler à un administrateur
Commentaire de soumpro le 29/03/2004 18:25:39

Ce code tient en 4 lignes en python  !
lol !
Mais tes anglophone ou koi ?
(hum) !? %{

signaler à un administrateur
Commentaire de MangaII le 29/03/2004 23:03:25

Merci du renseignement ! mais ca m'avance pas beaucoup !
Si c'est si cours, tu pourrai le fournir !
et c'est koi le rapport avec l'anglais ?

signaler à un administrateur
Commentaire de lpikachu58 le 30/03/2004 09:19:44

oui mais monsieur le python ça avance pas

signaler à un administrateur
Commentaire de lpikachu58 le 30/03/2004 09:25:29

Pour Manga 2 la trans formée de fourier est une intégration en exponentielle sur plus ou moins l'infini. Donc si tu veux faire une FFT d'un signal sonore il faut le stocker puis faire sur son intégralité et virer les fréquences inaudibles par exemple. Cependant dans l'espace de fourier tu perds toutes informations sur le temps T.

signaler à un administrateur
Commentaire de MangaII le 30/03/2004 16:17:24

c'est sympa tout ca ! mais ca m'avance pas bcp !
pou résumer, je cherche un petit bout de code (en C++ de préférence), qui permet de détecter les amplitutes de certaines fréquences à un instant T sur un signal sonore numérisé (format wave).
Le but principal est de déctecter les basses (évidemment)
Merci bcp !

signaler à un administrateur
Commentaire de Maegis le 31/03/2004 07:00:45

http://astronomy.swin.edu.au/~pbourke/analysis/dft/
&lt;--- Source d'origine. C'est tout du recopié à la virgule prêt alors ce serais bien de preciser au debut ou tu as pris le code ....

signaler à un administrateur
Commentaire de Maegis le 31/03/2004 07:05:55

Au final, en regardant dans les codes que t'as poster, il n'y en a pas beaucoup que tu as ecrit de ton propre chef
Si tout le monde postait tout les codes utiles qu'il trouverait sur internet par ci par la , il y aura des montagnes de trucs tout en anglais, pas forcement expliqué ni bien commenté.
Au final ça fait un peu, le gars qui poste des codes pour en avoir plus memem s'il comprend pas ce qu'il poste (je ne veut pas dire que tu ne comprends pas ce que tu postes mais c'est une impression que ça pourrait donner)

signaler à un administrateur
Commentaire de lpikachu58 le 31/03/2004 13:13:51

si tu veux en transformée temps fréquence position utilise la transformée en ondelette

signaler à un administrateur
Commentaire de roomsmush le 02/04/2004 15:40:45

c pas sympa ce que tu dis maegis, pour des gens qui se contentent de se rendre sur cppfrance, c sympa de trouver des codes utiles même si les auteurs les ont recopié, moi je suis bien content de l'avoir trouvé ici ce code mais c vrai que t'aurais pu mieu expliquer leur code lpikachu58

signaler à un administrateur
Commentaire de lpikachu58 le 05/05/2004 10:38:09

maegis t'es toujours aussi con à ce que je vois. Toi tu préfères réinverter la roue à chaque fois alors que ce n'est pas utile

signaler à un administrateur
Commentaire de Maegis le 05/05/2004 14:32:09

1) : un peu de modération, si tu regardes la charte tu verra qu'il faut eviter les insultes. Le seul point négatif que je t'ai signalé c'est que tu n'as pas dit d'ou ça venait, je ne t'ai pas insulté et je ne pense pas que tu ne comprennes pas ce code.
2)Au contraire de ce que tu crois, je pense que pour bien comprendre le fonctionnement d'un programme, il est necessaire, non peut etre pas de le refaire depuis zero, mais au moins d'en comprendre le principe. Ca s'appelle de la curiosité, quand je vois un truc, je veux savoir comment ça marche, et ça peut passer par le fait de refaire toute la reflexion toi même, ça te permet de mieux comprendre le truc. Bien entendu, ça ne veut pas dire que je n'utilise pas de bibliotheques ou des bouts de code d'autres gens qui on passé du temps dessus d'ou une certaine optimisation.
Exemple : Si tu regardes dans le site, il y a un gars qui a réécrit les fonction de math.h dont les ln, les exp les sin etc... je ne pense pas que beaucoup de gens vont prendre son code et l'utiliser à la place  des fonctions standards mais ne me dis pas que ça ne t'interesse pas de savoir comment on fait pour calculer un ln etc ...
De même, pour compresser des données, je suis d'accord pour utiliser une biblio bien optimisée et tout ça , mais c'est bien de savoir les differentes methodes de compression et leur mise en oeuvre, ce serait quand meme bete de s'en priver :)
En gros ça permet une meilleure connaissance des méthodes de programmation et du fonctionnenemt interne. Mais tout refaire tout seul depuis le début et ne pas utiliser des choses faites par des autres personnes, la je suis d'accord avec toi, ce n'est pas le mieux qu'on puisse faire

signaler à un administrateur
Commentaire de jul39dole le 18/11/2004 18:53:24

Comment utilise-t-on concrètement cette fonction ? (à quoi correspondent les variable dir, m, *x et *y) ?

signaler à un administrateur
Commentaire de ElectronBreton le 17/03/2005 11:28:43

Pour Manga II > Si tu veux faire de la transformée temps fréquence, il faut que tu t'intéresse à la transformée de WiegnerVille. Ca doit pouvoir se trouver sans trop de problèmes sur "Numerical Recipes In C"

Par contre, la transformée de fourier peut s'avérer amplement suffisante pour détecter des fréquences sur un intervalle de temps ~100 fois supérieur à ta fréquence d'échantillonnage (44,1 kHz à tout les coups ...). Tout dépend de la précision que tu souhaites ...

signaler à un administrateur
Commentaire de Aida_81 le 31/03/2005 00:50:40

Bonsoir,

Si tu peux expliquer ton code, l utilité de chaque variable utilisée ca serait bien, si c est possible.
Merci.
Aida.

signaler à un administrateur
Commentaire de nonoRed le 27/12/2005 13:53:09

bonjour tout le monde, au bout de deux heures de test en tout genre j'ai reussi à comprendre que :
* x et y servent pour stocker le resultat et le tableau d'orgine :
- x est le tableau des parties reelles
- y est le tableau des parties imaginaires
(encore là ca va, ca m'a pris deux secondes)

* nn est le nombre de points total dans le tableau (traduction de l'anglais)

* m est egale à log2 ( nn ) (environs deux heures pour le comprendre....)

* un code commenté s'est vachement bien!

signaler à un administrateur
Commentaire de JCDjcd le 22/05/2007 16:12:17

Bon bon bon ...

(1) bizarre cette transformee de fourrier rapide ... pas de fonction recursive ... aucun signe de racine-nieme de l'unite ... Enfin bon si ca marche, moi je veux bien. Mais d'habitude on voit l'algorithme en recursif, alors il serait bon de le preciser.

(2) une petite question (meme si je sais que cette source date un peu), avez-vous (je parle aussi bien de l'auteur que des downloaders de cette "source") une fois dans votre vie teste cette fonction ? j'etends par la, regarder si elle marche, si (sans trop etre vulgaire ou mal poli) elle ne serait pas buggee ?

(3) une grande question : avez-vous verife la complexite ? il suffirait de tracer le temps de calcul en fonction de N ... c'est ce sont des choses interessantes et convainquantes quant a la validite du programme.

(4) En lisant les commentaires sur les "reinventeurs de poudres", et bien moi je donne 100% raison a ceux qui reprogramme par eux-meme les choses, car c'est comme cela que l'on apprend, car en poussant l'argument adverse (c'est de la mauvaise foi, je vous l'accorde, mais ca se tient) pourquoi apprendre le C++ par un hello-world ?? ca a deja etet fait 100 millions de fois, alors pourquoi ne pas commencer par les choses difficiles... De plus vous oubliez une chose tres important (sans etre le paranoique de service) mais beaucoup de code copie sont FAUX, plein de bug, donc il y a un certain merite a refaire ce qui exixte a sa propre sauce.

(5) si vous vous dites "mais pour qui il se prend", je vais vous repondre : "pour un petit merdeux" (je crois que la charte n'interdit pas de s'auto-insulter :) )

(6) pour des preuves "graphiques" de complexite : http://www.cppfrance.com/codes/MULTIPLICATION-POLYNOMES-LOG_32745.aspx
avec en plus une application : la multiplication en n.log(n) de polynome de degre n

(7) je trouve cette source nulle

(8) un peu plus de commentaires aurait ete pas mal ... et en francais car cppFRANCE.com ...

cordialement le merdeux de service.

signaler à un administrateur
Commentaire de loicus le 24/05/2007 09:23:31

En réponse à nonoRed :

si il te faut 2 heures pour comprendre que m est log2 de nn : tu ne dois pas être un grand mathématicien... ;)

ligne 7 :
nn = 1<<m;  --> nn = 2^m --> m = log2 nn

il m'a fallu 4sec

bonne continuation quand même

signaler à un administrateur
Commentaire de nonoRed le 24/05/2007 09:39:12

LOICUS : :)) j'aime bien les mecs qui pensent tout savoir, alors qu'en fait ils sont à coté de la plaque...
tu sais ce que c'est le second degré? pas celui des maths je precise!!!!
nan?
pas etonnant! un geek comme toi devrait trouver son bonheur wikipedia !

signaler à un administrateur
Commentaire de The Incredible Godzy le 25/05/2007 17:26:51

C'est marrant la discussion reprend 1 an et demi plus tard comme si de rien n'était...

Toujours est-il que si la première partie du code est "magique", elle marche super bien et je connaissais pas l'algo, en revanche le reste j'y comprend strictement rien, et je vois pas comment on se passe des racines n-ièmes de l'unité dans le calcul de fourier.

Et puis bon... je sais que je suis un noob du C, mais quand même... meme algorithmiquement... sans commentaires c'est impanable (à moins de connaître déjà l'algo, et dans ce cas ça sert à rien de lire ce code...).

Ah oui dernière chose, chez moi il plante avec un segmentation fault quand on teste! (mais bon y'a des choses bizarres qui se passent avec DevCpp chez moi alors... :p)

signaler à un administrateur
Commentaire de The Incredible Godzy le 25/05/2007 17:31:58

Au fait la FFT permet de passer de n^2 (et pas 2^n) à n(log(n))... contrairement à ce qui est dit en haut.

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,250 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.