我有一个信号,我正在对其执行FFT,对其自身进行卷积,然后将IFFT返回到时域。信号长为8192。如果我将信号填充到16384(N * 2)并执行操作,我将获得正确的输出。但是,这有必要吗?但是,当我尝试使用C2C FFT转换坚持使用8192时,直到IFFT为止,我的数据始终相似。 (使用8192时,它只有16384个数据中的每2个点。)
我已经在matlab上运行了此程序,并得到了相同的结果,所以我怀疑它更多地是与数学有关,而不是隐含的,但是当我在cuda中这样做时,欢迎任何建议,我不介意拥有如有必要,可以将数据填充为某种形状,但是数据可以精确到我执行IFFT的程度。
N.B我知道我并没有在GPU上进行所有计算,这只是为了消除错误并让我看到代码在做什么。
答案 0 :(得分:2)
我有一个正在执行FFT的信号,先对其自身进行卷积,然后将IFFT返回到时域。
查看您的代码,您不是在频域中进行“与自身的卷积”,而是对其进行乘法。
整个操作序列(FFT,乘法,IFFT)将对应于在时域中计算信号与其自身的循环卷积。如果首先将信号填充到至少2*N-1
的长度(恰好是IFFT之后存储所有线性卷积系数所需的最小大小),则圆形卷积仅等效于线性卷积。
您可以使用较小的FFT大小(即小于2*N-1
,但至少为N
)来使用Overlap-add method来计算线性卷积。