jam*_*han 3 algorithm fft complex-numbers dft
我一直试图找到一些地方来帮助我更好地理解DFT以及如何计算它但无济于事.所以我需要帮助理解DFT和它的复数计算.
基本上,我只是在寻找有关如何计算DFT的示例,并解释它是如何计算的,因为最后,我正在寻找创建算法来计算它.
我假设一维DFT/IDFT ......
所有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*bc 是复数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)
[笔记]
/=log2(N)取决于递归停止条件)N=1 or 2...... 不要忘记停止递归N很大)e^(i.x)=cos(x)+i.sin(x)