基于MATLAB的数字信号处理(1) 常用序列的图形表示和序列的运算

当代五大奢侈品:
彼此深爱的灵魂伴侣
规律的安稳平和的睡眠
有属于自己独立的空间和时间
任何时候都真正懂你的人
能够点燃他人并时刻充满希望的心

一、常用序列的图形表示

1. 单位抽样序列和单位阶跃序列

在这里插入图片描述
编写函数

function [x,n]=impseq(n0,n1,n2)
%产生x(n)=delta(n-n0);n1=n0=n2
%-------------------------------
%[x,n]=impseq(n0,n1,n2)
%
if((n0<n1)||(n0>n2)||(n1>n2))
    error('参数必须满足n1=n0=n2')
end
n=n1:n2;
%x=[zeros(1,(n0-n1)),1,zeros(1,(n2-n0))];
x=(n-n0)==0;
function [x,n]=stepseq(n0,n1,n2)
%产生x(n)=u(n-n0);n1=n0=n2
%-------------------------------
%[x,n]=stepseq(n0,n1,n2)
if((n0<n1)||(n0>n2)||(n1>n2))
    error('参数必须满足n1=n0=n2')
end
n=n1:n2;
%x=[zeros(1,(n0-n1)),ones(1,(n2-n0+1))];
x=(n-n0)>=0;

MATLAB脚本绘图

clear;

n1=-5:5;
x1=impseq(0,-5,5);   %调用函数  改变第一个数字的值可以使之在不同的位置出现脉冲
%stem函数显示茎秆图
subplot(2,1,1);stem(n1, x1, 'r', 'filled');axis([-5,5,0,1.2]);title('单位抽样序列 \delta(n)');
xlabel('n1');

x2=stepseq(0,0,10);  %调用函数  第一个数字为从不同位置开始的阶跃,后两个为范围
n2=0:10;
subplot(2,1,2);stem(n2, x2, 'g', 'filled');axis([0,10,0,1.2]);title('单位阶跃序列 u(n)');
xlabel('n2');

运行效果如下:

在这里插入图片描述

2. 矩形序列和正弦序列

clear;

n=0:10;
x3=stepseq(0,0,10)-stepseq(5,0,10);     %04的矩形序列
subplot(2,1,1);stem(n, x3, 'g', 'filled');axis([0,10,0,1.2]);title('矩形序列');
xlabel('n');grid on;
n=0:22;
x4=sin(0.3*n);
subplot(2,1,2);stem(n, x4, 'r', 'filled');axis([0,25,-1.2,1.2]);title('正弦序列');
xlabel('n');grid on;

运行效果如下:

在这里插入图片描述

3. 实指数序列

clear;

n1=-2:10;
% 实指数序列
x1=(0.8).^n1;      % a<1
subplot(3, 1, 1);
stem(n1, x1, 'g', 'filled');axis([-2, 10, 0, 2]);
title('a<1');

x2=(1.2).^n1;     % a>1
subplot(3, 1, 2);
stem(n1, x2, 'r', 'filled');axis([-2, 10, 0, 8]);
title('a>1');

x3=(1).^n1;       % a=1
subplot(3, 1, 3);
stem(n1, x3, 'b', 'filled');axis([-2, 10, 0, 1.2]);
title('a=1');
xlabel('n');

运行效果如下:

在这里插入图片描述

4. 复指数序列

clear;

n=-2:10;
x=exp((0.4+0.6j)*n);    %复指数序列
subplot(211)
stem(n, real(x), 'g', 'filled');
axis([-4,11,min(real(x))-1,1.2*max(real(x))])
title('复指数序列')
ylabel('实部');grid;

subplot(212)
stem(n, imag(x), 'r', 'filled');
axis([-4,11,min(imag(x))-1,1.2*max(imag(x))])
ylabel('虚部');xlabel('n');grid;

在这里插入图片描述

5. 延拓5个周期序列

clear;

%延拓5个周期序列出来
x=[1,2,3,4];N=length(x);k=5;
nx=0:N-1;
ny=0:(k*N-1);   % 延拓
y=x(mod(ny,N)+1);  %mod函数 求余数
subplot(211),stem(nx,x,'g','filled');
axis([-1,N+1,0,5]);grid;
subplot(212),stem(ny,y,'r','filled');
axis([-1,k*N,0,5]);grid;

运行效果如下:

在这里插入图片描述

二、序列运算的MATLAB实现

1. 相加和相乘

已知两序列为:x1(n)=[1,3,5,7,6,4,2,1],起始位置ns1=-3;x2(n)=[4,0,2,1,-1,3],起始位置ns2=1,求他们的和ya以及乘积ym

clear;

x1=[1,3,5,7,6,4,2,1];ns1=-3;        %给定x1及它的起始点位置ns1
x2=[4,0,2,1,-1,3];ns2=1;            %给定x2及它的起始点位置ns2

%求出x1,x2的终点位置nf1,nf2
nf1=ns1+length(x1)-1;       
nf2=ns2+length(x2)-1;  

%故有nx1=ns1:nf1,nx2=ns2:nf2
n1=ns1:nf1;
n2=ns2:nf2;
n=min(ns1,ns2):max(nf1,nf2);    %y的位置向量
y1=zeros(1,length(n));y2=y1;    %y1,y2序列的初始化
y1((n>=ns1)&((n<=nf1)==1))=x1;  %给y1赋值x1
y2((n>=ns2)&((n<=nf2)==1))=x2;  %给y2赋值x2
%序列相加  相乘
ya=y1+y2;ym=y1.*y2;
subplot(221);stem(n1,x1,'m','filled');xlabel('n');title('x1(n)');grid;
subplot(223);stem(n2,x2,'g','filled');xlabel('n');title('x2(n)');grid;
subplot(222);stem(n,ya,'r','filled');xlabel('n');axis([-4,6,0,12]);title('y1(n)+y2(n)');
subplot(224);stem(n,ym,'b','filled');xlabel('n');title('y1(n)*y2(n)');axis([-4,6,0,28]);grid;

运行效果如下:

在这里插入图片描述

2. 两有限长序列的卷积运算

求解:x(n)=[1,2,3,-1,-2],nx=[-1,3] 与 h(n)=[2,2,1,-1,4,-2],nh=[-3,2]的卷积

clear;

%计算两序列卷积
x=[1,2,3,-1,-2];nx=-1:3;    %有限长序列x 及其范围
h=[2,2,1,-1,4,-2];nh=-3:2;  %有限长序列y 及其范围
ny=min(nx)+min(nh):max(nx)+max(nh);  %卷积后索引的范围
y=conv(x,h);     % 计算卷积的函数
disp(y);disp(ny); %打印结果
%绘图
stem(ny,y,'r','filled');xlabel('n');ylabel('y(n)');
title('x(n) * h(n)');grid;  

运行效果如下:

>> test_007
     2     6    11     5    -1    -2     7    -8    -6     4     # 卷积后的结果

    -4    -3    -2    -1     0     1     2     3     4     5     # 卷积后索引范围

在这里插入图片描述

3. 两有限长序列的互相关运算

clear;

%两有限长序列
x=[2,1,3,2,1,5,1];
y=[2,1,3,4];
N1=length(x)-1;N2=length(y)-1;
%计算两序列互相关性
rxy=conv(fliplr(x),y);k=(-N2):N1;   %将序列x翻转  算卷积
ryx=conv(fliplr(y),x);k=(-N2):N1;	%将序列y翻转  算卷积
%绘图
subplot(211);
stem(k,rxy,'g', 'filled');
title('rxy(n)');
subplot(212);
stem(k,ryx,'r', 'filled');
xlabel('n');title('ryx(n)');
axis([-N2,N1,0,35]);grid;

运行效果如下:
在这里插入图片描述

4. 差分方程求解,输入单位抽样序列的输出

输入单位抽样序列,取其长度为6,差分方程为:y(n)-0.5y(n-1)=x(n),初始条件为y(-1)=0,输入为δ(n),求输出y(n)=h(n)

clear;

b=1;a=[1,-0.5];L=6;
[h,n]=impz(b,a,L);    %数字滤波器单位抽样响应
y=filter(b,a,[1,0,0,0,0,0]);   %直接滤波器
stem(n,h,'r','filled');xlabel('n');title('h(n)');  %绘图
disp(y);   %打印输出结果

运行效果如下:

>> test_009
    1.0000    0.5000    0.2500    0.1250    0.0625    0.0313

在这里插入图片描述

3. 回声检测的MATLAB代码实现

clear;
load mtlb;x=mtlb;   %加载mtlb文件  声音文件
M = length(x);
a = 0.9; N = 5000;
x0 = [x', zeros(1, N)];
xN = [zeros(1, N), x'];
y0 = x0 + a.*xN;
subplot(2, 2, 1); stem(x0, 'g.');
title('Signal x[k]'); grid on
subplot(2,2,3); stem(y0,'g.');
title('y[k]=x[k] + 0.9*x[k-N]'); grid on
[Rxx,n] = xcorr(x0,x0);  %自相关
subplot(2, 2, 2);
stem(n,Rxx,'r.'); title('Rxx[n]'); grid on
[Ryy,n] = xcorr(y0,y0);
subplot(2, 2, 4);
stem(n,Ryy,'r.'); title('Ryy[n]'); grid on;

运行效果如下:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/fyfugoyfa/article/details/108565530