Matlab图形(Figure)中使用差值光标提取数据

0. 原由

示波器中常用差值光标,用于捕捉曲线中的特征点,并计算出特征点之间的坐标差值。

差值光标在分析图形数据时很有用。可惜在Matlab的Figure工具栏中并没有提供,自带的数据提取功能似乎不如差值光标好用。笔者尝试开发了用于Matlab图形(Figure)中提取数据的差值光标代码,能够与Matlab的自带Figure无缝对接,推荐作为常规数据分析的小工具。

1. 思路

向Figure增加鼠标移动回调函数,鼠标在figure中移动时,十字光标随鼠标移动,增加数据捕捉功能,当前光标与曲线距离较近时,能够自动捕捉曲线上的最近点,同时在文本框中(textbox)更新捕捉点的坐标,代码和效果如下。

set(hf,'WindowButtonMotionFcn' ,@GetData_WindowButtonMotionFcn); % 鼠标移动回调函数

向Figure增加鼠标点击回调函数,用户点击鼠标后完成鼠标取点确认,并计算出坐标差值,效果如下。

set(hf,'WindowButtonDownFcn' ,@GetData_WindowButtonDownFcn);     % 鼠标点击回调函数

向Figure增加键盘方向键和回车键按下回调函数,当用户按上下左右方向键时能够移动选定点(相当于鼠标移动),按下回车键时确认选定点(相当于鼠标点击),键盘操作时捕捉点可在曲线上逐点滑动,能够更加精准找到期望的特征点,效果如下。

set(hf,'WindowKeyPressFcn' ,@GetData_WindowKeyPressFcn);         % 键盘按下回调函数

2. 函数

笔者使用Matlab软件开发了函数GetData.m,在图形绘制完成后,输入GetData指令,即可直接在图形Figure中进行差值光标的操作。

function GetData()
% 在Figure图形中使用差值光标,获取图形中的特征点
% GetData针对当前图形(gcf)中的当前坐标轴(CurrentAxes)进行操作
clear global hp hp2 hl hl2 f hX1 hY1 hX2 hY2 ht1 ht2 ht3 ht4 ht5 ht6 hft Data f_hold % 清除全局变量
global hp hp2 hl hl2 f hX1 hY1 hX2 hY2 ht1 ht2 ht3 ht4 ht5 ht6 hft Data f_hold       % 全局变量
hf = gcf;
if isempty(f)
    f = 0;     % 初始化 f = 0
end
set(hf,'WindowButtonDownFcn' ,@GetData_WindowButtonDownFcn);     % 鼠标点击回调函数
set(hf,'WindowButtonMotionFcn' ,@GetData_WindowButtonMotionFcn); % 鼠标移动回调函数
set(hf,'WindowKeyPressFcn' ,@GetData_WindowKeyPressFcn);         % 键盘按下回调函数

3. 演示

3.1 使用差值光标获取正弦信号的峰峰值和周期

%% Test 1: 使用差值光标获取正弦信号的峰峰值和周期
close all
clear
clc
t = linspace(0,4*pi,200);
y = 3*sin(t)-0.5;
figure
plot(t,y)
GetData

用户确认后,差值光标获取的特征点坐标值会显示在指令窗中,通过差值光标求出正弦信号峰峰值为5.9968(理论值为6),周期为3.1574(理论值为pi)。指令窗中显示的差值坐标结果为:

Data =
    4.7361   -3.4992      % x1        y1
   11.1140   -3.4790      % x2        y2 
    6.3779    0.0202      % dx=x2-x1  dy=y2-y1  

3.2 使用差值光标获取脉冲宽度、幅值和间隔

%% Test 2: 使用差值光标获取脉冲宽度、幅值和间隔
close all
clear
clc
t = linspace(0,4*pi,200);
y = 1.5*(sin(t)>0.5)-0.5;
figure
plot(t,y)
ylim([-1 2])
GetData

通过差值光标求出脉冲宽度为0.50518,脉冲幅值为1.5,脉冲间隔为4.1046。

3.3 使用差值光标获取阶跃响应的上升时间、超调量及调整时间等

%% Test 3: 使用差值光标获取阶跃响应的上升时间、超调量及调整时间等
close all
clear
clc
t = linspace(0,4*pi,200);
Gs = tf(1,[1 2*0.3 1]);
figure
step(Gs,25);
axis([-1 25 -0.1 1.5])
GetData

通过差值光标求出上升时间1.75s,超调量36.42%,调整时间为13.25s。阶跃响应指标更准确的定量求解方法见 https://blog.csdn.net/MatlabFans_Mfun/article/details/108809448 。

3.4 使用差值光标获取多条曲线相对特征点

%% Test 4: 使用差值光标获取多条曲线特征点
close all
clear
clc
t = linspace(0,4*pi,500);
x = sin(t);
y = sin(t+pi/3)+0.5;
z = sin(t+pi/2) - 0.5;
figure
hold on
hl1 = plot(t,x);
hl2 = plot(2+t,y,'m--');
hl3 = plot(5+t,z,'k-.');
legend('曲线1','曲线2','曲线3')
GetData

通过差值光标求出正弦曲线1与正弦曲线2的相位差为1.043,幅值差为0.4945;正弦曲线1与正弦曲线3的相位差为2.2515,幅值差为1.0018。

4. 预告

分析图形数据时,还会经常需要对图形曲线进行平移操作,笔者使用Matlab开发了代码LineMove.m,可以方便的实现图形曲线的移动编辑。效果如下,代码和文档正在整理中,下期发布,敬请期待。

联系作者

有Matlab/Simulink方面的技术问题,欢迎发送邮件至944077462@qq.com讨论。更多Matlab/Simulink原创资料,欢迎关注微信公众号:Matlab Fans

源程序下载:
Matlab图形(Figure)中使用差值光标

在这里插入图片描述

  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MatlabFans_Mfun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值