我对傅里叶变换的有限理解是,您应该能够在时域和频域之间切换,而无需更改原始数据。所以,这里是我(我想)我在做什么的总结:
使用kiss_fft_next_fast_size(994)
确定我应该使用1000。
使用kiss_fft_alloc(...)
与nfft = 1000
一起创建 kiss_fft_cfg 。
通过将额外点数填充为零,将输入数据从994扩展到1000.
将 kiss_fft_cfg 与我的输入和输出数组一起传递给kiss_fft(...)
。
使用kiss_fft_alloc(...)
与nfft = 1000
创建反向kiss_fft_cfg 。
将反向kiss_fft_cfg 传递给kiss_fft(...)
输入上一个输出数组。
期待原始数据,但每个数据的大小要好1000倍!
我添加了full example here,我的50多行代码可以在找到。虽然我可以通过将每个结果除以OPTIMAL_SIZE
(即1000)的值来解决这个问题,但修复程序让我非常不安而不理解为什么。
请问你能说出我做错的简单蠢事吗?
答案 0 :(得分:14)
这是可以预期的:反向离散傅里叶变换(可以使用快速傅里叶变换实现),需要除以1 / N:
归一化因子乘以DFT和IDFT(此处为1和1 / N) 并且指数的标志仅仅是惯例,并且有所不同 一些治疗。这些约定的唯一要求是 DFT和IDFT具有相反的符号指数和该产品 它们的归一化因子是1 / N. DFT和IDFT的\ sqrt {1 / N}的标准化使得变换成为单一的, 这有一些理论上的优势。但它通常更实用 在数值计算中如上所述一次执行缩放 (以其他方式进行单位缩放可能很方便。)