资源描述
实 验 报 告
课程名称 数字信号处理
实验名称 用DFT实现长序列卷积并
用FFT进行信号谱分析
指导教师 罗倩
实验日期 2013年12月8日
学 院 信息与通信工程
专 业 电子信息工程
学生姓名 于卓立
班级/学号 电信 1103/ 2011010533
成 绩
指导老师签字
实验一、用 DFT 实现长序列卷积并用 FFT 进行信号谱分析
一、实验目的:
1、加深对离散傅立叶变换的理解;
2、熟悉用FFT进行信号的频谱分析;
3、熟悉长序列卷积的实现方法。
二、实验内容:
在实际的应用环境下,可能需要有限时宽的序列和一个时宽不定或长度非常长的序列进行卷积运算,理论上可以将整个波形存储起来,利用快速卷积方法进行处理,于是要求对短序列补充很多零点,从而导致计算量和需要的存储空间无谓的增加。实际上,当两序列长度差距较大时,快速卷积算法的优势并不能体现出来,而且输入数据未收集完之前,不能够计算出一个输出结果,因此整个系统必然存在较大的延时,不能进行实时处理。为了解决这个问题,可以将长序列分段,然后计算响应。根据分段方式不同,可分为重叠相加法和重叠保留法两种。本实验要求用重叠保留法实现长序列的卷积。
重叠保留法通过将长序列x(n)按照如下方式分成长度为L长的子段:
即每一子段与前一子段之间有M-1个点重叠。于是,将子段和 进行长度为L的圆周卷积,即
可见,的长度为L点。然而和 线性卷积的长度为L+M-1,因此的前K-1点与线性卷积结果不同,其余的L-M+1点与线性卷积的结果相同。因此,将的前M-1点舍去,即
于是
可见,在重叠保留法中,将原始序列进行有重叠的分段,子段与单位冲激响应之间进行圆周卷积,因此中的前M-1点与线性卷积的结果不等需要舍弃,而保留与线性卷积的结果相同的点。
题目一:
利用一个单位冲激响应序列为h(n)的系统,设计实现对长的数据的滤波处理,要求使用重叠保留法通过FFT来实现这种处理,要求各输入数据段重叠p个样点,并从每一段产生的输出中取出m个样点,再连接在一起以得到所要求的输出序列。设计滤波算法程序。试用
各数据段长N=6个样点,验证你的程序,并求出p和m,显示出分段的输入序列各段的内容和分段的输出序列各段的内容,用杆状图绘出线性卷积输出结果和通过FFT重叠保留法的输出结果。
注:
1、在Matlab中,有限长序列可以用行向量表示,如:x=[2,1,-1,0,1,4,3,7],向量x的下标从1开始。若想取出向量x中第M个到第N个值构成新的向量,用 x (M:N)。
2、当两个序列对应点相乘时,在Matlab中使用“.*”运算符,称“点乘”。
3、Matlab中,补零可以用zeros函数实现,例如:x=[x,zeros(1,N)]; 为在原x序列后补N个0;x=[zeros(1,M),x,zeros(1,N)]; 为在原x序列前补M个0,后补N个0。
4、线性卷积函数:conv (x,h);FFT和逆FFT函数:fft (x) 或fft (x,N)、ifft (x) 或ifft (x,N),N表示N点长FFT或逆FFT。
题目二:
以周期Ts=0.125ms对信号进行采样,得到离散时间信号:
x(n)=cos(0.48πn)+cos(0.52πn)
1) 用杆形图画出离散时间序列;
2) 取x(n) (0≤n≤10),求x(n)的10点FFT,并绘出图形;
3) 将1)中的x(n)后面补零,使x(n)加长到0≤n≤99,求FFT,并绘出图形;
4) 取x(n) (0≤n≤99),求x(n)的100点FFT,并绘出图形。
5) 分析1)-3)的结果;
6) 为了能分辨出信号的频谱成分,所需的频率分辨率是多少?至少应记录多长时间的信号,为什么?
7) 用FFT作出离散谱,离散谱线与实际频率如何对应?为什么?用实际频率标记频率轴。
三、流程图:
编写程序
输入已知量以及函数
每段分别DFT变换
将有用的数据拼接
输入已知量以及函数
绘制图像、以及原函数图像
编写程序
输入已知量以及函数
输出原波形
做FFT变换
输出DFT波形
补90个零,进行FFT变换
90个零后的DFT变换的图
对100点的时域信号进行FFT变换并取模
画出DFT变换的图
四、实验结果:
五、参考文献
[1] 焦瑞莉,罗倩,汪毓铎,顾奕,信号与系统引论,北京:高等教育出版社,2009年3月.。
[2] 胡广书,数字信号处理——理论、算法与实现,北京:清华大学出版社,2003年8月。
六、结果分析
实验结果与理论值符合,题目二中补零法做出来的函数图像频率太多,与实际不相符,实际波形应该只有两个频率。补零能是频谱的密度增加,分辨率并不能提高,要提高分辨率,可以通过增加信号实际记录长度实现。
七、实验总结
通过本次试验,实验者学会了FFT进行信号的频谱分析以及长序列卷积的实现方法,更加熟练的掌握了使用MATlab的使用方法,虽然在代码上存在不足——代码的单一性,不能广泛应用于其他函数的使用,但是在老师的帮助下,实验者能够做到心领神会,但是由于能力以及时间有限,不能再短时间内编出程序,所以只能用较为简单实验代码代替。本次试验为实验者日后的数字信号处理的学习、实验打下了坚实的基础。
八、附录
题目一:
clear all;close all;clc;
%实验内容(1)===================================================
n=1:1:18;
xn=1:1:18; %产生序列向量x1(n)=n+1, 0<=n<=17
hn=[1,0,-2] %产生长度为3的hn
x1=[zeros(1,2),xn(1:4)]
x2=xn(3:8)
x3=xn(7:12)
x4=xn(11:16)
x5=[xn(15:18),zeros(1,2)]
y1=ifft(fft(x1,6).*fft(hn,6)) %每段分别DFT变换
y2=ifft(fft(x2,6).*fft(hn,6))
y3=ifft(fft(x3,6).*fft(hn,6))
y4=ifft(fft(x4,6).*fft(hn,6))
y5=ifft(fft(x5,6).*fft(hn,6))
yn=[y1(3:6),y2(3:6),y3(3:6),y4(3:6),y5(3:6)]; %将有用的数据拼接
k=1:20
%----以下绘制幅频特性曲线------
subplot(2,1,1);
stem(yn); %绘制yn图像
axis([0 20 -40 10])
xlabel('n');ylabel('y(n)');title('重叠保留法');
grid on;
z=conv(xn,hn)
subplot(2,1,2) %直接线性卷积图形显示
stem(z)
axis([0 20 -40 10])
xlabel('n');ylabel('z(n)');title('直接卷积');
grid on;
题目二:
n1= [0:9];
x= cos(0.48*pi.*n1)+cos(0.52*pi.*n1);
figure(1);
subplot(4,1,1);
stem(n1,x) %用杆形图画出离散时间序列
grid on ;
X1= abs(fft(x)); % 对10点的时域信号进行FFT变换并取模
subplot(4,1,2); % 画出原始信号10点的DFT变换的图
stem(n1,X1)
grid on ;
xc= [x,zeros(1,90)]; % 在序列后补90个零,得到长度为100的序列
X2= abs(fft(xc)); % 对补零后的时域信号进行FFT变换并取模
n= [0:99];
subplot(4,1,3);
stem(n,X2) % 画出补90个零后的DFT变换的图
grid on ;
xn= cos(0.48*pi.*n)+cos(0.52*pi.*n); %建立100个点的时域信号
X3= abs(fft(xn)); % 对100点的时域信号进行FFT变换并取模
subplot(4,1,4); % 画出取样点数为100的DFT变换的图
stem(n,X3)
grid on ;
9
展开阅读全文