5

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

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

  2. 用于kiss_fft_alloc(...)创建一个kiss_fft_cfg 。nfft = 1000

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

  4. 将Kiss_fft_cfg与我的输入kiss_fft(...)输出数组一起传递。

  5. kiss_fft_alloc(...)用于创建一个反向的kiss_fft_cfg nfft = 1000

  6. 将逆的kiss_fft_cfg传递给kiss_fft(...)输入前一个输出数组。

  7. 期望返回原始数据,但将每个数据精确地放大 1000 倍!

我在这里放了一个完整的例子,我的 50 多行代码可以在最后找到。虽然我可以通过将每个结果除以OPTIMAL_SIZE(即 1000)的值来解决这个问题,但这个修复让我非常不安,不明白为什么。

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

4

1 回答 1

14

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

乘以 DFT 和 IDFT(此处为 1 和 1/N)的归一化因子以及指数的符号只是惯例,在某些处理中有所不同。这些约定的唯一要求是 DFT 和 IDFT 具有相反符号的指数,并且它们的归一化因子的乘积为 1/N。DFT 和 IDFT 的 \sqrt{1/N} 归一化使得变换是单一的,这具有一些理论上的优势。但是在数值计算中,像上面那样一次执行缩放通常更实用(并且单位缩放在其他方面可能很方便)。

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

于 2012-08-20T11:48:28.557 回答