2019年11月9日
一、实验目的
1.了解常用的时域离散信号及其特点。 2.掌握MATLAB产生常用时域离散信号的方法。 3.了解离散时间序列时域的基本运算。
4.了解MATLAB语言进行离散序列运算的常用函数,掌握离散序列运算程序的编写方法。
5.加深对离散线性时不变(LSI)系统基本理论的理解,明确差分方程与系统函数之间的关系。
6.初步了解用MATLAB语言进行离散时间系统研究的基本方法。
7.掌握求解离散时间系统冲激响应和阶跃响应程序的编写方法,了解常用子函数。
8.通过实验进一步理解卷积定理,了解卷积的过程。 9.掌握应用线性卷积求解离散时间系统响应的基本方法。 10.了解MATLAB中有关卷积的子函数及其应用方法。
二、实验用到的MATLAB函数
1.find 寻找非零元素的索引号 2.fliplr 对矩阵元素进行左右翻转 3.impz 求解数字系统的冲激响应 4.dstep 求解数字系统的阶跃响应 5.conv 进行两个序列间的卷积运算 6.xcorr 求序列的自相关函数 7. smoothdata 将序列作平滑处理
三、实验原理
1.序列的时域运算
由于MATLAB中是以序列的形式运算,应注意构建时间序列和信号序列,运算时分别对两个序列进行处理。一般有以下几种时域运算: (1)序列移位 (2)序列相加
如果两序列长度相同,可直接逐项相加。
如果长度不同,要对短的序列进行补零,并保持位置一一对应(时间序列应相同)。 (3)序列相乘
逐项相乘,具体方法与序列相加类似。 (4)序列反折
离散序列反折是指离散序列的两个向量以零时刻的取值为基准点,以纵轴为对称轴反折。可使用fliplr函数进行操作。 (5)序列倒相
即求一个与原序列的向量值相反,对应的时间序号向量不变的新的序列。 (6)序列的尺度变换 2.离散LSI系统的响应与激励
由离散时间系统的时域和频域分析方法可知,一个线性时不变离散系统可以用线性系数差分方程表示:
也可以用系统函数来表示:
系统函数H(z)反映了系统响应与激励间的关系。一旦上式中bm和ak数据确定了,系统的性质也就确定了。
3.用impz和dstep子函数求解离散系统的单位冲激响应和阶跃响应
根据已知的bm和ak,可以使用这两个函数分别求得系统的单位冲激响应和阶跃响应。
4.离散LSI系统的线性卷积
对于LSI系统,任意的输入信号x[n]可以用[n]及其位移的线性组合来表示,即:
当输入为[n]时,系统的输出y[n]=h[n],由系统的线性时不变性质可得:
称之为离散系统的线性卷积,简记为:
也就是说,如果已知系统的冲激响应,将输入信号与冲激响应进行卷积运算,即可求得系统的响应。 5.使用conv进行卷积运算
在MATLAB中,卷积子函数conv默认两个信号的时间序列从n=0开始,y对应的时间序号也从n=0开始。
四、 实验内容、方法与结果
1.令 ,画出序列 ;
先得到x[3-n],x[n],x[n-2]三个序列,通过补零使三个序列的时间坐标一一对应,然后直接进行运算得到结果。
对于x[3-n],先将信号序列反转,然后将时间序列移动3即可。 结果如下图:
信号可表示为 制 信号。
先产生时间序列,然后产生sinc(x)并绘图:
,用0.1s的采样间隔自-10~10s采样,绘
将信号 的周期分别扩展两倍和压缩一半,并绘图。
扩展两倍即sin(t/2),压缩两倍即sin(y*2),绘图如下:
用0~40间隔为5的序号序列,在一幅图绘制离散 的实部信号、虚部信号、振幅信号、相位信号信息。
先产生f(n)序列,然后通过real,imag,abs,angle函数得到实部信号、虚部信号、振幅信号、相位信号并绘图。
绘图结果如下:
2、设正弦序列 (1) 画出该正弦序列 (2) 画出序列x1[n] = x[2n]
(3) 画出均值为0、方差为1的高斯白噪声
(4) 给序列x1[n]添加均值为0、方差为1的高斯白噪声 (5) 对序列x1[n]作三点窗口平滑处理
要求将5个序列图像用subplot放在一个窗口上。 (1)(2)可直接画出。 (3)可使用randn函数产生。 (4)直接将x1[n]与高斯白噪声相加。 (5)使用smoothdata函数作平滑处理。 绘图结果如下:
3、已知一个系统:
(1) 画出系统单位冲激响应和单位阶跃响应 (2) 画出系统的输入序列x(n)=R5(n)的响应 要求将图像用subplot放在一个窗口上
(1)可以使用impz和dstep函数分别求得单位冲激响应和阶跃响应。 (2)可通过求x[n]与h[n]的卷积获得系统响应。 绘图结果如下:
4、设
令 (1)产生并绘制x[n]的200个样本, (2)求解并画出互相关函数 (3)如何从互相关图上得到a和k的数值
(1)直接产生序列并绘图。
(2)先产生y[n]序列,然后使用xcorr函数得到互相关函数rxy[l]。 (3) 因此可知rxy[l]与rxx[l]在x轴上的偏移量即-k,
用rxy[l]在-k处的峰值除以rxx[l]在0处的峰值,结果即为a。 绘图结果如下:
从图像可以看出-k=-50,即k=50,根据求出的rxx[0]=127.25,可求得a=0.1。
五、MATLAB代码
1.
%question_1
n0=0:12; %原序列x(n)下标
x0=[1 2 3 4 5 6 7 6 5 4 3 2 1]; %原序列x(n) n1=3-fliplr(n0); %序列x(3-n)下标 x1=fliplr(x0); %序列x(3-n) n2=n0+2; %序列x(n-2)下标 x2=x0; %序列x(n-2)
n=min([n0,n1,n2]):max([n0,n1,n2]); %得到Yn的下标 %初始化3个长度为N的数组 N=length(n); y0=zeros(1,N);
y1=zeros(1,N); y2=zeros(1,N);
%将3个序列的值与相应序号对应起来 y0((n>=min(n0))&(n<=max(n0)))=x0; y1((n>=min(n1))&(n<=max(n1)))=x1; y2((n>=min(n2))&(n<=max(n2)))=x2; %直接进行计算得到结果 Y=y1+y0.*y2;
stem(n,Y,'.'); %绘制离散序列Yn xlabel('n');ylabel('y(n)');
%绘制sinc信号 t=-10:0.1:10; sincx=sinc(t/pi); figure;
stem(t,sincx,'.');
xlabel('t');ylabel('sinc(t)');
%绘制y=sint y=sin(t); figure; subplot(311); plot(t,y);
xlabel('t');ylabel('y=sin(t)'); title('原图像');
%绘制将y=sint扩展2倍的图像 y1=sin(t/2); subplot(312); plot(t,y1);
xlabel('t');ylabel('y=sin(t/2)'); title('扩展2倍的图像'); %将y=sint压缩2倍的图像 y2=sin(t*2); subplot(313); plot(t,y2);
xlabel('t');ylabel('y=sin(t*2)'); title('压缩2倍的图像');
%产生序列 n=0:5:40;
fn=exp((-0.2+1i*0.4)*n); figure(3); subplot(221);
plot(n,real(fn)); %绘制实部 xlabel('n');ylabel('Re(fn)'); title('实部'); subplot(222);
plot(n,imag(fn)); %绘制虚部 xlabel('n');ylabel('Im(fn)'); title('虚部'); subplot(223);
plot(n,abs(fn)); %绘制幅值 xlabel('n');ylabel('|fn|'); title('幅值'); subplot(224);
plot(n,angle(fn)); %绘制相位 xlabel('n');ylabel('相位'); title('相位');
2.
%question_2 %产生正弦序列x[n] n=-100:100; xn=3*sin(pi*n/10); subplot(321);
stem(n,xn,'.'); %画出x[n] xlabel('n');ylabel('x[n]'); title('(1)序列x[n]');
x1n=3*sin(pi*n/10/10); %产生x1[n]序列 subplot(322);
stem(n,x1n,'.'); %画出x1[n] xlabel('n');ylabel('x1[n]'); title('(2)序列x1[n]');
N=randn(1,length(n)); %产生白噪声 subplot(323);
stem(N,'.'); %画出白噪声 xlabel('n');ylabel('幅度'); title('(3)高斯白噪声');
x2n=x1n+N; %序列x1[n]加上白噪声产生x2[n] subplot(324);
stem(n,x2n,'.'); %画出x2[n] xlabel('n');ylabel('x2[n]'); title('(4)序列x1[n]加高斯白噪声');
%对加了白噪声的正弦序列进行三点窗口平滑处理 x3n=smoothdata(x2n,'gaussian',3); subplot(325);
stem(n,x3n,'.'); %画出平滑处理后的序列
xlabel('n');ylabel('x''1[n]'); title('(5)平滑处理后的信号'); 3.
%question_3
b=[1/6 1/2 1/2 1/6]; a=[1 0 1/3 0]; N=32; n=0:N-1;
hn=impz(b,a,n); %求单位冲激响应 subplot(311); stem(n,hn,'.');
xlabel('n');ylabel('h[n]'); title('单位冲激响应');
gn=dstep(b,a,n); %求单位阶跃响应 subplot(312);
stem(n(1:N-1),gn,'.'); xlabel('n');ylabel('g[n]'); title('单位阶跃响应'); xn=[1 1 1 1 1 zeros(1,N-5)]; yn=conv(xn,hn); %求对x[n]的响应 subplot(313); stem(yn,'.');
xlabel('n');ylabel('y[n]'); title('对输入x[n]的响应'); 4.
%question_4 a=0.1;
k=50; nx=-100:100;
xn=cos(0.2*pi*nx)+0.5*cos(0.6*pi*nx); %产生x[n]序列 ny=-100+k:100+k;
yn=a*xn; %产生y[n]序列 n=-100:100+k; N=length(n); xn0=zeros(1,N); yn0=zeros(1,N);
xn0((n>=-100)&(n<=100))=xn; %产生时间坐标一一对应的x[n],y[n] yn0((n>=-100+k)&(n<=100+k))=yn; subplot(211); stem(n,xn0,'.');
xlabel('n');ylabel('x[n]'); title('x[n]图像');
[rxy, l]=xcorr(xn0,yn0); %求出互相关函数 subplot(212);
stem(l,rxy,'.'); %画出互相关函数 xlabel('l');ylabel('rxy[l]'); title('互相关函数图像');
因篇幅问题不能全部显示,请点此查看更多更全内容