Discrete Fourier Transform离散傅里叶变换算法

DFT

公式:

A k = ∑ n = 0 N − 1 e − i 2 π N k n a n , k ∈ { 0 , 1 , . . . N − 1 } A_k = \sum_{n=0}^{N-1}e^{-i\frac{2\pi}{N}kn}a_n , k\in \{0,1,... N-1\} Ak=n=0N1eiN2πknan,k{0,1,...N1}

一般我们通常写成
A k = ∑ n = 0 N − 1 W N k n a n , k ∈ { 0 , 1 , . . . N − 1 } A_k = \sum_{n=0}^{N-1}W_{N}^{kn}a_n , k\in \{0,1,... N-1\} Ak=n=0N1WNknan,k{0,1,...N1}

其中

W N = e − i 2 π N W_{N} = e^{-i\frac{2\pi}{N}} WN=eiN2π

W N k W_{N}^{k} WNk称为旋转因子, twiddle factor,之所以称之为旋转因子,是因为它在单位圆上根据k值不同而做不同角度的旋转。 (更多阅读请参考欧拉公式和傅里叶变换原理)

下面是N=2,N=4,N=8的旋转,
N=2,N=4,N=8的旋转
从图中可以看到,旋转因子具有如下性质

W N 0 = 1 W N N 2 = − 1 W N k = W N k + N W_{N}^{0}=1 \\ W_{N}^{\frac{N}{2}}=-1 \\ W_{N}^{k}=W_{N}^{k+N} WN0=1WN2N=1WNk=WNk+N


iDFT

公式:
a n = 1 N ∑ k = 0 N − 1 W N − k n A k , k ∈ { 0 , 1 , . . . N − 1 } a_n = \frac{1}{N}\sum_{k=0}^{N-1}W_N^{-kn}A_k, k\in \{0,1,... N-1\} an=N1k=0N1WNknAk,k{0,1,...N1}


具体示例

2个sample的DFT

旋转因子

W 2 = e − i 2 π / 2 = e − i π = c o s π − i s i n π = − 1 W_2 = e^{-i2\pi/2} = e^{-i\pi} = cos\pi-isin\pi = -1 W2=ei2π/2=eiπ=cosπisinπ=1

A k A_k Ak:
A k = ∑ n = 0 1 ( − 1 ) k n a n = ( − 1 ) 0 k a 0 + ( − 1 ) 1 k a 1 A_k = \sum_{n=0}^1 (-1)^{kn}a_n = (-1)^{0k}a_0+(-1)^{1k}a_1 Ak=n=01(1)knan=(1)0ka0+(1)1ka1

所以
A 0 = a 0 + a 1 A 1 = a 0 − a 1 A_0 = a_0+a_1 \newline A_1 = a_0-a_1 A0=a0+a1A1=a0a1

4个sample的DFT

旋转因子

W 4 = e − i 2 π / 4 = e − i π / 2 = − i W_4 = e^{-i2\pi/4} = e^{-i\pi/2} = -i W4=ei2π/4=eiπ/2=i

A k A_k Ak:
A k = ∑ n = 0 3 ( − 1 ) k n a n = ( − i ) 0 k a 0 + ( − i ) 1 k a 1 + ( − i ) 2 k a 2 + ( − i ) 3 k a 3 A_k = \sum_{n=0}^3 (-1)^{kn}a_n = (-i)^{0k}a_0+(-i)^{1k}a_1+(-i)^{2k}a_2+(-i)^{3k}a_3 Ak=n=03(1)knan=(i)0ka0+(i)1ka1+(i)2ka2+(i)3ka3

所以
A 0 = a 0 + a 1 + a 2 + a 3 A 1 = a 0 − i a 1 − a 2 + i a 3 A 2 = a 0 − a 1 + a 2 − a 3 A 3 = a 0 + i a 1 − a 2 − i a 3 A_0 = a_0+a_1+a_2+a_3 \newline A_1 = a_0-ia_1-a_2+ia_3 \newline A_2 = a_0-a_1+a_2-a_3 \newline A_3 = a_0+ia_1-a_2-ia_3 A0=a0+a1+a2+a3A1=a0ia1a2+ia3A2=a0a1+a2a3A3=a0+ia1a2ia3

