begin process at 2012 05 27 16:19:08
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > FFT2D, IMAGE, SPECTRE, FILTRE PASSE-BAS PASSE-HAUT

FFT2D, IMAGE, SPECTRE, FILTRE PASSE-BAS PASSE-HAUT


 Information sur la source

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Maths & Algorithmes Classé sous :fft, image, spectre, filtre, fourier Niveau :Débutant Date de création :12/07/2007 Vu / téléchargé :18 288 / 3 297

Auteur : JCDjcd

Ecrire un message privé
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (3)
Ajouter un commentaire et/ou une note


 Description

Cliquez pour voir la capture en taille normale
Petit programme qui permet de faire joujou avec la transformee de Fourier a deux dimensions
On effectue des operations sur le spectre de l'image (on le passe pas exemple dans un filtre)
puis on regarde les consequences sur l'image ... je trouve cela tres amusant !

Je donne seulement le code de la FFT2D, le reste du code source est dans main.c dans le zip

Source

  • //-------------------------------------------------
  • // FFT 1D - 2D
  • //-------------------------------------------------
  • //-------------------------------------------------
  • // calculs d'une tranformee de Fourier rapide
  • // non-normalisee sur l'ensemble des nombres
  • // dans le tableau <tab> indexes par <tab[0]>
  • // puis <tab[step]> puis <tab[2*step]> ...
  • // le nombre d'elements doit etre une puissance de deux
  • static void computing_FFT1D(P_COMPLEX res,P_COMPLEX tab,int step,int n,P_COMPLEX w)
  • {
  • if(1 == n)
  • {
  • // cas trivial
  • res->re = tab->re;
  • res->im = tab->im;
  • }
  • else
  • {
  • int k;
  • COMPLEX w2,wPowk;
  • MulComplex(&w2,w,w);
  • // diviser pour regner
  • computing_FFT1D(res,tab,2*step,n/2,&w2); // coefficients pairs
  • computing_FFT1D(res+n/2,tab+step,2*step,n/2,&w2); // coefficients impairs
  • wPowk.re = 1.;
  • wPowk.im = 0.;
  • for(k=0;k<n/2;k++)
  • {
  • // P(X) = A(X²) + X.B(X²)
  • // avec A(pair) et B(impair)
  • COMPLEX A,B;
  • A = res[k];
  • B = res[k + n/2];
  • MulComplex(&B,&B,&wPowk);
  • AddComplex(res+k,&A,&B);
  • SubComplex(res+k+n/2,&A,&B);
  • MulComplex(&wPowk,&wPowk,w);
  • }
  • }
  • } // computing_FFT1D()
  • //-------------------------------------------------
  • // effectue une transformation de Fourier rapide
  • // normalisee sur le tableau <tab> de taille
  • // <size>, une puissance de deux
  • // le resultat sera dans <res>
  • static void FFT1D(P_COMPLEX res,P_COMPLEX tab,int size,int sgn)
  • {
  • COMPLEX W;
  • int k;
  • double sqrt_size;
  • // obtention de la racine <size>-ieme de l'unite = exp(2.i.PI/size)
  • GetNthRootUnitComplex(&W,sgn,size);
  • // calcul de la FFT non-normalisee
  • computing_FFT1D(res,tab,1,size,&W);
  • // normalisation
  • sqrt_size = sqrt((double)size);
  • for(k=0;k<size;k++)
  • {
  • res[k].re /= sqrt_size;
  • res[k].im /= sqrt_size;
  • }
  • } // FFT1D()
  • //-------------------------------------------------
  • // effectue une transformation de Fourier en
  • // deux dimensions sur la matrice <mat>
  • // qui doit etre de taille n.n avec n une
  • // puissance de deux
  • // le resultat sera dans <res>
  • // on a besoin pour cette fonction d'une matrice
  • // temporaire et d'un tableau
  • // cette fonction retourne le module maximum du spectre
  • static double FFT2D(PP_COMPLEX res,PP_COMPLEX mat,int size,int sgn,PP_COMPLEX tmp,P_COMPLEX buffer)
  • {
  • double A_max2;
  • int x,y;
  • // FFT a une dimension selon les Y
  • for(x=0;x<size;x++)
  • {
  • FFT1D(buffer,mat[x],size,sgn);
  • for(y=0;y<size;y++)
  • {
  • tmp[y][x] = buffer[y];
  • }
  • }
  • // FFT a une dimension selon les X
  • A_max2 = 0.;
  • for(x=0;x<size;x++)
  • {
  • P_COMPLEX Z;
  • FFT1D(res[x],tmp[x],size,sgn);
  • Z = res[x];
  • for(y=0;y<size;y++)
  • {
  • double r2;
  • r2 = Z->re*Z->re + Z->im*Z->im;
  • if(r2 > A_max2)
  • {
  • A_max2 = r2;
  • }
  • Z ++;
  • }
  • }
  • return sqrt(A_max2);
  • } // FFT2D()
