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=0∑N−1e−iN2πknan,k∈{0,1,...N−1}
一般我们通常写成
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=0∑N−1WNknan,k∈{0,1,...N−1}
其中
W N = e − i 2 π N W_{N} = e^{-i\frac{2\pi}{N}} WN=e−iN2π
W
N
k
W_{N}^{k}
WNk称为旋转因子
, twiddle factor
,之所以称之为旋转因子,是因为它在单位圆上根据k值不同而做不同角度的旋转。 (更多阅读请参考欧拉公式和傅里叶变换原理)
下面是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=0∑N−1WN−knAk,k∈{0,1,...N−1}
具体示例
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=e−i2π/2=e−iπ=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=0∑1(−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=a0−a1
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=e−i2π/4=e−iπ/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=0∑3(−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=a0−ia1−a2+ia3A2=a0−a1+a2−a3A3=a0+ia1−a2−ia3
可以把它抽取出来参数,作为一个矩阵相乘,
{
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⎭⎪⎪⎬⎪⎪⎫=⎩⎪⎪⎨⎪⎪⎧11111−i−1i1−11−11i−1−i⎭⎪⎪⎬⎪⎪⎫⎩⎪⎪⎨⎪⎪⎧a0a1a2a3⎭⎪⎪⎬⎪⎪⎫
为了快速计算
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=(a0−a2)−i(a1−ia3)A2=(a0+a2)−(a1+a3)A3=(a0−a2)+i(a1−a3)
这样很多运算结果可以公用。
如果使用图线的方式来表示乘与加,有如下表示方法,
所以4个sample的DFT可以画成如下,
这便是DFT中蝴蝶算法的基本原理。
下面是8个sample的运算图
自己实现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内置函数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));
有一些有意思的结论,
- real部分是对称的,img部分是共轭兑成的
- 如果是完整的sin和cos波,在频率点处,可以看到跳点,原来的“直线”像断在这里一样
- 如果是完整的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=e−i2π/8=e−iπ/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⎭⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎬⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎫