本文已参与「新人创作礼」活动,一起开启掘金创作之路。
题记
用笔计算了下DFT,并用Matlab进行了验算。
为防止以后再做一次公式,特意记录一下。感叹:绕不过的傅里叶和卷积...
公式
离散傅里叶变换的公式 - Fourier Transform:
X k = ∑ j = 0 n − 1 x j ⋅ W j k E 1 W = e − 2 π n i E 2 X k = ∑ j = 0 n − 1 x j ⋅ e − j k 2 π n i E 3 \begin{aligned}
X_k &= \sum_{j = 0}^{n-1} x_{j} \cdot W^{jk} &\qquad E_1\\
W &= e^{-\frac{2\pi}{n}i} &\qquad E_2\\
X_k &= \sum_{j = 0}^{n-1} x_{j} \cdot e^{-jk\frac{2\pi}{n}i} &\qquad E_3\\
\end{aligned} X k W X k = j = 0 ∑ n − 1 x j ⋅ W jk = e − n 2 π i = j = 0 ∑ n − 1 x j ⋅ e − jk n 2 π i E 1 E 2 E 3
符号说明:
符号 说明 X k X_k X k 第 k k k 次傅里叶变换的结果, 即序列中频率为w w w 的幅值 x j x_j x j 序列中第 j j j 个数值 W W W 关于频率 (w = 2 π f t w={2\pi f t} w = 2 π f t ) 的函数, ==注:f = 1 n f=\frac{1}{n} f = n 1 在E 1 的 W 中, t 是 E 1 中 W 的指数 j E_1的W中,t是E_1中W的指数j E 1 的 W 中, t 是 E 1 中 W 的指数 j == i i i 复数中,虚部符号 n n n 序列长度
例子
序列 x = [ 1 , 2 , 3 ] , 则 n = 3 k = 0 : X 0 = ∑ j = 0 n − 1 x j ⋅ e − j k 2 π n i = ∑ j = 0 2 x j ⋅ e − j 0 2 π 3 i k = 1 : X 1 = ∑ j = 0 n − 1 x j ⋅ e − j k 2 π n i = ∑ j = 0 2 x j ⋅ e − j 1 2 π 3 i k = 2 : X 2 = ∑ j = 0 n − 1 x j ⋅ e − j k 2 π n i = ∑ j = 0 2 x j ⋅ e − j 2 2 π 3 i 序列x = [1, 2, 3],\qquad 则 n = 3\\
\begin{aligned}
k &= 0:X_0=\sum_{j = 0}^{n-1} x_{j} \cdot e^{-jk\frac{2\pi}{n}i}= \sum_{j = 0}^{2} x_{j} \cdot e^{-j0\frac{2\pi}{3}i}\\
k &= 1:X_1=\sum_{j = 0}^{n-1} x_{j} \cdot e^{-jk\frac{2\pi}{n}i}= \sum_{j = 0}^{2} x_{j} \cdot e^{-j1\frac{2\pi}{3}i}\\
k &= 2:X_2=\sum_{j = 0}^{n-1} x_{j} \cdot e^{-jk\frac{2\pi}{n}i}= \sum_{j = 0}^{2} x_{j} \cdot e^{-j2\frac{2\pi}{3}i}\\
\end{aligned} 序列 x = [ 1 , 2 , 3 ] , 则 n = 3 k k k = 0 : X 0 = j = 0 ∑ n − 1 x j ⋅ e − jk n 2 π i = j = 0 ∑ 2 x j ⋅ e − j 0 3 2 π i = 1 : X 1 = j = 0 ∑ n − 1 x j ⋅ e − jk n 2 π i = j = 0 ∑ 2 x j ⋅ e − j 1 3 2 π i = 2 : X 2 = j = 0 ∑ n − 1 x j ⋅ e − jk n 2 π i = j = 0 ∑ 2 x j ⋅ e − j 2 3 2 π i
再代入欧拉公式 :e x + i y = c o s ( x ) + i ⋅ s i n ( y ) e^{x+iy}=cos(x)+i \cdot sin(y) e x + i y = cos ( x ) + i ⋅ s in ( y )
X 0 = ∑ j = 0 2 x j ⋅ e − j 0 2 π 3 i = x 0 + x 1 + x 2 = 6 + 0 i X 1 = ∑ j = 0 2 x j ⋅ e − j 1 2 π 3 i = x 0 + x 1 ⋅ ( − 1 2 − 3 2 i ) + x 2 ⋅ ( − 1 2 + 3 2 i ) = − 3 2 + 3 2 i ; X 2 = ∑ j = 0 2 x j ⋅ e − j 2 2 π 3 i = x 0 + x 1 ⋅ ( − 1 2 + 3 2 i ) + x 2 ⋅ ( − 1 2 − 3 2 i ) = − 3 2 − 3 2 i ; \begin{aligned}
X_0&= \sum_{j = 0}^{2} x_{j} \cdot e^{-j0\frac{2\pi}{3}i} =x_0+x_1+x_2=6 + 0i\\
X_1&= \sum_{j = 0}^{2} x_{j} \cdot e^{-j1\frac{2\pi}{3}i} =x_0+x_1\cdot (-\frac{1}{2}-\frac{\sqrt{3}}{2}i)+x_2\cdot (-\frac{1}{2}+\frac{\sqrt{3}}{2}i)=-\frac{3}{2} +\frac{\sqrt{3}}{2}i;\\
X_2&= \sum_{j = 0}^{2} x_{j} \cdot e^{-j2\frac{2\pi}{3}i} =x_0+x_1\cdot (-\frac{1}{2}+\frac{\sqrt{3}}{2}i)+x_2\cdot (-\frac{1}{2}-\frac{\sqrt{3}}{2}i)=-\frac{3}{2} -\frac{\sqrt{3}}{2}i;\\
\end{aligned} X 0 X 1 X 2 = j = 0 ∑ 2 x j ⋅ e − j 0 3 2 π i = x 0 + x 1 + x 2 = 6 + 0 i = j = 0 ∑ 2 x j ⋅ e − j 1 3 2 π i = x 0 + x 1 ⋅ ( − 2 1 − 2 3 i ) + x 2 ⋅ ( − 2 1 + 2 3 i ) = − 2 3 + 2 3 i ; = j = 0 ∑ 2 x j ⋅ e − j 2 3 2 π i = x 0 + x 1 ⋅ ( − 2 1 + 2 3 i ) + x 2 ⋅ ( − 2 1 − 2 3 i ) = − 2 3 − 2 3 i ;
Matlab检验
x = [1 2 3 ];
n = length(x);
result = zeros(1 ,n);
for k = 0 :n-1
for j = 0 :n-1
result(k+1 ) = result(k+1 ) + x(j+1 ) * (cos(j*k*2 *pi/n) - sin(j*k*2 *pi/n)*i);
end
end
result
fft(x)
参考资料
en.wikipedia.org/wiki/Discre…
baijiahao.baidu.com/s?id=172580…
zhuanlan.zhihu.com/p/407885496