Matlab信号处理笔记

寒假开始学习基于MATLAB的信号处理。学习教材:在这里插入图片描述
以此博客来记录

一、MATLAB基础

1.Matlab选择结构——switch-case语句

Matlab基本函数-fix函数

%例1.8 编写一个某地产公司对顾客所购买的房产实行打折销售的标准
price=input('请输入商品价格:')
switch fix(price/100)
    case {
    
    0,1}
        rate=0;
    case {
    
    2,3,4}
        rate=0.1/100;
    case num2cell(5:9)
        rate=0.2/100;
    case num2cell(10:24)
        rate=0.3/100;
end
price=price*(1-rate)

与C语言的switch-case语句不同的是,在MATLAB语言中,当其中一个case语句后的条件为真时,switch-case语句不对其后的case语句进行判断,也就是说在MATLAB语言中,即使有多条case判断语句为真,也只执行所遇到的第一条为真的语句。这样就不必像C语言那样,在每条case语句后加上break语句以防止继续执行后面为真的case条件语句。

2.break语句与continue语句的区别

break语句:中止本次循环,跳出最内层循环(即不再执行循环)
continue语句:跳过本次循环,去执行下一轮循环

%break语句
a=0;b=1;
for i=0:5
    b=b+1
    if i>2
        break
    end
    a=a+2
end

%运行结果:
a=0,2,4,6
b=1,2,3,4,5
%continue语句
a=0;b=1;
for i=0:5
    b=b+1
    if i>2
        continue
    end
    a=a+2
end

%运行结果:
a=0,2,4,6
b=1,2,3,4,5,6,7

3.try-catch语句

MATLAB try-catch结构

%try-catch语句
%例1.12 先求两矩阵的乘积,若出错,则自动转去求两矩阵的点乘
A=[1,2;3,4];
B=[5,6;7,8];

try
    C=A*B;
catch
    C=A.*B;
end
C

4.数组与矩阵

4.1数组

用“[]”创建一维数组,行数组元素用空格或者逗号分隔,列数组元素用分号分隔,标点符号一定要在英文状态下输入。

%创建数组实例
clear all
A=[]
B=[6 4 3 5 6 7] %行数组元素用空格或者逗号分隔
C=[4,2,4,5,6,7]
D=[1;4;56;67;75;3] %列数组元素用分号分隔
E=B' %转置
E=B.' %共轭转置

%程序结果
A =

     []


B =

     6     4     3     5     6     7


C =

     4     2     4     5     6     7


D =

     1
     4
    56
    67
    75
     3


E =

     6
     4
     3
     5
     6
     7


E =

     6
     4
     3
     5
     6
     7
%1.18 访问数组实例
clear all
clc
B=[1 2 3 5 7 6]
b1=B(1) %访问数组第1个元素
b2=B(1:3) %访问数组第1个到第3个元素
b3=B(3:end) %访问数组第3个到最后1个元素
b4=B(end:-1:1) % 数组元素反向输出
b5=B([1 4])  %访问数组第1个和第4个元素

%程序结果
B =

     1     2     3     5     7     6


b1 =

     1


b2 =

     1     2     3


b3 =

     3     5     7     6


b4 =

     6     7     5     3     2     1


b5 =

     1     5

%1-19 对一子数组赋值
clear all
clc
B=[1 2 3 5 7 6]
B(3)=34 %访问数组第3个元素  将第3个元素赋值为34
B([4 6])=[56 987] %访问数组第4个和第6个元素 分别赋值为56,987

%程序结果
B =

     1     2     3     5     7     6


B =

     1     2    34     5     7     6


B =

     1     2    34    56     7   987

4.1.1用冒号创建一维数组

具体格式为:x1:x2:x3,其中x1表示初始值,x2表示步长,x3表示终止值。利用冒号生成数组时,若x2为负值,则表示生成递减向量;若x2省略,则系统默认步长为1。

%1-20 用冒号创建一维数组
clear all
clc

A=3:6 %创建元素为3到6数组
B=3.1:1.5:6 %创建元素为3.1到6,步长为1.5的数组
C=3.1: -1.5 :-6%创建元素为3.1到-6,步长为-1.5的数组

