begin process at 2010 02 10 09:38:26
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > LA TRANSFORMÉE DE FOURIER RAPIDE À UNE DIMENSION

LA TRANSFORMÉE DE FOURIER RAPIDE À UNE DIMENSION


 Information sur la source

Note :
5,5 / 10 - par 4 personnes
5,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Maths & Algorithmes Niveau :Expert Date de création :24/03/2004 Vu :6 730

Auteur : lpikachu58

Ecrire un message privé
Site perso
Commentaire sur cette source (32)
Ajouter un commentaire et/ou une note

 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;
}



 Sources du même auteur

Source avec Zip COMMUNIQUER AVEC UN GPS (MFC)
COMMUNICATION SUR RS232 AVEC UN MICROCONTROLEUR
TRANSFORMÉE DE FOURIER CLASSIQUE
Source avec Zip UNE ONDELETTE POUR LE TRAITEMENT DU SIGNAL NUMÉRIQUE
Source avec Zip UN TUTORIAL POUR LA CRÉATION DE DLL SOUS VISUAL C++ 6.0

 Sources de la même categorie

Source avec Zip OPERATION SUR LES MATRICES CARREES AVEC CLASSE GENERIQUE par chouhad
Source avec une capture OPÉRATIONS SUR MATRICES C++ par Minilogus
[DEV-C++] CALCUL DE LA RACINE CARRÉE D'UN RÉEL par Jhep
PROGRAMME QUI CALCUL LE PPCM ET LE PGCD par AnoSantino
EVALUER UNE EXPRESSION MATHÉMATIQUE par begueradj

Commentaires et avis

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.

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 !!!

Commentaire de lpikachu58 le 25/03/2004 09:38:27

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

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

Commentaire de lpikachu58 le 26/03/2004 09:05:34

pas de mal

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 !

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) !? %{

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 ?

Commentaire de lpikachu58 le 30/03/2004 09:19:44

oui mais monsieur le python ça avance pas

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.

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 !

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 ....

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)

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

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

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

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

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) ?

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 ...

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.

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!

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.

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

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 !

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)

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.

Commentaire de Late2201 le 16/09/2009 16:55:57

Salut,

Voila je m'interesse depuis peu a la transformée de Fourier dans le but de faire un filtre numérique.

Certains l'ont deja demandé mais ils n'ont pas eu de réponse alors je réessaie :p

Serait-il possible d'avoir plus de détails sur l'algo en lui-même ?

A quoi correspond le paramètre m, et comment influence-t-il l'algo ?

Merci d'avance.

Commentaire de nonoRed le 16/09/2009 17:07:02

late2201 : c'est ecrit un peu plus haut au dessus "* m est egale à log2 ( nn ) (environs deux heures pour le comprendre....) "

loicus : euh il me veut quoi le gamin ?

Commentaire de Late2201 le 17/09/2009 09:45:49

D'accord, mais on m'avait conseillé de faire une FFT et de "ne sélectionner que le composant correspondant a 50 Hertz, (en dimensionnant subtilement mes fenêtres d'analyses...".

Mais je ne vois pas comment faire ça avec cet algo, à moins que cela ne soit a faire apres...

Commentaire de nonoRed le 17/09/2009 10:48:49

faudrait me donner le contexte précis de ton exo, parceque là ca remonte à deux ans,
c'est dans une image? ou un signal electrique?

Commentaire de Late2201 le 17/09/2009 13:47:16

C'est pour le traitement d'un signal electrique

Commentaire de Late2201 le 17/09/2009 13:47:39

C'est pour le traitement d'un signal electrique

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,109 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales