2017-06-08 135 views
1

我试图做一个简单的fft并比较MATLAB和CUDA之间的结果。CUDA fft与MATLAB的不同结果fft

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; 
} 

在此CUDA代码我得到的结果是:

enter image description here

你可以看到,CUDA给4个零(单元5-9)。

我错过了什么?

非常感谢您的关注!

回答

3

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

如果您需要它们,您可以填入这些“缺失”的术语,只需考虑每个对应术语的复共轭,但通常没有太多的意义。

+1

好的,很高兴知道!谢谢Paul,我很感激。 –

+1

仅供参考,这在http://docs.nvidia.com/cuda/cufft/index.html#fft-types记录:“cuFFT利用这种冗余,只适用于埃尔米特矢量的前半部分” – Tom

+0

PLEASE if你也可以回答我相同的问题(但在二维数组 - - 结果只是不正确,我认为): https://stackoverflow.com/questions/44436155/cuda-fft-2d-different-results-from-matlab -FFT上-2D –