《数字信号处理》
实 验 报 告 册
班级:
姓名:
学号:
唐山学院信息与控制工程实验教学中心
20##年3月
《数字信号处理》课程实验报告(六)
第二篇:6.FFT及信号的谱分析 -数字信号处理实验报告
计算机与信息工程学院验证性实验报告
专业:通信工程 年级/班级:20##级 20##—20##学年第一学期
一、实验目的
(1)通过实验加深对FFT的理解,熟悉FFT程序、结构及编程方法;
(2)熟练应用FFT对典型信号进行谱分析的方法;
(3)了解应用FFT进行信号频域分析可能出现的问题以便在实际中正确应用FFT;
(4)理解FFT与IFFT的关系;
(5)熟悉应用FFT实现两个序列的线性卷积的方法。
二、实验仪器
计算机,MATLAB软件
三、实验原理
在各种信号序列中,有限长序列信号处理占有很重要的位置,对有限长序列,我们可以使用离散Fourier 变换(DFT)。这一变换不但可以很好地反映序列的频谱特性,而且易于用快速算法在计算机上实现,当序列 的长度为 时,它的DFT 定义为:
反变换为:
有限长序列的DFT是其Z 变换在单位圆上的等距采样,或者说是序列Fourier 变换的等距采样,因此可以用于序列的谱分析。FFT 并不是与DFT 不同的另一种变幻,而是为了减少DFT运算次数的一种快速算法。它是对变换式进行一次次的分解,使其成为若干小点数的组合,从而减少运算量。常用的FFT 是以2 为基数的,其长度。它的效率高,程序简单,使用非常方便,当要变换的序列长度不等于2的整数次方时,为了使用以2为基数的FFT,可以用末位补零的方法,使其长度延长至2 的整数次方。在利用DFT 进行频谱分析时可能会出现三种误差。
(1) 混叠
为了计算一个连续信号的频谱,首先需要对这个连续信号进行取样,如果取样频率太低,也即抽样周期太大,在频域内将产生混叠现象,这样就不可能无失真的恢复原连续信号。对带限信号,当所处理模拟信号最高频率 与抽样频率满足时就不会出现频谱混叠现象。
然而,时域内有限长的信号,其频谱宽度是无限的,为了使有限长信号满足抽样定理,在进行抽样之前,可以先用低通模拟滤波器对信号进行滤波,从而保证高于折叠频率的分量不会出现。
(2)泄漏
实际信号序列往往很长,甚至是无限长序列。为了方便,我们往往用截短的序列来近似他们。这样可以使用较短的DFT 来对信号进行频谱分析。对序列x(n) 截短的过程就是将原信号序列与矩形窗函数相乘的过程,在频域就是两者频谱的卷积。一般情况下这样都会造成由此得到的频谱不同于信号原来的频谱,这种现象叫做泄漏。在实际应用中,可以选用频谱主瓣小、旁瓣小、尽量接近于 的窗函数来减少泄漏。泄漏不能与混叠完全分开,因为泄漏导致频谱的扩展,从而造成混叠。为了减少泄漏的影响,可以选择适当的窗函数使频谱的扩散减至最小。
(3)栅栏效应
DFT 是对单位圆上z 变换的均匀取样,所以它不可能将频谱视为一个连续函数。这样就产生了栅栏效应。就一定的意义上看,用DFT 来观看频谱就好像通过一个尖桩的栅栏来观看一个图景一样,只能在离散点上看到真实的频谱。这样就有可能发生一些频谱的峰点或谷点被“尖桩的栅栏”所挡住,不能被我们观察到。减小栅栏效应的一个方法是借助于原序列的末端增加一些零值,从而变动DFT 的点数。这一方法实际上是人为的改变了对真实频谱采样的点数和位置,相当于搬动了每一根“尖桩栅栏”的位置,从而使得原来看不到的频谱的峰点或谷点就有可能看到了。IFFT 一般可以通过FFT 程序来完成,只要对X[k]取共轭,进行FFT 运算,然后再取共轭,并乘以因子1/N,就可以完成IFFT。
实验中用到的信号序列:
a) Gaussian 序列
b) 衰减正弦序列
四、实验步骤
分别利用下述三种不同方式计算序列的傅立叶变换,并画出相应的幅频和相频特性,再比较各个程序的计算机运行时间。
(1)用 for loop语句编写M函数文件dft1.m,用循环变量逐点计算 X (k);
(2)编写MATLAB 矩阵运算的M 函数文件dft2.m, 完成矩阵运算;
(3)调用 FFT 库函数,直接计算 X (k)。
五、实验程序
x=[1,1,1,1,1,1,1,1];
N=length(x);
w=exp(-j*2*pi/N);
for k=1:N
sum=0;
for n=1:N
sum=sum+x(n)*w^((k-1)*(n-1));
end
Am(k)=abs(sum);
pha(k)=angle(sum);
end
figure
subplot(1,2,1),plot(Am),xlabel('w(rad)'),ylabel('幅度'),title('幅度谱')
subplot(1,2,2),plot(pha),xlabel('w(rad)'),ylabel('相角'),title('相位谱')
x=[1,1,1,1,1,1,1,1];
N=length(x);
n=[0:N-1];
k=[0:N-1];
w=exp(-j*2*pi/N);
nk=n'*k;
wnk=w.^(nk);
Xk=x*wnk;
Am=abs(Xk);
pha=angle(Xk);
figure(2)
subplot(1,2,1),plot(Am),xlabel('w(rad)'),ylabel('幅度'),title('幅度谱')
subplot(1,2,2),plot(pha),xlabel('w(rad)'),ylabel('相角'),title('相位谱')
x=[1,1,1,1,1,1,1,1];
Xk=fft(x,512);
Am=abs(Xk)
pha=angle(Xk)
figure(3)
subplot(1,2,1),plot(Am),xlabel('w(rad)'),ylabel('幅度'),title('幅度谱')
subplot(1,2,2),plot(pha),xlabel('w(rad)'),ylabel('相角'),title('相位谱')
六、实验结果
(1)用for loop语句编写程序得到的X (k)的幅频和相频曲线如下:
(2)用MATLAB 矩阵运算得到的X (k)的幅频和相频曲线如下:
(3)调用 FFT 库函数,直接计算 X (k) 的幅频和相频曲线如下(此时N=512):
教师签名:
年 月 日