本发明涉及一种基于MFC类库和屏幕分辨率的波形绘制和采集方法。
背景技术:
在航空和国防领域中,电子技术的发展对信号波形得要求越来越复杂,同时又不能降低信号的分辨率,这对测试用的信号源提出了新的挑战。要求信号源不仅具备复杂波形的输出能力,还对输出频率、波形质量、输出通道数目以及输出信号之间的同步能力等功能指标提出了更高的要求。
任意波形绘制及信号产生是任意波发生装置最重要的功能,该功能注重于以灵活的方式产生任意复杂信号,并通过任意波发生装置实现“逐点输出”。以显示屏幕为载体构建直角坐标系,左下角为坐标原点,向右为x正方向,对应时间信息,向上为y正方向,对应幅度信息。
采用MFC设计波形绘制软件的基本方法是通过跟踪鼠标响应消息(如鼠标按下WM_LBUTTONDOWN、鼠标抬起WM_LBUTTONUP、鼠标移动WM_MOUSEMOVE)来触发操作。当鼠标按下时表示绘制开始,在鼠标移动过程中会按一定时间间隔触发WM_MOUSEMOVE消息,每触发一次WM_MOUSEMOVE消息,系统可以获取一次当前鼠标的位置(以像素为单位)并存入数组pBuf,鼠标抬起表示绘制操作结束,将pBuf中的数据取出后转化为直角坐标系中的对应的坐标点,逐点连接后显示鼠标轨迹曲线。图1所示绘制的正弦波,坐标系x方向长度为21个像素,x方向相邻像素点的间隔可以等效为时域上的一个时间间隔。y方向由像素位置转化为对应的幅度坐标,范围为0~3V。为了能够实时显示鼠标运动轨迹,需设置一个定时器消息WM_TIMER,设定定时间隔,在执行波形绘制操作时,时间每过,执行一次波形重绘操作。
现有鼠标跟踪法下,如若鼠标向左移动,如图2所示缺点1示意图的虚线部分,由于先前位置存储数组pBuf中的位置数据没有做相应的处理,导致一个x对应两个或多个y值,造成“曲线重复”,这种波形是无法输出的。
在波形绘制鼠标移动过程中,MFC以一定的时间间隔触发WM_MOUSEMOVE消息,记为Δt。若鼠标绘制过程中某段移动速度非常快,如图1所示,A->B用时Δt,B->C用时Δt,pBuf中的波形数据将会失去部分时域上的信息。该波形数据通过任意波形发生装置输出的后如图2中缺点2所示,导致正弦波信号部分失真。
当鼠标向x负方向移动时,会产生类似半封闭的曲线,造成在同一时间点上对应多个不同的幅度信息,这里把这种现象称为“曲线重复”,这显然不是波形发生装置希望输出的信号。
技术实现要素:
本发明为了解决上述问题,提出了一种基于MFC类库和屏幕分辨率的波形绘制和采集方法,本方法解决了常用的鼠标跟踪法存在的同一时间点,可能存在多个不同幅度的缺点,通过定时对存储的坐标数据进行处理,实现时间和幅度的一一对应。同时通过插值的方法,以达到采集数据准确反映波形数据时域信息的目的。
为了实现上述目的,本发明采用如下技术方案:
一种基于MFC类库和屏幕分辨率的波形绘制和采集方法,包括以下步骤:
(1)在波形绘制窗口建立直角坐标系,确定像素坐标和直角坐标之间的转换关系,给坐标数据存储数组分配内存空间;
(2)设定数据修正和波形重绘操作的时间间隔;
(3)记录鼠标点击并移动过程中的鼠标点击时的坐标,并存储到坐标数据存储数组内;
(4)执行绘制操作过程中,按照设定的时间间隔,依次进行坐标数据存储数组的数据进修正和波形重绘操作,直到检测到鼠标释放信息;
(5)对坐标数据存储数组的坐标数据进行插值拟合,输出绘制信号。
所述步骤(2)中,设置不同的存储单元分别记录鼠标的左键点击、释放和移动信息。
所述步骤(2)中,数据修正的时间间隔小于波形重绘的时间间隔。
所述步骤(4)中,如果坐标数据存储数组的存在多个在时间上存在先后顺序的点,用最新的数据替换最先数据,依次进行填补舍弃。
所述步骤(4)中,波形重绘操作包括背景刷新和坐标连线。
所述步骤(5)中,利用三次样条插值运算进行拟合。
所述步骤(5)中,具体包括:
(5-1)取出坐标数据存储数组中的坐标数据,横坐标赋值给一维数组X,纵坐标赋值给一维数组Y;
(5-2)初始化插值后的新的横坐标一维数组X’;
(5-3)利用三次样条插值运算进行拟合,以新的曲线横坐标值和纵坐标值替换坐标数据存储数组中的数据。
本发明的有益效果为:
(1)本发明不仅解决了“曲线重复”问题,还通过对坐标数据的插值运算解决了时域信息丢失的问题;
(2)本发明采用定时数据修正法,每隔一定时间间隔就对坐标数据存储数组中的数据进行一次修正,达到一个x只对应一个y的目的,确保每个横坐标仅对应一个纵坐标,采用定时数据刷新设计,实现绘制曲线实时显示;
(3)采用插值的方法来弥补缺失的数据,最终实现在波形x方向范围内,每一个x方向的像素点,都有一个y方向的幅度数值与之相对,克服波形曲线时域信息丢失的缺点。
附图说明
图1为本发明的MFC鼠标跟踪法绘制正弦波曲线;
图2为本发明的已有方法缺点示意图;
图3为本发明的无修正和定时修正后的轨迹对比图;
图4为本发明的采用插值法拟合的波形曲线图;
图5为本发明的流程示意图。
具体实施方式:
下面结合附图与实施例对本发明作进一步说明。
采用定时修正法和插值法,克服已有方法存在的曲线重复和波形失真缺点。把整个方法可分为两个部分:波形绘制、采集及波形数据修正和波形数据插值拟合。具体实现流程如下:
第一部分:波形绘制和采集
(1)设计波形绘制窗口,建立直角坐标系,确定像素坐标和直角坐标之间的转换关系,给坐标数据存储数组pBuf分配一定的内存空间后初始化;
(2)添加三个鼠标响应消息WM_LBUTTONDOWN、WM_LBUTTONUP、WM_MOUSEMOVE和一个定时器消息WM_TIMER,并设定定时间隔Δt1和Δt2,分别用于数据修正和波形重绘操作,且满足Δt1<Δt2;
(3)鼠标按下并移动过程中,每响应一次MOUSEMOVE消息记录一次当前鼠标的坐标,并将坐标数据存入pBuf;
(4)在执行绘制操作的过程中,时间每过Δt1执行一次数据修正,若pBuf数组中存在多个在时间上存在先后顺序的点,如满足则先舍弃共k-1个坐标值,然后将移动到在pBuf中的位置,pBuf中的其它坐标点依次向左推移填补舍弃后的所有空白位置,如图3所示;
(5)时间每过Δt2执行一次波形重绘操作,包括背景刷新和坐标连线;
(6)鼠标抬起时表示绘制操作结束;
第二部分:波形数据插值拟合
(7)绘制操作结束后对pBuf中的坐标数据进行插值拟合,解决时域上的波形失真问题。本发明通过调用Matlab接口函数实现插值运算,Matlab具有强大的数值运算能力,其提供的一维插值函数也有多种,这里选用精度最高、曲线最平滑的三次样条插值运算。
以图1绘制的正弦波曲线为例,具体实现步骤如下:
Step1:取出pBuf中的坐标数据,横坐标赋值给一维数组X=[x1,x2…,xn],纵坐标赋值给一维数组Y=[y1,y2…,yn];
Step2:初始化插值后的新的横坐标一维数组X’=[x1,x1+1,x1+2,…,xn-1,xn];
Step3:调用Matlab接口函数做插值运算Y’=interp1(X,Y,X’,'spline');
Step4:X’为曲线横坐标值,Y’为曲线纵坐标值替换pBuf中的数据。
(8)将pBuf中的数据存入文件,通过任意波形发生装置输出绘制的信号。
上述虽然结合附图对本发明的具体实施方式进行了描述,但并非对本发明保护范围的限制,所属领域技术人员应该明白,在本发明的技术方案的基础上,本领域技术人员不需要付出创造性劳动即可做出的各种修改或变形仍在本发明的保护范围以内。