//-------------------------------------------------
// FFT 1D - 2D
//-------------------------------------------------


//-------------------------------------------------
// calculs d'une tranformee de Fourier rapide
// non-normalisee sur l'ensemble des nombres
// dans le tableau <tab> indexes par <tab[0]>
// puis <tab[step]> puis <tab[2*step]> ...
// le nombre d'elements doit etre une puissance de deux
static void computing_FFT1D(P_COMPLEX res,P_COMPLEX tab,int step,int n,P_COMPLEX w)
{
if(1 == n)
  {
  // cas trivial
  res->re = tab->re;
  res->im = tab->im;
  }
else
  {
  int     k;
  COMPLEX w2,wPowk;
  MulComplex(&w2,w,w);
  // diviser pour regner
  computing_FFT1D(res,tab,2*step,n/2,&w2); // coefficients pairs
  computing_FFT1D(res+n/2,tab+step,2*step,n/2,&w2); // coefficients impairs
  wPowk.re = 1.;
  wPowk.im = 0.;
  for(k=0;k<n/2;k++)
    {
    // P(X) = A(X²) + X.B(X²)
    //  avec A(pair) et B(impair)
    COMPLEX A,B;
    A = res[k];
    B = res[k + n/2];
    MulComplex(&B,&B,&wPowk);
    AddComplex(res+k,&A,&B);
    SubComplex(res+k+n/2,&A,&B);
    MulComplex(&wPowk,&wPowk,w);
    }
  }
} // computing_FFT1D()


//-------------------------------------------------
// effectue une transformation de Fourier rapide
// normalisee sur le tableau <tab> de taille
// <size>, une puissance de deux
// le resultat sera dans <res>
static void FFT1D(P_COMPLEX res,P_COMPLEX tab,int size,int sgn)
{
COMPLEX   W;
int       k;
double    sqrt_size;

// obtention de la racine <size>-ieme de l'unite = exp(2.i.PI/size)
GetNthRootUnitComplex(&W,sgn,size);
// calcul de la FFT non-normalisee
computing_FFT1D(res,tab,1,size,&W);
// normalisation
sqrt_size = sqrt((double)size);
for(k=0;k<size;k++)
  {
  res[k].re /= sqrt_size;
  res[k].im /= sqrt_size;
  }
} // FFT1D()


//-------------------------------------------------
// effectue une transformation de Fourier en
// deux dimensions sur la matrice <mat>
// qui doit etre de taille n.n avec n une
// puissance de deux
// le resultat sera dans <res>
// on a besoin pour cette fonction d'une matrice
// temporaire et d'un tableau
// cette fonction retourne le module maximum du spectre
static double FFT2D(PP_COMPLEX res,PP_COMPLEX mat,int size,int sgn,PP_COMPLEX tmp,P_COMPLEX buffer)
{
double  A_max2;
int     x,y;

// FFT a une dimension selon les Y
for(x=0;x<size;x++)
  {
  FFT1D(buffer,mat[x],size,sgn);
  for(y=0;y<size;y++)
    {
    tmp[y][x] = buffer[y];
    }
  }
// FFT a une dimension selon les X
A_max2 = 0.;
for(x=0;x<size;x++)
  {
  P_COMPLEX Z;

  FFT1D(res[x],tmp[x],size,sgn);

  Z = res[x];
  for(y=0;y<size;y++)
    {
    double r2;
    r2 = Z->re*Z->re + Z->im*Z->im;
    if(r2 > A_max2)
      {
      A_max2 = r2;
      }
    Z ++;
    }
  }
return sqrt(A_max2);
} // FFT2D()



 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip Source avec une capture COLORATION SYNTAXIQUE