%运行结果
A =

     3     4     5     6


B =

    3.1000    4.6000


C =

    3.1000    1.6000    0.1000   -1.4000   -2.9000   -4.4000   -5.9000

4.1.2用logspace()函数创建一维数组

MATLAB中常用logspace()函数创建一维数组,调用方式如下:
(1)y=logspace(a,b);该函数创建行向量y,第一个元素为10a,最后一个元素为10b,形成总是为50个元素的等比数列。
(2)y=logspace(a,b,n);该函数创建行向量y,第一个元素为10a,最后一个元素为10b,形成总是为n个元素的等比数列。

%1-21 用logspace()创建一维数组
clear all
clc
A=logspace(1,4,20) %创建一个由区间 [10^1,10^4] 内的20个点组成的向量

%运行结果
A =

   1.0e+04 *

  列 111

    0.0010    0.0014    0.0021    0.0030    0.0043    0.0062    0.0089    0.0127    0.0183    0.0264    0.03791220

    0.0546    0.0785    0.1129    0.1624    0.2336    0.3360    0.4833    0.6952    1.0000

补基础:
运行结果中的1.0e+04即110^4=10000
这是科学计数法的表示方式。
再举两个例子:
如果输入了向量[23 000 000, 55 000 000],那么MATLAB会将之表示为:1.0e+7
[2.3, 5.5]
如果输入了向量[0.000 000 23, 0.000 000 55],那么MATLAB会将之表示为:1.0e-7*[2.3, 5.5]

4.1.3用linspace()函数创建一维数组

y = linspace(x1,x2) 返回包含 x1 和 x2 之间的 100 个等间距点的行向量。
y = linspace(x1,x2,n) 生成 n 个点。这些点的间距为 (x2-x1)/(n-1)。
linspace 类似于冒号运算符“:”,但可以直接控制点数并始终包括端点。“linspace”名称中的“lin”指示生成线性间距值而不是同级函数 logspace,后者会生成对数间距值。

%1-22 用linspace()创建一维数组
clear all
clc
A=linspace(1,20,5)%创建一个由区间 [1,20] 中的5个等间距点组成的向量
B=linspace(1,2)%创建一个由区间 [1,2]中的100个等间距点组成的向量

%运行结果
A =

    1.0000    5.7500   10.5000   15.2500   20.0000


B =111

    1.0000    1.0101    1.0202    1.0303    1.0404    1.0505    1.0606    1.0707    1.0808    1.0909    1.10101222

    1.1111    1.1212    1.1313    1.1414    1.1515    1.1616    1.1717    1.1818    1.1919    1.2020    1.21212333

    1.2222    1.2323    1.2424    1.2525    1.2626    1.2727    1.2828    1.2929    1.3030    1.3131    1.32323444

    1.3333    1.3434    1.3535    1.3636    1.3737    1.3838    1.3939    1.4040    1.4141    1.4242    1.43434555

    1.4444    1.4545    1.4646    1.4747    1.4848    1.4949    1.5051    1.5152    1.5253    1.5354    1.54555666

    1.5556    1.5657    1.5758    1.5859    1.5960    1.6061    1.6162    1.6263    1.6364    1.6465    1.65666777

    1.6667    1.6768    1.6869    1.6970    1.7071    1.7172    1.7273    1.7374    1.7475    1.7576    1.76777888

    1.7778    1.7879    1.7980    1.8081    1.8182    1.8283    1.8384    1.8485    1.8586    1.8687    1.87888999

    1.8889    1.8990    1.9091    1.9192    1.9293    1.9394    1.9495    1.9596    1.9697    1.9798    1.9899100

    2.0000

4.2常见的数组运算

4.2.1数组的加减乘除幂

在这里插入图片描述

%例23-27 数组的运算
clear all
clc
A=[2 3 5 6 7 8]
B=[1 4 6 3 7 2]

C=A+B %数组的加法
D=A-B %数组的减法
E=A.*B %数组的乘法
F=A./B %数组的左除A/B
G=A.\B %数组的右除B/A
F=A.^B %数组的求幂