可以把它抽取出来参数,作为一个矩阵相乘,
{ A 0 A 1 A 2 A 3 } = { 1 1 1 1 1 − i − 1 i 1 − 1 1 − 1 1 i − 1 − i } { a 0 a 1 a 2 a 3 } \begin{Bmatrix} A_0 \\ A_1 \\ A_2 \\ A_3 \end{Bmatrix} = \begin{Bmatrix} 1 & 1 & 1 & 1 \\ 1 & -i & -1 & i \\ 1 & -1 & 1 & -1 \\ 1 & i & -1 & -i \end{Bmatrix} \begin{Bmatrix} a_0 \\ a_1 \\ a_2 \\ a_3 \end{Bmatrix} A0A1A2A3=11111i1i11111i1ia0a1a2a3

为了快速计算 A A A,我们可以将计算稍作改变:
A 0 = ( a 0 + a 2 ) + ( a 1 + a 3 ) A 1 = ( a 0 − a 2 ) − i ( a 1 − i a 3 ) A 2 = ( a 0 + a 2 ) − ( a 1 + a 3 ) A 3 = ( a 0 − a 2 ) + i ( a 1 − a 3 ) A_0 = (a_0+a_2) + (a_1+a_3) \newline A_1 = (a_0-a_2) - i(a_1-ia_3) \newline A_2 = (a_0+a_2) - (a_1+a_3) \newline A_3 = (a_0-a_2) + i(a_1-a_3) A0=(a0+a2)+(a1+a3)A1=(a0a2)i(a1ia3)A2=(a0+a2)(a1+a3)A3=(a0a2)+i(a1a3)
这样很多运算结果可以公用。

如果使用图线的方式来表示乘与加,有如下表示方法,
乘与加
所以4个sample的DFT可以画成如下,
4个sample的DFT
这便是DFT中蝴蝶算法的基本原理。
下面是8个sample的运算图
8sample图


自己实现DFT

根据上述算法,在matlab上做如下DFT实现

定义DFT函数

function [f, Xk] = mydft(xn, fs, N)
%UNTITLED2 此处显示有关此函数的摘要
%   此处显示详细说明
%   xn:  the discrete samples
%   fs:  frequency
%   N:   the amount of samples
    n = 0:1:N-1;
    k = n;
    WN= exp(-1i*2*pi/N);
    nk = n' * k;
    Xk = xn(1:N) * WN.^nk;
    f = 0:fs/N:fs/N*(N-1);
end

Demo代码如下,
Matlab代码
可以看到和Matlab内置函数fft结果是一样的

复数域的三维观测

频率在时间轴上形成了“波”形的二维形状,但是它仅仅展示出了振幅(能量)信息。
傅里叶变化增加了复数域轴,使它展示出了相位信息,每一个点也成为了三维空间上的点。

下面我们在三维视角下观测,操作步骤如下,

绘制波形
N=200;

fs=20;
i=0:1:N-1;
xn = sin(2*pi*i*fs/N);

绘制振幅谱
Xk = fft(xn,N);
mag = abs(Xk);

plot(1:1:N/2, mag(1:N/2));

绘制real部分
scatter(1:1:N, real(Xk));

绘制img部分
scatter(1:1:N, imag(Xk));

投影图
scatter(real(Xk), imag(Xk));

绘制3D点
scatter3(1:1:N, real(Xk), imag(Xk));

有一些有意思的结论,

  1. real部分是对称的,img部分是共轭兑成的
  2. 如果是完整的sin和cos波,在频率点处,可以看到跳点,原来的“直线”像断在这里一样
  3. 如果是完整的sin和cos波,投影图是趋向于X型的

选取一段钢琴音,观测它的3D图

real部分图

imagine部分图

投影图基本呈现X形状


附录

8sample DFT 样例

旋转因子

