MATLAB初入门(一)

我在这里使用的是MATLABR2014a,附上下载链接:https://pan.baidu.com/s/1Ro5o-4woFwe4qaGhDjJIlw 密码:1vb7。

安装好后下面开始我们的MATLAB之旅。

1.1离散时间信号的MATLAB表示

(1)离散时间信号的序列表示

例:

>>x=[-1,1,2,1,0,-1];       %离散时间信号x(n)序列幅度值

>>n=[-1,0,1,2,3,4];        %离散时间信号x(n)序列时间序列

两行合起来即为离散时间信号x(-1)=-1,x(0)=1,x(1)=2,x(2)=1,x(3)=0,x(4)=-1;

(2)离散时间信号的图形表示

这里将介绍stem这条专用函数命令

例:

>>n=-3:5;

>>x=[0,0,-1,1,2,1,-1,0,0];

>>subplot(2,1,1),stem(x);

>>grid;line([1,9],[0,0]);

>>subplot(2,1,2);stem(n,x,'.');

>>grid;line([-3,5],[0,0]);

>>xlabel('n');ylabel('x(n)')

 得到图形如下:

下面我们来逐条命令探索一下

>>n=-3:5;

>>x=[0,0,-1,1,2,1,-1,0,0];

这两行命令等价于x(-3)=0,x(-2)=0,x(-1)=-1,x(0)=1,x(1)=2,x(2)=1,x(3)=-1,x(4)=0,x(5)=0

可是第一个图却不是这样原因在于下面这一条命令

>>stem(x,'string');            %绘制x(n)的棒状图,横坐标为序列的下标序号,棒的末端由string指定,至于string有哪些,详见数字信号处理(第二版 唐向宏 编著)P315 表B-6

>>stem(n,x,'string');         %绘制x(n)的棒状图,横坐标由n指定

现在再来介绍一下subplot命令

>>subplot(m,n,p);            %将图形窗口分成n*m个子图形窗口,并选择第p个子图形作为当前图形窗口

接下来是grid;line命令

gird;line(横坐标范围,x轴方向及其位置)

仍拿刚才的离散信号举例

例:

>>grid;line([0,90],[0,0]);

>>grid;line([1,9],[0,2])

最后再来介绍一下xlabel与ylabel

xlabel('n');ylabel('x(n)')          %标注坐标轴

(3)常用离散信号的产生方法

令ns为序列的起始位置,nf为序列的终止位置。

(1)单位脉冲序列:δ(n-n0) = 1,n=n0;

                                              0,n≠n0;

MATLAB命令:x=zeros(1,N);x(1,n0)=1;(其中N为序列个数)

(2)单位阶跃序列:u(n-n0)=1,n≥n0;

                                           0,n<n0;

MATLAB命令:n=[ns,:nf];x=[(n-n0)≥0];

(3)实指数序列:x(n)=a^n,(n,a∈R)

MATLAB命令:n=[ns,:nf];x=a.^n;

(4)复指数序列:x(n)=e^[(δ+jw)n],任意n

MATLAB命令:n=[ns,:nf];x=exp((delta+jw)*n);

(5)正(余)弦序列:x(n)=cos(wn+θ),任意n

MATLAB命令:n=[ns,:nf];x=cos(w*n+sita);

1.2离散时间信号运算的实现

(1)信号的相加与相乘

方法:首先将两序列的时间变量延拓到同长,x1和x2分别成为y1和y2;然后再逐点相加y(n)=y1(n)+y2(n)或逐点相乘y(n)=y1(n)*y2(n),求得新信号。

例:

n1=[-5:4];

n1s=-5;n1f=4;

x1=[2,3,1,-1,3,4,2,1,-5,-3];

n2=[0:9];

n2s=0;n2f=9;

x2=[1,1,1,1,1,1,1,1,1,1];

ns=min(n1s,n2s);nf=max(n1f,n2f);     %求取新信号的时间起始及终止位置

n=ns:nf;

y1=zeros(1,length(n));

y2=zeros(1,length(n));                       %延拓序列初始化(两个单位脉冲序列)

y1(find((n>=n1s)&(n<=n1f)==1))=x1; %给延陀序列y1赋值x1

y2(find((n>=n2s)&(n<=n2f)==1))=x2; %给延拓序列y2赋值x2

