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

时间:2014-10-14 05:06:59

标签: algorithm fft complex-numbers dft

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

基本上,我只是在寻找有关如何计算DFT的示例,并说明如何计算DFT,因为最后,我希望创建一个算法来计算它。

1 个答案:

答案 0 :(得分:9)

我假设1D DFT / IDFT ......

所有DFT都使用此公式:

DFT equation

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

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

此处mine Real<->Complex domain DFT/IDFT in C++您还可以找到有关如何使用1D变换计算2D变换以及如何通过N-point DFT,IDFT计算N-point DCT,IDCT的提示。

快速算法

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

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

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

复杂数字

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

所以计算就像这样

<强>此外:

i*i=-1

<强>乘法:

c0+c1=(a0+i.b0)+(a1+i.b1)=(a0+a1)+i.(b0+b1)

真实 - &gt;复杂转换:

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)

<强> [注释]