Matlab中编程细节

1 Matlab中的绘图设置

1.1 不同绘图函数

1.1.1 plot()函数
  • plot(X,Y)创建 Y 中数据对 X 中对应值的二维线图。
    • 要绘制由线段连接的一组坐标,请将 X 和 Y 指定为相同长度的向量。
    • 要在同一组坐标区上绘制多组坐标,请将 X 或 Y 中的至少一个指定为矩阵。
%% plot()函数的基本使用
% 设置横坐标
x = linspace(-2*pi, 2*pi, 100);
% 设置纵坐标
y1 = sin(x);
y2 = cos(x);
y3 = x/pi;
Y = [y1; y2; y3];

figure;
% 绘制一条曲线
subplot(1, 3, 1);
plot(x, y1);
title('绘制一条曲线');
grid on;
% 绘制多条曲线方法1
subplot(1, 3, 2);
plot(x, y1, x, y2, x, y3);
title('绘制多条曲线方法1');
grid on;
% 绘制多条曲线方法2
subplot(1, 3, 3);
plot(x, Y);
title('绘制多条曲线方法2');
grid on;
  • plot(X1, Y1, LineSpec1, ..., Xn, Yn, LineSpecn) 可为每个 x-y 对组指定特定的线型、标记和颜色。您可以对某些 x-y 对组指定 LineSpec,而对其他对组省略它。
    • 例如,plot(X1,Y1,"o",X2,Y2) 对第一个 x-y 对组指定标记,但没有对第二个对组指定标记。
%% 指定线型、颜色和标记
% 绘制三条正弦曲线,每条曲线之间存在较小的相移。
% 第一条正弦曲线使用绿色线条,不带标记。
% 第二条正弦曲线使用蓝色虚线,带圆形标记。
% 第三条正弦曲线只使用红色星号标记。
x = 0:pi/10:2*pi;
y1 = sin(x);
y2 = sin(x-0.25);
y3 = sin(x-0.5);

figure;
plot(x, y1, 'g', x, y2, 'b--o', x, y3, 'r*');
grid on;
%% 指定线宽、标记大小和标记颜色
% 创建线图并使用 LineSpec 选项指定带正方形标记的绿色虚线。
% 使用 Name,Value 对组来指定线宽、标记大小和标记颜色。
% 将标记边颜色设置为蓝色,并使用 RGB 颜色值设置标记面颜色。
x = -pi:pi/10:pi;
y = tan(sin(x)) - sin(tan(x));

figure;
plot(x,y,'--gs',...
    'LineWidth',2,...
    'MarkerSize',10,...
    'MarkerEdgeColor','b',...
    'MarkerFaceColor',[0.5,0.5,0.5]);
grid on;
线型、标记和颜色参数:
  • 线型
  • 标记
  • 颜色
  • 自定义更丰富参数

Color - 颜色:直接使用三元组或者16进制,默认取值 = [0 0.4470 0.7410],e.g. plot(x, y, "Color", [0 0.4470 0.7410])plot(x, y, "Color", "#0072BD")

LineWidth — 线条宽度:线宽,指定为以磅为单位的正值,其中 1 磅 = 1/72 英寸。如果该线条具有标记,则线条宽度也会影响标记边。默认取值 = 0.5。

MarkerIndices — 要显示标记的数据点的索引:要显示标记的数据点的索引,指定为正整数向量。如果不指定索引,MATLAB 将在每个数据点显示一个标记。e.g.:
plot(x,y,"-o","MarkerIndices",[1 5 10]) :在第一、第五和第十个数据点处显示圆形标记。
plot(x,y,"-x","MarkerIndices",1:3:length(y)):每隔三个数据点显示一个交叉标记。
plot(x,y,"Marker","square","MarkerIndices",5):在第五个数据点显示一个正方形标记。

MarkerEdgeColor — 标记轮廓颜色:标记轮廓颜色,指定为 "auto"、RGB 三元组、十六进制颜色代码、颜色名称或短名称。默认值 "auto" 使用与 Color 属性相同的颜色。

MarkerFaceColor — 标记填充颜色:标记填充颜色,指定为 "auto"、RGB 三元组、十六进制颜色代码、颜色名称或短名称。"auto" 选项使用与父坐标区的 Color 属性相同的颜色。