//这里介绍一下find函数的用法——找出所有非零元素,在这里即为函数定义域里的元素//

ya=y1+y2;                                           %逐点相加

yp=y1.*y2;                                           %逐点相乘

subplot(4,1,1),stem(n,y1,'.');

line([n(1),n(end)],[0,0]);

subplot(4,1,2),stem(n,y2,'.');

line([n(1),n(end)],[0,0]);

subplot(4,1,3),stem(n,ya,'.');

line([n(1),n(end)],[0,0]);

subplot(4,1,4),stem(n,yp,'.');

line([n(1),n(end)],[0,0]);

得到如下图所示结果:

(2)序列截取操作,序列移位与周期延拓运算

1.y(n)=x(n-m)。

MATLAB实现为:y=x;ny=nx-m

2.y(n)=x((n))M,其中M表示延拓周期

MATLAB实现为:ny=nxs:nxf;y=x(mod(ny,M)+1)。

例:

>> N=24;M=8;m=3;
>> n=0:N-1;                                             %定义域[0,23]
>> x1=(0.8).^n;                                        %生成指数序列x1
>> x2=[(n>=0)&(n<M)];                            %形成矩形序列RM(n) x2
>> x=x1.*x2;                                             %截取操作形成新序列x
>> xm=zeros(1,N);                                    %生成单位脉冲序列xm  
>> for k=m+1:m+M
        xm(k)=x(k-m);                                       
   end;                                                        %这是一个循环,进行序列移位,将x右移m位,得到xm
>> xc=x(mod(n,M)+1);                              %产生x(n)的周期延拓xc
>> xcm=x(mod(n-m,M)+1);                       %产生x(n)移位后的周期延拓xcm
>> subplot(6,1,1),stem(n,x1,'.');
>> subplot(6,1,2),stem(n,x2,'.');
>> subplot(6,1,3),stem(n,x,'.');
>> subplot(6,1,4),stem(n,xm,'.');
>> subplot(6,1,5),stem(n,xc,'.');
>> subplot(6,1,6),stem(n,xcm,'.');

得到如图所示结果

3.序列翻褶与序列累加运算

序列翻褶:y(n)=x(-n)

MATLAB表示为:y=fliplr(x);

序列累加:y(n)=∑x(i),i∈[ns,n]

MATLAB表示为:y=cumsum(x);

例:

>> n=0:10;                                             %x(n)的时间序列[0,10]
>> x=3*exp(-0.2*n);                               %x(n)的序列大小x(n)=3e^-0.2n
>> y=fliplr(x);                                         %x(n)的序列翻褶 
>> n1=-fliplr(n);                                      %时间序列的翻褶(翻褶点为原点)
>> n2=fliplr(-(n-3));                                 %在指定位置m=3处的时间序列的翻褶
>> subplot(2,1,1);stem(n,x);                    
>> xlabel('n'),ylabel('x(n)');
>> subplot(2,1,2);stem(n1,y);
>> xlabel('n'),ylabel('y(n)=x(-n)');
>> s=cumsum(x);                                   %求累加序列s(n)=∑x(i),i∈[0,n]

>> figure(2);                                            %新生成一个图形窗口
>> subplot(2,1,1);stem(n2,y);                 
>> xlabel('n'),ylabel('y(n)=x(-n+3)');
>> subplot(2,1,2);stem(n,s);
>> xlabel('n'),ylabel('s(n)');

结果如下图所示:

4.卷积的实现

数学描述为:y(n)=h(n)*x(n)

MATLAB命令为:y=conv(x,h);

例:
>> x=ones(1,10);                                                    %ones(M,N)函数表示产生一个M行N列的矩阵
>> n=[0:14];h=0.5.^n;                                             %系统的单位冲激响应h(n)
>> y=conv(x,h);                                                       %卷积
>> stem(y);xlabel('n');ylabel('y(n)=x(n)*y(n)');         %生成图像

运行结果如下图:

注:函数conv不需要给定序列的x(n),y(n)的时间序号,也不返回y(n)=x(n)*h(n)的时间序号。所以要想正确地表示出conv的额计算结果,还需要构造x(n),y(n),h(n)的对应时间序号向量。

以下为修改后的求卷积方法:

