Salut salut,
Je viens déranger un peu la communauté avec un soucis lors de l'utilisation de la bibli FFTW3, je vous expose mon soucis :
J'ai pour but d'analyser un signal audio, j'ai un dispositif permettant d'acquérir le signal, j'échantillonne a 190kHz pour des émetteurs produisant des fréquences allant de 60kHz à 81kHz.
Je veux seulement pour l'instant pouvoir les identifier via du coup une FFT (je ne suis pas intéressé par la FFT inverse je ne me soucis pas de scaling etc).
Voila mon soucis malgré une étude de la documentation je n'arrive pas a obtenir un résultat satisfaisant, après avoir tout mis sur le dos du matériel qui n'échantillonnerai pas réellement a 190kHz ou autre (c'est fou ce qu'on peut trouver comme excuses) j'ai finalement généré un fichier correspondant (via MATLAB) à ce qu'il me faut en ayant toujours quasi le même écart d'environ 600Hz sur la valeur voulu.
Donc deux possibilités, soit j'utilise mal la librairie, soit j'exploite mal les résultats, je vous link ci-dessous mon code (utile):

ffttest.c
Permet d'appliquer la FFT sur une série de valeurs stockées dans un fichier
Code c : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 
#define TAILLE 8192 //voir 16384
//    *DECLARATION FFTW*
fftw_complex *in;
fftw_plan planC2C;
 
//    *ALLOCATION MEMOIRE*
in = fftw_alloc_complex(TAILLE);                   
 
//     *CREATION PLAN*
planC2C = fftw_plan_dft_1d(TAILLE, in, in, FFTW_FORWARD, FFTW_PATIENT);
 
//    *RECUPERATION DES VALEURS*
for(;i<TAILLE;++i){
        fscanf(file,"%lf",&in[i][0]);
        in[i][1]=0.;
    }
 
//    *EXECUTION FFT*
fftw_execute(planC2C);
 
//    *ECRITURE DES RESULTATS*
for(i=0;i<TAILLE;++i){
    fprintf(file,"%lf\n",sqrt(pow(in[i][0],2)+pow(in[i][1],2)));   //Calcul de l'amplitude
    }
 
//    *DESALLOCATION MEMOIRE*
fftw_destroy_plan(planC2C);
fftw_free(in);

sFREQ.c
Permet de rechercher dans le fichier resultat la/les plus grandes amplitudes et d'exploiter ce résultat en affichant la/les fréquence(s) correspondantes
Code c : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 
#include <stdlib.h>
#include <stdio.h>
#define TAILLE 8192
#define FREQ 190000
#define DOUBLE sizeof(double)
#define OLDRESULT "8192_C_FFT1_OLD.txt"
#define JSRESULT "8192_GURU.txt"
 
int main(){
FILE* file=NULL;
int i=0,k=0;
double recup;
double *sauv,*freq;
 
sauv=(double*)malloc(DOUBLE);
freq=(double*)malloc(DOUBLE);
file=fopen(JSRESULT,"r");
for(;i<TAILLE/2+1;++i){
 
    fscanf(file,"%lf",&recup);
    if(recup>300.){
        *(sauv+k)=recup;
        *(freq+k)=i*(FREQ/TAILLE);      //La frequence est determinee ici par i*(FREQ/TAILLE)
        ++k;
 
        sauv=(double*)realloc(sauv,(k+1)*DOUBLE);
        freq=(double*)realloc(freq,(k+1)*DOUBLE);
    }
}
for(i=0;i<k;++i)
{
    printf("Frequence = %lf, Amplitude = %lf\n",*(freq+i),*(sauv+i));
}
fclose(file);
free(sauv);free(freq);
return 0;
}

Voila voila, en espérant avoir été assez clair, merci d'avance !