离散傅里叶变换

离散傅里叶变换的作用

将时间域信号分解为构成它的频率成分,以此获得频率信息(振幅谱、功率谱和功率谱密度)可以获得我们无法从时间域获得的对信号的一些洞察。

离散傅里叶变换(DFT)便是帮助我们获得这些表示的第一步。

DFT将信号(时间域)或距离(空间域)转换到频率域。

可以通过转换找到原本域内不明显的信号特征

离散傅里叶变换的公式

X k = ∑ n = 0 N − 1 x n e − i 2 π N k n X_k = \sum_{n=0}^{N-1}{x_n}e^{-i\frac{2\pi}{N}kn} Xk=n=0N1xneiN2πkn

xn 为离散时间域信号 ✖ 复数为e的指数
e − i 2 π N k n e − i n = c o s ( n ) + i s i n ( n ) e^{-i\frac{2\pi}{N}kn} \\ e^{-in} = cos(n)+isin(n) eiN2πknein=cos(n)+isin(n)
即可看作将时间信号✖特定频率的正弦和余弦 ,由变量k给出,再将结果求和。

可对不同的频率和不同的k值进行求和。

离散傅里叶变换仍旧是时域到频域的变换。由于求和形式的特殊性,可以有其他的解释方法。

如果把序列xn看作多项式f(x)的xn项系数,则计算得到的XK 恰好是多项式 f (x)代入单位根$e^{-i\frac{2\pi}{N}k} \ 的点值 的点值 的点值f(e^{-i\frac{2\pi}{N}k}\$) 。

这便构成了卷积定理的另一种解释办法,即对多项式进行特殊的插值操作。离散傅里叶变换恰好是多项式在单位根处进行插值。

例如计算:

( n 3 ) + ( n 7 ) + ( n 11 ) + ( n 15 ) + … … {n\choose 3} + {n\choose 7} +{n\choose 11}+{n\choose 15}+…… (3n)+(7n)+(11n)+(15n)+……

定义函数f(x)为:

f ( x ) = ( 1 + x ) n = ( n 0 ) x 0 + ( n 1 ) x 1 + ( n 2 ) x 2 + ( n 3 ) x 3 + … … f(x) = (1+x)^n = {n\choose 0}x^0 + {n\choose 1}x^1 +{n\choose 2}x^2+{n\choose 3}x^3+…… f(x)=(1+x)n=(0n)x0+(1n)x1+(2n)x2+(3n)x3+……

然后可以发现,代入四次单位根 f(i)得到这样的序列:

f ( i ) = ( 1 + i ) n = ( n 0 ) + ( n 1 ) i − ( n 2 ) x 2 − ( n 3 ) i + … … f(i) = (1+i)^n={n\choose 0} + {n\choose 1}i -{n\choose 2}x^2-{n\choose 3}i+…… f(i)=(1+i)n=(0n)+(1n)i(2n)x2(3n)i+……

于是下面的求和恰好可以把其余各项消掉:

f ( 1 ) + i f ( i ) − f ( − 1 ) − i f ( − 1 ) = 4 ( n 3 ) + 4 ( n 7 ) + 4 ( n 11 ) + 4 ( n 15 ) + … … f(1) + if(i) - f(-1) -if(-1) = 4{n\choose 3} + 4{n\choose 7} +4{n\choose 11}+4{n\choose 15}+…… f(1)+if(i)f(1)if(1)=4(3n)+4(7n)+4(11n)+4(15n)+……

因此这道数学题的答案为:

( n 3 ) + ( n 7 ) + ( n 11 ) + ( n 15 ) + … … = 2 n + i ( 1 + i ) n − i ( 1 − i ) n 4 {n\choose 3} + {n\choose 7} +{n\choose 11}+{n\choose 15}+…… = \frac{2^n+i(1+i)^n-i(1-i)^n}4 (3n)+(7n)+(11n)+(15n)+……=42n+i(1+i)ni(1i)n

这道数学题在单位根处插值,恰好构成离散傅里叶变换。

在这里插入图片描述

复平面中的单位圆
在这里插入图片描述

其中向量OA单位根,表示为 e i θ e^i\theta eiθ,可知 e i θ = c o s θ + i s i n θ e^i\theta = cos\theta+isin\theta eiθ=cosθ+isinθ

将单位圆等分成 n个部分(以单位圆与实轴正半轴的交点一个等分点),以原点为起点,圆的这 n 个 n等分点为终点,作出 n个向量。

其中幅角为正且最小的向量称为 n次单位向量,记为 ω n 1 \omega_n^1 ωn1

其余的 n−1 个向量分别为 ω n 2 , ω n 3 , … … , ω n n \omega_n^2,\omega_n^3,……,\omega_n^n ωn2,ωn3,……ωnn ,它们可以由复数之间的乘法得来 ω n k = ω n k − ∗ ω n 1 \omega_n^k=\omega_n^k-*\omega_n^1 ωnk=ωnkωn1

易得 ω n n = ω n 0 = 1 \omega_n^n=\omega_n^0=1 ωnn=ωn0=1

可把DFT看作时间信号和许多频率之间产生相关性

在这里插入图片描述

还可以看作矩阵乘法的旋转

在这里插入图片描述

X0 为时间信号与k=0 的内积以此类推

快速傅里叶变换(Fast Fourier Transform, FFT)

快速傅里叶变换 (Fast Fourier Transform, FFT) 是一种可在O(nlogn)时间内完成的 离散傅里叶变换(Discrete Fourier transform, DFT) 算法.

傅里叶变换 (Fourier Transform) 本质上是信号与三角函数进行卷积运算,而快速傅里叶变换 (FFT) 就是提高卷积的计算效率,时间复杂度从 O(n2) 降低到 O(nlogn)

FFT 在算法中主要是用来在算法中的运用主要是用来加速多项式乘法大数乘法

多项式乘法

考虑两个多项式 A(x)B(x),其乘积 C(x) = A(x)·B(x)

假设 A(x) 的项数为 n,其系数构成的 n维向量为 (a0,a1,a2,⋯,an−1) ; B(x) 的项数为 m ,其系数构成的 m维向量为 (b0,b1,b2,⋯,bn−1)。

我们要求C(x) 的系数构成的n+m-1维的向量,先考虑暴力做法:

n = len(A)
m = len(B)
C = [0]*(m+n-1)
for i in range(n):
    for j in range(m):
        C[i+j] = A[i] * B[j]
      

可见时间复杂度是 O(n2) 。

实际运用中多项式的项数非常多,比如 105 这种级别,那么有没有什么方法可以加速运算呢?

已知在一组插值节点 (x0,x1,x2,⋯,xn)中 ,假设A(x)B(x) 为多项式的项数相同。 A(x),**B(x)**的点值向量分别为(ya0,ya1,ya2,⋯,yan) ,(yb0,yb1,yb2,⋯,ybn) ,则:

A ( x ) = ( x 0 , y a 0 ) , ( x 1 , y a 1 ) , ( x 2 , y a 2 ) , … … , ( x n , y a n ) A(x) = (x_0,y_{a0}),(x_1,y_{a1}),(x_2,y_{a2}),……,(x_n,y_{an}) A(x)=(x0,ya0),(x1,ya1),(x2,ya2)……(xn,yan)

B ( x ) = ( x 0 , y b 0 ) , ( x 1 , y b 1 ) , ( x 2 , y b 2 ) , … … , ( x n , y b n ) B(x) = (x_0,y_{b0}),(x_1,y_{b1}),(x_2,y_{b2}),……,(x_n,y_{bn}) B(x)=(x0,yb0),(x1,yb1),(x2,yb2)……(xn,ybn)

C ( x ) = ( x 0 , y a 0 ⋅ y b 0 ) , ( x 1 , y a 1 ⋅ y b 1 ) , ( x 2 , y a 2 ⋅ y b 2 ) , … … , ( x n , y a n ⋅ y b n ) C(x) =(x_0,y_{a0}·y_{b0}),(x_1,y_{a1}·y_{b1}),(x_2,y_{a2}·y_{b2}),……,(x_n,y_{an}·y_{bn}) C(x)=(x0,ya0yb0),(x1,ya1yb1),(x2,ya2yb2)……(xn,yanybn)

那么 C(x) = A(x) ⋅ B(x) ,那么其点值表示法可以在 O(n) 的时间内求出

点值表示法

点值表示法是把这个多项式看成一个函数,从其中选取 n 个不同的点,从而利用这 n 个点来唯一地表示这个函数

A ( x 0 ) = y 0 = a 0 + a 1 x 0 + a 2 x 0 2 + a 3 x 0 3 + … … + a n − 1 x 0 n − 1 A(x_0) = y_0 = a_0 +a_1x_0+a_2x_0^2+a_3x_0^3+……+a_{n-1}x_0^{n-1} A(x0)=y0=a0+a1x0+a2x02+a3x03+……+an1x0n1

A ( x 1 ) = y 1 = a 0 + a 1 x 1 + a 2 x 1 2 + a 3 x 1 3 + … … + a n − 1 x 1 n − 1 A(x_1) = y_1 = a_0 +a_1x_1+a_2x_1^2+a_3x_1^3+……+a_{n-1}x_1^{n-1} A(x1)=y1=a0+a1x1+a2x12+a3x13+……+an1x1n1

A ( x 2 ) = y 2 = a 0 + a 1 x 2 + a 2 x 2 2 + a 3 x 2 3 + … … + a n − 1 x 2 n − 1 A(x_2) = y_2 = a_0 +a_1x_2+a_2x_2^2+a_3x_2^3+……+a_{n-1}x_2^{n-1} A(x2)=y2=a0+a1x2+a2x22+a3x23+……+an1x2n1

………………

A ( x n ) = y n = a 0 + a 1 x n + a 2 x n 2 + a 3 x n 3 + … … + a n − 1 x n n − 1 A(x_n) = y_n = a_0 +a_1x_n+a_2x_n^2+a_3x_n^3+……+a_{n-1}x_n^{n-1} A(xn)=yn=a0+a1xn+a2xn2+a3xn3+……+an1xnn1

那么用点值表示法表示 A(x) 如下:

A ( x ) = a 0 + a 1 x + a 2 x 2 a 3 x 3 + … … + a n − 1 x n − 1 ⇔ A ( x ) = ( x 0 , y 0 ) , ( x 1 , y 1 ) , ( x 2 , y 2 ) , … … , ( x n , y n ) A(x)= a_0 +a_1x+a_2x^{2}a_3x^{3}+……+a_{n-1}x^{n-1} ⇔ A(x)=(x_0,y_{0}),(x_1,y_{1}),(x_2,y_{2}),……,(x_n,y_{n}) A(x)=a0+a1x+a2x2a3x3+……+an1xn1A(x)=(x0,y0),(x1,y1),(x2,y2)……(xn,yn)

可以观察到,多项式乘法的系数表示法就是做卷积运算,而点值表示法是做乘法运算。卷积定理告诉我们在一个域中的卷积相当于另一个域中的乘积。

在这里,系数表示法就是时域上表达,很复杂,而点值表示法就是频域上表示,就非常简单。那么我们将其转换为频域上表示,就可以大大降低其复杂度!

此时我们可以把快速傅里叶变换(FFT)看作是一个黑匣子,我们先向黑匣子输入A(x) ,B(x) ** 系数表达式,黑匣子内部先将A(x) ,B(x) ** 都变成点值表达式,黑匣子进行乘法运算后,再在内部转换为系数表达式.

FFT算法

FFT算法的基本思想是分治法,将多项式分为奇次项和偶次项处理

A ( x ) = a 0 + a 1 x + a 2 x 2 + a 3 x 3 + … … + a n − 1 x n − 1 A(x)= a_0 +a_1x+a_2x^2+a_3x^3+……+a_{n-1}x^{n-1} A(x)=a0+a1x+a2x2+a3x3+……+an1xn1

按照次数的奇偶来分成两组,然后提出一个x:

A ( x ) = ( a 0 + a 2 x 2 + a 4 x 4 + a 6 x 6 … … ) + x ( a 1 + a 3 x 2 + a 5 x 4 + a 7 x 6 ) A(x) = (a_0 +a_2x^2+a_4x^4+a_6x^6……)+x(a_1 +a_3x^2+a_5x^4+a_7x^6) A(x)=(a0+a2x2+a4x4+a6x6……+x(a1+a3x2+a5x4+a7x6)

H ( x ) = a 0 + a 2 x + a 4 x 2 + a 6 x 3 + … … + a n − 2 x n − 2 2 H(x) = a_0 +a_2x+a_4x^2+a_6x^3+……+a_{n-2}x^{\frac{n-2}2} H(x)=a0+a2x+a4x2+a6x3+……+an2x2n2

G ( x ) = a 1 + a 3 x + a 5 x 2 + a 6 x 3 + … … + a n − 1 x n − 2 2 G(x) = a_1 +a_3x+a_5x^2+a_6x^3+……+a_{n-1}x^{\frac{n-2}2} G(x)=a1+a3x+a5x2+a6x3+……+an1x2n2

A ( x ) = H ( x 2 ) + x G ( x 2 ) A(x) = H(x^2)+xG(x^2) A(x)=H(x2)+xG(x2)

因为单位根 ω 2 n k + n = − ω 2 n k \omega_{2n}^{k+n}=-\omega_{2n}^k ω2nk+n=ω2nk 即对于偶数次单位根 ω n k + n / 2 = − ω n k \omega_{n}^{k+n/2}=-\omega_{n}^k ωnk+n/2=ωnk ,和 H ( x 2 ) 和 G ( x 2 ) H(x^2)和G(x^2) H(x2)G(x2) 是偶函数,分别代如 ω n k + n / 2 和 ω n k \omega_{n}^{k+n/2}和\omega_{n}^k ωnk+n/2ωnk 可得到:

A ( ω n k ) = G ( ( ω n k ) 2 ) + ω n k ∗ H ( ( ω n k ) 2 ) = G ( ω n 2 k ) + ω n k ∗ H ( ω n 2 k ) = G ( ω n / 2 k ) + ω n k ∗ H ( ω n / 2 k ) ) A(\omega_{n}^k) = G((\omega_{n}^k)^2)+\omega_{n}^k*H((\omega_{n}^k)^2) \\ =G(\omega_{n}^{2k})+\omega_{n}^k*H(\omega_{n}^{2k}) \\ =G(\omega_{n/2}^k)+\omega_{n}^k*H(\omega_{n/2}^k)) A(ωnk)=G((ωnk)2)+ωnkH((ωnk)2)=G(ωn2k)+ωnkH(ωn2k)=G(ωn/2k)+ωnkH(ωn/2k))

A ( ω n k + n / 2 ) = G ( ω n 2 k + n ) + ω n k / 2 ∗ H ( ω n 2 k + n ) = G ( ω n / 2 k ) − ω n k ∗ H ( ω n / 2 k ) ) A(\omega_{n}^{k+n/2}) = G(\omega_{n}^{2k+n})+\omega_{n}^{k/2}*H(\omega_{n}^{2k+n}) \\ =G(\omega_{n/2}^k)-\omega_{n}^k*H(\omega_{n/2}^k)) A(ωnk+n/2)=G(ωn2k+n)+ωnk/2H(ωn2k+n)=G(ωn/2k)ωnkH(ωn/2k))
因此我们求出了 G ( ω n / 2 k ) 和 H ( ω n / 2 k ) G(\omega_{n/2}^k)和H(\omega_{n/2}^k) G(ωn/2k)H(ωn/2k)后,就可以同时求出 $A(\omega_{n}{k+n/2})和A(\omega_{n}k) $。于是对G和H分别递归 DFT 即可。

离散傅里叶逆变换

用来实现上文黑匣子的另一半,将多项式点值表达式转换成系数表达式。

对于多项式` A ( x ) = a 0 + a 1 x + a 2 x 2 + a 3 x 3 + … … + a n − 1 x n − 1 A(x)= a_0 +a_1x+a_2x^2+a_3x^3+……+a_{n-1}x^{n-1} A(x)=a0+a1x+a2x2+a3x3+……+an1xn1 ,已知 n个点,其 n维点值向量为 ( A ( x 0 ) , A ( x 1 ) , A ( x 2 ) , … … , A ( x n − 1 ) ) (A(x_0),A(x_1),A(x_2),……,A(x_n-1)) (A(x0),A(x1),A(x2),……A(xn1)),请求解其n维系数向量 (a0,a1,a2,⋯,an−1)?

1、设 (d0,d1,d2,⋯,dn−1)为 (a0,a1,a2,⋯,an−1)得到的离散傅里叶变换的结果。

构造多项式:

F ( x ) = d 0 + d 1 x + d 2 x 2 + … … + d n − 1 x n − 1 F(x) = d_0+d_1x+d_2x^2+……+d_{n-1}x^{n-1} F(x)=d0+d1x+d2x2+……+dn1xn1

2、设向量 ( c 0 , c 1 , … … , c n − 1 ) (c_0,c_1,……,c_{n-1}) c0,c1,……,cn1,其中ck 为F(x) 在 x = ω n − k x=\omega_{n}^{-k} x=ωnk的点值表示,即

c k = ∑ n = 0 n − 1 d i ( ω n − k ) i c_k = \sum_{n=0}^{n-1}{d_i}(\omega_{n}^{-k})^i ck=n=0n1di(ωnk)i

代入 d i = ∑ j = 0 n − 1 a j ( ω n i ) j d_i = \sum_{j=0}^{n-1}{a_j}(\omega_{n}^{i})^j di=j=0n1aj(ωni)j

c k = ∑ n = 0 n − 1 [ ∑ j = 0 n − 1 a j ( ω n i ) j ] ( ω n − k ) i c_k = \sum_{n=0}^{n-1}{[\sum_{j=0}^{n-1}{a_j}(\omega_{n}^{i})^j]}(\omega_{n}^{-k})^i ck=n=0n1[j=0n1aj(ωni)j](ωnk)i

所以
c k = ∑ j = 0 n − 1 a j ∑ i = 0 n − 1 ( ω n i ) j − k c_k = \sum_{j=0}^{n-1}a_j{\sum_{i=0}^{n-1}}(\omega_{n}^{i})^{j-k} ck=j=0n1aji=0n1(ωni)jk
S ( j , k ) = ∑ i = 0 n − 1 ( ω n i ) j − k S(j,k)={\sum_{i=0}^{n-1}}(\omega_{n}^{i})^{j-k} S(j,k)=i=0n1(ωni)jk,对其简化:

j − k = δ j-k=\delta jk=δ
S ( j , k ) = ω n 0 + ω n δ + ω n 2 δ + … … + ω n ( n − 1 ) δ S(j,k)=\omega_{n}^{0}+\omega_{n}^{\delta}+\omega_{n}^{2\delta}+……+\omega_{n}^{(n-1)\delta} S(j,k)=ωn0+ωnδ+ωn2δ+……+ωn(n1)δ
可见 ω n k \omega_{n}^{k} ωnk为等比数列,其公比为 ω n δ \omega_{n}^{\delta} ωnδ

ω n δ = 1 \omega_{n}^{\delta}=1 ωnδ=1 δ = 0 \delta=0 δ=0时, S ( j , k ) = n S(j,k)=n S(j,k)=n,此时 j = k;

当$\omega_{n}^{\delta} ≠1 $ 即 δ ≠ 0 \delta≠0 δ=0时,由等比数列求和公式:

在这里插入图片描述

此时 j ≠ k

综合可得S(j,k)=[j=k]*n

带入原式求ak :
c k = ∑ j = 0 n − 1 a j S ( j , k ) = ∑ j = 0 n − 1 a j [ j = k ] ∗ n = a k ∗ n c_k = \sum_{j=0}^{n-1}a_jS(j,k)=\sum_{j=0}^{n-1}a_j[j=k]*n = a_k *n ck=j=0n1ajS(j,k)=j=0n1aj[j=k]n=akn
所以ak = ck/n

参考:

快速傅里叶变换(FFT)算法 | Long Luo’s Life Notes

一小时学会快速傅里叶变换(Fast Fourier Transform) - 知乎 (zhihu.com)

Wiki: 快速傅里叶变换

如何快速理解离散傅立叶变换和FFT_哔哩哔哩_bilibili

  • 44
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Simulink是一款由MathWorks公司开发的图形化建模和仿真工具,它可以用于对动态系统进行建模、仿真和分析。其中,离散傅里叶变换(Discrete Fourier Transform, DFT)是Simulink中一种常用的信号分析方法之一。 离散傅里叶变换是将一个离散时间序列信号转换成一系列复数值的过程。在Simulink中,可以使用内置的傅里叶变换块来进行信号的离散傅里叶变换。这个块接收一个输入信号,然后对输入信号进行离散傅里叶变换,输出结果是输入信号的频谱。 在使用Simulink进行离散傅里叶变换时,首先需要通过信号源块提供输入信号。然后,将输入信号连接到傅里叶变换块的输入端口。傅里叶变换块会根据输入信号的长度自动选择合适的离散傅里叶变换算法,并输出信号的频谱。 在Simulink中,可以通过设置傅里叶变换块的参数来控制输出结果的精度和频谱范围。例如,可以通过设置采样率来指定输入信号的采样频率,从而保证输出频谱的准确性。此外,还可以选择是否进行零填充,以提高频谱的分辨率。 通过Simulink进行离散傅里叶变换可以使信号的频谱分析变得更加直观和简单。同时,Simulink提供了丰富的信号处理和可视化工具,可以进一步对频谱进行分析和处理。因此,Simulink离散傅里叶变换在信号处理、通信系统设计等领域有着广泛的应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值