1.2.1 数字信号处理部分知识重温(1) 从DFT(离散傅里叶变换)到FFT(快速傅里叶变换)(1)
写在前面:本文不作为一篇严谨的理论推导文章,仅为博主学习时的随手小记,个人的主观认知为主,以求日后能在较快时间内理清思路,找到当下的学习状态。文章中会尽量避免出现过多公式及推导,如果能有幸给其他朋友带来一些帮助,不甚荣幸。
感谢以下文章及老师的指导:
【数字信号处理(北京交通大学 陈后金)】 2.1 离散傅里叶变换(DFT) - 4 DFT性质2_哔哩哔哩_bilibili
彻底搞懂--离散傅里叶变换和频谱分析 - 游标卡尺不估读的文章 - 知乎
(文中第一第二部分的讲解最为易懂,可以先看第二部分,再看第一部分)
- 一、DFT的引入
我们知道:一段线段(比如0-1),在长度上是有限长的,但是这段线段由无限的点组成的(1,9.9,,9.99,9.999...)。这是一个曾困扰博主的误区。
接着,DFT这一理论诞生的应用场景是在计算机的计算时,我们知道,计算机的数值计算,只能接受离散的数值分量,也就是说,计算机进行计算的信号,时域取值必须都是离散的,频域取值也必须是离散的。
我们各类信号的计算公式如下(先不纠结各个公式如何导出,先使用结论,日后再深究):
- 连续角频率和数字角频率都是连续量,(2π/N)*mk是离散量。(N,m,k均只取整数)
- 连续周期信号与连续非周期信号因为是在时域上连续,首先就被排除了被计算机接纳的可能,离散非周期信号在频域上有连续量Ω,因此也淘汰出局。能被计算机接纳的仅有离散周期信号
- 前三种信号如果想被计算机利用,只需变换为第四种类型的信号即可
注:在实际应用中,离散化的实现借助于采样,周期化的实现借助于周期延拓,因此,我们直接认为: 离散化=采样;周期化=周期延拓
也就是说为了能够得到一个时域与频域均离散取值的信号,我们首先实现在时域离散化(采样),接着为实现频域离散化,我们利用频域抽样定理,对采样后的离散时间信号进行周期延拓,如下图所示:(也可以从频域先开始离散化)
注:虽然离散周期信号在时域和频域上都有无数个点,但这些点都会按照一个有限周期内的点/序列进行相同的延拓得到的。因此,我们只需要知道一个周期序列的完整取值,无限“复用”即可。
而离散周期信号的向频域的变换,称之为离散傅里叶变换(DFT),由此正式引出DFT!
- 二、DFT的正式展开
首先介绍DFT的具体定义式:
注1:在DFT的表达式中,有两个变量:m,k,它们都是在(0,N-1)区间(也就是完整的序列长度/周期)取值的变量。M位于频域,k位于时域。从表达式我们发现,m在频域每取一个值,k都会在时域上从0到N-1取N个值与之对应。
为了书写方便,我们引入了这样一个符号:
注1:为了记忆再简便一点,个人这么认为:w---e^-2πj,W右边符号直接上下对应分子分母,写成分数mk/N,乘到w的指数上去
注2:这个符号是一个复数!(仅当(2π/N)*mk=π的整数倍时取整数),在频域上绕单位圆运动(见下图)
(以N=4举例)
注3:WN^mk=WN^(mk%N)
我们以一道题对上面DFT的定义式进行举例:
根据WN^mk=WN^(mk%N)可化简:
由上我们可以观察到:
1.要进行m个点序列的DFT,要进行m^2次(复数)乘法运算;
2.在(未化简版的)矩阵X[0](m=0)对应的一行,从左到右每个元素相隔为0,之后以此类推。由此可总结:X[m]对应频域的W上标从左到右间隔m
我们进一步的拓展:
首先我们知道:两种序列在时域上的图像是相同的
注:上图是两种序列的DTFT(离散时间傅里叶变换--对应离散非周期时间序列,频域连续,时域离散)
注:上图是两种序列DFT(时域需要在原来的基础上周期延拓)的表达式
可见:在DTFT的频域中,两序列频域相同,在对时域上两个序列周期延拓后进行DFT,补零后的序列在频域上的离散序列原数值不变,在原数值之间均匀的插入新数值,以图为例:
(原因是WN^mk=e^-2πj*(mk/N)在频域的单位圆上运动,经过的点为m*(2π/N);单位圆上一个周期(0->2π)经过(采样到)的点数=N=实际信号频域离散序列的长度=实际信号时域离散序列的长度,对序列时域补零,则序列长度N增大,在频域单位圆经过(采样到)的点数自然也会增加)
总之,通过对时域进行补零,可以得到更高的频域离散化(采样)精度
- 三、DFT的一些重要性质
①线性特性
②循环位移特性(头尾相连,循环移位)
举例:(离散非周期)原序列{01234}(假设0元素位于坐标轴原点上)
---->周期延拓成离散周期序列:..01234{01234}01234.... (头尾相连)
---->向左位移2单位:..012340{123401}234.... (循环移位)
①可以理解为括号向相反方向移动若干单位 ②可以理解为从左(右)边移除的元素,会从另一边递补进来
注意:以上讨论的是在位移以后,原序列位置处各点新的取值情况,x坐标轴并未发生改变!!
③对称特性
这是一个极其重要的特性,首先:1.一个数与另一个数如果是共轭关系,那么他们实部相同,虚部取反。也就会说,我们知道了某点数值的共轭,等同于知道了该点的数值。
又因为该性质:X*[(N-m)n]=X[m],也就是说,我们具备了知晓一个点的数值,就能得到另一个点的(共轭)数值的途径。下面是一道示例:
④循环卷积定理
该性质=循环位移性质+翻转的组合技,依旧先举例:
(离散非周期)原序列{01234}(假设0元素位于坐标轴原点上)
---->对原序列进行翻转:4321{00000}(在原点处的元素翻转后位置不变)
---->对翻转后的序列进行周期延拓成为离散周期序列:..04321{04321}04321.... (头尾相连)
---->向左位移2单位:..0432104{32104}321.... (循环移位)(x点循环卷积=序列分x次向右移动一个单位,将每一次移动后的结果逐行写到矩阵)
注:1.参与循环移位运算的两个序列必须等长(长度=循环卷积点数),否则需要补零!并且要先进行补零,在按照上述步骤进行翻转、循环位移等操作。
2.注意区别线性卷积和循环卷积:下图是线性卷积的示例图:
存在这样一个规律:当循环卷积点数L=(序列1长度+序列2长度)-1,L点循环卷积与线性卷积可以得到相同的结果。因此,我们要计算线性卷积,可以通过求解L点循环卷积得到,循环卷积又可以通过DFT(两个序列在频域相应的离散序列相乘)取到。
3.循环卷积的频域:
再一次说明,将两序列使用DFT,将他们在频域对应的离散序列逐点相乘,再用IDFT还原,得到的结果等同于两序列在时域循环卷积,也等同于两序列在时域做线性卷积(前提是L要符合要求,且两个序列需要通过补零达到长度L)
4.循环卷积的具体应用:
在实际计算机运算DFT来计算(循环)线性卷积时,采用的是FFT算法(计算效率:L/2*(log2L)),通过实际应用我们发现,当参与运算的两个序列长度(其中一个长度a,另一个b)相当时,效率(3*L/2*(log2L)+L--两个原序列FFT,再逐点相乘(L),再将L点的新序列IFFT)较线性卷积直接运算(a*b)提速最为明显,且随着序列的数量级增大而增大。
但是如果两序列长度差距过大,那么,计算效率提速很低甚至不如直接线性卷积计算。
- 四、番外篇:线性卷积一些计算改进(可不看)
因为在计算大型序列的线性卷积时,往往会因为两个问题:①需要等待序列全部点数据的输入才能开始运算,耽误时间 ②存储大型序列,给计算机的存储性能带来了挑战,因此,研究改善算法:
①重叠相加法:将输入序列分段,输入一段计算一段
先设长序列分段,每一段的小序列的长度L(长序列最后一部分要是长度达不到L,需要补零填充),再计算按照L划分,共能产生几段小序列,设数量为m
分别将每一段小序列与另一个短序列卷积,得出结果
每一段小序列与另一个短序列卷积出的新序列会存在m-1个点的重合,在合成最终序列时要注意将他们相加
②重叠保留法-将输入序列分段,输入一段计算一段
先设长序列分段,每一段的小序列的长度L(长序列最后一部分要是长度达不到L,需要补零填充),再计算按照L划分,共能产生几段小序列,设数量为m
在原数列首元素前补零,个数=m-1
按L为长度划分新序列,从第二个序列开始,每个小序列都从上个小序列最后一个元素的位置往前一个开始(比如原序列{0123456789},L=4,m=3 {0012},{12(头两个元素来自上一个序列最后两个元素)34}...),换句话说,每个小序列在首尾都会与前一个或后一个小序列有两个元素的重叠
- 五、DFT对离散非周期信号频谱的计算(可不看)
下图的公式,用于计算使用DFT计算离散非周期信号,DFT中每一个点对于的在原信号频谱上的位置(设进行N点DFT运算,前N/2的点用第一行公式,否则用第二行)