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

时间:2012-08-20 10:54:24

标签: c++ signal-processing fft kissfft

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

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

  2. 使用kiss_fft_alloc(...)nfft = 1000一起创建 kiss_fft_cfg

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

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

  5. 使用kiss_fft_alloc(...)nfft = 1000创建反向kiss_fft_cfg

  6. 反向kiss_fft_cfg 传递给kiss_fft(...)输入上一个输出数组。

  7. 期待原始数据,但每个数据的大小要好1000倍!

  8. 我添加了full example here,我的50多行代码可以在找到。虽然我可以通过将每个结果除以OPTIMAL_SIZE(即1000)的值来解决这个问题,但修复程序让我非常不安而不理解为什么。

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

1 个答案:

答案 0 :(得分:14)

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

  

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

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