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)中使用差值光标