【问题标题】:CUDA CUFFT/IFFT Different results if i pad my data?CUDA CUFFT/IFFT 如果我填充数据会有不同的结果?
【发布时间】:2019-05-11 20:07:30
【问题描述】:

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

我已经通过 matlab 运行它并得到了相同的结果,所以我怀疑它更多地与数学而不是实现有关,但是当我在 cuda 中这样做时,欢迎任何建议,我不介意如有必要,以某种形状填充数据,但数据在我进行 IFFT 之前都很好。

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

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

这是我应该得到的

如果我不填充,这就是我得到的。

【问题讨论】:

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

标签: c++ cuda fft


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-01
    • 1970-01-01
    相关资源
    最近更新 更多