《MATLAB信号处理超级学习手册》——2.3 信号在MATLAB中的运算

简介:

本节书摘来自异步社区《MATLAB信号处理超级学习手册》一书中的第2章,第2.3节,作者:MATLAB技术联盟 , 史洁玉著,更多章节内容可以访问云栖社区“异步社区”公众号查看

2.3 信号在MATLAB中的运算

MATLAB信号处理超级学习手册
本节利用MATLAB进行离散时间序列的基本运算,掌握基本的MATLAB函数的编写和调试方法,同时了解对连续时间信号的时域运算,加深对信号的时域运算的理解。

2.3.1 信号的时移、反折和尺度变换
描离散序列的时域运算包括信号的相加、相乘,信号的时域变换包括信号的移位、反折、尺度变换等。在MATLAB中,离散序列的相加、相乘等运算是两个向量之间的运算,因此参加运算的两个序列向量必须具有相同的维数,否则应进行相应的处理。

离散序列的时移、反折、尺度变换与连续时间信号相似,在此举例来说明MATLAB实现过程。

【例2-17】离散序列的时移、反折、尺度变换的实现。运行程序如下:

clear;
k=-12:12;
k1=2.*k+4;
f=-[stepfun(k,-3)-stepfun(k,-1)]+...
    4.*[stepfun(k,-1)-stepfun(k,0)]+...
    0.5*k.*[stepfun(k,0)-stepfun(k,11)];
f1=-[stepfun(k1,-3)-stepfun(k1,-1)]+...
    4.*[stepfun(k1,-1)-stepfun(k1,0)]+...
    0.5*k1.*[stepfun(k1,0)-stepfun(k1,11)];
subplot 221;
stem(k,f);
axis([-12 12 -1 6]);
grid on;
xlabel('n');
ylabel('h(n)');
text(-8,3,'f[k]')
subplot 222;
stem(k+1,f);
axis([-12 12 -1 6]);
grid on;
xlabel('n');
ylabel('h(n)');
text(-9.5,3,'f[k-1]')
subplot 223;
stem(k,f1);
axis([-12 12 -1 6]);
grid on;
xlabel('n');
ylabel('h(n)');
text(-8,3,'f[2k+4]')
subplot 224;
stem(2-k,f);
axis([-12 12 -1 6]);
grid on;
xlabel('n');
ylabel('h(n)');
text(5.5,3,'f[2-k]')
AI 代码解读

运行程序结果如图2-17所示。

screenshot

2.3.2 信号的加法和乘法运算
信号的相加和相乘是指同一时刻信号取值的相加与相乘。

对于离散序列来说,序列相加是将信号对应时间序号的值逐项相加,在这里不能象连续时间信号那样用符号运算来实现,而必须用向量表示的方法,即在MATLAB中离散序列的相加需表示成两个向量的相加,因而参加运算的两序列向量必须具有相同的维数。

实现离散序列相加的MATLAB实用子程序如下:

function [f,k]=lsxj(f1,f2,k1,k2)
%实现f(k)=f1(k)+f2(k),f1,f2,k1,k2是参加运算的二离散序列及其对应的时间序列向量,f和k为返回的和序列及其对应的时间序列向量
k=min(min(k1),min(k2)):max(max(k1),max(k2));
%构造和序列长度
s1=zeros(1,length(k));s2=s1;
%初始化新向量
s1(find((k>=min(k1))&(k<=max(k1))==1))=f1;
%将f1中在和序列范围内但又无定义的点赋值为零
s2(find((k>=min(k2))&(k<=max(k2))==1))=f2;
%将f2中在和序列范围内但又无定义的点赋值为零
f=s1+s2;
 %两长度相等序列求和
stem(k,f,'filled')
axis([(min(min(k1),min(k2))-1),(max(max(k1),max(k2))+1),(min(f)-0.5),(max(f)+0.5)])
%坐标轴显示范围
AI 代码解读

【例2-18】已知两离散序列分别为:

screenshot

试用MATLAB绘出它们的波形及f 1[k]+ f 2[k]的波形。

运行程序如下:

clear
f1=-2:2;k1=-2:2;
f2=[1 1 1];k2=-1:1;
subplot 221;
stem(k1,f1);
grid on;
xlabel('n');
ylabel('h(n)');
axis([-3 3 -2.5 2.5]);
title('f1[k]');
subplot 222;
stem(k2,f2)
grid on;
xlabel('n');
ylabel('h(n)');
axis([-3 3 -2.5 2.5]);
title('f2[k]');
subplot 223;
[f,k]=lsxj(f1,f2,k1,k2);
grid on;
xlabel('n');
ylabel('h(n)');
title('f[k]=f1[k]+f2(k)');
AI 代码解读

运行结果如图2-18所示。

screenshot

与离散序列加法相似,这里参加运算的两序列向量必须具有相同的维数。实现离散时间信号相乘的MATLAB实用子程序代码如下:

