CUDA CUFFT/IFFT 如果我填充数据会有不同的结果?
CUDA CUFFT/IFFT Different results if i pad my data?
我有一个信号,我正在对其进行 FFT,与自身进行卷积,然后将 IFFT 返回到时域。信号长8192。如果我将信号填充到 16384 (N*2) 并执行操作,我会得到正确的输出。然而,这有必要吗?但是当我尝试使用 C2C FFT 变换并坚持使用 8192 时,我在整个过程中都有类似的数据,直到 IFFT。 (当使用 8192 时,它只有 16384 数据中的每第二个点)。
我已经 运行 通过 matlab 进行了此操作并得到了相同的结果,所以我怀疑它更多地与数学有关而不是实现,但是因为我在 cuda 中这样做,欢迎任何建议,我不介意在必要时以某种形状填充数据,但数据在我执行 IFFT 之前都很好。
N.B 我知道我并没有在 GPU 上进行所有计算,这只是为了消除错误并让我看到代码在做什么。
Link 编码:http://pasted.co/e2e5e625
这是我应该得到的
如果我不填充,这就是我得到的结果。
I have a signal that I am doing an FFT to, doing an convolution with itself and then an IFFT back to the time domain.
看看你的代码,你不是在频域中做 "convolution with itself" 而是自己做乘法。
整个操作序列(FFT、乘法、IFFT)将对应于计算信号在时域中与其自身的循环卷积。如果首先将信号填充到至少 2*N-1
的长度(这恰好是在 IFFT 之后存储所有线性卷积系数所需的最小大小),则循环卷积仅等同于线性卷积。
您可以使用较小的 FFT 大小(即小于 2*N-1
,但至少 N
)通过使用 Overlap-add method.
计算线性卷积
我有一个信号,我正在对其进行 FFT,与自身进行卷积,然后将 IFFT 返回到时域。信号长8192。如果我将信号填充到 16384 (N*2) 并执行操作,我会得到正确的输出。然而,这有必要吗?但是当我尝试使用 C2C FFT 变换并坚持使用 8192 时,我在整个过程中都有类似的数据,直到 IFFT。 (当使用 8192 时,它只有 16384 数据中的每第二个点)。
我已经 运行 通过 matlab 进行了此操作并得到了相同的结果,所以我怀疑它更多地与数学有关而不是实现,但是因为我在 cuda 中这样做,欢迎任何建议,我不介意在必要时以某种形状填充数据,但数据在我执行 IFFT 之前都很好。
N.B 我知道我并没有在 GPU 上进行所有计算,这只是为了消除错误并让我看到代码在做什么。
Link 编码:http://pasted.co/e2e5e625
这是我应该得到的
如果我不填充,这就是我得到的结果。
I have a signal that I am doing an FFT to, doing an convolution with itself and then an IFFT back to the time domain.
看看你的代码,你不是在频域中做 "convolution with itself" 而是自己做乘法。
整个操作序列(FFT、乘法、IFFT)将对应于计算信号在时域中与其自身的循环卷积。如果首先将信号填充到至少 2*N-1
的长度(这恰好是在 IFFT 之后存储所有线性卷积系数所需的最小大小),则循环卷积仅等同于线性卷积。
您可以使用较小的 FFT 大小(即小于 2*N-1
,但至少 N
)通过使用 Overlap-add method.