数据经过一次fft再算一次ifft后,与初始值不一致

rainliuyu 2012-10-11 11:47:11
很简单的程序,1d复数运算
输入的数据实际上是一组正弦曲线,经fft再ifft后,输出的结果仍然是正弦曲线,但问题是所有的数据比输入时变大了几十倍

十分不解,请各位看看什么原因



cufftHandle hdFFT;
cufftResult result = cufftPlan1d(&hdFFT, nFFTSize, CUFFT_C2C, nBatch);
if(result != CUFFT_SUCCESS)
return FALSE;

cufftComplex *pComplex = (cufftComplex*)pInComp;

cufftComplex *pDevComplex;
if(cudaMalloc((void**)&pDevComplex, nFFTSize*sizeof(cufftComplex)*nBatch))
{
cufftDestroy(hdFFT);
return FALSE;
}
cudaMemset(pDevComplex, 0, nFFTSize*sizeof(cufftComplex)*nBatch);
cudaMemcpy(pDevComplex, pComplex, nCount*sizeof(cufftComplex), cudaMemcpyHostToDevice);


cufftResult rfft = cufftExecC2C(hdFFT, pDevComplex, pDevComplex, CUFFT_FORWARD_INVERSE);
if(rfft == CUFFT_SUCCESS)
{
rfft = cufftExecC2C(hdFFT, pDevComplex, pDevComplex, CUFFT_INVERSE);
cudaMemcpy(pOutComp, pDevComplex, nCount*sizeof(cufftComplex), cudaMemcpyDeviceToHost);
}

cudaFree(pDevComplex);
cufftDestroy(hdFFT);




...全文
3283 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
rainliuyu 2013-01-23
  • 打赏
  • 举报
回复
问题解决了 不好意思,拖了这么久,因为最近在忙别的 N个点FFT时需要每个点乘以1/N 而IFFT就不需要了,这是目前得出的结论
tag180 2012-12-06
  • 打赏
  • 举报
回复
FFT归一化就是反变换出来的结果要除以变换序列长度。。。。 DFT的公式是一个叠加结果~一般iDFT都是在叠加结果前面乘以1/N的~~~ 这个问题在FFT中同样适用~
rainliuyu 2012-11-25
  • 打赏
  • 举报
回复
问题暂时还未解决,期待高人来赐教一下有关fft和归一化
rainliuyu 2012-11-17
  • 打赏
  • 举报
回复
引用 3 楼 zhoujk 的回复:
归一化,然后做FFT和 iFFT,如果结果归一化后和源数据接近(不会完全相同)就可以认为是正确的
谢谢指点,请问下是在FFT和IFFT之前都要做归一化吗? 我是做的脉冲压缩算法 先FFT,然后之间几步之后最后ifft
zhoujk 2012-11-12
  • 打赏
  • 举报
回复
归一化,然后做FFT和 iFFT,如果结果归一化后和源数据接近(不会完全相同)就可以认为是正确的
rainliuyu 2012-10-21
  • 打赏
  • 举报
回复
求助啊
rainliuyu 2012-10-11
  • 打赏
  • 举报
回复
代码有一行粘的有误,是这样
cufftResult rfft = cufftExecC2C(hdFFT, pDevComplex, pDevComplex, CUFFT_FORWARD);
之后直接又做了一次INVERSE的

589

社区成员

发帖
与我相关
我的任务
社区描述
CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。
社区管理员
  • CUDA编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