热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

数字信号处理之Matlab应用基础

一、Matlab简介•Matlab名字是由Matrix和Laboratory两个词的前三个字母组合而成的,是由MathWorks公司于1982年推出的一套高性能的数值计算和可视化

一、Matlab 简介

• Matlab名字是由Matrix和Laboratory两个词的前三个字母组合而成的,是由MathWorks公司于1982年推出的一套高性能的数值计算和可视化数学软件。
• Matlab编程运算与人进行科学计算的思路和表达方式完全一致。不像学习其它高级语言如Basic、Fortran和C等那样难于掌握。
• 其基本元素是矩阵 。
• 具有强大的数值计算和图示能力。
• 具有丰富的工具箱(ToolBox)。
• 在高校中,Matlab已成为数学,信息,控制等诸多学科有关课程的有效教学工具。



二、Matlab 的安装与启动

下载安装自行百度即可;

附一个更改Matlab默认保存文件路径的方法,R2015b实测有效:

https://blog.csdn.net/u012210613/article/details/52346842



三、Matlab 编程基础


• 1 变量

变量无需定义即可使用。
变量名的大小写是敏感的。
变量的第一个字符必须为英文字母,而且不超过31个字符。
变量名可以包含下连字符、数字,但不能为空格符、标点 。



• 2 数组,向量与矩阵的创建和访问

• 在Matlab中,这三个概念在创建和显示的时候没有任何区别。
• 向量的创建 要创建一个向量,在命令窗口下输入:
t=0:1:10
屏幕显示:
t =

 0 1 2 3 4 5 6 7 8 9 10
注意:
向量的第一个元素的下标是1,而不是0。
T=0:1:10产生了0~10步长为1的共11个数,保存在t(1),t(2), ┉t(11)中。

• 矩阵的创建
例如:创建一个3×3的矩阵,输入 :
a=[1 2 3;4 5 6;7 8 9]
屏幕输出
a =
1 2 3
4 5 6
7 8 9

• 访问矩阵的某一个元素:
a(3,2)
ans=
8
访问矩阵某行(列)的所有元素:
a(3,:) a(:,2)
注意:这两个符号分别是1*3行向量和3*1列向量



• 3 部分特殊变量和常数

• ans 最近生成的无名结果
• eps 浮点数的相对误差
• pi 圆周率(3.1415926)
• i 虚数单位
• j 虚数单位
• inf 无穷大,如n/0



• 4 部分常用运算符


1 算术运算符

• + 加
• - 减
• * 乘(包括标量乘,矩阵乘,标量与矩阵乘)
• / 除(包括标量除,矩阵除标量,数组除标量)
• ^ 矩阵求幂(矩阵必须为方阵)
• .* 数组相乘
• ./ 数组相除
• .^ 数组求幂
注意:.* ./ 表示两个同维数组中的对应元素做乘,除;. ^ 表示对数组的每个元素求幂

 


2 关系运算符

• <小于
• <= 小于等于
• > 大于
• >= 大于等于
• == 等于
• ~= 不等于
运算法则:若关系式成立,结果为1;若关系式不成立,结果为0

 


3 逻辑运算符

• & 与
• | 或
• ~ 非
运算法则: 若逻辑真,结果为1;若逻辑假,结果为0。

 


4 其他常见符号

• = 变量赋值
• % 注释符
• ‘ 共轭转置符
• : 冒号运算符
• n:s:m 产生n~m,步长为s的序列,s可以为
正或负或者小数,默认值为1。



• 5 Matlab的程序设计


• Matlab的工作方式有二种

1. 交互式的指令操作方式。即用户在命令窗口中输入命令并按下回车键后,系统执行该指令并立即
给出运算结果。
2. m文件的编程方式。m文件是由 matlab语句构成的文件,且文件名必须以.m为扩展名,如example.m。用户可以用任何文件编辑器来对M文件进行编辑。

 


• 顺序结构:

Matlab 从上到下依次执行各语句,该结构最简单。



• 循环结构

(1)for-end 循环
用于循环次数事先确定的,格式为
for i=n:s:m
语句体
end
s 为步长,可以为正数,负数或小数。

(2)while-end 循环
用于循环次数不能事先确定的,格式为
while 表达式
语句 体
end
只有表达式为真,就执行语句体,表达
式为假,终止该循环。


• 分支结构

• (1) if 语句
格式为
if 表达式1
语句体1
elseif 表达式2
语句体2
………..
else
语句体
end



• 6 m文件的创建,保存


• 创建

【File】菜单下【New】菜单选项的【M-File】命 令 打开matlab的m文件编辑器窗口 。


• 保存

单击M文件编辑器窗口工具栏中的【 Save】图标,打开保存对话框

 


• 7 基本数学函数和基本绘图函数

sin(x) cos(x) tan(x) cot(x) exp(x)
log(x) :自然对数
log10(x): 以10为底的对数
log2(x):以2为底的对数
abs(x):取模
conj(x):取共轭
real(x):取实部
imag(x):取虚部