Source avec Zip Source avec une capture ORBITES DES SATELLITES GPS
Source avec Zip Source avec une capture DESSIN D'ARBRES
Source avec Zip Source avec une capture PROGRAMMATION LINEAIRE
Source avec Zip EXTENSION DE CORPS (MATH)

 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

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture TRAITEMENT DE L'IMAGE: FILTRE MÉDIAN EN TEMPS CONSTANT par Pistol_Pete
Source avec Zip Source avec une capture LIBRAIRIE DE TRAITEMENT DU SIGNAL par AmK
Source avec Zip Source avec une capture TRAITEMENT DE L'IMAGE : APPLICATION DE FILTRES (CMUGRAPHIC... par Pistol_Pete
Source avec Zip Source avec une capture EQUALIZER (WIN32) par gagah1
Source avec Zip DETECTION DE CONTOURS DANS UNE IMAGE par semaj_james

Commentaires et avis

Commentaire de Pistol_Pete le 16/07/2007 13:08:41

Salut

Ca fait longtemps que je voulais faire un programme comme celui là et ce programme est très réussi. Ca donne des résultats très intéressant pour les filtres PB et PH.
J'ai juste une petite question, comment fais tu pour construire tes filtres, puisque une convolution en temps équivaut à une multiplication en fréquence. Tu multiplies par quoi?
A+
(9/10)

Commentaire de JCDjcd le 17/07/2007 17:56:08

ben je multiplie les coefficients soit pas 1 (basse frequence) soit par 0 (haute frequence) pour faire un PB (passe bas)
voici la fonction filtre PB : la "frequence de coupure" est à 1/16-ieme

//-------------------------------------------------
void filter_LowPas(P_COMPLEX Y,P_COMPLEX X,int x,int y,int size)
{
x = (x + size/32) % size;
y = (y + size/32) % size;

if(x < size/16  && y < size/16)
  {
  Y->re = X->re;
  Y->im = X->im;
  }
else
  {
  Y->re = 0.;
  Y->im = 0.;
  }
} // filter_LowPas()

Commentaire de morice08 le 12/02/2009 14:49:55

Bonjour!
Peut-on utiliser le même code en langage C pour filtrer un signal venant d'un capteur (onde sinusoïdale issue d'un accéléromètre) ??
Je dois intégrer un filtre passe-bas et un filtre passe-haut dans mon programme.
Merci!

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

traitement image : filtre circulaire [ par jphotension ] jphotensionBonjour,je traite des images binaires bitmap en programmant en C. J'effectue des traitements sur l'image : érosion, dilatation, ouverture, code FFT image [ par CaMeGave ] Bonjour Je suis a la recherche soit d'une librairie open source, soit d'un code qui me permette de faire des FFT (et FFT inverse) sur des images sous Filtre de bayer [ par zoomeo ] Salut a tous!je poste ce message car j'ai un petit soucis...Je dois réaliser un "debayeuriseur" et je ne comprend pas trop le principe, du moins je ne filtre moyenneur [ par hassiba45 ] salut tous le monde, j'essaye de faire  un filtre  moyenneur  sur une image  BMP  en  C++  builder  6, mon pgm n'affiche pas le filtre correctement ca image [ par JoeBlack5 ] Bonjour à tous,Comme projet de fin d'étude, j'ai choisi le "Système d'identification par l'iris". Pour cela j'ai eu reccour à MATLAB et tous marche à les filtres de daubechies [ par haroudi19 ] &nbsp;bonjour&nbsp;&nbsp; tous le mondeje veux savoire comment appliquer un filtre de daubechies sur une image pr&#233;cisement comment faire le produ Flouter une image a l'aide de FFT (Cooley-Tukey-Gauss) [ par biloy ] Bonjour, Avec un collègue, nous voudrions créer un programme pour flouter une image. On sait qu'il faut utiliser les transformations de Fourrier (selo génération d'un filtre median en C [ par marouene2706 ] bon comme le titre l'indique, j'ai rencontré un petit probleme lors de la programmation d'un filtre median en C (image 400*300) j'aimerai avoir de l'a filtrage [ par sousoi ] Bonjour, Je connais beaucoup mieux le C que le C++, et j'aimerais implémenter un filtre médian pour faire le filtrage d'une image. J'ai un tableau pou FFT d'une image avec VC++ 6.0 [ par incognito76 ] Bonjour, je suis débutante en c++ et utilise vc++ 6.0 et j'aimerai calculer la valeur absolue de la FFT d'une image(format .bmp) après l'avoir affic


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
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 : 1,264 sec (3)

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