【问题标题】:How to do inverse fft symmetric with CUFFT如何用 CUFFT 做逆 fft 对称
【发布时间】:2017-06-27 05:05:30
【问题描述】:

我需要将此行 (MATLAB) 转换为 CUDA:

picTimeFiltered = ifft((picFFT_filt), size(I,3), 3 ,'symmetric');

我目前的实现是针对这一行(没有“对称”标志):

picTimeFiltered = ifft((picFFT_filt), size(I,3), 3);

这是我的 CUDA 实现:

void ifftDouble_many(cuDoubleComplex*& input, cuDoubleComplex*& outputMatrixAfterIFFT, const int width, const int height, const int depth)
{
    const int NX = depth;
    const int NY = width * height;

    // Allocate and set the CUDA Input 
    cuDoubleComplex *d_input;
    cudaMalloc(&d_input, NX*NY * sizeof(cuDoubleComplex));
    cudaMemcpy(d_input, input, NX * NY * sizeof(cuDoubleComplex), cudaMemcpyHostToDevice);

    // Allocate the CUDA output
    cufftDoubleComplex* d_output = nullptr;
    cudaMalloc((void**)&d_output, sizeof(cuDoubleComplex)*NX*NY);

    // CUDA FFT
    cufftHandle plan;
    int n[1] = { NX };
    int inembed[] = { NY, NX };
    int onembed[] = { NY, NX };
    cufftPlanMany(&plan, 1, n, inembed, 1, NX, onembed, 1, NX, CUFFT_Z2Z, NY);
    cufftExecZ2Z(plan, d_input, d_output, CUFFT_INVERSE);

    // Devide the results by depth
    devideCufftDoubleComplexArrayByScalar_CUDA(d_output, NX * NY, depth);

    cudaMemcpy(outputMatrixAfterIFFT, d_output, NY*NX * sizeof(cuDoubleComplex), cudaMemcpyDeviceToHost);

    /* Destroy the CUFFT plan. */
    cufftDestroy(plan);
    cudaFree(d_input);
    cudaFree(d_output);
}

请指教 - 如何通过 CUDA 进行逆 fft 对称?

【问题讨论】:

  • @Paul R 请指教:)
  • 请指教什么?你有一个实际的问题吗?您发布的代码不起作用吗?如果是这样,它以什么方式不起作用?
  • 嗨@talonmise。我的代码可以工作并且可以逆 fft 但不是对称的。我需要像matlab一样的ifft对称。请查看

标签: cuda fft ifft cufft


【解决方案1】:

使用 cufftExecC2R() 或 cufftExecZ2D() 计算单精度/双精度的逆对称 fft。

http://docs.nvidia.com/cuda/cufft/index.html#axzz4l0egR62U

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-11
    • 2015-08-13
    • 2012-04-30
    • 2015-01-07
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    • 2018-07-12
    相关资源
    最近更新 更多