begin process at 2012 02 08 09:03:02
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > FAST FOURIER TRANSFORM

FAST FOURIER TRANSFORM


 Information sur la source

Note :
Aucune note
Catégorie :Maths & Algorithmes Niveau :Débutant Date de création :03/04/2005 Date de mise à jour :08/04/2005 10:13:46 Vu / téléchargé :16 713 / 1 180

Auteur : Jarod1980

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

 Description

Un petit exemple de la FAST FOURIER TRANSFORM sur la fonction f(x) = x*(1-x).

N'hésitez pas à mettre des commentaires. Si vous avez des idées pour améliorer mon code n'hésitez pas non plus.

Source

  • // FAST FOURIER TRANSFORM
  • // Exemple de la FFT sur la fonction f(x) = x*(1-x)
  • #include <stdio.h>
  • #include <stdlib.h>
  • #include <math.h>
  • #define swap(a,b) norm=(a); (a)=(b); (b)=norm
  • //reel[] et imag[i] sont la liste des réelles et des imaginaires
  • // sign = 1 donne la transformée de Fourier
  • // sign = -1 donne la transformée de Fourier inverse
  • void fft(double *reel, double *imag, int log2n, int sign) {
  • int n, m, m2, i, j, k, l;
  • double c1, c2, norm, norm2, cphi, sphi;
  • n = 1<<log2n;
  • /* Inversement des bits */
  • for(i=0; i<n; i++) {
  • for(j=log2n-1, m=0, k=i; j>=0; j--, k>>=1) m += (k&1)<<j;
  • if(m>i) {
  • swap(reel[i],reel[m]);
  • swap(imag[i],imag[m]);
  • }
  • }
  • /* normalisation de la transformée de Fourier */
  • norm = 1.0/sqrt((double)n);
  • for(i=0; i<n ;i++) {
  • reel[i] *= norm;
  • imag[i] *= norm;
  • }
  • /* calcul de la FFT */
  • for(j=0; j < log2n; j++) {
  • m = 1<<j; m2 = 2*m;
  • c1 = 1.0;
  • c2 = 0.0;
  • cphi = cos(sign*2.0*M_PI/((double)m2));
  • sphi = sin(sign*2.0*M_PI/((double)m2));
  • for(k=0; k<m; k++) {
  • for(i=k; i<n; i+=m2) {
  • l = i + m;
  • norm = c1*reel[l] - c2*imag[l];
  • norm2 = c1*imag[l] + c2*reel[l];
  • reel[l] = reel[i] - norm;
  • imag[l] = imag[i] - norm2;
  • reel[i] += norm;
  • imag[i] += norm2;
  • }
  • norm = c1*cphi - c2*sphi; // Calcul de exp(2 pi k/m) avec
  • norm2 = c1*sphi + c2*cphi; // le théorème d'addition
  • c1 = norm; c2 = norm2;
  • }
  • }
  • }
  • int main(int argc, char *argv[])
  • {
  • int n=16, k=4, i;
  • double re[16], im[16];
  • double h,x;
  • FILE *fichier;
  • fichier = fopen("FFT.dat","w");
  • h = 1.0/(n-1);
  • printf("Calcul des Points:\n");
  • for(i=0; i<n; i++) {
  • x = h*i;
  • re[i] = x*(1-x);
  • im[i] = 0;
  • printf(" % lf %+lf i\n",re[i],im[i]);
  • }
  • fft(re,im,k,+1);
  • printf("Transformation:\n");
  • for(i=0; i<n; i++) {
  • printf(" % lf %+lf i\n",re[i],im[i]);
  • fprintf(fichier,"%d %lf %lf\n",i,re[i],im[i]);//on enregistre dans FFT.dat
  • }
  • fclose(fichier);
  • fft(re,im,k,-1);
  • printf("FFT inverse:\n");
  • for(i=0; i<n; i++) {
  • printf(" % lf %+lf i\n",re[i],im[i]);
  • }
  • system("PAUSE");
  • return 0;
  • }
// FAST FOURIER TRANSFORM
// Exemple de la FFT sur la fonction f(x) = x*(1-x)

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define  swap(a,b)  norm=(a); (a)=(b); (b)=norm

//reel[] et imag[i] sont la liste des réelles et des imaginaires
// sign = 1 donne la transformée de Fourier
// sign = -1 donne la transformée de Fourier inverse

