C ++中的fftw对于2的幂来说变得更慢?

时间:2014-12-14 16:39:50

标签: c++ fftw

我在C ++中使用fftw库。我知道fft的计算对于2的幂是最有效的,但是我创建了一个二维fft的最小例子,我得到了不同的结果。没有2的幂的2d-fft比另一个计算得快得多。这是我的代码:

int N = 2083;
int M = 2087;
int Npow2 = pow(2, ceil(log2(N)));
int Mpow2 = pow(2, ceil(log2(M)));

fftw_complex * signala = (fftw_complex *)fftw_malloc(sizeof(fftw_complex)* N * M);

for (int i = 0; i < N; i++)
{
    for (int j = 0; j < M; j++)
    {
        signala[i*M + j][0] = rand();
        signala[i*M + j][0] = 0;
    }
}

fftw_complex * signala_ext = (fftw_complex *)fftw_malloc(sizeof(fftw_complex)* Npow2 * Mpow2);

fftw_complex * outa = (fftw_complex *)fftw_malloc(sizeof(fftw_complex)* N * M);
fftw_complex * outaext = (fftw_complex *)fftw_malloc(sizeof(fftw_complex)* Npow2 * Mpow2);

//Create Plans
fftw_plan pa = fftw_plan_dft_2d(N, M, signala, outa, FFTW_FORWARD, FFTW_ESTIMATE);
fftw_plan paext = fftw_plan_dft_2d(Npow2, Mpow2, signala_ext, outaext, FFTW_FORWARD, FFTW_ESTIMATE);

//zeropadding
memset(signala_ext, 0, sizeof(fftw_complex)* Npow2 * Mpow2); //Null setzen
for (int i = 0; i < N; i++)
{
    for (int j = 0; j < M; j++)
    {
        signala_ext[i*Mpow2 + j][0] = signala[i*M + j][0];
        signala_ext[i*Mpow2 + j][1] = signala[i*M + j][1];
    }
}

//Execute FFT
double tstart1 = clock();

fftw_execute(pa);

double time1 = (clock() - tstart1) / CLOCKS_PER_SEC;
printf("Time: %f sec\n", time1);
double tstart2 = clock();

fftw_execute(paext);

double time2 = (clock() - tstart2) / CLOCKS_PER_SEC;
printf("Time: %f sec\n", time2);

我为N和M选择了素数。我的程序返回: 对于signala(非2次幂):2.95秒 对于signala_ext(power-of-2):5.232秒

为什么功率为2的fft速度要慢得多?我做错了什么?

我会感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

FFTW喜欢尺寸是小素数幂的乘积。符合此标准的最接近2083或2087的值是2100(2100 = 2 2 * 3 * 5 2 * 7),因此如果您选择尺寸为2100 x 2100年你应该看到不错的表现。