function [f,k]=lsxc(f1,f2,k1,k2)
%实现f(k)=f1(k)+f2(k),f1,f2,k1,k2是参加运算的二离散序列及其对应的时间序列向量,f和k为返回的和序列及其对应的时间序列向量
k=min(min(k1),min(k2)):max(max(k1),max(k2));
%构造和序列长度
s1=zeros(1,length(k));s2=s1;
%初始化新向量
s1(find((k>=min(k1))&(k<=max(k1))==1))=f1;
%将f1中在和序列范围内但又无定义的点赋值为零
s2(find((k>=min(k2))&(k<=max(k2))==1))=f2;
%将f2中在和序列范围内但又无定义的点赋值为零
f=s1.*s2;
%两长度相等序列求和
stem(k,f,'filled')
axis([(min(min(k1),min(k2))-1),(max(max(k1),max(k2))+1),(min(f)-0.5),(max(f)+0.5)])
%坐标轴显示范围
AI 代码解读

【例2-19】试用MATLAB绘出上例中两离散序列乘法f 1[k]×f 2[k]的波形。运行程序如下:

f1=-2:2;k1=-2:2;
f2=[1 1 1];k2=-1:1;
subplot 221;
stem(k1,f1);
grid on;
xlabel('n');
ylabel('h(n)');
axis([-3 3 -2.5 2.5]);
title('f1[k]');
subplot 222;
stem(k2,f2);
grid on;
xlabel('n');
ylabel('h(n)');
axis([-3 3 -2.5 2.5]);
title('f2[k]');
subplot 223;
[f,k]=lsxc(f1,f2,k1,k2);
grid on;
xlabel('n');
ylabel('h(n)');
title('f[k]=f1[k]*f2(k)');
AI 代码解读

运行结果如图2-19所示。

screenshot

2.3.3 信号的奇偶分解
用户可以利用MATLAB编写的函数sigevenodd()将序列分解成偶序列和奇序列两部分,源程序为:

function****[xe,xo,m]=evenodd(x,n)
if (imag(x)~=0)
        error(‘x is not a real sequence’);
    end
m=-fliplr(n);m1=min([m,n]);m2=max([m,n]);m=m1:m2;
nm=n(1)-m(1);n1=1:length(n);
x1=zeros(1,length(m));
x1(n1+nm)=x;x=x1;
xe=0.5*(x+fliplr(x)); xo=0.5*(x-fliplr(x));
AI 代码解读

【例2-20】已知x(n)=u(n)-u(n-10),要求将序列分解为奇偶序列。运行程序如下:

n=[0:10];
x=stepseq(0,0,10)- stepseq(10,0,10);
[xe,xo,m]=evenodd(x,n);
subplot(2,2,1);stem(n,x);
ylabel('x(n)'); xlabel('n');
grid on;
title('矩形序列');axis([-10,10,-1.2,1.2])
subplot(2,2,2);stem(m,xe);
ylabel('xe(n)'); xlabel('n');
grid on;
title('奇序列');axis([-10,10,-1.2,1.2])
subplot(2,2,3);stem(m,xo);
ylabel('xo(n)'); xlabel('n');
grid on;
title('偶序列');axis([-10,10,-1.2,1.2])
AI 代码解读

运行结果如图2-20所示。

screenshot

程序运行过程中用到的位阶跃序列的生成函数子程序为:

function [x,n]=stepseq(n0,ns,nf)
n=[ns:nf];x=[(n-n0)>=0];
AI 代码解读

2.3.4 信号的积分和微分
对于连续时间信号,其微分运算是用diff函数来完成的,其语句格式为:diff(function,'variable',n)

其中,function表示需要进行求导运算的信号,或者被赋值的符号表达式;variable为求导运算的独立变量;n为求导的阶数,默认值为求一阶导数。

连续信号的积分运算用int函数来完成,语句格式为:

int(function,'variable',a,b)
AI 代码解读

其中,function表示需要进行被积信号,或者被赋值的符号表达式;variable为求导运算的独立变量;a,b为积分上、下限,a和b省略时为求不定积分。

【例2-21】积分运算的实现。运行程序如下:

syms t f2;
f2=t*(heaviside(t)-heaviside(t-1))+heaviside(t-1); 
t=-1:0.01:2;
subplot(121);
ezplot(f2,t);
title('原函数')
grid on;
ylabel('x(t)');
f=diff(f2,'t',1); 
subplot(122)
ezplot(f,t);
title('积分函数 ')
grid on;
ylabel('x(t)')
AI 代码解读

运行结果如图2-21所示。

screenshot

【例2-22】微分运算的实现。运行程序如下:

syms t f1;
f1=heaviside(t)-heaviside(t-1); 
t=-1:0.01:2; 
subplot(121);
ezplot(f1,t);
title('原函数')
grid on;
f=int(f1,'t'); 
subplot(122);
ezplot(f,t)
grid on
title('微分函数')
ylabel('x(t)');
AI 代码解读