void fft(double *reel, double *imag, int log2n, int sign) {
  
  int n, m, m2, i, j, k, l;
  double  c1, c2, norm, norm2, cphi, sphi;

  n = 1<<log2n;

  /* Inversement des bits */
  for(i=0; i<n; i++) {
    
    for(j=log2n-1, m=0, k=i; j>=0; j--, k>>=1) m += (k&1)<<j;
    
    if(m>i) {
      swap(reel[i],reel[m]);
      swap(imag[i],imag[m]);
    }
  }
  
  /* normalisation de la transformée de Fourier */
  norm = 1.0/sqrt((double)n);
  for(i=0; i<n ;i++) {
    reel[i] *= norm;
    imag[i] *= norm;
  }
  
  /* calcul de la FFT */
  for(j=0; j < log2n; j++) {
    m = 1<<j;  m2 = 2*m;
    c1 = 1.0; 
    c2 = 0.0;
    cphi = cos(sign*2.0*M_PI/((double)m2));
    sphi = sin(sign*2.0*M_PI/((double)m2));
    for(k=0; k<m; k++) {
      for(i=k; i<n; i+=m2) {
	l = i + m;
	norm  = c1*reel[l] - c2*imag[l];
	norm2 = c1*imag[l] + c2*reel[l];
	reel[l] = reel[i] - norm;
	imag[l] = imag[i] - norm2;
	reel[i] += norm;
	imag[i] += norm2;
      }
      norm  = c1*cphi - c2*sphi; // Calcul de exp(2 pi k/m) avec
      norm2 = c1*sphi + c2*cphi; // le théorème d'addition
      c1 = norm;  c2 = norm2;
    }
  }
  
}
int main(int argc, char *argv[])
{
  int n=16, k=4, i;
  double re[16], im[16];
  double h,x;
  FILE *fichier;
  fichier = fopen("FFT.dat","w");
  
  h = 1.0/(n-1);
  
  printf("Calcul des Points:\n");
  for(i=0; i<n; i++) {
    x = h*i;
    re[i] = x*(1-x);
    im[i] = 0;
    
    printf(" % lf %+lf i\n",re[i],im[i]);
    
  }
  
  fft(re,im,k,+1);
  printf("Transformation:\n");
  for(i=0; i<n; i++) {
    printf(" % lf %+lf i\n",re[i],im[i]);
    fprintf(fichier,"%d %lf %lf\n",i,re[i],im[i]);//on enregistre dans FFT.dat
  }
  fclose(fichier);
  
  fft(re,im,k,-1); 
  printf("FFT inverse:\n");
  for(i=0; i<n; i++) {
  printf(" % lf %+lf i\n",re[i],im[i]);
  }
  system("PAUSE");	
  return 0;
}


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  • FFT.pdfTélécharger ce fichier [Réservé aux membres club]100 332 octets

Télécharger le zip


 Historique

08 avril 2005 10:13:46 :
Ajout d'un fichier PDF explicatif de la FFT avec rappels sur la Transformée de Fourier, etc...

 Sources du même auteur

Source avec une capture FRACTALE NEWTON-RAPHSON VERSION GLUT
TRANSFORMEE DE FOURIER DISCRETE
Source avec une capture FRACTALE TREE (ARBRE) VERSION GLUT
Source avec une capture COURBE DE GUMOWSKI & MIRA VERSION GLUT
Source avec une capture COURBE DE GUMOWSKI-MIRA

 Sources de la même categorie

Source avec Zip UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture CHIFFREMENT DE VIGENERE par lajouad
Source avec Zip Source avec une capture ANALYSE SYNTAXIQUE par lajouad
Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture DESSINER UNE ARBRE BINAIRE( MODE CONSOLE): par benzarabel

Commentaires et avis

Commentaire de luhtor le 03/04/2005 16:57:52

La FFT, elle a besoin de calculer les coefficients de fourrier ?
Pour les calculer, c'est un calcul d'intégrale, et j'arrive pas à comprendre ou est ce que tu fais ce calcul.
J'ai du mal à comprendre la fonction, tu pourrais détailler un peu ? car j'aimerais bien l'utiliser, mais je voudrais d'abord savoir comment elle fonctionne pour pouvoir l'adapter.

Merci

Commentaire de Arnaud16022 le 05/04/2005 14:27:30

idem...
le systeme est utilisable sur n'importe quelle fonction ou crée/optimisé spécialement pour celle la?

Commentaire de Jarod1980 le 05/04/2005 15:16:55

Pour ce qui est de l'explication de la FFT je vais mettre dès que j'ai un peu de temps un PDF explicatif avec toutes les formules. Cette routine FFT est utilisable avec n'importe quelle fonction. Ici j'ai choisis comme exemple f(x) = x*(1-x) mais vous pouvez utiliser une autre fonction, par exemple :

sin(2*M_PI*3*i/((double)n)) + 1.0;

Commentaire de Arnaud16022 le 05/04/2005 21:44:18

yeah
vive adobe
je l'attends avec impatience
:)

Commentaire de Arnaud16022 le 19/04/2005 22:07:28

je viens de dl le pdf (c pas trop tot..)
c'est bien galère
je vais regarder ca mais les intégrales et moi ca fait au mois 10
merci qd meme
ad

Commentaire de jujubilation le 19/05/2005 05:11:30

Pourrais tu mettre ton pdf sur un serveur libre ... Ca serait genial ( mon sujet de stage est proche de la FFT et etant a l'etranger il est difficile pour moi de devenir membre) D'ailleur ils en profitent bien pour se faire de la thune sur notre dos ...C'est + proche de win que de linux...

Commentaire de ulrichomon le 25/02/2006 21:57:36

Le pdf que tu a mis concerne la DFT(discrete Fourier Transform) et non la FFT(Fast Fourier Transform)
Voila les liens ou sont expliqués :
la DFT:http://www.spectrumsdi.com/ch8.pdf
la FFT:http://www.spectrumsdi.com/ch12.pdf
Ces pdf expliquent relativement bien comment tout cela marche.

Commentaire de Manu_tbb le 07/03/2006 11:43:12

bonjour, je trouve ce code tres interessant, je voudrais savoir si je  peux y apporter des modification afin de traiter que des signaux à valeur reel et si oui quelles modification dois-je apporter.
merci
cordialement

Commentaire de thinkdifferent le 08/03/2006 10:15:30

Est ce que quelqu'un a essayé la librairie FFTW (fftw.org)...
j'essai actuellement mais je comprend pas trop trop... si quelqu'un la connait et pouvait en faire un exemple comme celui-ci dessus ca serait genial...

:)
merci

Commentaire de supergrey le 05/10/2006 13:56:17

C'est quoi k=4 ?
Est-ce qu'on peut trouver la fondamentale dun signal avec cette source et comment?

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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,936 sec (3)

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