CUDA CUFFT / IFFT如果我填充数据会得到不同的结果吗?

时间:2019-05-11 20:07:30

标签: c++ cuda fft

我有一个信号,我正在对其执行FFT,对其自身进行卷积,然后将IFFT返回到时域。信号长为8192。如果我将信号填充到16384(N * 2)并执行操作,我将获得正确的输出。但是,这有必要吗?但是,当我尝试使用C2C FFT转换坚持使用8192时,直到IFFT为止,我的数据始终相似。 (使用8192时,它只有16384个数据中的每2个点。)

我已经在matlab上运行了此程序,并得到了相同的结果,所以我怀疑它更多地是与数学有关,而不是隐含的,但是当我在cuda中这样做时,欢迎任何建议,我不介意拥有如有必要,可以将数据填充为某种形状,但是数据可以精确到我执行IFFT的程度。

N.B我知道我并没有在GPU上进行所有计算,这只是为了消除错误并让我看到代码在做什么。

链接到代码:http://pasted.co/e2e5e625

这就是我应该得到的 This is what i should get

如果我不踩水,这就是我得到的。 enter image description here

1 个答案:

答案 0 :(得分:2)

  

我有一个正在执行FFT的信号,先对其自身进行卷积,然后将IFFT返回到时域。

查看您的代码,您不是在频域中进行“与自身的卷积”,而是对其进行乘法。

整个操作序列(FFT,乘法,IFFT)将对应于在时域中计算信号与其自身的循环卷积。如果首先将信号填充到至少2*N-1的长度(恰好是IFFT之后存储所有线性卷积系数所需的最小大小),则圆形卷积仅等效于线性卷积。

您可以使用较小的FFT大小(即小于2*N-1,但至少为N)来使用Overlap-add method来计算线性卷积。