运行结果如图2-22所示。

screenshot

目录
打赏
0
0
0
0
1819
分享
相关文章
基于GRU网络的MQAM调制信号检测算法matlab仿真,对比LSTM
本研究基于MATLAB 2022a,使用GRU网络对QAM调制信号进行检测。QAM是一种高效调制技术,广泛应用于现代通信系统。传统方法在复杂环境下性能下降,而GRU通过门控机制有效提取时间序列特征,实现16QAM、32QAM、64QAM、128QAM的准确检测。仿真结果显示,GRU在低SNR下表现优异,且训练速度快,参数少。核心程序包括模型预测、误检率和漏检率计算,并绘制准确率图。
109 65
基于GRU网络的MQAM调制信号检测算法matlab仿真,对比LSTM
BOC调制信号matlab性能仿真分析,对比功率谱,自相关性以及抗干扰性
本内容介绍了一种基于BOC(Binary Offset Carrier)调制的算法,使用Matlab2022a实现。完整程序运行效果无水印,核心代码配有详细中文注释及操作步骤视频。理论部分阐述了BOC调制在卫星导航中的应用优势:相比BPSK调制,BOC信号功率谱主瓣更窄、自相关函数主峰更尖锐,可优化旁瓣特性以减少干扰,提高频谱利用率和同步精度,适合复杂信道环境下的信号接收与处理。
基于FPGA的信号DM编解码实现,包含testbench和matlab对比仿真
本项目展示了DM编解码算法的实现与测试结果。FPGA测试结果显示为T1,Matlab仿真结果为T2。使用软件版本为Matlab 2022a和Vivado 2019.2。核心程序包含详细中文注释和操作视频。DM编解码通过比较信号样本差值进行编码,适用于音频等低频信号处理。硬件结构包括编码器(采样器、减法器、比较器)和解码器(解码器、积分器)。
一维信号的小波变换与重构算法matlab仿真
本程序使用MATLAB2022A实现一维信号的小波变换与重构,对正弦测试信号进行小波分解和重构,并计算重构信号与原信号的误差。核心步骤包括:绘制分解系数图像、上抽取与滤波重构、对比原始与重构信号及误差分析。小波变换通过多分辨率分析捕捉信号的局部特征,适用于非平稳信号处理,在信号去噪、压缩等领域有广泛应用。
MATLAB学习之旅:数据统计与分析
在MATLAB中,我们掌握了数据导入、处理及插值拟合等基础技能。接下来,我们将深入数据统计与分析领域,学习描述性统计量(如均值、标准差)、数据分布分析(如直方图、正态概率图)、数据排序与排名、数据匹配查找以及数据可视化(如箱线图、散点图)。这些工具帮助我们挖掘数据中的有价值信息,揭示数据的奥秘,为后续数据分析打下坚实基础。
MATLAB学习之旅:数据建模与仿真应用
在MATLAB的学习中,我们已掌握基础操作、数据处理与统计分析。接下来将进入数据建模与仿真应用阶段,学习如何构建和验证现实世界的模型。我们将从定义模型结构和参数入手,涵盖线性回归、动态系统建模等内容,并通过仿真和实际数据对比评估模型的准确性和可靠性。最终,这些技能将帮助我们在科学研究和工程应用中解决复杂问题。
基于梯度流的扩散映射卡尔曼滤波算法的信号预处理matlab仿真
本项目基于梯度流的扩散映射卡尔曼滤波算法(GFDMKF),用于信号预处理的MATLAB仿真。通过设置不同噪声大小,测试滤波效果。核心代码实现数据加载、含噪信号生成、扩散映射构建及DMK滤波器应用,并展示含噪与无噪信号及滤波结果的对比图。GFDMKF结合非线性流形学习与经典卡尔曼滤波,提高对非线性高维信号的滤波和跟踪性能。 **主要步骤:** 1. 加载数据并生成含噪测量值。 2. 使用扩散映射捕捉低维流形结构。 3. 应用DMK滤波器进行状态估计。 4. 绘制不同SNR下的轨迹示例。
|
8月前
|
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
本文介绍了2023年高教社杯数学建模竞赛D题的圈养湖羊空间利用率问题,包括问题分析、数学模型建立和MATLAB代码实现,旨在优化养殖场的生产计划和空间利用效率。
317 6
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现
本文提供了2022年华为杯数学建模竞赛B题的详细方案和MATLAB代码实现,包括方形件组批优化问题和排样优化问题,以及相关数学模型的建立和求解方法。
197 3
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现
【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码
本文介绍了2023年五一杯数学建模竞赛B题的解题方法,详细阐述了如何通过数学建模和MATLAB编程来分析快递需求、预测运输数量、优化运输成本,并估计固定和非固定需求,提供了完整的建模方案和代码实现。
253 0
【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码

热门文章

最新文章