CUDA fft与MATLAB fft的不同结果

CUDA fft与MATLAB fft的不同结果,matlab,math,cuda,signal-processing,fft,Matlab,Math,Cuda,Signal Processing,Fft,我试着做了一个简单的fft,并比较了MATLAB和CUDA的结果 MATLAB: 9个数的向量1-9 I = [1 2 3 4 5 6 7 8 9]; 并使用此代码: fft(I) 给出了结果: 45.0000 + 0.0000i -4.5000 +12.3636i -4.5000 + 5.3629i -4.5000 + 2.5981i -4.5000 + 0.7935i -4.5000 - 0.7935i -4.5000 - 2.5981i -4.5000

我试着做了一个简单的fft,并比较了MATLAB和CUDA的结果

MATLAB: 9个数的向量1-9

I = [1 2 3 4 5 6 7 8 9];
并使用此代码:

fft(I)
给出了结果:

  45.0000 + 0.0000i
  -4.5000 +12.3636i
  -4.5000 + 5.3629i
  -4.5000 + 2.5981i
  -4.5000 + 0.7935i
  -4.5000 - 0.7935i
  -4.5000 - 2.5981i
  -4.5000 - 5.3629i
  -4.5000 -12.3636i
和CUDA代码:

int FFT_Test_Function() {

    int n = 9;

    double* in = new double[n];
    Complex* out = new Complex[n];

    for (int i = 0; i<n; i++)
    {
        in[i] = i + 1;
    }

    // Allocate the buffer
    cufftDoubleReal *d_in;
    cufftDoubleComplex *d_out;
    unsigned int out_mem_size = sizeof(cufftDoubleComplex)*n;
    unsigned int in_mem_size = sizeof(cufftDoubleReal)*n;
    cudaMalloc((void **)&d_in, in_mem_size);
    cudaMalloc((void **)&d_out, out_mem_size);

    // Save time stamp
    milliseconds timeStart = getCurrentTimeStamp();

    cufftHandle plan;
    cufftResult res = cufftPlan1d(&plan, n, CUFFT_D2Z, 1);
    if (res != CUFFT_SUCCESS) { cout << "cufft plan error: " << res << endl; return 1; }
    cudaCheckErrors("cuda malloc fail");

    cudaMemcpy(d_in, in, in_mem_size, cudaMemcpyHostToDevice);
    cudaCheckErrors("cuda memcpy H2D fail");

    res = cufftExecD2Z(plan, d_in, d_out);
    if (res != CUFFT_SUCCESS) { cout << "cufft exec error: " << res << endl; return 1; }
    cudaMemcpy(out, d_out, out_mem_size, cudaMemcpyDeviceToHost);
    cudaCheckErrors("cuda memcpy D2H fail");

    milliseconds timeEnd = getCurrentTimeStamp();
    milliseconds totalTime = timeEnd - timeStart;
    std::cout << "Total time: " << totalTime.count() << std::endl;

    return 0;
}
int FFT\u Test\u函数(){
int n=9;
双精度*in=新双精度[n];
复数*out=新复数[n];

对于(int i=0;i
CUFFT_D2Z
是一个实到复的FFT,因此输出数据中的顶部
N/2-1
点是冗余的-它们只是变换下半部分的复共轭(如果比较关于中点的镜像项对,可以在MATLAB输出中看到这一点)


如果需要,您可以通过对每个对应项进行复共轭来填充这些“缺失”项,但这样做通常没有多大意义。

FYI中记录了这一点:“cuFFT利用这种冗余,只对厄米特向量的前半部分起作用”如果你也能回答我同样的问题(但在2d阵列上-我认为结果不真实),请回答我: