离散傅里叶变换

前言

由于实际中接触的信号是离散的,研究离散傅里叶变换是非常必要的。与连续傅里叶变换不同,这时我们只能预测信号,没有理论上的保证。一般的采样方法自然是等间隔采样 \[ x_j=f(jT) \] 即使这样,我们也只能选取其中有限信息周期性延拓之后处理。

周期系列的DFT

对于\(y=\{y_j\},y_j=y_{j+n}\)

DFT (Discrete Fourier Transform) 即离散傅里叶变换定义为 \[ F_n(y)=\bar{y}=\{\bar{y_j}\} \] 其中 \[ y_j=\sum_{k=0}^{n-1}y_k\bar{\omega}^{jk},\omega=e^{\frac{2\pi i}{n}} \] 逆变换IDFT为 \[ y_j=\frac{1}{n}\sum_{k=0}^{n-1}\bar{y_k}\omega^{jk} \] 性质都与连续傅里叶变换类似。

快速傅里叶变换(FFT)

事实上,DFT在很长一段时间内并没有受到人们的重视,直到FFT算法的出现使得DFT的运算大大简化,这才在实际中得到广泛运用。

DFT:\(O(n^2)\) FFT:\(O(n\log n)\)

思想:将序列\(x(j)\)分为两组 \[ \begin{cases} x(2r)=x_1(r)\\ x(2r+1)=x_2(r) \end{cases} \]

\[ \begin{aligned} \bar{x}(k)=\sum_{j=0}^{n-1}x(j)\omega_n^{-jk}&=\sum_{j=0}^{n/2-1}x(2r)\omega_n^{-2rk}+\sum_{j=0}^{n/2-1}x(2r+1)\omega_n^{-(2r+1)k}\\ &=\sum_{j=0}^{n/2-1}x(2r)\omega_n^{-2rk}+\omega_n^{-k}\sum_{j=0}^{n/2-1}x(2r+1)\omega_n^{-2rk}\\ &=G(k)+\omega_n^{-k} H(k) \end{aligned} \]

同时 \[ \bar{x}(k+\frac{n}{2})=G(k)-\omega_n^{-k}H(k) \] 可以看出一个规模为n的离散傅里叶变换问题被划为了两个规模为n/2的子问题,合并需\(O(n)\)时间,故总时间复杂度\(O(n\log n)\)

如图显示了一次FFT大致的过程。

如果规模不是n的幂可以考虑补零操作

自然顺序 二进制表示 码位倒置 码位倒置顺序
0 000 000 0
1 001 100 4
2 010 010 2
3 011 110 6
4 100 001 1
5 101 101 5
6 110 011 3
7 111 111 7

实际操作中,一般先按自然顺序输入存储单元,然后再通过变址运算将自然顺序的存储转换成码位倒置顺序的存储,然后进行FFT的原位计算。

一个小应用——切比雪夫插值

Chebyshev多项式

\[ \begin{aligned} T_n(\cos\theta)&=\cos(n\theta)\\ T_0(1&)=1\\ T_1(1&)=x\\ T_2(1)=&2x^2-1\\ T_3(1)=&4x^3-3x\\ \cdots \end{aligned} \]

插值节点选在\(\cos k\pi/n\)上,这样可以尽量使误差变小,一定程度上规避龙格现象的产生。(数值分析内容就不展开了)

对一个函数计算插值系数 \[ P(x)=\sum_{j=0}^{n}a_jT_j(x) \]\(x_k=\cos(k\pi/n)\)

\[ y_k=P(x_k)=\sum_{j=0}^{n}a_jT_j(x_k)=\sum_{j=0}^{n}a_j\cos(jk\pi/n) \] 则可以改写为 \[ y_k=\frac{1}{2}\sum_{j=0}^na_j\omega^{jk}+\frac{1}{2}\sum_{j=-n}^{0}a_{-j} \omega^{jk}=\sum_{j=-n}^nc_j\omega^{jk} \]\((y_k)\)延拓成\(2n\)周期的偶序列则有 \[ y_k=\sum_{j=-n}^nc_j\omega^{jk},0\le j\le 2n-1 \] 用DFT公式套上去即可得到 \[ a_j=\frac{1}{n\epsilon_j}\sum_{k=0}^{2n-1}y_k\bar{\omega}^{jk},j=0,1,\cdots,n \] 其中 \[ \epsilon_0=\epsilon_n=2,\epsilon_1=\cdots=\epsilon_{n-1}=1 \] 即可利用快速离散傅里叶变换得到系数。

离散滤波器

假设\(X,Y\)为离散信号空间,称算子\(F:X\rightarrow Y\)是线性时不变的,如果满足 \[ \begin{aligned} &F(\alpha x+\beta y)=\alpha F(x)+\beta F(y)\\ &F(T_p(x))=T_p(F(x)) \end{aligned} \] 其中 \[ (T_p(x))_k=x_{k-p} \] 。离散傅里叶变换与连续傅里叶变换也有非常类似的结论:

$ Thm $ 如果\(F\)是离散信号空间上的线性时不变算子,则存在序列\(f\),使得 \[ F(x)=f*x \]

Z变换

序列\(x\)的Z变换定义为函数\(\hat{x}:[-\pi,\pi]\rightarrow \mathbb{C}\)\[ \hat{x}(\phi)=\sum_{j\in \mathbb{Z}}x_je^{-ij\phi} \] 注:\(z=e^{i\phi}\)\[ \hat{x}(\phi)=\sum_{j\in \mathbb{Z}}x_jz^{-j} \]

Z变换与Fourier级数

假设\(f\in L^2[-\pi,\pi]\),其Fourier级数展开为 \[ f(\phi)=\sum_{n\in \mathbb{Z}}x_ne^{in\phi} \] 即傅里叶级数是一种\(L^2[-\pi,\pi]\rightarrow l^2\)的变换。

Z变换把序列转化为函数\(f(-\cdot)\in L^2[-\pi,\pi]\)

卷积算子与Z变换

\(Thm\) 假设\(f=(f_n),x=(x_n)\in l^2\),则 \[ (\widehat{f*x})(\phi)=\hat{f}(\phi)\hat{x}(\phi) \] 验证是容易的。

窗口傅里叶变换(WFT)

使用傅里叶变换确实是信号处理一个非常常用的手法,但是它只能适合平稳信号的分析,给出一个信号总体上包含哪些频率的成分,并不能给出各成分出现的时刻。但是实际上自然中大部分信号是非平稳的,任何一个频谱都是和所有的时间相关。为了更好地分析信号,我们需要考虑将信号分成若干份,每一段分别做傅里叶变换,这就引出了窗口傅里叶变换。

窗函数

非平凡函数\(\omega\in L^2(\mathbb{R})\)称为窗函数如果满足\(t\omega\in L^2(\mathbb{R})\)

中心 \[ t^*=\frac{1}{\Vert \omega\Vert_{L^2}^2}\int_{\mathbb{R}}t|\omega(t)|^2dt \] 半径 \[ \Delta_\omega=\frac{1}{\Vert \omega\Vert_{L^2}}(\int_{\mathbb{R}}(t-t^*)^2|\omega(t)|^2dt)^{1/2} \]

时间窗、频率窗

\(g\)是实的窗函数,且\(g(t)=g(-t),\Vert g\Vert=1\)\(f\)的窗口傅里叶变换定义为 \[ S[f](\lambda,b)=\frac{1}{\sqrt{2\pi}}\int_{\mathbb{R}}f(t)\overline{g(t-b)}e^{-i\lambda t}dt \]

一般\(g\)是一个在某区间上取值,区间之外快速趋于零的函数,例如Guass型函数。表达式中\(f,g\)相乘一项就是选取\(f\)\(b\)周围一块,再做傅里叶变换。随着\(b\)变化,选取区间(窗口)也在变化。

\(W_{\lambda,b}(t)=g(t-b)e^{i\lambda t}\)

则由窗口傅里叶变换定义可得 \[ S[f](\lambda,b)=\frac{1}{\sqrt{2\pi}}\int_{\mathbb{R}}f(t)\overline{W_{\lambda,b}(t)}dt \] \(W_{\lambda, b}\)的中心和半径分别是\(t^*+b\)\(\Delta_g\),则窗口傅里叶变换主要给出了\(f(t)\)在时间窗 \[ [t^*+b-\Delta_g,t^*+b+\Delta_g] \] 里面的局部信息。

另一方面,令 \[ V_{\lambda,b}(\omega)=\mathfrak{F}[W_{\lambda,b}](\omega)=e^{i\lambda b}e^{-i\omega b}\hat{g}(\omega-\lambda) \] \(V_{\lambda, b}\)的中心和半径分别是\(\lambda^*+\lambda\)\(\Delta_\hat{g}\) \[ S[f](\lambda,b)=\frac{1}{\sqrt{2\pi}}\langle f,W_{\lambda,b}(t)\rangle=\frac{1}{\sqrt{2\pi}}\langle \hat{f},V_{\lambda,b}(t)\rangle \] 即窗口傅里叶变换还给出了频率窗 \[ [\lambda^*+\lambda-\Delta_{\hat{g}},\lambda^*+\lambda+\Delta_{\hat{g}}] \] 里面的局部化信息。

可以观察到时频指标移动时,窗函数的时频窗覆盖了整个时频平面。可以证明,一个信号可以用它的窗口傅里叶变换来恢复。

但是时频窗的总面积是固定的,对于窗口宽度的确定就成了一个非常令人头疼的课题。窗太窄,窗内的信号太短,会导致频率分析不够精准,频率分辨率差。窗太宽,时域上又不够精细,时间分辨率低。对于该问题的解决方案就引出了小波变换。

(傅里叶变换到此结束,进入分类主题——小波分析)