FFTW与FFTW_ESTIMATE和FFTW_MEASURE的结果不同

时间:2015-07-27 12:54:26

标签: c++ fft precision floating-accuracy fftw

我使用FFTW对2D图像数据执行FFT。可以使用FFTW_ESTIMATE或FFTW_MEASURE来规划FFT。我假设在使用任何一个时我都得到相同的结果。但是我发现了一个案例,我发现了巨大的差异。

代码是(最低示例):

template<class T_IMG>
void aa(T_IMG& img)
{
    float* in = new float[2048*2048];
    float* in2 = new float[2048*2048];
    float* out = new float[2048*2048*2];
    float* out2 = new float[2048*2048*2];
    int dim[2] = {2048,2048};

    fftwf_plan plan1 = fftwf_plan_dft_r2c(2, dim, in, reinterpret_cast<fftwf_complex*>(out), FFTW_ESTIMATE);
    fftwf_plan plan2 = fftwf_plan_dft_r2c(2, dim, in2, reinterpret_cast<fftwf_complex*>(out2), FFTW_MEASURE);
    img.load();
    for(int y=0; y<2048; y++)
        for(int x=0; x<2048; x++){
            in2[y*2048 + x] = img(x, y);//(std::abs(1024-x) < 20 && std::abs(1024-y) < 20) ? 1e9 : 0;
            in[y*2048 + x] = img(x, y); //(std::abs(1024-x) < 20 && std::abs(1024-y) < 20) ? 1e9 : 0;
        }
    fftwf_execute(plan2);
    fftwf_execute(plan1);
    for(int y=0; y<2048; y++)
        for(int x=0; x<1025; x++){
            float r1 = out[(y*1025 + x)*2];
            float r2 = out2[(y*1025 + x)*2];
            float c1 = out[(y*1025 + x)*2+1];
            float c2 = out2[(y*1025 + x)*2+1];
            float diffR = std::abs(r1-r2);
            float diffC = std::abs(c1-c2);
            if((diffR > 1 && diffR/std::abs(r1) > 1) || (diffC > 1 && diffC/std::abs(c1)) > 1){
                std::cerr << "Err " << diffR << "; " << diffC << std::endl;
                return;
            }
        }
}

我有一个浮点值范围从0到3e9的图像。中间有一种sinc功能。例如,对于(42,91)处的(18,229)vs(200,466),总是触发错误。

那些价值远远不够可能?我该如何解决?

另外,我尝试以双精度执行相同的操作。这很有用......但是我经常无法负担双精度计算的开销,并且期望获得单精度的合理值。

DP中该点的值为(-580,-166)

0 个答案:

没有答案