
0900210308 陈文鑫
1.实验目的
(1)学习MATLAB软件及其在信号处理中的应用,加深对常用离散时间信号的理解。
(2)利用MATLAB产生常见离散时间信号及其图形的显示,进行单运算。
(3)熟悉MATLAB对离散信号的处理及其应用。
2.实验原理
(1)离散信号的表示:在MATLAB中,可以用向量(数组)来表示有限长序列,不过这样的向量并没有包含样本位置的信息,因此,需要用两个向量(数组)来表示一个有限长序列,其中一个向量表示序列的值,称为样本向量;另一个向量表示样本的位置(即序列的序号),称为位置向量。比如序列在MATLAB中需要用以下两个向量来表示:
n = [-2,-1,0,1,2,3]; x = [2,1,-1,5,2]; 其中 向量n表示序号,向量x表示序列的值。
当不需要样本位置信息或者序列从n = 0 开始时,可以只用样本向量表示。另外由于内存的,MATLAB无法表示无限长序列。
(2)离散信号的基本运算
信号相加:序列相加是对应样本相加,如果两序列长度不等或者位置向量不同,则不能用算数运算符“+”直接实现相加,必须对位置向量和长度统一处理后再相加。以下M函数可以实现任意两序列的相加运算:
function [y, n] = sigadd(f1,n1,f2,n2)
% [y n] = sigadd(f1,n1,f2,n2),Add two sequences.
% Inputs:
% f1 ---- the first sequence
% n1 ---- index vector of f1
% f2 ---- the second sequence
% n2 ---- index vector of f2
% Outputs:
% y ---- the output sequence
% n ---- index vector of y
n = min(n1(1),n2(1)):max(n1(end),n2(end)); % index vector of y(n)
y1 = zeros(1,length(n)); y2 = y1; % initialization
y1(n >= n1(1) & n <= n1(end)) = f1;
y2(n >= n2(1) & n <= n2(end)) = f2;
y = y1 + y2;
序列的移位:序列移位后,样本向量没有变化,只是位置向量变了。任意序列的移位可以用以下的M函数实现:
function [y,n] = sigshift(x,m,n0)
% [y,n] = sigshift(x,m,n0),result of y = x(n-n0);
% Inputs:
% x ---- sequence to be shifted
% m ---- the index vector of x
% n0 --- shift amount
% Outputs:
% y ---- the output sequence
% n ---- the index vector of y
y = x;
n = m + n0;
序列的反折:序列反折后,样本向量倒置,位置向量倒置且变号。以下函数可以实现序列的反折运算:
function [y,n] = sigfold(x,m)
% [y,n] = sigfold(x,n),result of y(n) = x(-n);
% Inputs:
% x ---- sequence to be folded
% m ---- the index vector of x
% Outputs:
% y ---- the output sequence
% n ---- the index vector of y
y = fliplr(x);
n = -fliplr(m);
(3)系统零状态响应的求解
系统零状态响应表示为,在MATLAB中,零状态响应的求解可以用两种方法实现:
求出单位样值响应h(n),然后计算卷积和。
首先用函数impz求出系统的单位样值响应,其调用格式为:
其中,h 是单位样值响应的样本序列,n是其位置向量;b、a分别是差分方程右边和左边的系数向量,N可以是单位样值响应的样本个数,此时 n = [0,1,2,…,N-1];N 也可以是一个向量,用来指定所求的样本的位置,此时 n = N。
其次,用函数conv计算卷积和,其调用格式为:
其中,x,h为做卷积和的两个序列,y是卷积的结果。
用函数filter直接求系统的零状态响应,其调用格式为:
其中,x是输入序列,y是与x等长的输出序列,b、a分别为差分方程右边和左边的系数向量。
实验内容:
1.产生单位阶跃信号 (用ones 函数)
n=0:30;
>> u=[ones(1,10) 1 ones(1,20)];
stem(n,u);
axis([0 30 0 1.2]);
2.产生指数序列 x(n)等于2乘以负一的n次方再乘以E的n次方
clf;
n=0:0.5:5;
a=-exp(1);
k=2;
x=a.^(n)*k;
stem(n,x);
xlabel('time index n');
ylabel('amplitude');
axis([0 5 -100 100]);
3.产生一个周期正弦函数
n=0:40;
f=0.1;
phase=0;
a=1.5;
arg =2*pi*f*n-phase;
x=a*cos(arg);
clf;
stem(n,x);
axis([0 40 -2 2]);
grid on;
title('sinusoidal sequence');
xlabel('tine index in');
ylabel('amplitude');
axis;
4.
n1=-4:2; x=[-4,5,1-2,-3,0,2];
n2=-5:1; y=[6,-3,-1,0,8,7,-2];
n=-5:4;
x1=[x zeros(1,10-length(n1))];
x2=[zeros(1,10-length(n1)) x1];
y1=[y zeros(1,10-length(n2))];
y2=x[2]*y[1];
subplot(3,1,1);stem(n,x2);
subplot(3,1,2);stem(n,y1);
subplot(3,1,3);stem(n,y[2]);
实验总结:
通过本次试验进一步熟悉了matlab的操作,熟悉了M文件的编写及调用;学习了MATLAB软件及其在信号处理中的应用,加深对常用离散时间信号的理解。
学会了利用MATLAB产生常见离散时间信号及其图形的显示,进行单运算;通过软件的操作验证理论学习的知识,加强了自己动手锻炼的能力。
