我一直试图找一些地方来帮助我更好地理解DFT以及如何计算它但无济于事。所以我需要帮助理解DFT及其复数的计算。
基本上,我只是在寻找有关如何计算DFT的示例,并说明如何计算DFT,因为最后,我希望创建一个算法来计算它。
答案 0 :(得分:9)
我假设1D DFT / IDFT ......
所有DFT都使用此公式:
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)
<强> [注释] 强>
complex = real+i.0
也取决于递归停止条件)/=log2(N)
... N=1 or 2
很大)N