%运行结果
A =

     2     3     5     6     7     8


B =

     1     4     6     3     7     2


C =

     3     7    11     9    14    10


D =

     1    -1    -1     3     0     6


E =

     2    12    30    18    49    16


F =

    2.0000    0.7500    0.8333    2.0000    1.0000    4.0000


G =

    0.5000    1.3333    1.2000    0.5000    1.0000    0.2500


F =

           2          81       15625         216      823543          64

4.2.2数组的点积

C = dot(A,B) 返回 A 和 B 的标量点积。
如果 A 和 B 是向量,则它们的长度必须相同。
C = dot(A,B,dim) 计算 A 和 B 沿维度 dim 的点积。dim 输入是一个正整数标量。

%1.27 数组的点积
clear all
clc
A=[2 4 5]
B=[1 4 2]
a=dot(A,B) %数组的点积
b=sum(A.*B) %数组元素的乘积之和

%运行结果
A =

     2     4     5
B =

     1     4     2
a =

    28
b =

    28

4.2.3数组的关系运算

MATLAB 数组运算
MATLAB中的两个数之间的关系有6种描述

小于 <
大于 >
等于等于 ==
大于等于 >=
小于等于 <=
不等于 ~=

比较两个元素的大小时,若表达式为真,则返回结果1,否则返回0

%数组的关系运算
clear all
clc
A=[1 3 4 5 6]
B=[1 2 4 54 5]
C=A>B
D=A<B
E=A==B
F=A>=B
G=A<=B

%运行结果
A =

     1     3     4     5     6
B =

     1     2     4    54     5
C =

  1×5 logical 数组

   0   1   0   0   1
D =

  1×5 logical 数组

   0   0   0   1   0
E =

  1×5 logical 数组

   1   0   1   0   0
F =

  1×5 logical 数组

   1   1   1   0   1
G =

  1×5 logical 数组

   1   0   1   1   0

4.3矩阵

4.3.1矩阵的表示

(1)直接输入法

%直接输入法创建矩阵
clear all
clc
A = [1 34 45;12 23 54;65 32 6]%行与行之间既可以通过;号隔开,也可以通过回车符隔开
B=[1 2 4
   32 43 54
   54,65,756]

%运行结果
A =

     1    34    45
    12    23    54
    65    32     6

B =

     1     2     4
    32    43    54
    54    65   756

(2)载入外部数据文件

data.txt的文件内容:
在这里插入图片描述

%读取数据文件data.txt
clear all
clc
load data.txt %载入数据文件
imagesc(data)%以图像的形式显示
colormap winter %查看并设置当前颜色图为"winter"冷色调

运行结果:
在这里插入图片描述
补充:MATLAB | MATLAB配色不够用 全网最全的colormap补充包来啦写论文时可参考修改配色

(3)利用MATLAB内置函数创建矩阵

函数名 功能介绍
ones() 产生全为1的矩阵
zeros() 产生全为0的矩阵
eye() 产生单位矩阵
rand() 产生在(0,1)区间分布的随机矩阵
randn() 产生均值为0,方差为1的标准正态分布随机矩阵
compan() 伴随矩阵
gallery() Higham检验矩阵
hadamard() Hadamard阵
hankel() Handkel阵
hilb() Hilbert阵
magic() 魔方阵
pascal() pascal阵
rosser() 经典对称特征值
toeplitz() Toeplitz帧
vander() vander阵
wilknsion() wilknsion特征值检验矩阵

%利用系统内置函数创建矩阵
clear all
clc
A=zeros(5,4) %5行4列全为0的矩阵
close all
B=randn(5,4) %5行4列均值为0,方差为1的标准正态分布随机矩阵
imagesc(B)%以图像的形式显示
colormap winter %查看并设置当前颜色图为"winter"冷色调

%运行结果
A =

     0     0     0     0
     0     0     0     0
     0     0     0     0
     0     0     0     0
     0     0     0     0
B =

   -1.0891    0.0859   -0.6156   -1.4023
    0.0326   -1.4916    0.7481   -1.4224
    0.5525   -0.7423   -0.1924    0.4882
    1.1006   -1.0616    0.8886   -0.1774
    1.5442    2.3505   -0.7648   -0.1961

运行结果:
在这里插入图片描述

(4)利用M文件创建和保存矩阵

创建M文件,在其中输入矩阵,保存为AA.m,然后在命令行中输入AA,即可。

%利用M文件创建和保存矩阵 创建A1_32.m文件
A=[12 324 435
   213 43 45
   2 4 54]

运行结果:
在这里插入图片描述

4.3.2矩阵的寻访

(1)单元素寻访
%矩阵的单元素寻访
clear all
clc
A=[12 324 435
   213 43 45
   2 4 54]
x=A(1,1)
y=A(2,2)
z=A(3,1)

%运行结果
A =

    12   324   435
   213    43    45
     2     4    54
x =
    12
y =
    43
z =
     2
(2)多元素寻访

(1) A(e1:e2:e3)表示取数组或矩阵A的第e1元素开始每隔e2步长一直到e3的所有元素;
(2) A([m n l])表示取数组或矩阵A中的第m、n、l个元素;
(3) A(:,j)表示取A矩阵的第j列全部元素;
(4) A(i,:)表示取A矩阵的第i列全部元素;
(5) A(i:i+m,:)表示取A矩阵第i~(i+m)行的全部元素;
(6) A(:,k,k+m)表示取A矩阵第k~(k+m)列的全部元素;
(7) A(i:i+m,k:k+m)表示取A矩阵第i~ (i+m)行内,并在第k~(k+m)列中的所有元素;
(8) 还可以利用一般向量和end运算符来表示矩阵下标,从而获得子矩阵。end表示某一维末尾元素下标。

%对矩阵进行多元素寻访
clear all
clc
A=randn(4) %生成均值为0,方差为1的标准正态分布随机矩阵
A(1,:) %访问第1行所有元素
A(2:4,:) %访问第2到4行所有元素
A(:,2) %访问第2列所有元素
A %访问所有元素

%运行结果
A =

   -1.5771   -1.3337    0.0229   -0.8314
    0.5080    1.1275   -0.2620   -0.9792
    0.2820    0.3502   -1.7502   -1.1564
    0.0335   -0.2991   -0.2857   -0.5336

ans =

   -1.5771   -1.3337    0.0229   -0.8314
ans =

    0.5080    1.1275   -0.2620   -0.9792
    0.2820    0.3502   -1.7502   -1.1564
    0.0335   -0.2991   -0.2857   -0.5336
ans =

   -1.3337
    1.1275
    0.3502
   -0.2991
A =

   -1.5771   -1.3337    0.0229   -0.8314
    0.5080    1.1275   -0.2620   -0.9792
    0.2820    0.3502   -1.7502   -1.1564
    0.0335   -0.2991   -0.2857   -0.5336

4.3.3矩阵的运算

语法类似于数组的运算,见4.2。

5.图形的绘制

5.1二维图形的绘制

在MATLAB中,主要的二维绘图函数如下:

(1)普通二维图形的绘制

%1.50在同一坐标轴上绘制sin(x)、sin(2x)、sin(3x)这三条曲线
clear all
clc
x=0:0.01:3*pi
y1=sin(x)
y2=sin(2*x)
y3=sin(3*x)

figure
plot(x,y1,x,y2,x,y3)
axis([0 8 -1.5 1.5]) %设置坐标轴范围
grid on

xlabel('x')
ylabel('y')
title('演示绘图基本步骤')
legend('sin(x)','sin(2x)','sin(3x)')

运行结果:
在这里插入图片描述

%显示函数y=2*exp(-0.5*x).*sin(2*pi*x)及其包络线
clear all
clc
x=(0:pi/100:2*pi)'
y1=2*exp(-0.5*x)*[1,-1]%上下两条包络线
y2=2*exp(-0.5*x).*sin(2*pi*x)%函数
x1=(0:12)/2
y3=2*exp(-0.5*x1).*sin(2*pi*x1)
figure
plot(x,y1,'-.',x,y2,'y-',x1,y3,'rp')

