实验二 参考 快速傅立叶变换(FFT)及其应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二快速傅立叶变换(FFT )及其应用
一、实验目的
1.在理论学习的基础上,通过本实验,加深对FFT 的理解,熟悉FFT 子程序。
2.熟悉应用FFT 对典型信号进行频谱分析的方法
3.了解应用FFT 进行信号频谱分析过程中可能出现的问题以便在实际中正确应用FFT 。
二、实验原理
在各种信号序列中,有限长序列信号处理占有很重要地位,对有限长序列,我们可以使用离散Fouier 变换(DFT)。这一变换不但可以很好的反映序列的频谱特性,而且易于用快速
算法在计算机上实现,当序列x(n)的长度为N 时,它的DFT 定义为:
1
0()()N kn
N
n X k x n W -==∑,
2n j N
N W e
-=反换为:10
1()()N kn
N
k x n X k W N --==∑有限长序列的DFT 是其Z 变换在单位圆上的
等距采样,或者是序列Fourier 变换的等距采样,因此可以用于序列的谱分析。
FFT 并不是与DFT 不同的另一种变换,而是为了减少DFT 运算次数的一种快速算法。它是对变换式进行一次次分解,使其成为若干小点数的组合,从而减少运算量。常用的FFT 是以2为基数的,其长度 N=2L ,它的效率高,程序简单使用非常方便,当要变换的序列长度不等于2的整数次方时,为了使用以2为基数的FFT ,可以用末位补零的方法,使其长度延长至2的整数次方。
在运用DFT 进行频谱分析的过程中可能产生几种问题: (1) 混叠
序列的频谱时被采样信号的周期延拓,当采样速率不满足Nyquist 定理时,就会发生频谱混叠,使得采样后的信号序列频谱不能真实的反映原信号的频谱。 避免混叠现象的唯一方法是保证采样速率足够高,使频谱混叠现象不致出现,即在确定采样频率之前,必须对频谱的性质有所了解,在一般情况下,为了保证高于折叠频率的分量不会出现,在采样前,先用低通模拟滤波器对信号进行滤波。 (2) 泄漏
实际中我们往往用截短的序列来近似很长的甚至是无限长的序列,这样可以使用较短的DFT 来对信号进行频谱分析,这种截短等价于给原信号序列乘以一个矩形窗函数,也相当于在频域将信号的频谱和矩形窗函数的频谱卷积,所得的频谱是原序列频谱的扩展。
泄漏不能与混叠完全分开,因为泄漏导致频谱的扩展,从而造成混叠。为了减少泄漏的影响,可以选择适当的窗函数使频谱的扩散减至最小。
DFT 是对单位圆上Z 变换的均匀采样,所以它不可能将频谱视为一个连续函数,就一定意义上看,用DFT 来观察频谱就好像通过一个栅栏来观看一个图景一样,只能在离散点上看到真实的频谱,这样就有可能发生一些频谱的峰点或谷点被“尖桩的栅栏”所拦住,不能别我们观察到。
减小栅栏效应的一个方法就是借助于在原序列的末端填补一些零值,从而变动DFT 的点数,这一方法实际上是人为地改变了对真实频谱采样的点数和位置,相当于搬动了每一根“尖桩栅栏”的位置,从而使得频谱的峰点或谷点暴露出来。
用FFT 可以实现两个序列的圆周卷积。在一定的条件下,可以使圆周卷积等于线性卷积。一般情况,设两个序列的长度分别为N1和N2,要使圆周卷积等于线性卷积的充要条件是
FFT 的长度
N ≥N1+N2
对于长度不足N 的两个序列,分别将他们补零延长到N 。 当两个序列中有一个序列比较长的时候,我们可以采用分段卷积的方法。有两种方法: 重叠相加法。将长序列分成与短序列相仿的片段,分别用FFT 对它们作线性卷积,再将分段卷积各段重叠的部分相加构成总的卷积输出。
重叠保留法。这种方法在长序列分段时,段与段之间保留有互相重叠的部分,在构成总的卷积输出时只需将各段线性卷积部分直接连接起来,省掉了输出段的直接相加。 (3) 栅栏效应
DFT 是对单位圆上z 变换的均匀采样,所以它不可能将频谱视为一个连续 函数,从某种意义上讲,用DFT 来观察频谱就如同通过一个栅栏来观看景象一 样,只能在离散点上看到真实的频谱,这样一些频谱的峰点或谷点就可能被"尖 桩的栅栏"挡住,也就是正好落在两个离散采样点之间,不能被观察到。
减小栅栏效应的一个方法是在原序列的末端填补一些零值,从而变动DFT 的点数,这一方法实际上是人为地改变了对真实频谱采样的点数和位置,相当于 搬动了"尖桩栅栏"的位置,从而使得频谱的峰点或谷点暴露出来。 (4) DFT 的分辨率
填补零值可以改变对DTFT 的采样密度,人们常常有一种误解,认为补零可以提高DFT 的频率分辨率,事实上,DFT 的频率分辨率通常规定为s f N ,这里的N 是指信号[]x n 的有
效长度,而不是补零的长度。不同长度的
[]
x n ,其DTFT 的结果是不同的;而相同长度的
[]
x n 尽管补零的长度不同其DTFT 的结果应是相同的,它们的DFT 只是反映了对相同的DTFT 采用了不同的采样密度。
总结一下: 要提高DFT 分辨率只有增加信号[]
x n 的截取长度N 。
三、实验用到序列 a) 高斯序列
()()
2
0150n p q a e
n x n --⎧⎪
≤≤=⎨⎪⎩其他
b) 衰减正弦序列
()()sin 2015
0an b e fn n x n π-⎧≤≤⎪=⎨
⎪⎩其他
c) 三角波序列
()c n
038n 47
0 n x n n ≤≤⎧⎪
=-≤≤⎨⎪⎩
其他
d) 反三角波序列
()4
03447
0 d n n x n n n -≤≤⎧⎪
=-≤≤⎨⎪⎩
其他
四、实验内容
Matlab 编程实现FFT 实践及频谱分析 .
1.用Matlab 产生正弦波,矩形波,以及白噪声信号,并显示各自时域波形图 2.进行FFT 变换,显示各自频谱图,其中采样率,频率、数据长度自选 3.做出上述三种信号的均方根图谱,功率图谱,以及对数均方根图谱
4.用IFFT 傅立叶反变换恢复信号,并显示恢复的正弦信号时域波形图 源程序
%***************1.正弦波****************% fs=100;%设定采样频率 N=128; n=0:N-1; t=n/fs;
f0=10;%设定正弦信号频率 %生成正弦信号 x=sin(2*pi*f0*t); figure(1); subplot(231);
plot(t,x);%作正弦信号的时域波形 xlabel('t'); ylabel('y');
title('正弦信号y=2*pi*10t 时域波形'); grid;
%进行FFT 变换并做频谱图 y=fft(x,N);%进行fft 变换 mag=abs(y);%求幅值
f=(0:length(y)-1)'*fs/length(y);%进行对应的频率转换 figure(1); subplot(232);
plot(f,mag);%做频谱图 axis([0,100,0,80]); xlabel('频率(Hz)'); ylabel('幅值');
title('正弦信号y=2*pi*10t 幅频谱图N=128'); grid;
%求均方根谱 sq=abs(y); figure(1); subplot(233); plot(f,sq);
xlabel('频率(Hz)');