武汉工程大学matlab实验二离散时间信号的分析实验.docx
- 文档编号:8842549
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:20
- 大小:231.63KB
武汉工程大学matlab实验二离散时间信号的分析实验.docx
《武汉工程大学matlab实验二离散时间信号的分析实验.docx》由会员分享,可在线阅读,更多相关《武汉工程大学matlab实验二离散时间信号的分析实验.docx(20页珍藏版)》请在冰豆网上搜索。
武汉工程大学matlab实验二离散时间信号的分析实验
武汉工程大学
数字信号处理实验报告二
专业班级:
14级通信03班
学生姓名:
秦重双
学号:
1404201114
实验时间:
2017年5月3日
实验地点:
4B315
指导老师:
杨述斌
实验一离散时间信号的分析实验
一、实验目的
1 认识常用的各种信号,理解其数学表达式和波形表示。
2 掌握在计算机中生成及绘制数值信号波形的方法。
3 掌握序列的简单运算及计算机实现与作用。
4 理解离散时间傅里叶变换、Z变换及它们的性质和信号的频域特性。
2、实验设备
计算机,MATLAB语言环境。
3、实验基础理论
1、序列的相关概念
离散时间信号用一个称为样本的数字序列来表示。
一般用{x[n]}表示,其中自变量n的取值范围是﹣∞到﹢∞之间的整数。
为了表示方便,序列通常直接用x[n]表示。
离散时间信号可以是一个有限长序列,也可以是一个无限长序列。
有限长(也称为有限时宽)序列仅定义在有限的时间间隔中:
﹣∞≤N1≤N2≤+∝.有限长序列的长度或时宽为N=N1-N2+1。
满足x[n+kN]=x[n](对于所有n)的序列称为周期为N的周期序列,其中N取任意正整数;k取任意整数;
2、常见序列
常见序列有单位取样值信号、单位阶跃序列、矩形序列、斜变序列、单边指数序列、正弦序列、复指数序列等。
3、序列的基本运算
序列的基本运算有加法、乘法、倒置(反转)、移位、尺度变换、卷积等。
4、离散傅里叶变换的相关概念
5、Z变换的相关概念
4.实验内容与步骤
1、知识准备
认真复习以上基础理论,理解本实验所用到的实验原理。
2、离散时间信号(序列)的产生
利用MATLAB语言编程和绘制单位样值信号、单位阶跃序列、指数序列、正弦序列及随机离散信号的波形,以加深对离散信号时域表示的理解。
1 单位取样值信号
Matlab程序
x=0;
y=1;
stem(x,y);
title('单位样值');
axis([-2,2,0,1]);
2 单位阶跃序列
Matlab程序
n0=0;
n1=-5;
n2=5;
n=[n1:
n2];
x=[(n-n0)>=0];
stem(n,x);
xlabel('n');
ylabel('x(n)');
title('单位阶跃序列');
3 指数序列、正弦序列
Matlab程序
n=[0:
10];
x=(1/3).^n;
stem(n,x);
xlabel('n');
ylabel('x(n)');
title('指数序列');
n=[-20:
20];
x=2*sin(0.5.*n);
stem(n,x);
xlabel('n');
ylabel('x(n)');
axis([-20,20,-3,3]);
title('正弦序列');
4 随机离散信号矩形序列
Matlab程序
n=[1:
10];
x=rand(1,10);
stem(n,x);
xlabel('n');
ylabel('x(n)');
title('随机序列');
3、序列的运算
数字信号处理的目的,就是从一个或几个给定的离散时间信号中产生一个具有所需性质的信号。
处理算法由加法、乘法、倒置(反转)、移位、尺度变换、卷积等基本运算组合构成。
此部分实验将通过几个简单常见的例子说明这些基本运算的实际运用,以便进一步理解序列的简单运算及计算机实现与作用。
(1)信号平滑
利用MATLAB语言编程实现信号平滑运算。
信号平滑是数字信号处理应用中的一个常见的算法,以虑出被加性噪声污染的信号中的噪声。
假定信号s[n]被噪声d[n]所污染,得到了一个含有加性噪声的信号x[n]=s[n]+d[n]。
要得到无污染的信号,可用简单的信号平滑即信号的加法实现。
例如,采用三点(可选,以信号特点来定)平滑来实现。
y[n]=(x[n-1]+x[n]+x[n+1])/3
由此可以理解平滑滤波的处理方法。
Matlab程序
r=65;
d=0.8*(rand(r,1)-0.5);
m=0:
r-1;
s=2*m.*(0.9.^m);
x=s+d';
subplot(2,1,1);
plot(m,d','r-',m,s,'g--',m,x,'b-.');
xlabel('n');
ylabel('振幅');
legend('d[n]','s[n]','x[n]');
x1=[00x];x2=[0x0];x3=[x00];
y=(x1+x2+x3)/3;
subplot(2,1,2);
plot(m,y(2:
r+1),'r-',m,s,'g--');
legand('y[n]','s[n]');
xlabel('n');
ylabel('振幅');
(2)调制信号的产生
利用MATLAB语言编程实现信号的调制。
调制信号是工程应用中常用的一类信号,调制信号的产生可以通过序列的乘法运算得到。
例如,用低频调制信号xL[n]=cos(wln)来调制高频正弦信号xH[n]=cos(wHn),就可得到振幅调制信号y[n]。
y[n]=A(1+m*xL[n])xH[n]=A(1+mcos(wLn))cos(wHn)
其中m称为调制指数,用来确保(1+m*xL[n])在所有可能的n的情况下m都是正数。
以上式进行编程即可实现调制的目的。
Matlab程序
Fm=10;Fc=100;Fs=500;k=0:
199;t=k/Fs;
x=sin(2*pi*Fm*t);y=x.*cos(2*pi*Fc*t);
X=fft(x,256);Y=fft(y,256);
subplot(2,2,1);
plot(x);
xlabel('t(s)');ylabel('x');
title('原信号');
subplot(2,2,2);plot(X);
plot([-128:
127],fftshift(abs(X)));xlabel('w');ylabel('X(jw)');
title('原信号频谱');
subplot(2,2,3);plot(y);xlabel('t(s)');ylabel('y');
title('调制信号');
subplot(2,2,4);
plot(Y);plot([-128:
127],fftshift(abs(Y)));
xlabel('w');ylabel('Y(jw)');
title('调制信号频谱');
(3)卷积的计算
用MATLAB语言编程可实现信号卷积运算。
卷积是数字信号处理中非常重要的一个运算,用卷积可以计算一个序列通过离散系统后的响应信息。
如可以编程实现9点对7点(序列长度可以自己设定)的序列卷积运算。
Matlab程序
x=[00.511.50];nx=0:
4;
h=[11100];nh=0:
4;
[y,ny]=conv_m(x,nx,h,nh);
subplot(2,2,1);stem(nx,x);title('序列x');xlabel('n');ylabel('x(n)');
subplot(2,2,2);stem(nh,h);title('序列h');xlabel('n');ylabel('h(n)');
subplot(2,2,3);stem(ny,y);title('两序列卷积');xlabel('n');ylabel('y(n)');
conv_m函数程序
function[y,ny]=conv_m(x,nx,h,nh)
%信号处理的卷积程序
%[y,ny]=conv_m(x,nx,h,nh)
%y=卷积结果
%ny=y的基底(support);
%nx=x的基底;
%h=基底nh上的第二个信号
%nh=h的基底
nyb=nx
(1)+nh
(1);
nye=nx(length(x))+nh(length(h));
ny=[nyb:
nye];
y=conv(x,h);
end
(4)序列的离散傅里叶变换,Z变换及信号频域特性
●用MATLAB语言编程实现信号离散傅里叶的正反变换。
Matlab程序
xn=[1,1,1,1];
N=4;
k=dft(xn,N)'
Xk=[4,0,0,0];
N=4;
Xk=idft(xn,N)'
xn=[1,1,1,1];N=length(xn);n=0:
N-1;k=0:
N-1;
Xk=xn*exp(-j*2*pi/N).^(n'*k);
x=(Xk*exp(j*2*pi/N).^(n'*k))/N;
subplot(1,2,2);
stem(k,abs(Xk));gridon;
title('|X(k)|');
axis([-1,N,1.1*min(abs(Xk)),1.1*max(abs(Xk))]);
subplot(1,2,1);
stem(n,xn);grid;
title('x(n)');
axis([-1,N,1.1*min(xn),1.1*max(xn)]);
dft函数程序
function[Xk]=dft(xn,N)
n=[0:
1:
N-1];k=n;
WN=exp(-j*2*pi/N);nk=n'*k;WNnk=WN.^nk;Xk=xn*WNnk;
end
idft函数程序
function[Xk]=idft(xn,N)
n=[0:
1:
N-1];k=n;
WN=exp(-j*2*pi/N);nk=n'*k;WNnk=WN.^(-nk);Xk=xn*WNnk/N;
end
●用MATLAB语言编程实现信号的圆周移位、圆周卷积、验证DFT的圆周时移、圆周卷积性质和圆周卷积与线性卷积的关系。
圆周移位
Matlab程序
n=[0:
10];
M=6;N=11;
x=10*0.8.^n;
y=cirshift(x,M,N);
subplot(2,1,1);
stem(n,x);
title('ÔÐòÁв¨ÐÎ');
xlabel('n');ylabel('x(n)');
subplot(2,1,2);
stem(n,y);
title('Ô²ÖÜÒÆλÐòÁв¨ÐÎ');
xlabel('n');ylabel('y(n)');
sigmod函数程序
function[m]=sigmod(n,N);
m=rem(n,N);
m=m+N;
m=rem(m,N);
end
cirshift函数程序
function[y]=cirshift(x,m,N);
iflength(x)>N
error('Nmustbegreaterthanlength(x)');
end
x=[xzeros(1,N-length(x))];
n=[0:
N-1];
n=sigmod(n-m,N);
y=x(n+1);
end
圆周卷积
Matlab程序
x1=[122];n1=[0:
2];
x2=[1234];n2=[0:
3];
disp('N=5');n3=[0:
4];
N=5;
y=circonvt(x1,x2,N)
subplot(3,1,1);
stem(n1,x1);
title('x1');
xlabel('n1');ylabel('x1(n)');
subplot(3,1,2);
stem(n2,x2);
title('x2');
xlabel('n2');ylabel('x2(n)');
subplot(3,1,3);
stem(n3,y);
title('圆周卷积');
xlabel('n3');ylabel('y(n)');
circonvt函数程序
function[y]=circonvt(x1,x2,N);
iflength(x1)>N
error('Length(x1)isnotgreatthanN');
end
iflength(x2)>N
error('Length(x2)isnotgreatthanN');
end
x1=[x1,zeros(1,N-length(x1))];
x2=[x2,zeros(1,N-length(x2))];
m=[0:
N-1];
x2=x2(mod(-m,N)+1);
H=zeros(N,N);
forn=1:
N;
H(n,:
)=cirshift(x2,n-1,N);
end
y=x1*H';
end
●验证一个实周期序列奇偶部分的DFT与此序列本身的DFT之间的关系。
Matlab程序
function[xe,xo,m]=evenodd(x,n)
ifany(imag(x)~=0)
error
end
m=-fliplr(n);
m1=min([m,n]);
m2=max([m,n]);
m=m1:
m2;
nm=n
(1)-m
(1);n1=1:
length(n);
x1=zeros(1,length(m));
x1(n1+nm)=x;x=x1;
xe=0.5*(x+fliplr(x));
xo=0.5*(x-fliplr(x));
n=[0:
10];
x=stepseq(0,0,10)-stepseq(10,0,10);
[xe,xo,m]=evenodd(x,n);
subplot(2,2,2);stem(m,xe);title('偶部');
xlabel('n');ylabel('xe(n)');
subplot(2,2,4);
stem(m,xo);
title('奇部');
xlabel('n');
ylabel('xo(n)');
●用MATLAB语言编程实现信号的Z变换及其反变换、Z变换的零极点分布。
a=[11-6];
b=[050];
[r,p,k]=residuez(b,a);
subplot(121);
zplane(b,a);
title('零极点分布图');
[H,w]=freqz(b,a,100);
magH=abs(H);phaH=angle(H);
figure
(2)
subplot(222);plot(w/pi,magH);grid
xlabel('frequencyinpiunits');
title('magnitudepart');
subplot(223),plot(w/pi,phaH/pi);grid
xlabel('frequencyinpiunits');
title('Anglepart');
5、实验扩展思考
1 编程产生方波信号序列和锯齿波信号序列。
x=[0:
1/256:
8];y1=square(pi*x);
subplot(2,1,1);plot(x,y1);axis([0,8,-2,2]);title('方波');xlabel('x');ylabel('y1');gridon;y2=sawtooth(pi*x);
subplot(2,1,2);plot(x,y2);title('锯齿波');xlabel('x');ylabel('y2');gridon;
2 实验中所产生的正弦序列的频率是多少?
怎样才能改变它?
分别是哪些参数控制该序列的相位、振幅和周期?
正弦序x[n=]Asin(w0n+Φ)频率f=w0/2pi通过改变w0改变频率f;Φ控制序列相位,A控制序列振幅,w0控制序列周期。
3 编程实现序列长度为N的L点的正反离散傅里叶变换,并分析讨论所得出的结果,其中L≧N,如L=8,N=6。
function[Xk]=dft(xn,N)
n=[0:
1:
8-1];k=n;
WN=exp(-1j*2*pi/N);
nk=n'*k;
WNnk=WN.^nk;
Xk=xn*WNnk;
function[Xk]=idft(xn,N)
n=[0:
1:
8-1];k=n;
WN=exp(-1j*2*pi/N);nk=n'*k;
WNnk=WN.^(-nk);
Xk=xn*WNnk/N;
4 由实验说明离散傅里叶变换的对称关系,说明序列的时域和频域的关联特性。
离散傅里叶变换具有共轭对称性
(1)复共轭序列的DFT。
设x*(n)为x(n)的复共轭序列,长度为N,X(k)=DFT[x(n)],则DFT[x*(n)]=X*(N-K),0<=k<=N-1
(2)DFT的共轭对称性。
定义圆周共轭对称分量xep(n)和圆周共轭反对称分量xop(n)
xep(n)=1/2[x(n)+x*(N-n)],xop(n)=1/2[x(n)-x*(N-n)]则DFT[xep(n)]=Re[X(k)],DFT[xop(n)]=jIm[X(k)]
序列的时域和频域的关联特性
(1)时域卷积对应频域相乘
设f[x(n)]=X(ejw),f[h(n)]=H(ejw),y(n)=x(n)*h(n),则Y(e^jw)=1/2pi[X(e^jw)*H(e^jw)]
(2)时域相乘对应于1/2*pi的频域卷积设f[x(n)]=X(e^jw),f[h(n)]=H(e^jw),y(n)=x(n)h(n),则Y(e^jw)=1/2*pi[X(e^jw)*H(e^jw)]
六、实验报告要求
1、实验中的主要结论:
圆周卷积与线性卷积之间的关系。
设圆周卷积y(n)=∑x1(m)x2(n-m)LRL(n),线性卷积y1(n)=x1(n)*x2(n),则y(n)=[∑y1(n+rL)]Rl(n),及当L>=N1+N2-1,y(n)=y1(n)。
2、通过编写程序,让我更熟练的使用MATLAB,能更好的理解书本所学的内容
3、心得体会:
在使用matlab软件定义函数时,必须对函数的含义理解清楚,要不然很容易定义函数出现错误。
其次要对matlab自带函数的含义用法理解清楚。
这次实验我最大的收获就是对离散时间序列的理论基础的概念有了一个很好的复习和更深刻的认识。
遇到最大的问题就是定义函数时考虑不够全面。
但是我相信随着后面实验的进行,我能将matlab这个工具与课本的理论基础知识完美的结合起来。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 武汉 工程 大学 matlab 实验 离散 时间 信号 分析
![提示](https://static.bdocx.com/images/bang_tan.gif)