Kiss FFT似乎将数据乘以它转换的点数

mos*_*osi 4 c++ signal-processing fft kissfft

我对傅里叶变换的有限理解是,您应该能够在时域和频域之间切换,而无需更改原始数据.所以,这里是我(我想)我在做什么的总结:

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

  2. 使用kiss_fft_alloc(...)创建kiss_fft_cfgnfft = 1000.

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

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

  5. 使用kiss_fft_alloc(...)创建逆kiss_fft_cfgnfft = 1000.

  6. 传递逆kiss_fft_cfgkiss_fft(...)输入先前的输出数组.

  7. 期待原始数据回来,但每个数据准确地大1000倍!

我在这里放了一个完整的例子,最后可以找到我的50多行代码.虽然我可以通过将每个结果除以OPTIMAL_SIZE(即1000)的值来解决这个问题,但是如果没有理解为什么那么修复会使我感到非常不安.

请问你能说出我做错的愚蠢事吗?

use*_*136 14

这是可以预期的:反向离散傅立叶变换(可以使用快速傅里叶变换实现),需要除以1/N:

乘以DFT和IDFT(此处为1和1/N)的标准化因子和指数的符号仅仅是惯例,并且在一些处理方面不同.这些约定的唯一要求是DFT和IDFT具有相反符号指数,并且它们的归一化因子的乘积为1/N. 对于DFT和IDFT,\ sqrt {1/N}的归一化使得变换是单一的,这具有一些理论上的优点.但是,如上所述,在数值计算中通常更加实际地一次执行缩放(并且单位缩放在其他方面可以是方便的).

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