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

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

  1. SQL SERVER 获取差值最小的数据

    分享一个小技巧,获取和自己差值最小的数据,测试数据如下: --测试数据 if not object_id(N'Tempdb..#T1') is nulldrop table #T1 Go Create ...

  2. Python中通过索引名称提取数据loc()函数Python中通过行和列下标提取数据iloc()函数

    [小白从小学Python.C.Java] [Python全国计算机等级考试] [Python数据分析考试必会题] ● 标题与摘要 Python中通过索引名称提取数据 loc()函数 Python中通过 ...

  3. 在一个数组中找 差值最大的两个数 差值最小的两个数 推广到 点对

    先求差值最大的: 1.找出最大值和最小值 然后做差,  每次比较相邻的两个数(比如先0,1  然后2,3),然后每次比较记录下最大和最小的差值,可以比较1.5N次得到结果,和分为奇数偶数位比较一样的复 ...

  4. matlab 取点画图,Matlab关于figure中获取鼠标位置点画图问题

    在本测试程序中,共有三个文件,untitled.fig.untitled.m和ButtonmoveFcn. 思路:在figure中的axes点击鼠标,画出该点击的位置A,然后滑动鼠标,获取滑动后鼠标的 ...

  5. grafana计算不同时间的差值_大数据时代!如何基于Spark Streaming构建实时计算平台...

    随着互联网技术的迅速发展,用户对于数据处理的时效性.准确性与稳定性要求越来越高,如何构建一个稳定易用并提供齐备的监控与预警功能的实时计算平台也成了很多公司一个很大的挑战. 自2015年携程实时计算平台 ...

  6. extract提取返回结果中的内容_httprunner如何提取数据串联上下游接口

    httprunner进行接口测试时,从上一个接口提取参数传递给下游接口,如何获取数据里最后一个值? 突然被学员问道一个httprunner的问题,惭愧的是大猫之前没有是通过httprunner,又不好 ...

  7. (matlab) figure中画多条线,并对每条线依次加标注

    t = 0 : 0.01 : 5; x = sin(t); y = cos(t); figure plot(t, x,'red--');  % 绘制正弦曲线 hold on;  % 将正弦曲线保持在图 ...

  8. Matlab同一figure中使用多种色图

    在数字图像处理中,往往会用不同的色图对图像进行渲染,但是在同一个figure窗口下,仅能使用一种色图,如果多次调用colourmap()等函数,之前的色图会被覆盖掉. 要解决这个问题,需要先将Matl ...

  9. matlab 获取edit,关于matlab的gui中获取edit值的问题

    本帖最后由 李昊波 于 2017-7-16 11:12 编辑 想请教一个问题,制作了一个有24个edit的gui程式,想获取edit中的数值然后用这些数值来做排列组合,但是运行结果显示为生成了一个空的 ...

最新文章

  1. Nginx reload的时候出现的问题/usr/local/nginx/logs/nginx.pid
  2. linux的简单面试题,收集的一些简单的UNIX/Linux面试题
  3. linux 调用 fudanNLP
  4. C++——类访问修饰符
  5. python 面向对象教程:访问限制
  6. 关于MGS4和XSI
  7. IE中a标签绝对定位时才生的bug
  8. 怎样让WinForms下DataGrid可以像ASP.NET下的DataGrid一样使用自定义的模板列
  9. 数据访问增删改查之单项查询
  10. PageHelper分页插件使用
  11. 你只会用 StringBuilder?试试 StringJoiner,真香!
  12. oracle with as用法_as的用法那么多,你知道多少?
  13. 大数据_MapperReduce_Hbase的优化_RowKey设计原则---Hbase工作笔记0028
  14. oracle存储过程菜鸟教程,SQL 简介
  15. 短消息类新旧服务代码对应表
  16. 什么是动态评分及规则
  17. 苹果手机显示没有连接服务器怎么办啊,苹果手机更新连接到服务器出现问题怎么办...
  18. date类型在日期增加或者减少几天
  19. MacBook Pro换固态硬盘出现的一个稀缺问题
  20. C/C++编程:注入类名

热门文章

  1. Big Endian(大端)和 Little Endian(小端)模式
  2. AI数字人提供线上线下场景应用,世优BOTA构建车企虚拟人新体验
  3. 院校护理实验室污水处理设备
  4. win服务器文件权限问题,win服务器 文件夹权限设置
  5. 计算机主机结构三部分,计算机主机结构
  6. Ubuntu 10.04里安装强大抓图工具Shutter
  7. 在Optimus Mini 3上显示视频
  8. 魅蓝note5android版本怎么升级,魅蓝Note 5升级版将至?多达三款型号
  9. 7y30 linux,基于酷睿M3-7Y30:CHUWI 驰为 发布 CoreBook 二合一变形本
  10. IOC和DI入门案例