如何计算离散傅立叶变换?

jam*_*han 3 algorithm fft complex-numbers dft

我一直试图找到一些地方来帮助我更好地理解DFT以及如何计算它但无济于事.所以我需要帮助理解DFT和它的复数计算.

基本上,我只是在寻找有关如何计算DFT的示例,并解释它是如何计算的,因为最后,我正在寻找创建算法来计算它.

Spe*_*tre 9

我假设一维DFT/IDFT ......

所有DFT都使用这个公式:

DFT方程

  • X(k) 是变换样本值(复杂域)
  • x(n) 是输入数据样本值(实际或复杂域)
  • N 是数据集中的样本/值的数量

整个事情通常乘以归一化常数c.正如您所看到的单值,您需要N计算,因此对于所有样本,O(N^2)它都很慢.

在这里可以找到有关如何使用1D变换计算2D变换以及如何N-point通过N-pointDFT,IDFT 计算DCT,IDCT的Real < - >复杂域DFT/IDFT的提示.

快速算法

存在快速算法,基于将该等式分别为总和的奇数偶数部分(其给出总和),其也是每单个值,但是两个半部是相同的等式,一些常数调整.所以可以直接从第一个计算出一半.这导致每单值.如果你递归地应用这个,那么你得到每个单值.所以整个事情变得很棒,但也增加了这些限制:2x N/2O(N)+/-O(N/2)O(log(N))O(N.log(N))

所有DFFT都需要输入数据集的大小等于2的幂!

所以它可以递归拆分.零填充到最接近的2的较大功率用于无效的数据集大小(在音频技术中有时甚至是相移).看这里:

复数

  • c = a + i*b
  • c 是复数
  • a 是它的真实部分(Re)
  • b 是它想象中的部分(Im)
  • i*i=-1 是虚构的单位

所以计算是这样的

加成:

c0+c1=(a0+i.b0)+(a1+i.b1)=(a0+a1)+i.(b0+b1)
Run Code Online (Sandbox Code Playgroud)

乘法:

c0*c1=(a0+i.b0)*(a1+i.b1)
     =a0.a1+i.a0.b1+i.b0.a1+i.i.b0.b1
     =(a0.a1-b0.b1)+i.(a0.b1+b0.a1)
Run Code Online (Sandbox Code Playgroud)

真实 - >复杂的转换:

complex = real+i.0
Run Code Online (Sandbox Code Playgroud)

[笔记]