>> nx=[-5:4];x=ones(1,10);                                                                         %信号序列x(n)及其时间序列nx 
>> nh=[0:14];h=0.5.^nh;                                                                              %系统的单位冲激响应序列h(n)及其时间序列nh
>> y=conv(x,h);                                                                                           %调用卷积函数conv求系统输出y
>> n0=nx(1)+nh(1);                                                                                      %求卷积序列y的起始时间位置
>> N=length(nx)+length(nh)-2;                                                                     %求卷积序列y的序列长度
>> ny=n0:n0+N;                                                                                            %求卷积序列y的时间向量                 
>> subplot(2,2,1);stem(nx,n);title('x(n)');xlabel('n');yla                                   
>> subplot(2,2,1);stem(nx,n);title('x(n)');xlabel('n');ylabel('x(n)');
>> subplot(2,2,1);stem(nx,x);title('x(n)');xlabel('n');ylabel('x(n)');
>> subplot(2,2,2);stem(nh,h);title('h(n)');xlabel('n');ylabel('h(n)');
>> subplot(2,2,3);stem(ny,y);title('x(n)与h(n)的卷积和y(n)');xlabel('n');ylabel('y(n)');
>> h=get(gca,'position');h(3)=2.5*h(3);
>> set(gca,'position',h)                                                                                    %将第三个子图的横坐标范围扩为原来的2.5倍

所得图像如下:

1.3差分方程的MATLAB求解

对常系数线性差分方程∑aky(n-k)=∑bmx(n-m)的递推求解,在MATLAB中,由以下两个函数完成:
(1)xi=filtic(B,A,ys,xs)

由ys与xs求出具有常系数差分方程(B,A)的等效初始条件的输入向量。

其中ys=[y(-1),y(-2),...,y(-N)],xs=[x(-1),x(-2),...,x(-N)],B=[b0,b1,...bM],A=[a0,a1,...aN],默认a0=1,xs=0

(2)yn=filter(B,A,xn,xi)

常系数差分方程(B,A)所表示的系统在输入信号为xn和系统初始状态为xi时,系统的响应为yn。当系统初始状态xi=0时,则返回系统的零状态响应yn。

例:

>> xs=0;ys=0;                                %系统初始状态x(-1)=0,y(-1)=0;
>> B=[1,0.5];A=[1,-0.5];                 %差分方程为y(n)-0.5y(n-1)=x(n)+0.5x(n-1)
>> xi=filtic(B,A,ys);                         %求等效初始条件的输入序列xi(n)
>> xn=zeros(1,20);xn(1,1)=1;        %x(n)为单位冲激序列,长度N=20
>> yn=filter(B,A,xn,xi);                   %调用filter解差方程,求系统输出信号
>> N=length(yn);                           %求输出序列y(n)的长度
>> n=0:N-1;                                   %输出序列y(n)的时间序列
>> stem(n,yn,'.');                            %制图
>> xlabel('n');ylabel('h(n)');grid;

结果如下:

1.4连续信号的离散与重构

1.时域抽样频率与频谱混叠

首先通过一个例子来说明时域抽样频率与频谱混叠的关系

例:设连续信号xa(t)=Ae^-atsin(at)*u(t),A=444.128,a=50*2^(1/2),分别以抽样频率f=1000Hz,400Hz,200Hz进行等间隔抽样。计算并图示三种抽样频率下的抽样信号x(n)以及其幅频特性函数|Xa(jΩ)|,观察其周期以及频谱混叠程度与fs的关系。

