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

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)来解决这个问题,但在不理解原因的情况下,这种修复方法让我感到非常不安。
请问您能否指出我在做错了什么?

就像积分一样 - 我们通常不提及常数。 - MSalters
1
这真的取决于实现方式。请查看Kiss文档以了解扩展方面的信息。通常,除以n是逆FFT例程的一部分。看起来他们在Kiss中跳过了这一步骤。 - sellibitze
1个回答

14
这是可以预期的:离散傅里叶逆变换(可以使用快速傅里叶变换实现)需要除以1/N:
引用部分: DFT和IDFT的归一化因子(这里为1和1/N)以及指数的符号仅仅是惯例,在某些处理中可能会有所不同。这些惯例的唯一要求是DFT和IDFT具有相反符号的指数,并且它们的归一化因子的乘积为1/N。对于DFT和IDFT都进行\sqrt{1/N}的归一化使得变换是酉的,这具有一些理论优势。但在数字计算中,一次性完成缩放通常更加实用(并且单位缩放在其他方面也很方便)。

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


太好了!非常感谢您。 - mosi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接