fftwpp在卷积后创建零填充数组

时间:2011-03-23 15:49:46

标签: c++ fft fftw

我使用fftwpp将我的数据和卷积内核转换为傅立叶空间,将它们像标量积一样将它们相乘,然后将它们转换回真实空间。当我第一次运行程序时,它会创建一个完全用零填充的数组。当我再次运行它时,它会给我预期的结果。

运行时,会创建wisdom3.txt。如果我删除它,程序会花费大量时间再次创建一个零填充数组。

我的代码出了什么问题?

// sx, sy and sz are the dimensions of my data

int szp = sz / 2 + 1;
size_t align = sizeof(Complex);

// creates arrays to store the data in, the double one is for the real data
// the Complex one for the fourier data
array3<double> f(sx, sy, sz, align);
array3<Complex> g(sx, sy, szp, align);

// copying data into double array
for(int k = 0; k < sz; k++)
    for(int j = 0; j < sy; j++)
        for(int i = 0; i < sx; i++)
            f(i, j, k) = data[i + sx * j + sx * sy * k];

// transforming data into fourier space
rcfft3d Forward3(sz, f, g);
Forward3.fft(f, g);


// generate the kernel
array3<double> kernel(sx, sy, sz);
array3<Complex> kernel2(sx, sy, szp, align);
// more code to create the kernel left out ...


// transform the kernel into the fourier space
rcfft3d ForwardKernel3(sz, kernel, kernel2);
ForwardKernel3.fft(kernel, kernel2);


// multiplying data and kernel in fourier space together
for(int k = 0; k < szp; k++)
    for(int j = 0; j < sy; j++)
        for(int i = 0; i < sx; i++)
            g(i, j, k) = g(i, j, k) * kernel2(i, j, k);


// transform back to normal space
crfft3d Backward3(sz, g, f);
Backward3.fftNormalized(g, f);


// putting everything in the results array and normalize
for(int k = 0; k < sz; k++)
    for(int j = 0; j < sy; j++)
        for(int i = 0; i < sx; i++)
            result[i + sx * j + sx * sy * k] =
                (f(i, j, k) >= thresholdValue ? f(i, j, k) : 0);

1 个答案:

答案 0 :(得分:3)

FFTW ++是FFTW的包装器。 FFTW需要生成执行计划以有效地处理您的数据。生成计划后,it can be reused将处理各种数据集。您看到的文件wisdom3.txt是有关您的程序首次运行时生成的计划的信息。一旦存在,它将在连续运行时加载并允许程序快速运行。如果删除它,FFTW必须重新生成它,使程序再次运行缓慢。

至于为什么第一次运行时输出为零,是因为这个计划生成步骤。它在FFTW FAQ中解释。

总而言之,由于我没有使用过FFTW ++,我不知道您应该调用的确切方法,以确保在执行FT之前生成计划。但是在定义输入/输出数组之后以及在使用数据初始化之前,应立即调用它。如果你需要多次运行你的代码,你应该保留智慧文件。