运行结果:
在这里插入图片描述
补基础:
(1) 表转置
(2).:点乘 就是将向量的每个元素对应进行相乘的操作
语法:.

运行:[1 2 3].*[4 5 6]
结果:[4 10 8]
(3)点积是将向量的元素对应相乘后,加起来
语法:dot(x1,x2)
Matlab中向量点乘、点积、叉乘计算

(2)双纵坐标图形的绘制

yyaxis left 激活当前坐标区中与左侧 y 轴关联的一侧。后续图形命令的目标为左侧。
yyaxis right 激活当前坐标区中与右侧 y 轴关联的一侧。后续图形命令的目标为右侧。

%绘制双纵坐标图形
x=linspace(0,4)
y=x
yyaxis left
plot(x,y,'b-.')

x1=0:pi/10000:7*pi
y1=sin(x1*2*pi)
yyaxis right
plot(x1,y1,'r.')

运行结果:
在这里插入图片描述

补基础:
  1. text:向数据点添加文本说明
% 绘制一条正弦曲线。在点 (π,0) 处,添加文本说明 sin(π)
x = 0:pi/20:2*pi;
y = sin(x);
plot(x,y)
text(pi,0,'\leftarrow sin(\pi)') %使用 \pi 表示希腊字母 π。使用 \leftarrow 显示一个向左箭头。

运行结果:
在这里插入图片描述

  1. gtext:使用鼠标将文本添加到图窗
% 绘制一条正弦曲线。在点 (π,0) 处,添加文本说明 sin(π)
x = 0:pi/20:2*pi;
y = sin(x);
plot(x,y)
gtext('\leftarrow sin(\pi)','color','red','fontsize',14) %使用 \pi 表示希腊字母 π。使用 \leftarrow 显示一个向左箭头。color设置颜色属性为红色。fontsize设置字体大小为14

运行结果:
在这里插入图片描述

二、信号与系统分析基础

1.离散时间信号的概念

离散时间信号 : 在时间t上是离散的值。
时间离散, 幅值连续。(在任意两个离散时间点上,两个幅值差无限小)。 比如抽样信号。
时间离散, 幅值离散。 定义为数字信号。
离散时间信号常常可以用下图表示:
在这里插入图片描述
图中横坐标虽然画的是一条连续线,但重要的时要知道x[n]仅仅在n为整数值时才有定义,认为x[n]在n不为整数时就是零时不正确的;x[n]在n为非整数时只是无定义。

%用图示法来表示离散时间信号
clc
clear all
N=[-3 -2 -1 0 1 3 3 2 5 6 7 6 9 11]
X=[0 2 3 3 2 3 0 -1 -2 -3 -4 -5 1 2]
subplot(211)
stem(N,X) %绘制离散针状图
hold on
plot(N,zeros(1,length(X)),'r') %绘制横轴
set(gca,'box','on')%将图轴方框绘制出来
xlabel('序列号');ylabel('序列值')
subplot(212)
plot(N,X,'r')
hold on
plot(N,zeros(1,length(X)),'b')
xlabel('时间/s');ylabel('函数值')

运行结果:
在这里插入图片描述

2.采样定理

在这里插入图片描述

% 时域的信号长度,决定频域的采样间隔,它们成导数关系
% 时域中信号有N点,每点间隔dt,所以时域信号长度为N*dt
% 那么频谱每点的间隔就是1/(N*dt)

clc
clear all

dt=0.01;n=0:90-1
t=dt*n
f=10 %原始信号频率为10HZ
x=sin(3*pi*f*t+0.5)%原始信号

dt=0.1;n=0:10-1
t1=dt*n
x1=sin(3*pi*f*t1+0.5)%采样后的信号
subplot(311);plot(t,x);title('原始信号')
subplot(312);plot(t,x,t1,x1,'rp');title('采样过程')
subplot(313);plot(t1,x1);title('抽样后的信号')

运行结果:
在这里插入图片描述

2.3 离散时间序列

猜你喜欢

转载自blog.csdn.net/weixin_44769034/article/details/128482895