我使用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)