数字信号处理|| 离散序列的基本运算
一、实验目的
(1)进一步了解离散时间序列时域的基本运算。
(2)了解MATLAB语言进行离散序列运算的常用函数,掌握离散序列运算程序的编写方法。
二、实验涉及的MATLAB子函数
(1)find
功能:寻找非零元素的索引号。
调用格式:find((n>=min(n1))&(n<=max(n1)));在符合关系运算条件的范围内寻找非零元素的索引号。
(2)fliplr
功能:对矩阵行元素进行左右翻转。
调用格式:x1=fliplr(x);将x的行元素进行左右翻转,赋给变量x1。
三、实验原理
离散序列的时域运算包括信号的相加、相乘,信号的时域变换包括信号的移位、反折、倒相及信号的尺度变换等。
在MATLAB中,离散序列的相加等运算是两个向量之间的运算,因此参加运算的两个序列向量必须具有相同的维数,否则应进行相应的处理。
四、实验任务
(1)认真阅读实验原理,明确本次实验目的,复习有关离散时间序列运算的理论知识。
(2)在MATLAB中编写运行各例题程序,理解离散序列运算的性质,了解各条语句的意义。
(3)读懂各例题程序,了解基本的离散序列运算MATLAB中的程序编写方法。
(4)列写已调试通过的实验任务程序, 打印或描绘实验程序产生的曲线图形。
五、实验程序及运行结果
(1)序列移位
将一个离散信号序列进行移位,形成新的序列:
x1(n)=x(n-m)
当m>0时,原序列x(n)向右移m位,形成的新序列称为x(n)的延时序列;当m<0时,原序列x(n)向左移m位,形成的新序列称为x(n)的超前序列。
1)
x1(n)=u(n-6) (-10<n<10)
x2(n)=u(n-4) (-10<n<10)
编写一个MATLAB程序,对u(n)序列进行移位,由图3-1比较三个序列之间的关系。
MATLAB程序:
n1=-10;n2=10;
k0=0;k1=-6;k2=4;
n=n1:n2;、%生成离散信号的时间序列
x0=[n>=k0];%生成离散信号x0(n)
x1=[(n-k1)>=0];%生成离散信号x1(n)
x2=[(n-k2)>=0];%生成离散信号x2(n)
subplot(3,1,1),stem(n,x0,’filled’,’k’);
axis([n1,n2,1.1*min(x0),1.1*max(x0)]);
ylabel(‘u(n)’);
subplot(3,1,2),stem(n,x1,’filled’,’k’);
axis([n1,n2,1.1*min(x1),1.1*max(x1)]);
ylabel(‘u(n+6)’);
subplot(3,1,3),stem(n,x2,’filled’,’k’);
axis([n1,n2,1.1*min(x2),1.1*max(x2)]);
ylabel(u’(n-4)’);
运行结果:
2) 已知一正弦信号:
求其移位信号x(n-2)和x(n+2)在-2<n<10区间的序列波形。
MATLAB程序:
n = -2:10; % 定义时间序列n
n0 = 2; % 延迟2个单位
n1 = -2; % 提前2个单位
x = 2 * sin(2 * pi * n / 10); % 建立原信号x(n)
x1 = 2 * sin(2 * pi * (n - n0) / 10); % 建立x(n-2)信号
x2 = 2 * sin(2 * pi * (n - n1) / 10); % 建立x(n+2)信号
subplot(3, 1, 1); % 创建3行1列的子图布局,并定位到第1个子图
stem(n, x, 'filled', 'k'); % 使用stem函数绘制x(n),并设置属性
ylabel('x(n)'); % 设置y轴标签
subplot(3, 1, 2); % 定位到第2个子图
stem(n, x1, 'filled', 'k'); % 使用stem函数绘制x(n-2)
ylabel('x(n-2)'); % 设置y轴标签
subplot(3, 1, 3); % 定位到第3个子图
stem(n, x2, 'filled', 'k'); % 使用stem函数绘制x(n+2)
ylabel('x(n+2)'); % 设置y轴标签
运行结果:
(2)序列相加
两个离散序列相加是指两个序列中相同序号n(或同一时刻)的序列值逐项对应相加,构成一个新的序列:
x(n)=x1(n)+x2(n)
1)求
MATLAB程序:
n1 = 0; % 初始值
n2 = 10; % 结束值
n01 = 2; % 第一个单位脉冲的延迟
n02 = 4; % 第二个单位脉冲的延迟
n = n1:n2; % 创建时间序列
% 建立单位脉冲序列 d(n-2) 和 d(n-4)
x1 = (n - n01) == 0; % 注意使用双等号进行比较
x2 = (n - n02) == 0;
% 将两个单位脉冲序列相加
x3 = x1 + x2;
% 绘制三个序列的图形
subplot(3, 1, 1); % 第1个子图
stem(n, x1, 'filled'); % 使用stem函数绘制 d(n-2) 序列
axis([n1, n2, 0, 1.1]); % 限定显示范围
ylabel('d(n-2)'); % 设置y轴标签
subplot(3, 1, 2); % 第2个子图
stem(n, x2, 'filled'); % 使用stem函数绘制 d(n-4) 序列
axis([n1, n2, 0, 1.1]); % 限定显示范围
ylabel('d(n-4)'); % 设置y轴标签
subplot(3, 1, 3); % 第3个子图
stem(n, x3, 'filled'); % 使用stem函数绘制 d(n-2) + d(n-4) 序列
axis([n1, n2, 0, 1.1]); % 限定显示范围
ylabel('d(n-2) + d(n-4)'); % 设置y轴标签
(3)序列反折
离散序列反折是指离散序列的两个向量以零时刻的取值为基准点,以纵轴为对称轴反折。在MATLAB中提供了fliplr函数,可以实现序列的反折。
1)已知一个信号:
求它的反折序列x(-n)。
n = -4:4; % 创建一个序列从-4到4
x = exp(-0.3*n); % 计算序列的指数衰减值% 翻转x数组,并相应翻转n数组
x1 = fliplr(x);
n1 = -fliplr(n);
% 在1行2列的子图中的第一个位置绘制原始序列
subplot(1, 2, 1); % 创建1行2列的子图布局,并定位到第1个子图
stem(n, x, 'filled'); % 使用stem函数绘制序列,并填充标记
title('x(n)'); % 设置标题
% 在1行2列的子图中的第二个位置绘制翻转后的序列
subplot(1, 2, 2); % 定位到第2个子图
stem(n1, x1, 'filled'); % 使用stem函数绘制翻转后的序列,并填充标记
title('x(-n)'); % 设置标题
运行结果:
(4)序列倒相
离散序列倒相是求一个与原序列的向量值相反,对应的时间序号向量不变的新的序列。
1)将上(3)1)中信号:倒相。
MATLAB程序:
n = -4:4; % 创建一个序列从-4到4
x = exp(-0.3*n); % 计算序列的指数衰减值
% 取x的相反数
x1 = -x;
% 在1行2列的子图中的第一个位置绘制原始序列
subplot(1, 2, 1); % 创建1行2列的子图布局,并定位到第1个子图
stem(n, x, 'filled'); % 使用stem函数绘制序列,并填充标记
title('x(n)'); % 设置标题
axis([min(n), max(n), 1.1*min(x1), 1.1*max(x)]); % 限定显示范围
% 在1行2列的子图中的第二个位置绘制相反数序列
subplot(1, 2, 2); % 定位到第2个子图
stem(n, x1, 'filled'); % 使用stem函数绘制相反数序列,并填充标记
title('-x(n)'); % 设置标题
axis([min(n), max(n), 1.1*min(x1), 1.1*max(x)]); % 限定显示范围
运行结果:
(5)序列的尺度变换
对于给定的离散序列x(n),序列x(mn)是x(n)每隔m点取一点形成,相当于时间轴n压缩了m倍;反之,序列x(n/m)是x(n)作m倍的插值而形成的,相当于时间轴n扩展了m倍。
1)已知信号x(n)=sin(2πn),求x(2n)和x(n/2)的信号波形。为研究问题的方便,取0<n<20,并将n缩小20倍进行波形显示。
MATLAB程序:
n = (0:20)/20; % 建立原信号x(n)的时间序列
x = sin(2*pi*n); % 计算原信号x(n)
x1 = sin(2*pi*n*2); % 建立x(2n)信号
x2 = sin(2*pi*n/2); % 建立x(n/2)信号
% 使用subplot(3, 1, i)创建3行1列的子图布局,并在第i个子图中绘图
subplot(3, 1, 1); stem(n, x, 'filled'); % 绘制原信号x(n)
ylabel('sin(2*pi*n)'); % 设置y轴标签
subplot(3, 1, 2); stem(n, x1, 'filled'); % 绘制x(2n)信号
ylabel('sin(2*pi*2n)'); % 设置y轴标签
subplot(3, 1, 3); stem(n, x2, 'filled'); % 绘制x(n/2)信号
ylabel('sin(2*pi*n/2)'); % 设置y轴标签
运行结果:
六、实验心得
离散序列的基本运算实验中,使我对离散时间序列的时域运算有了更进一步的认识。学习如何使用MATLAB进行序列的移位、相加、反折和倒相等操作。特别是通过find和fliplr函数的应用,我对序列运算的编程实现有了更深的理解。实验中对不同序列进行操作并观察结果的变化,让我对离散序列的基本性质有了更加直观的认识。