>> fs=10000;fs1=1000;fs2=400;fs3=200;                                         %设置4种抽样频率
>>t=0:1/fs:0.1;                                                                                   %采集信号长度为0.1s
>>A=444.128;a=50*sqrt(2)*pi;b=a;                                                   %连续信号xa(t)的参数
>> xa=exp(-a*t).*sin(b*t);
>> k=0:511;f=fs*k/512;                                                                      %由wk=2Πk/512=2ΠfT求得模拟频率f                             
>> w=2*pi*k/512;
>> Xa=xa*exp(-j*[1:length(xa)]'*w);                                                   %近似模拟信号频谱
>> T1=1/fs1;t1=0:T1:0.1;                                                                   %采集信号长度为0.1s
>> x1=A*exp(-a.*t1).*sin(b*t1);                                                          %1kHz抽样序列x1(n)
>> X1=x1*exp(-j*[1:length(x1)]'*w);                                                    %x1(n)的512点dtft
>> T2=1/fs2;t2=0:T2:0.1;                                                                    %采集信号长度为0.1s
>> x2=A*exp(-a.*t2).*sin(b.*t2);                                                          %400Hz抽样序列x2(n)
>> X2=x2*exp(-j*[1:length(x2)]'*w);                                                    %x2(n)的512点dtft
>> T3=1/fs3;t3=0:T3:0.1;                                                                    %采集信号长度为0.1s
>> x3=A*exp(-a.*t3).*sin(b.*t3);                                                          %200Hz抽样序列x3(n)
>> X3=x3*exp(-j*[1:length(x3)]'*w);                                                     %x3(n)的512点dtft
>> figure(1); 
>> subplot(2,2,1);plot(t,xa);
>> axis([0,max(t),min(xa),max(xa)]);title('模拟信号');

//ps: axis([xmin xmax ymin ymax])作用为:

设置当前图形的坐标范围,分别为x轴的最小、最大值,y轴的最小最大值

>> xlabel('t(s)');ylabel('xa(t)');line([0,max(t)],[0,0]);
>> subplot(2,2,2);plot(f,abs(Xa)/max(abs(Xa)));
>> title('模拟信号的幅度频谱');axis([0,500,0,1]);
>> xlabel('f(Hz)');ylabel('|Xa(jf)|');
>> subplot(2,2,3);stem(t1,x1,'.');
>> line([0,max(t1)],[0,0]);axis([0,max(t1),min(x1),max(x1)]);
>> title('抽样序列x1(n)(fs1=1kHz)');xlabel('n');ylabel('x1(n)');
>> f1=fs1*k/512;
>> subplot(2,2,4);plot(f1,abs(X1)/max(abs(X1)));
>> title('x1(n)的幅度谱');xlabel('f(Hz)');ylabel('|X1(jf)|');
>> figure(2);
>> subplot(2,2,1);stem(t2,x2,'.');
>> line([0,max(t2)],[0,0]);axis([0,max(t2),min(x2),max(x2)]);
>> title('抽样序列x2(n)(fs2=400Hz)');xlabel('n');ylabel('x2(n)');
>> f=fs2*k/512;
>> subplot(2,2,2);plot(f,abs(X2)/max(abs(X2)));
>> title('x2(n)的幅度谱');xlabel('f(Hz)');ylabel('|X2(jf)|');
>> subplot(2,2,3);stem(t3,x3,'.');
>> line([0,max(t3)],[0,0]);axis([0,max(t3),min(x3),max(x3)]);
>> title('抽样序列x3(n)(fs3=200Hz)');xlabel('n');ylabel('x3(n)');
>> f=fs3*k/512;
>> subplot(2,2,4);plot(f,abs(X3)/max(abs(X3)));
>> title('x3(n)的幅度谱');xlabel('f(Hz)');ylabel('|X3(jf)|');

得到结果如下图:

从图中可以看出,当f≥500Hz时,|Xa(jΩ)|的值很小。所以,fs=1kHz的抽样序列x1(n)的频谱混叠很小;而fs=400Hz时,频谱混叠很大;fs=200Hz时,频谱混叠最严重。

2.由离散序列恢复模拟信号

仍然借助上一个例子来展示:

 A=444.128;a=50*sqrt(2)*pi;b=a;
for k=1:2
if k==1 Fs=400;
elseif k==2 Fs=1000;end
T=1/Fs;dt=T/3;
Tp=0.03;
t=0:dt:Tp;
n=0:Tp/T;
TMN=ones(length(n),1)*t-n'*T*ones(1,length(t));
x=A*exp(-a.*n*T).*sin(b*n*T);
xa=x*sinc(Fs*TMN);
subplot(2,1,k);plot(t,xa);hold on;
axis([0,max(t),min(xa)-10,max(xa)+10]);
st1=sprintf('由Fs=%d',Fs);st2='Hz的抽样序列x(n)重构的信号';
ylabel('xa(t)');
st=[st1,st2];title(st)
xo=A*exp(-a.*t).*sin(b*t);
stem(t,xo,'.');line([0,max(t)],[0,0]);
emax2=max(abs(xa-xo))
end

运行结果如下图:

至于每一行命令是何意思必须看懂书上1.3.2节上的连续信号的重构,在这里就不做介绍了。。。。。。。

  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值