Matlab-信号与系统计算

Intro

Matlab 的脚本文件为 .m 文件.

取索引处的值

Matlab 中的索引用 () 而非 []:

1
2
3
4
5
6
7
8
9
10
A = [1, 2, 3, 4, 5, 6];

% 单个索引值
value = A(3); % 获取索引为 3 处的值,value = 3

% 多个索引值
values = A([2, 4, 6]); % 获取索引为 2、4、6 处的值,values = [2, 4, 6]

% 范围索引值
rangeValues = A(2:4); % 获取索引从 2 到 4 处的值,rangeValues = [2, 3, 4]

且, Matlab 中的索引是从 1 开始的.

查看文档

如查看 print 的文档:

1
help print

注释

%.

常用函数

自然指数

1
2
n = [0:32];
x = exp(j*(pi/8)*n);

三角函数

1
2
x1 = sin((pi/4)*[0:15]);
x2 = cos((pi/7)*[0:15]);

实数和虚数

1
2
real(x);
imag(x);

绝对值

1
abs(x);

角度

1
angle(x);

对数

1
2
3
4
5
6
7
8
9
10
11
12
x = 10;
y = log(x); % 计算以 e 为底的自然对数
disp(y); % 显示结果

x = 100;
y = log10(x); % 计算以 10 为底的对数
disp(y); % 显示结果

x = 8;
base = 2;
y = log(x) / log(base); % 计算以 2 为底的对数
disp(y); % 显示结果

定义连续的区间和离散的区间

定义连续的区间

如:

1
x = 0:0.1:1

其中 0.1 为步长.

同样可以用 linspace 函数:

1
x = linspace(0, 1, 11)

其中 0, 1 为范围, 11 为元素数量.

定义离散的区间

如:

1
x = [1, 2, 3, 4, 5]

需要加上 [].

也可以用 ones, zeros 等函数.

描述一个离散时间函数

如:

$$
\displaylines
{
\begin{aligned}
x[n] = \begin{cases}
2n, -3 \le n \le 3 \newline~ \newline
0, otherwise
\end{cases}
\end{aligned}
}
$$

可用:

1
2
n = [-3:3];
x = 2*n;

描述

给变量插入一段离散值

如:

1
2
n = [-3:3];
x = 2*n;

此时 x 的值为:

1
[-6 -4 -2 0 2 4 6]

这样写之后:

1
x = [0 0 x 0 0];

x 的值变为:

1
[0 0 -6 -4 -2 0 2 4 6 0 0]

zeros 函数

其用于创建一个由 0 组成的数组或矩阵:

1
2
3
4
A = zeros(3)     % 创建一个 3x3 的零矩阵
B = zeros(2, 4) % 创建一个 2x4 的零矩阵
C = zeros([3, 2]) % 创建一个 3x2 的零矩阵
D = zeros(1, 5, 2) % 创建一个大小为 1x5x2 的零数组

可以利用这个来插入一维零矩阵来填充:

1
x = [zeros(1, 95) x zeros(1, 95)];

size 函数

其返回矩阵或数组的大小 (如 1x1, 2x2, 也就是矩阵的维度).

绘制信号曲线

stem 函数

其为 staircase error minimization 的缩写 (但不知道关系在哪里).

用于绘制离散信号的离散序列图:

1
2
stem(x, y)
stem(x, y, LineSpec)

x 是 x 轴上的向量, y 是 y 轴上的向量.

LineSpec 用于指定线条样式, 如 r--.

给图像打上 label 以及 title

xlabel, ylabel, 和 title

1
2
3
4
5
6
x = 0:0.1:2*pi;
y = sin(x);
stem(x, y) % 绘制离散序列图
xlabel('x')
ylabel('y')
title('Discrete Sequence Plot')

操作两个函数

若不是用符号变量 (还没了解这个) 表示函数, 则需要用 . 符号, 如两个函数相乘, 需要写成:

1
2
3
4
x = linspace(0, 1, 100);  % 自变量 x 的取值范围
f1 = sin(x); % 第一个函数
f2 = cos(x); % 第二个函数
f_product = f1 .* f2; % 函数相乘

定义 Matlab 函数

一般将定义的函数单独放在一个文件中, 函数定义的语法为:

1
2
3
4
5
function output_arguments = function_name(input_arguments)
% Function body
% Statements and computations go here
% The function may or may not return output arguments
end

计算卷积

conv 函数.

若有:
$$
\displaylines
{
\begin{aligned}
x[n] = \begin{cases}
1, 0 \le n \le 5 \newline~ \newline
0, otherwise
\end{cases}
\end{aligned}
}
$$

则计算 y[n] = x[n] * x[n] 为:

1
y = conv(x,x);

滤波

filter 函数.

其实际作用就是解方程.

用于计算:
$$
\displaylines
{
\begin{aligned}
\sum_{k=0}^K a_k y[n-k] = \sum_{m=0}^M b_m x[n-m]
\end{aligned}
}
$$

这里的 $a_k$ 和 $b_k$ 为滤波器系数 (?)

如计算 y[n] + 2y[n-1] = x[n] - 3x[n-1]:

1
2
3
4
x = [1, 2, 3, 4, 5];
a = [1 2];
b = [1 -3];
y = filter(b, a, x)

用 filter 计算离散时间的卷积

离散时间的卷积式可以写为:
$$
\displaylines
{
\begin{aligned}
y[n] = \sum_{m=-\infty}^\infty b_m x[n-m] \newline~ \newline
\end{aligned}
}
$$

符号变量

需要安装有 Symbolic Math Toolbox 包才行.

创建和使用如:

1
2
3
4
5
syms x;  % 创建符号变量 x
f = x^2 + 3*x + 2; % 创建符号表达式
df = diff(f, x); % 对 f 求导数
int_f = int(f, x); % 对 f 积分
solve_eqn = solve(f == 0, x); % 求解方程 f = 0

ezplot

用于绘制符号函数.


Matlab-信号与系统计算
http://example.com/2023/10/30/Matlab-信号与系统计算/
作者
Jie
发布于
2023年10月30日
许可协议