C++ 如果我填充数据,CUDA CUFT/IFFT会产生不同的结果?

C++ 如果我填充数据,CUDA CUFT/IFFT会产生不同的结果?,c++,cuda,fft,C++,Cuda,Fft,我有一个信号,我正在对它进行FFT,对它本身进行卷积,然后再进行IFFT回到时域。信号是8192长。如果我将信号填充到16384(N*2)并执行这些操作,我将获得正确的输出。然而,这是否必要?但当我尝试使用C2C FFT变换并坚持使用8192时,在IFFT之前,我始终有类似的数据。(使用8192时,它仅具有16384数据中的每2个点) 我通过matlab运行了这个程序,得到了相同的结果,因此我怀疑它更多地与数学有关,而不是与实现有关,但当我在cuda中执行此操作时,欢迎提供任何建议,如果必要,我

我有一个信号,我正在对它进行FFT,对它本身进行卷积,然后再进行IFFT回到时域。信号是8192长。如果我将信号填充到16384(N*2)并执行这些操作,我将获得正确的输出。然而,这是否必要?但当我尝试使用C2C FFT变换并坚持使用8192时,在IFFT之前,我始终有类似的数据。(使用8192时,它仅具有16384数据中的每2个点)

我通过matlab运行了这个程序,得到了相同的结果,因此我怀疑它更多地与数学有关,而不是与实现有关,但当我在cuda中执行此操作时,欢迎提供任何建议,如果必要,我不介意将数据填充成某种形状,但数据在我执行IFFT之前是良好的

注意:我知道我并不是在GPU上做所有的计算,这只是为了消除错误,让我看看代码在做什么

链接到代码:

这是我应该得到的

这就是我不做pad的结果。

我有一个信号,我正在对它进行FFT,对它本身进行卷积,然后再进行IFFT回到时域

看看你的代码,你不是在频域中做一个“自身卷积”,而是一个自身的乘法

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

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

我有一个信号,我正在对它进行FFT,对它本身进行卷积,然后再进行IFFT回到时域

看看你的代码,你不是在频域中做一个“自身卷积”,而是一个自身的乘法

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


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

在解析FFT调用的输出时,您似乎没有使用Nyquist限制在解析FFT调用的输出时,您似乎没有使用Nyquist限制