0

这似乎是一个简单的问题,但我一直试图在 FFTW 页面上找到答案,但我无法。

我为前向和后向变换创建了 FFTW 计划,并将一些数据直接输入到 fftw_complex *fft 结构中(而不是先从输入数据计算 FFT)。然后我对此计算了一个IFFT,结果不正确。我这样做对吗?

编辑:所以我做的是以下内容:

int ht=2, wd=2;
fftw_complex *inp  = fftw_alloc_complex(ht * wd);
fftw_complex *fft  = fftw_alloc_complex(ht * wd);
fftw_complex *ifft = fftw_alloc_complex(ht * wd);

fftw_plan plan_f = fftw_plan_dft_1d(wd *ht, inp, fft,  FFTW_FORWARD,  FFTW_ESTIMATE);
fftw_plan plan_b = fftw_plan_dft_1d(wd * ht, fft, ifft, FFTW_BACKWARD, FFTW_ESTIMATE );

for(int i =0 ; i < 2; i++)
{
    for(int j = 0; j<2; j++)
    {
        inp[wd*i + j][0] = 1.0;
        inp[wd*i + j][1] = 0.0;
    }
}

//    fftw_execute(plan_f);

for(int i =0 ; i < 2; i++)
{
    for(int j = 0; j<2; j++)
    {
        fft[wd*i + j][1] = 0.0;
        if(i == j == 0)
            fft[wd*i+j][0] = 4.0;
        else
            fft[wd*i+j][0] = 0.0;

        std::cout << fft[wd*i+j][0] << " and " << fft[wd*i+j][1] << std::endl;
    }
}

fftw_execute(plan_b);
for(int i =0 ; i < 2; i++)
{
    for(int j = 0; j<2; j++)
        std::cout << ifft[wd*i+j][0]/(double)(wd*ht) << " and " << ifft[wd*i+j][1]/(double)(wd*ht) << std::endl;
}

这是完整的代码。ifft 应该为实部返回 [1 1 1 1]。它没有。

4

1 回答 1

0

我做了最愚蠢的事情——在我发布的 if 条件下:

我 == j == 0

而不是 i ==0 && j == 0

当我修复它时,它可以工作。非常感谢大家帮助我。

于 2014-08-13T13:16:25.997 回答