W 8 1 = e − i 2 π / 8 = e − i π / 4 = 2 2 − i 2 2 W_8^1 = e^{-i2\pi/8} = e^{-i\pi/4} = \frac{\sqrt{2}}2-i\frac{\sqrt{2}}2 W81=ei2π/8=eiπ/4=22 i22
W 8 2 = − i W_8^2 = -i W82=i
W 8 3 = − 2 2 − i 2 2 W_8^3 = -\frac{\sqrt{2}}2-i\frac{\sqrt{2}}2 W83=22 i22
W 8 4 = − 1 W_8^4 = -1 W84=1
W 8 5 = − 2 2 + i 2 2 W_8^5 = -\frac{\sqrt{2}}2+i\frac{\sqrt{2}}2 W85=22 +i22
W 8 6 = i W_8^6 = i W86=i
W 8 7 = 2 2 + i 2 2 W_8^7 = \frac{\sqrt{2}}2+i\frac{\sqrt{2}}2 W87=22 +i22
W 8 8 = 1 W_8^8 = 1 W88=1

旋转因子矩阵

{ W 8 0    W 8 0    W 8 0    W 8 0    W 8 0    W 8 0    W 8 0    W 8 0 W 8 0    W 8 1    W 8 2    W 8 3    W 8 4    W 8 5    W 8 6    W 8 7 W 8 0    W 8 2    W 8 4    W 8 6    W 8 0    W 8 2    W 8 4    W 8 6 W 8 0    W 8 3    W 8 6    W 8 1    W 8 4    W 8 7    W 8 2    W 8 5 W 8 0    W 8 4    W 8 0    W 8 4    W 8 0    W 8 4    W 8 0    W 8 4 W 8 0    W 8 5    W 8 2    W 8 7    W 8 4    W 8 1    W 8 6    W 8 3 W 8 0    W 8 6    W 8 4    W 8 2    W 8 0    W 8 6    W 8 4    W 8 2 W 8 0    W 8 7    W 8 6    W 8 5    W 8 4    W 8 3    W 8 2    W 8 1 } \begin{Bmatrix} W_8^0\space\space W_8^0\space\space W_8^0\space\space W_8^0\space\space W_8^0\space\space W_8^0\space\space W_8^0\space\space W_8^0 \\ \\ W_8^0\space\space W_8^1\space\space W_8^2\space\space W_8^3\space\space W_8^4\space\space W_8^5\space\space W_8^6\space\space W_8^7 \\ \\ W_8^0\space\space W_8^2\space\space W_8^4\space\space W_8^6\space\space W_8^0\space\space W_8^2\space\space W_8^4\space\space W_8^6 \\ \\ W_8^0\space\space W_8^3\space\space W_8^6\space\space W_8^1\space\space W_8^4\space\space W_8^7\space\space W_8^2\space\space W_8^5 \\ \\ W_8^0\space\space W_8^4\space\space W_8^0\space\space W_8^4\space\space W_8^0\space\space W_8^4\space\space W_8^0\space\space W_8^4 \\ \\ W_8^0\space\space W_8^5\space\space W_8^2\space\space W_8^7\space\space W_8^4\space\space W_8^1\space\space W_8^6\space\space W_8^3 \\ \\ W_8^0\space\space W_8^6\space\space W_8^4\space\space W_8^2\space\space W_8^0\space\space W_8^6\space\space W_8^4\space\space W_8^2 \\ \\ W_8^0\space\space W_8^7\space\space W_8^6\space\space W_8^5\space\space W_8^4\space\space W_8^3\space\space W_8^2\space\space W_8^1 \\ \\ \end{Bmatrix} W80  W80  W80  W80  W80  W80  W80  W80W80  W81  W82  W83  W84  W85  W86  W87W80  W82  W84  W86  W80  W82  W84  W86W80  W83  W86  W81  W84  W87  W82  W85W80  W84  W80  W84  W80  W84  W80  W84W80  W85  W82  W87  W84  W81  W86  W83W80  W86  W84  W82  W80  W86  W84  W82W80  W87  W86  W85  W84  W83  W82  W81

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值