• Matlab提供了强大的图形绘制功能。

在大多数情况下,用户只需要指定绘图的方式,提供绘图数据,利用Matlab提供的丰富的二维,三维图形函数,就可以绘制出所需的图形。
• 1 .绘制二维连续函数
Matlab中最常用的绘图函数是plot,plot的命令格式有以下几种:
• (1) plot(y)
当y为一向量时,以y的序号作为x轴,按向量y的值绘制曲线。
• (2) plot(x,y)
x,y均为向量时,以x向量作为X轴,向量y作为Y轴绘制曲线。
注意:x和y种元素的个数必须相同!

在Matlab用stem命令实现离散序列的绘制。

stem命令的格式有以下几种:
(1)stem(y)
以x=1,2,3……为各点数据的x坐标,以y向量的各个对应元素为y坐标,在(X,Y)坐标面画一个空心小圆圈。
(2)stem(x,y,’filled’)
以x向量的各个元素为x坐标,以y向量的各个对应元素为y坐标,在(X,Y)坐标面画一个实心小圆圈,并连接一条线段到X轴。



• 8 编程举例


例一.用图形表示连续调制波形y=sin(t)sin(9t)及其包络。
程序如下:

t=(0:pi/100:pi)’;% 长度为101 的时间采样列向量
y1=sin(t)*[1,-1];% 包络线函数值,是(101x2 )的矩阵
y2=sin(t).*sin(9*t); % 长度为101 的调制波列向量
t3=pi*(0:9)/9;
y3=sin(t3).*sin(9*t3);
plot(t,y1,&#39;r:&#39;,t,y2,&#39;b&#39;,t3,y3,&#39;bo&#39;)
axis([0,pi,-1,1]) %控制轴的范围

运行结果:

 


四、Matlab 在数字信号处理课程中的应用


• 常见连续信号

•  周期信号:正弦信号,周期方波


例二 产生一个幅度为2,频率为4Hz,相位为π/6的正弦信号

A=2;% 振幅
f=4;% 频率
phi=pi/6;% 初相位
w0=2*pi*f;% 角频率
t=0:0.01:1;% 描点
x=A*sin(w0*t+phi);% x取值
plot(t,x);

运行结果:


• 非周期信号:指数信号,阶跃信号,取样函数Sa(x)等


例三 产生一个高度为1,宽度为3,延时为2秒的矩形脉冲信号

t=-2:0.02:6;% 自变量取值范围
plot(t,rectpuls(t-2,3));
% rectpuls(t,width)用以产生一个幅值为1,宽度为width,
% 相对于t=0点左右对称的矩形波信号,该函数的横坐标范围由向量t决定,
% 是以t=0为中心向左右各展开width/2的范围,width的默认值为1。
% t-2根据“左加右减”,即对称轴为x=2
axis([-2,6,0,1.5]);

运行结果:



例四 取样函数:用sinc(x)命令

N=1000;
t=-10:20/N:10;
x=sinc(t/pi);
plot(t,x);
grid on

运行结果: 



• 随机信号:
rand产生均匀分布的白噪声,randn产生高斯分布的白噪声

t=0:0.01:1;
y=randn(1,length(t));
plot(t,y);grid on;

运行结果:



• 离散信号

• 周期序列


例五 产生一个幅度为2,频率为4Hz,相位为π/6的正弦信号

A=2;% 幅值
phi=pi/6;% 初相位
omega=2*pi/12;% 角频率
n=-10:10;% 自变量范围:21个点
x=A*sin(omega*n+phi);
stem(n,x,&#39;fill&#39;);% 描实心点
grid on;% 打开网格

运行结果:



例六 产生单位脉冲序列δ[n]和单位阶跃序列u[n-3]

• 单位脉冲序列δ[n]和单位阶跃序列u[n]可以用ones(1,n)和zeros(1,n)来生成单位脉冲序列和单位阶跃序列
ones(1,n)命令产生1行n列的1值
zeros(1,n)命令产生1行n列的0值

n=-5:30;
x=[zeros(1,8),1,zeros(1,27)];% 该数组前1-5为0,6位为1,后27位为0
y=[zeros(1,8),ones(1,28)];% 该数组前1-5位为0,后28位为1
subplot(2,1,1);
stem(n,x,&#39;fill&#39;);grid on;
subplot(2,1,2)
stem(n,y,&#39;fill&#39;);grid on;

运行结果:



• 离散卷积

• matlab 中卷积运算的指令是c=conv(a,b),其中a和b是有限长的序列


例七 计算下面两个序列的卷积
a=[-2 0 1 –1 3]; b=[1 2 0 -1];

两个序列的都从0开始的

a=[-2 0 1 -1 3];% L(a)=5
b=[1 2 0 -1];% L(b)=4
c=conv(a,b);% L(c)=8
M=length(c)-1;% a卷积b的长度为L(a)+L(b)-1, L(M)=7
n=0:1:M;% n=0:1:7 L(N)=8
stem(n,c,&#39;fill&#39;);grid on;
xlabel(&#39;Time index n&#39;);% 给横坐标加注释

运行结果:



• LTI系统

• 因果LTI系统的零状态响应,在matlab中可以用函数y=filter(num,den,x) 实现
其中:
num------系统传递函数分子系数组成的行向量
den-------- 系统传递函数分母系数组成的行向量
x-------输入的离散序列
y-------输出的离散序列,y的长度与x的长度一样

 

• 因果LTI系统的幅频响应和相频响应曲线,在matlab中可以用函数freqz(num,den,n,Fs)
该函数可以同时作出幅频和相频响应图
其中:
num-----系统传递函数分子系数组成的行向量
den------系统传递函数分母系数组成的行向量
n---------是频率响应的点数,最好为2的幂缺省值512
Fs--------采样频率


例八 已知一个系统的传递函数为



求系统单位冲激响应h[n],以及h[n]的幅频相频响应图


运行结果:

N=64;
x=[1 zeros(1,N-1)]; %产生单位冲激函数δ[n]
num=[0.008 -0.033 0.05 -0.033 0.008];% 分子系数
den=[1 2.37 2.7 1.6 0.41];% 分母系数
y=filter(num,den,x); %计算零状态响应以画出单位冲激响应h[n]
figure(1);% 画图1
n=1:N;
stem(n,y,&#39;fill&#39;);grid on; title(&#39;单位冲激响应&#39;);
figure(2)% 画图2
Fs=1024;
freqz(num,den,N,Fs);grid on; %做出幅频和相频响应曲线
title(&#39;幅频相频响应&#39;)



补充:


单边指数序列


n=0:10;
x1=power(0.8,n);
stem(n,x1,&#39;linewidth&#39;,2);
xlabel(&#39;n&#39;);
ylabel(&#39;a^n&#39;);
axis([n(1) n(end) -1.5 1.5]);
title(&#39;0.8^n&#39;);

运行结果:


 


连续复指数信号

ts=0;
te=5;
dt=0.01;
t=[ts:dt:te];% t:0-5
alpha=-0.5;w=10;% 参数设置
x=exp((alpha+j*w)*t);
title(&#39;复指数信号&#39;);
subplot(2,2,1);plot(t,real(x),&#39;linewidth&#39;,2);% Re(x)
title(&#39;复指数信号&#39;);
xlim([t(1) t(end)]);
grid on;xlabel(&#39;t&#39;);ylabel(&#39;real part&#39;);subplot(2,2,2);plot(t,imag(x),&#39;linewidth&#39;,2);
grid on;xlabel(&#39;t&#39;);ylabel(&#39;imaginary part&#39;);subplot(2,2,3);plot(t,abs(x),&#39;linewidth&#39;,2);
grid on;xlabel(&#39;t&#39;);ylabel(&#39;∣x∣&#39;);subplot(2,2,4);plot(t,angle(x),&#39;linewidth&#39;,2);
grid on;xlabel(&#39;t&#39;);ylabel(&#39;Φ(x)&#39;);

运行结果:



求连续非周期信号的幅频响应与相频响应曲线


 exp(-3*t)*u(t)

% exp(-3*t)*u(t)的幅频、相频曲线
x=sym(&#39;exp(-3*t)*heaviside(t)&#39;);
subplot(311)
ezplot(x),grid on
axis([-1 5 0 1.1])
title(&#39;单边指数信号&#39;)
X=simplify(fourier(x));
subplot(312)
ezplot(abs(X)),grid on
title(&#39;幅度谱&#39;);
phase = angle(X);
subplot(313)
ezplot(phase),grid on
title(&#39;相位谱&#39;)

运行结果:

实际应用中,经过抽样所获得的信号是离散的数值量x(k),无法表示为符号表达式,对于此类信号不能使用fourier函数进行处理,但是可以用MATLAB数值计算法进行求解。

 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


推荐阅读
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 开发笔记:计网局域网:NAT 是如何工作的?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了计网-局域网:NAT是如何工作的?相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • SLAM中相机运动估计的基本问题及解决方案
    本文讨论了SLAM中相机运动估计的基本问题,指出了解决方案的存在。作者认为阅读相关SLAM书籍是掌握基础原理的有效途径,而不是仅仅依赖现成的解决方案。同时,作者也提到了激光雷达和特征点匹配等技术在SLAM中的应用,并建议读者深入理解相关原理,而不是盲目追求现成的代码。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 网址:https:vue.docschina.orgv2guideforms.html表单input绑定基础用法可以通过使用v-model指令,在 ... [详细]
  • 嵌入式处理器的架构与内核发展历程
    本文主要介绍了嵌入式处理器的架构与内核发展历程,包括不同架构的指令集的变化,以及内核的流水线和结构。通过对ARM架构的分析,可以更好地理解嵌入式处理器的架构与内核的关系。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
author-avatar
裸身耍丶暧昧800
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有