利用FFTW3库实现二维快速傅里叶余弦变换

时间:2015-01-04 12:36:41

标签: c++

请帮我解决这个问题。 我试图通过使用FFTW3库在二维中使用快速傅里叶余弦变换。在我的情况下,我真的需要转换很多点。当我在x和y方向上设置的点数等于n0 * n1 = 512 * 512时,我的程序运行正常。但是,我设置的点数等于n0 * n1 = 1024 * 1024,我得到消息“分段错误”。问题可能来自内存,其中三个数组在[N],in2 [N],out [N](此处为N = n0 * n1)中是双重的,它们是构建的。

所以我试图用vector替换数组,但它似乎不适合FFTW3库。 我的程序是在RAM 4GB和核心i3的笔记本电脑上运行。

你能否就我的案件向我提出建议?

我很欣赏你的理想。 非常感谢你。

这是我的程序

enter code here
#include <stdio.h>
#include <math.h>
#include <fftw3.h>

using namespace std;
int main() {

    int n0=1024;
    int n1=1024;

    int N=n0*n1;

    double in[N], in2[N], out[N];

    fftw_plan p, q;
    int i,j;
    p = fftw_plan_r2r_2d(n0,n1, in, out, FFTW_REDFT00, FFTW_REDFT00, FFTW_ESTIMATE);

    for (i =0;i <n0;i++){
        for (j=0;j<n1;j++)
        { 
            in[i*n0+j] = cos(2.0*M_PI*(double)i/(n0 - 1))+cos(2.0*M_PI*(double)j/(n1 - 1)); 
        }
    }

    fftw_execute(p);
    q = fftw_plan_r2r_2d(n0,n1, out, in2, FFTW_REDFT00, FFTW_REDFT00, FFTW_ESTIMATE);
    fftw_execute(q);

    for (i =0;i<n0;i++){
        for (j=0;j<n1;j++)
        {
            printf("%3d %9.5f %9.5f\n", i*n0+j, in[i*n0+j], in2[i*n0+j]/(2.0*(double)(n0 - 1))/(2.0*(double)(n1 - 1)));
        }
    }
  fftw_destroy_plan(p); fftw_destroy_plan(q); fftw_cleanup();
  return 0;
}

2 个答案:

答案 0 :(得分:0)

  1. C ++标准禁止使用可变长度数组。有些编译器确实支持它们,但使用它们并不是一个好主意,因为它会使你的程序不可移植(即N如果你创建一个大小为N的数组,它必须是一个编译时常量在堆栈上。

  2. inin2out数组在堆栈上分配。默认堆栈大小因不同的操作系统而异,但通常为几兆字节(Linux上为8 MB)。持有它们是不够的。这就是你获得SEGFAULT的原因。

  3. 要解决此问题,您可以动态分配数组:

    double* in = new double[N];
    double* in2 = new double[N];
    double* out = new double[N];
    
  4. 不要忘记在不再需要它们时(在本例程序的最后)删除它们以避免内存泄漏:

    delete[] in;
    delete[] in2;
    delete[] out;
    

答案 1 :(得分:0)

FFTW3会很乐意接受来自矢量的点,你只需要得到一个指针。调用vector::data()来获取指针。