Question

Après avoir fait FFT et IFFT je peux entendre que le bruit dans mon casque ... Voici le code:

        double* spectrum = new double[n];

        fftw_plan plan;

        plan = fftw_plan_r2r_1d(n, data, spectrum, FFTW_REDFT10, FFTW_ESTIMATE);

        fftw_execute(plan);
        fftw_destroy_plan(plan);

        plan = fftw_plan_r2r_1d(n, spectrum, data, FFTW_REDFT01, FFTW_ESTIMATE);
        fftw_execute(plan);
        fftw_destroy_plan(plan);

Peut-être que j'ai choisi un mauvais type FFT?
Post-scriptum données est le signal initial

UPDATE

Ok, donc maintenant le code est

        fftw_complex* spectrum = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * n);

        fftw_plan plan;

        plan = fftw_plan_dft_r2c_1d(n, data, spectrum, FFTW_ESTIMATE);

        fftw_execute(plan);
        fftw_destroy_plan(plan);

        plan = fftw_plan_dft_c2r_1d(n, spectrum, data, FFTW_ESTIMATE);
        fftw_execute(plan);
        fftw_destroy_plan(plan);

Le problème reste le même, mon tableau de données est corrompue.

Mise à jour # 2

Alors, le problème est dans ma taille et transformer normalisant. Si je l'utilisateur FFTW_REDFT10 à vrai réel et FFTW_REDFT01 qui transforment des transformations tailles-je utiliser? 2 * n? Ou autre chose? Et puis je dois normaliser mon signal de sortie en divisant chaque élément par 2 * n?
Merci à tous pour répondre.

Mise à jour # 3

Merci à tous pour répondre à nouveau. Je l'ai résolu le problème avec votre aide. Voici le code de travail:

        // FFT  
        fftw_complex* spectrum  = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * n);

        fftw_plan plan;

        plan = fftw_plan_dft_r2c_1d(n, data, spectrum, FFTW_ESTIMATE);

        fftw_execute(plan);
        fftw_destroy_plan(plan);

        // some filtering here

        // IFFT
        plan = fftw_plan_dft_c2r_1d(n, spectrum, data, FFTW_ESTIMATE);
        fftw_execute(plan);
        fftw_destroy_plan(plan);

        // normalizing

        for (int i = 0; i < n; i++) {
            data[i] = data[i] / n;
        }
Était-ce utile?

La solution

Je ne vois pas où vous votre sortie normaliser. Vous devez diviser vos valeurs de sortie par le nombre d'éléments dans le tableau de données pour normaliser le dos de données plage de valeurs d'origine.

Voir le FFTW Manuel 4.8.2, dernier paragraphe (je manuel V3.2).

Autres conseils

Vous effectuez une FFT réelle à réelle (en fait, FFTW est le calcul d'une TCD ou transformée en cosinus discrète, à l'interne, mais il en résulte la même chose). Soyez prudent sur le nombre de points qui sont calculés dans le tableau du spectre de sortie. Un vrai-à-real transformant uniquement a n / 2 + 1 valeurs réelles placée dans la matrice.

Si, comme vous l'avez indiqué, vous calculer un réel à complexe transform, vous générerez des deux côtés du spectre (ils sont conjugués complexes de l'autre), mais votre tableau de sortie devra être redimensionnée pour accueillir des valeurs complexes, plus le résultat courant continu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top