【问题标题】:Kiss FFT seems to multiply data by the number of points that it transformsKiss FFT 似乎将数据乘以它转换的点数
【发布时间】:2012-08-15 16:58:35
【问题描述】:

我对傅里叶变换的有限理解是,您应该能够在不更改原始数据的情况下在时域和频域之间切换。所以,这里是我(认为我)在做什么的总结:

  1. 使用kiss_fft_next_fast_size(994)来确定我应该使用1000。

  2. 使用kiss_fft_alloc(...) 创建带有nfft = 1000kiss_fft_cfg

  3. 通过将额外点填充为零,将我的输入数据从 994 大小扩展到 1000。

  4. kiss_fft_cfg 与我的输入和输出数组一起传递给 kiss_fft(...)

  5. 使用kiss_fft_alloc(...) 创建带有nfft = 1000inverse Kiss_fft_cfg

  6. inverse Kiss_fft_cfg传递给kiss_fft(...),输入前一个输出数组。

  7. 期待原始数据返回,但每个数据都恰好大 1000 倍!

我已经输入了full example here,我的 50 多行代码就在末尾​​strong>。虽然我可以通过将每个结果除以 OPTIMAL_SIZE 的值(即 1000)来解决这个问题,但这个修复让我非常不安,不明白为什么。

你能告诉我我做错了什么愚蠢的事情吗?

【问题讨论】:

  • 就像积分一样——我们通常不会提到常数。
  • 这真的取决于实现。检查有关缩放的 Kiss 文档。通常,除以 n 是逆 FFT 例程的一部分。看起来他们在 Kiss 中跳过了这一步。

标签: c++ signal-processing fft kissfft


【解决方案1】:

这是意料之中的:逆离散傅里叶变换(可以使用快速傅里叶变换实现)需要除以 1/N:

归一化因子乘以 DFT 和 IDFT(此处为 1 和 1/N) 并且指数的符号只是约定,并且在 一些治疗。这些约定的唯一要求是 DFT 和 IDFT 具有相反符号的指数,并且 它们的归一化因子为 1/N。 DFT 和 IDFT 的 \sqrt{1/N} 归一化使得变换是单一的, 具有一定的理论优势。但它往往更实用 在数值计算中一次执行所有缩放,如上所述 (并且单位缩放可以通过其他方式方便)。

http://en.wikipedia.org/wiki/Dft

【讨论】:

  • 这是一种解脱!非常感谢您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-26
  • 2017-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-18
相关资源
最近更新 更多