在信号与系统课程的学习中,有一次老师的作业是利用MATLAB绘制一个离散周期信号,结合自己的探索与其它文章的启发,最终完成了图样的绘制。由于感觉方法还算具有一定的适用范围与启发性,所以想在这里简单总结一下,希望可以帮助到其他朋友。
离散信号的绘制
绘制离散信号我们可以采用stem函数,其使用规则和plot类似,第一个参数的位置为自变量向量,第二个参数的位置为因变量向量。考虑到我们在学习中遇到的一般是整数离散信号,所以自变量向量的定义可以使用如下形式:
n = 1:1:10;
其中的第一位和第三位为起点和终点,可以根据我们的需要进行设置。
因变量向量是一个与自变量向量大小相同的向量,往往与自变量之间存在一定关系,或者我们有特定的目的,这时候我们便可以根据我们的需要进行设置,考虑一种最简单的情况,即因变量的值全为1:
f_n = ones(1, 10);
调用stem函数为:
n = 1:1:10;
f_n = ones(1, 10);
stem(n, f_n);
图样为:
离散周期信号的实现
取余函数mod
考虑到我们遇到的离散坐标都是整数值,在周期性的绘制时我们可以考虑使用取余函数mod,下面以一个例子说明取余函数mod的用法。
a = mod(23, 5);
其中第一位为被除数,第二位为除数,运行指令,不难得到结果:
周期性的实现
对于一个周期不算太大的信号,我们可以使用判断语句if给出它在一个周期内的取值情况,然后使用取余函数mod进行周期延拓。例如,假设一个信号的周期为 10,那么1处和11处的信号取值应该是一样的,又因为1和11对10取余数都是1,我们便可以通过对0-10余数进行赋值,从而完成对指定区间的绘制。下面通过一个例子进行说明,如果目标周期函数如下:
周期信号的横坐标自然是无限延伸的,我们在绘图的时候必然也只能绘出它在指定区间范围的图样,我们便期待能够编写这样一个程序:指定我们需要的定义域,然后输出相应的图样。这时候我们需要给出任意一个自变量对应的函数值,然后使用stem进行绘图,显然此时通过枚举的方法效率很低,也不具有通用性,我们便可以考虑使用mod函数。
n = -20:1:20;%根据需要任意指定
f_n = fun1(n);
stem(n, f_n);
函数代码为:
function f = fun1(x)
temp = ones(1,numel(x));
for k = 1:numel(x)
a = x(k);
if a>=0
a = mod(a,11);
if a>=0 && a<=2
temp(k) = 1;
elseif a>=9 && a<=10
temp(k) = 1;
else
temp(k) = 0;
end
else
a = mod(-a,11);
if a>=0 && a<=2
temp(k) = 1;
elseif a>=9 && a<=10
temp(k) = 1;
else
temp(k) = 0;
end
end
f = temp;
end
end
值得一提的是,&&和||都只能针对标量进行操作,所以在函数中不妨根据自变量向量的大小生成一个同样大小的向量,然后指定到每一个元素进行操作。
普适性的检验
下面我们改变自变量的范围如下:
n = -40:1:40;%根据需要任意指定
可知符合需求。