MarkerSize — 标记大小:标记大小,指定为以磅为单位的正值,其中 1 磅 = 1/72 英寸,默认取值 = 6。

1.1.2 mesh()函数

1.2 图形窗口句柄

MATLAB图形句柄
专题八图形窗口与坐标轴 - 闲谈社的文章 - 知乎

1.3 局部视图放大

Matlab绘制局部放大图 - CSDN
【MATLAB基础绘图第8棒】绘制局部放大图 - CSDN

2 Matlab中的函数(句柄)

3 Matlab中符号变量

U Matlab中信号延迟(平移)

W 频率轴的设置

频率轴的设置的参考链接:
fftshift详解 - CSDN
1.3. DFT的特性 - CSDN
fftshift讲解 - 信号处理小王子的文章 - 知乎

V Matlab的fft函数掌握

Matlab中IFFT/FFT注意事项及在OFDM仿真中的应用问题 - CSDN
数字信号处理1:完全掌握Matlab中的FFT - hal3515的文章 - 知乎

S Matlab的unwrap相位解缠绕

一般在计算一个系统相频特性时,要用到反正切函数 \(\arctan\) 提取相位,计算机中反正切函数有如下规定:

  • 在一、二象限中的角度为 \(0 \sim \pi\)

  • 在三、四象限中的角度为 \(0 \sim -\pi\)

但实际得到的结果会发生相位跳变,跳变幅度为 \(2 \pi\),这就叫相位的卷绕。unwrap()函数的作用就是解卷绕,使相位在 \(\pi\) 处不发生跳变,从而反应出真实的相位变化。

简单说就是:unwrap()的作用则是如果向量中相邻点的相位跃变\(\geq \pi\),则通过\(\pm 2n \pi\)的方式使得相位跃变小于\(\pi\),从而使得整个相位变化曲线链接起来。

实际在默认的情况下,unwrap()在检查到数据前后两点的差距在超过 \(\pi\) 的时候,就认为有跳变,当然其阈值也能通过函数设置。

例如:若一个角度从\(0\)变到\(2 \text{pi}\),但在计算机中实际得到的结果是 \(0 \sim \pi\),再由 \(-\pi \sim 0\),在 \(w = \pi\) 处发生跳变,跳变幅度为 \(2 \pi\),这就叫相位的卷绕。

下面使用一个Matlab程序来帮助理解

%% 相位解缠绕理解
clc; clear; close all;
% 设置一个0~4π的相位变化
realTheta = 0:4*pi/30:4*pi-4*pi/30;
N = length(realTheta);
% 使用该相位产生一个复信号
s = exp(1i*realTheta);
% 使用angle计算每一点信号对应的相位
angleTheta = angle(s);
% 由于存在相位卷绕,使用unwrap解相位卷绕得到真实变化相位
realAngleTheta = unwrap(angle(s));

figure;
plot(0:N-1, realTheta, '-rp', 'linewidth', 2);
hold on;
plot(0:N-1, angleTheta, '-bo', 'linewidth', 1.25);
hold on;
plot(0:N-1, realAngleTheta, '-gx', 'linewidth', 0.75);
hold on
plot(0:N-1, ones(1, N)*pi, '-.', 0:N-1, -ones(1, N)*pi, '-.');
legend('真实变换', '只使用angle得到的卷绕相位', ...
    '使用unwrap解相位卷绕得到真实变化相位', '\pi', '-\pi');
grid on;

运行结果为:

弃置区

clc; clear; close all;
a = [1 3 -1 5 2 6 4 -2];
b = [1 2 3];
c = [1 2 3 0 0 0 0 0];
d = [3 0 0 0 0 0 1 2];
e = [3 2 1];
Zab = conv(a, b);
Zac = conv(a, c);
Zad = conv(a, d);
Zae = conv(a, e);

BLZab = int8(ifft(fft(a).*fft(b, 8)));

BLZac = int8(ifft(fft(a, 10).*fft(c, 10)));

% BLZad的结果=BLZae
BLZad = int8(ifft(fft(a).*fft(d, 8)));
BLZae = int8(ifft(fft(a).*conj(fft(e, 8))));
posted @ 2023-05-15 19:34  博客侦探  阅读(101)  评论(0编辑  收藏  举报