DSP——MATLAB离散时间信号基本运算(及常用信号函数的调用)

今天刚好上了节DSP的课程,然后课堂是MATLAB关于离散时间信号的基本运算。想必直接通过我们自己的理解可能会觉得很简单,但是当要通过电脑即MATLAB去处理时,发现还是有一丢丢的难理解,接下来我将会举几个例子帮助理解。

一、首先还是先给几个常用函数,也是课堂总结的,到时建立M文件直接调用就好:
1、单位脉冲函数

function [x,n] = stepseq(n0,n1,n2)
% 产生 x(n) = u(n-n0); n1 <= n <= n2
% n1 n2是定义域的上下限,n0是延时因子,注意是延时
% [x,n] = stepseq(n0,n1,n2)
%
close all
n = [n1:n2]; x = [(n-n0) >= 0];
% figure;
% stem(n,x);

2、阶跃函数


function [x,n] = stepseq(n0,n1,n2)
% 产生 x(n) = u(n-n0); n1 <= n <= n2
%  n1 n2是定义域的上下限,n0是延时因子,注意是延时
% [x,n] = stepseq(n0,n1,n2)
%
close all
n = [n1:n2]; x = [(n-n0) >= 0];
% figure;
% stem(n,x);

3、时移处理函数

function [y,n] = sigshift(x,m,k)
% 对输出产生时移 y(n) = x(n-k)
%注意此时定义域也会跟着移动
% [y,n] = sigshift(x,m,k)
%
n = m+k; y = x;

%  n = -2 :10;
% x = [1 2 3 4 5 6 7 6 5 4 3 2 1];

4、时间反转函数

function [y,n] = sigfold(x,n)
% 时间反转处理 y(n) = x(-n)
% -----------------------
% [y,n] = sigfold(x,n)
%
y = fliplr(x); n = -fliplr(n);

%  n = -2 :10;
% x = [1 2 3 4 5 6 7 6 5 4 3 2 1];

基本这四个处理函数就够帮助基本的MATLAB运算理解了。

二、进入正题,为什么MATLAB处理这些基本运算就有所特别呢?首先我们应知道的是MATLAB是按照矩阵的形式存储数据,我们平常用的一般为一个行矩阵,所以对该行矩阵的元素位置(也就是相当于我们xy轴的x坐标)是有第一个、第二个、第三个、、、等等来标识,其一个因变量序列x[n]与另一个因变量序列y[n]相加时是只考虑本身元素按次序相加的,其相加过程与n无关(实际上是必须要相关的),所以我们要解决的问题就是使两者序列相加时对应于同一个n对应的x[n]与y[n]相加,下面举例子说明下。
如果两个序列x=[1 2 3] 与y=[1 2 3]相加时,此时n与y或者x的对应关系未知:
1、若n与y或者x的对应关系如下:x【1】=1,x【2】=2,x【3】=3,y【1】=1,y【2】=2,y【3】=3
当做MATLAB运算时,即x+y=【2 4 6】,此时运算正确,相关代码如下:
n=1:3;
x=[1 2 3];%假如x[1]=1,x[2]=2,x[3]=3
y=[1 2 3];%假如y[1]=1,y[2]=2,y[3]=3
z=x+y;
subplot(311);
stem(n,x)
title(“x[n]”);
grid on;
subplot(312);
stem(n,y)
title(“y[n]”);
grid on;
subplot(313);
stem(n,z)
title(“z[n]”);
grid on;
在这里插入图片描述
2、若n与y或者x的对应关系如下:x【1】=1,x【2】=2,x【3】=3,y【2】=1,y【3】=2,y【4】=3此时由于它们的自变量n不同,用MATLAB直接利用上一代码是完全不行的,除非对x,y增加对应位置的零才能运算,代码如下
n=1:4;
x=[1 2 3 0];%假如x[1]=1,x[2]=2,x[3]=3
y=[0 1 2 3];%假如y[2]=1,y[3]=2,y[4]=3
z=x+y;
subplot(311);
stem(n,x)
title(“x[n]”);
grid on;
subplot(312);
stem(n,y)
title(“y[n]”);
grid on;
subplot(313);
stem(n,z)
title(“z[n]”);
grid on;
在这里插入图片描述
那么从个例子发现要是如果
n与y或者x的对应关系如下:x【1】=1,x【2】=2,x【3】=3,y【100】=1,y【101】=2,y【102】=3时是不是也要添加那么多相应的零。
答案是对的,那么就得出个结论:

其实在MATLAB中的序列的运算中针对x[n] y[n]来说,他们的运算只和本身元素有关,所以我们要让x[n]与n, y[n]与n建立一一对应的联系,方法就让它们的n为同一个n,使得具有同样的对应关系
总结起来具体实例如下:
在这里插入图片描述

[x1,n1] = impseq(1,-10,10);%先生成单位脉冲函数
[x2,n2] = impseq(-1,-10,10);%
n=min([n1,n2]):max([n1,n2]);%将定义范围化成同一个区间
N=length(n);
y1=zeros(1,N);
y2=zeros(1,N);%生成一个行矩阵用于存储对应同一范围的函数值
y1(find(n>=min(n1)&n<=max(n1)))=x1;
y2(find(n>=min(n2)&n<=max(n2)))=x2;%未与x(n)重合的取0
y=y1+y2;%再进行相关运算
stem(n,y)
grid on

在这里插入图片描述
在这里插入图片描述

[x1,n1] = impseq(1,-10,10);%先生成单位脉冲函数
[x2,n2] = impseq(-1,-10,10);%
[x3,n3] = impseq(0,-10,10);
n=min([n1,n2,n3]):max([n1,n2,n3]);%将定义范围化成同一个区间
N=length(n);
y1=zeros(1,N);
y2=zeros(1,N);
y3=zeros(1,N);%生成一个行矩阵用于存储对应同一范围的函数值
y1(find(n>=min(n1)&n<=max(n1)))=x1;
y2(find(n>=min(n2)&n<=max(n2)))=x2;
y3(find(n>=min(n3)&n<=max(n3)))=x3;%未与x(n)重合的取0
y=y1+y3.*y2;%再进行相关运算
stem(n,y)
grid on

在这里插入图片描述
在这里插入图片描述

[x1,n1] = impseq(1,-10,10);%先生成单位脉冲函数
[x2,n2] = impseq(0,-10,10);%
[x2,n2] = sigfold(x2,n2);%反转,x2表示输入信号,n2表示输入信号对应定义范围
[x2,n2] = sigshift(x2,n2,1);%时移 1表延时因子如x[n-1]
n=min([n1,n2]):max([n1,n2]);%将定义范围化成同一个区间
N=length(n);
y1=zeros(1,N);
y2=zeros(1,N);%生成一个行矩阵用于存储对应同一范围的函数值
y1(find(n>=min(n1)&n<=max(n1)))=x1;
y2(find(n>=min(n2)&n<=max(n2)))=x2;%未与x(n)重合的取0
y=y1+y2;%再进行相关运算
stem(n,y)
grid on

在这里插入图片描述
写的有点乱。。。哎

猜你喜欢

转载自blog.csdn.net/qq_37335890/article/details/88255934
今日推荐