2016-04-28 4 views
2

Я пытаюсь сделать ifft и fft в массиве с плавающей запятой. Однако результат одинаковый для обоих. Есть ли у вас какие-либо идеи? Почему результаты одинаковы, хотя я использую FFTW_FORWARD для одного и FFTW_BACKWARD для другого?FFT и IFFT с FFTW

int N=16; 
    fftwf_complex in[N], out[N]; 
    fftwf_plan p1, q; 

    /* prepare a cosine wave */ 
    for (i = 0; i < N; i++) { 
    in[i][0] = cos(3 * 2*M_PI*i/N); 
    in[i][1] = 0; 
    } 

    /* forward Fourier transform, save the result in 'out' */ 
    p1 = fftwf_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE); 
    fftwf_execute(p1); 
    for (i = 0; i < N; i++) 
    cout << out[i][0] << endl; 
    fftwf_destroy_plan(p1); 

    printf("\nInverse transform:\n"); 
    q = fftwf_plan_dft_1d(N, in, out, FFTW_BACKWARD, FFTW_ESTIMATE); 
    fftwf_execute(q); 
    for (i = 0; i < N; i++) 
    cout << out[i][0] << endl; 
    fftwf_destroy_plan(q); 

ответ

4

Вы показываете только реальные части выходных лотков и игнорируете воображаемые компоненты. Просто так получилось, что действительные части совпадают, но мнимые компоненты различны (они на самом деле являются комплексно сопряженными):

#include <iostream> 
#include <cmath> 
#include "fftw3.h" 

using namespace std; 

int main() 
{ 
    int N=16; 
    fftwf_complex in[N], out[N]; 
    fftwf_plan p1, q; 

    for (int i = 0; i < N; i++) { 
     in[i][0] = cos(3 * 2*M_PI*i/N); 
     in[i][1] = 0; 
    } 

    p1 = fftwf_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE); 
    fftwf_execute(p1); 
    for (int i = 0; i < N; i++) 
     cout << out[i][0] << " + j" << out[i][1] << endl; // <<< 
    fftwf_destroy_plan(p1); 

    printf("\nInverse transform:\n"); 
    q = fftwf_plan_dft_1d(N, in, out, FFTW_BACKWARD, FFTW_ESTIMATE); 
    fftwf_execute(q); 
    for (int i = 0; i < N; i++) 
     cout << out[i][0] << " + j" << out[i][1] << endl; // <<< 
    fftwf_destroy_plan(q); 

    return 0; 
} 

компилировать и запускать:

$ g++ -Wall fftwf.cpp -lfftw3f && ./a.out 

3.67394e-16 + j0 
1.19209e-07 + j7.34788e-16 
-3.67394e-16 + j0 
8 + j-7.34788e-16 
3.67394e-16 + j0 
2.38419e-07 + j7.34788e-16 
-3.67394e-16 + j0 
1.19209e-07 + j-7.34788e-16 
3.67394e-16 + j0 
1.19209e-07 + j7.34788e-16 
-3.67394e-16 + j0 
2.38419e-07 + j-7.34788e-16 
3.67394e-16 + j0 
8 + j7.34788e-16 
-3.67394e-16 + j0 
1.19209e-07 + j-7.34788e-16 

Inverse transform: 
3.67394e-16 + j0 
1.19209e-07 + j-7.34788e-16 
-3.67394e-16 + j0 
8 + j7.34788e-16 
3.67394e-16 + j0 
2.38419e-07 + j-7.34788e-16 
-3.67394e-16 + j0 
1.19209e-07 + j7.34788e-16 
3.67394e-16 + j0 
1.19209e-07 + j-7.34788e-16 
-3.67394e-16 + j0 
2.38419e-07 + j7.34788e-16 
3.67394e-16 + j0 
8 + j-7.34788e-16 
-3.67394e-16 + j0 
1.19209e-07 + j7.34788e-16 

Интересно отметить, что БПФ и IFFT математически почти идентичны. Они часто реализуются как единая подпрограмма с указателем, указывающим направление (вперед или назад). Обычно этот флаг влияет только на знак мнимой части факторов скручивания.

+1

большой! Большое спасибо! –