用FFT做频谱分析
一、实验目的
(1) 在理论学习的基础上,通过本实验,加深对FFT的理解,熟悉FFT子程序。 (2) 熟悉应用FFT对典型信号进行频谱分析的方法。
(3) 了解应用FFT进行信号频谱分析过程中可能出现的问题,以便在实际中正确应用FFT。 (4) 熟悉应用FFT实现两个序列的线性卷积的方法。 (5) 初步了解用周期图法做随机信号谱分析的方法。
二、实验原理与方法
在各种信号序列中,有限长序列信号处理占有很重要的地位,对有限长序列,我们可以使用离散傅里叶变换(DFT)。这一变换不但可以很好地反映序列的频谱特性,而且易于用快速算法在计算机上实现,当序列x(n)的长度为N时,它的DFT定义为
X(k)x(n)W,WNeknNn0N1j2N
逆变换为
1N1kn x(n)X(k)WNNk0有限长序列的DFT是其z变换在单位圆上的等距采样,或者说是序列傅里叶变换的等距采样,因此可以用于序列的谱分析。
FFT并不是与DFT不同的另一种变换,而是为了减少DFT运算次数的一种快速算法。 它是对变换式进行一次次分解,使其成为若干小点数的组合,从而减少运算量。常用的FFT是以2为基数的,其长度N2L,其中,L为正整数。它的效率高,程序简单,使用非常方便。当要变换的序列长度不等于2的整数次方时,为了使用以2为基数的FFT,可以用末位补零的方法,使其长度延长至2的整数次方。
1) 在运用DFT进行频谱分析的过程中可能产生的三种误差
(1) 混叠。序列的频谱是被采样信号的周期延拓,当采样速率不满足奈奎斯特定理时,就会发生频谱混叠,使得采样后的信号序列频谱不能真实地反映原信号的频谱。
避免混叠现象的唯一方法是保证采样速率足够高,使频谱混叠现象不致出现,即在确定采样频率之前,必须对频谱的性质有所了解。在一般情况下,为了保证高于折叠频率的分量不会出现,可在采样前先用低通模拟滤波器对信号进行滤波。
(2) 频谱泄露。实际中我们往往用截短的序列来近似很长的甚至是无限长的序列,这样可以使用较短的DFT来对信号进行频谱分析,这种截短等价于给原信号序列乘以一个矩形窗函数,也相当于在频域将信号的频谱和矩形窗函数的频谱卷积,所得的频谱是原序列频谱的扩展。
泄露不能与混叠完全分开,因为泄露导致频谱的扩展,从而造成混叠。为了减少泄露的影响,可以选择适当的窗函数使频谱的扩散减至最小。
(3) 栅栏效应。DFT是对单位圆上z变换的均匀采样,所以它不可能将频谱视为一个连续函数,就一定意义上看,用DFT来观察频谱就好像通过一个栅栏来观看一个图景一样,只能在离散点上看到真实的频谱,这样就有可能发生一些频谱的峰点或谷点被“尖桩的栅栏”所拦住,而不能被我们观察到的现象。
减小栅栏效应的一个方法就是借助于在原序列的末端填补一些零值,从而变动DFT的点数,这一方法实际上是人为地改变了对真实频谱采样的点数和位置,相当于搬动了每一根“尖桩栅栏”的位置,从而使得频谱的峰点或谷点暴露出来。
2) 用FFT计算线性卷积
用FFT可以实现两个序列的圆周卷积。在一定的条件下,可以使圆周卷积等于线性卷积。一般情况,设两个序列的长度分别为N1和N2,要使圆周卷积等于线性卷积的充要条件是FFT的长度N≥N1+N2。对于长度不足N的两个序列,分别将它们补零延长到N。
当两个序列中有一个序列比较长的时候,我们可以采用分段卷积的方法,具体有以下两种方法。
(1) 重叠相加法。将长序列分成与短序列相仿的片段,分别用FFT对它们作线性卷积,再将分段卷积各段重叠的部分相加构成总的卷积输出。
(2) 重叠保留法。这种方法在长序列分段时,段与段之间保留有互相重叠的部分,在构成总的卷积输出时只需将各段线性卷积部分直接连接起来,省掉了输出段的直接相加。
3) 用周期图法(平滑周期图的平均法)对随机信号做谱分析
实际中许多信号往往既不具有有限能量,同时又是非周期性的。无限能量信号的基本概念是随机过程,也就是说无限能量信号是一随机信号。周期图法是随机信号做谱分析的一种方法,它特别适用于用FFT直接计算功率谱的估值。
将长度为N的实平稳随机序列的样本x(n)再次分割成K段,每段长度为L,即L=N/K。每段序列仍可表示为
xi(n)=x(n+(i-1)L) 0≤n≤L-1,1≤i≤K
这里在计算周期图之前,先用窗函数w(n)给每段序列xi(n)加权,K个修正的周期图定义为
() ILi1LUx(n)w(n)ein0L12jnT,K i1,2,...式中,U表示窗口序列的能量,有
1L12Uw(n)
Ln0在此情况下,功率谱估计量可表示为
1KwSNX()ILi
Ki1
三、实验内容
(1) 已知有限长序列x(n)[1,0.5,0,0.5,1,1,0.5,0],要求: 1.用FFT求该序列的DFT、IDFT的图形。
2.假设采样频率Fs20Hz,序列长度N分别取8、32和,用FFT计算其幅度频谱和相位频谱。
(2) 用FFT计算下面连续信号的频谱,并观察选择不同的采样周期Ts和序列长度N值对频谱特性的影响:
xa(t)e0.01t(sin2tsin2.1tsin2.2t) t≥0
(3) 已知序列x(n)3cos(0.4n)sin(5n),1≤n≤15;y(n)0.8n,1≤n≤20。用FFT
实现快速卷积,并测试直接卷积和快速卷积的时间。
(4)设xa(t)3sin(200t)sin(100t)cos(50t),用DFT分析xa(t)的频谱结构,选择不同的截取长度Tp,观察截断效应,试用加窗的方法减少频谱间干扰。
1.频率fs400Hz,T1/fs。
2.采样信号序列x(n)xa(nT)(n),(n)是窗函数,选取两种窗函数:矩形窗和哈明窗。
NfsTp,3.对x(n)做2048点DFT,作为xa(t)的近似连续频谱Xa(jf)。N为采样点数,
Tp为截取时间长度,取三种长度0.04s、40.04s、80.04s。
四、实验预习
(1) 认真阅读实验原理,明确本次实验任务,读懂例题程序,复习有关序列运算的理论知识,了解实验方法。
(2) 根据实验任务预先编写实验程序。
(3) 预习思考:快速傅里叶变换(FFT)与离散傅里叶变换(DFT)有什么联系?简述使用FFT的必要性。
五、实验报告
(1) 列出调试通过的实验程序,打印或描绘实验程序产生的图形曲线。
(2) 思考题:对一个有限长序列进行DFT等价于将该序列周期延拓后进行DFS展开,因为DFS也只是取其中一个周期来计算,所以FFT在一定条件下也可以用于分析周期信号序列。如果实正弦信号为sin(2fn),f=0.1,用16点FFT来做DFS运算,得到的频谱是信号本身的真实谱吗?
六、实验参考
1. 与DFT和FFT相关的MATLAB函数
与DFT和FFT相关的MATLAB函数主要包括fft和ifft。 1) fft 语法:
Y=fft(X) Y=fft(X,n)
Y=fft(X,[],dim) Y=fft(X,n,dim)
介绍:Y=fft(X)语句中,如果X是矩阵,则计算该矩阵每一列的傅里叶变换;如果X是数组,则计算第一个非单元素维的离散傅里叶变换。
Y=fft(X,n)语句可计算X的n点的DFT。如果X的长度小于n,则在X的后面补0。如果X的长度大于n,则对X进行截取。当X是一个矩阵时,X的每一列的长度按照统一的方法进行调整。
Y=fft(X,[],dim)和Y=fft(X,n,dim)语句可根据参数dim在指定的维上进行离散傅里叶变换。
2) ifft 语法:
介绍:ifft函数和fft函数的调用类似,所不同的就是fft的输入参数是时域信号,而ifft的输入参数是频域信号。
Y=ifft(X) Y=ifft(X,n)
Y=ifft(X,[],dim) Y=ifft(X,n,dim)