宋连珺,柏正尧
(云南大学 信息学院,昆明 650500)
在工作和实验当中,对大量信号的采集、处理和分析需要专业的应用软件来实现。LabVIEW的开发环境类似于C和BASIC,但是LabVIEW与其他计算机语言有明显的区别,其他计算机语言都是以一种文本性的语言来产生代码,而LabVIEW是一种G语言,是以框图的形式产生程序。LabVIEW的优点是能够进行自动化分析和处理所采集的信号,但其分析信号的能力还存在着一些局限和缺陷。
Matlab是一种功能强大的计算语言,它将计算、可视化和编程等功能集于一个易于使用的环境,得到了广泛的应用。Matlab分析计算能力很强,数据库也十分强大,但与外部设备交换信息能力却很差[1]。所以,有很多人将LabVIEW和Matlab混合编程,取长补短,让各自的优点能发挥到最大,以设计出功能比较完善的信号处理系统[2]。例如,使用二者来进行小波去噪、滤波等,解决了单用一个带来的问题,降低了程序的复杂程度,并能得到很好的实验效果。本文将二者结合来实现波形的显示,首先在Matlab中运行程序,然后把程序导入Lab-VIEW中的Matlab script节点来实现二者的结合,把问题简单化,同时仿真的结果验证了设计的可行性。
本文先单独使用Matlab来进行波形的显示,得到的结果不是很好。然后改进了方法,让Matlab和LabVIEW混合编程实现理想的结果。所以在第二节里阐述了Matlab在LabVIEW 中调用的实现方法和实现原理。最后在第三节里阐述了LabVIEW中的Matlab Script来实现波形显示的仿真过程,并得到仿真结果。
首先我们用Matlab来进行仿真实验,使用NI FlexRIO设备设计实现了基于PXI架构的高速数据采集,并把采集的数据以十六进制形式保存在TXT文档里,但是TXT格式不能显示十六进制数据,用记事本打开都是乱码,用UltraEdit可以看到数据,但用UltraEdit打开的数据并不能直接导入LabVIEW、Matlab程序中,因为采集的数据都很大,也不能用直接复制的方法。考虑用Matlab中的fopen,fscanf函数,但因为TXT中数据如乱码一样并不能实现转换,所以我们用fi函数和hex函数把它转换为十六进制,再把转换的文件读入程序。因为采集的数据很大,不能都显示出来,所以显示其中的一小部分。本文采样点数选择为1024点。
实验结果如图1所示,我们可以看到波形的生成,虽然有些误差但不影响整体波形。采集中会有噪声,所以误差也不能避免。
图1 Matlab波形显示Fig.1 Matlab waveform display
LabVIEW中可通过Matlab script节点调用Matlab的脚本程序。调用Matlab scrip节点过程为在程序框图界面单击右键出现函数选板,然后点击数学,在数学的选板里找到脚本与公式,在脚本与公式里找到脚本节点就可以看到Matlab script节点。最后把节点拖曳出来,放在程序框图面板中合适的位置,用工具选版按需要调节大小。
本文采集信号使用的是时间交替采样[3],采集的信号进行信号分析处理,数据采集的工作主要是由LabVIEW完成,用户图形界面的设计也是由其完成,设计的界面清晰明了;后台进行的大型计算、数据分析、细节处理是由Matlab完成,然后把结果提供给LabVIEW调用,其工作过程如图2所示[4]。
图2 原理框图Fig.2 Principle diagram
在进行一些大的算法编程时,经常会遇到大量数据存储的格式各不相同的情况,例如DSP和FPGA中用到的是十六进制,而Matlab中运算得到的是十进制,但是执行要用各自允许的格式在不同的软件中,有时转换起来非常麻烦。但单用hex函数也不能解决问题。所以我们加入fi函数来实现转换。fi是默认构造函数和返回一个有符号没有值的定点对象,16位字长,15位小数长度[5]。
A=fread(fid,1024,'integer*4',0,'b');
B=fi(A,1,32,0);表示返回一个定点对象值 A,为正数,字长为32 bit,小数部分长度为0。
本文采样点数设置为1024,这样可以使结果比较清晰一些。因为采集的天文数据十分庞大,也只能选择其中的一部分,而且采样点数过多会使波形紧密,看不清楚整体波形。算法实现步骤可分为4步:
步骤1用fopen打开文件,再用fread把文件读入,读入后关闭文件;
步骤2用fi函数和hex函数实现十六进制的转换, 程序如下:A=fread(fid,1024,'integer*4',0,'b');B=fi(A,1,32,0);C=upper(hex(B));并把转换的数据写入另一个TXT,文件命名为test.2;
步骤3打开转换好的文件test.2,用reshape函数重新调整矩阵的行数、列数、维数。把调整好的数据保存在newdata.txt文件中。
步骤4用fscanf函数一个个读入数据,并用plot函数画出波形。
在操作中我们发现不用Matlab script节点直接显示波形图只能用波形图表,不能用波形图。但是波形图表逐点地接收数据,并逐点地显示在前面板窗口中[6],所以读入数据是一个个的读,并且只能观察部分波形的变化。虽然可以直接观察,但不能完整地观察波形。波形图可一次接收规定的采样点数,并显示完整的波形。所以使用波形图就需要Matlab script节点来转换采集信号的数据格式。
首先我们把运行正确的Matlab程序导入节点,根据自己所编Matlab程序中输入输出的要求在脚本节点外框上点击右键选择添加输入变量和输出变量,同时数据类型也需要修改,使二者匹配,不匹配会出现错误。处理过程中许多需要设定的参数都可以在前面板以按钮方式设置,可任意改变数据,就像实际仪器一样,也可做一些验证试验,操作方法简单,还可根据需要增加功能,数据可靠性很高。在输出变量连接波形图时,整个界面清晰明了,比单用LabVIEW编程或Matlab编程简单,如图3所示[7]。
图3 程序框图Fig.3 Program chart
在前面板点击运行就可以得到波形,结果如图4所示,与图1相比可以清晰地看出波形,我们可以根据波形图推算它的周期。如果要改变采样点数,应该在Matlab里修改采样点数运行正确后再导入节点,直接在节点里修改是无效的,最后运行的还是原来的采样点数。
图4 采样点数为1024时的波形Fig.4 Waveform diagram of the sampling points to 1024
从图中可以看出在转换过程中出现了一些误差,但能够看出整体波形,波形比单用Matlab显示的更清晰、方便。
本文将LabVIEW和Matlab相结合,用于采集数据的快速显示。从仿真结果可知,采用这个方法可以使仿真过程更加简洁,可以直接应用于复杂的工程问题,不需要繁琐的转换,解决了LabVIEW和Matlab单独使用的局限性。LabVIEW与Matlab混合编程的方法,能充分利用Matlab功能强大的算法库,取长补短,实现快速开发,两者结合能够给实际应用带来方便。
[1]刘保柱,苏彦华.Matlab7.0从入门到精通[M].北京:人民邮电出版社,2010.
[2]赵玲,苏维均.一种LabVIEW调用Matlab的方法[J].北京工商大学学报:自然科学版,2009,27(2):73-75.
[3]黄宇.基于PXI架构的高速数据采集系统设计[J].自动化与仪表,2015,30(9):79-83.
[4]吴小红.LabVIEW中调用Matlab进行信号处理方法研究[J].微型机与应用,2014,33(10):66-68.
[5]曲丽荣,胡容,范寿康.LabVIEW、Matlab及其混合编程技术[M].北京:机械工业出版社,2011.
[6]丁筱玲.基于LabVIEW和单片机的室内环境监测预警系统的设计[D].山东:山东农业大学,2014.
[7]章佳荣,王璨,赵国宇.精通LabVIEW虚拟仪器程序设计与案例实现[M].北京:人民邮电出版社,2013.