基于Matlab的USB数据采集卡上位机处理系统
2011-06-05张聪慧郑正奇
张聪慧,郑正奇
(华东师范大学 信息科学与技术学院,上海200241)
以多通道测距雷达信号的处理为研究背景,要求对USB数据采集卡传输到上位机的数据进行数字信号处理,得到多路测距雷达差频信号的频率与电压幅度。为此以Matlab为平台,接收USB传输的数据,然后进行处理,并使用Matlab GUI设计用户操作界面,完成了一个完整的基于Matlab的USB数据采集卡上位机程序。
1 系统架构介绍
本上位机系统对应的USB数据采集卡与上位机的接口基于Cypress公司的CY7C68013A,它支持USB 2.0协议,且自带增强型8051单片机。利用Mex文件作为Matlab与C语言的程序接口,实现了Matlab对USB接口数据的读写操作,并利用Matlab进行进一步的数据处理和界面显示。系统框图如图1所示。
图1 系统框图Fig.1 System block diagram
2 Matlab读取USB数据
Matlab不能直接对USB数据进行操作,但可通过API与外部程序接口,即Mex文件,来调用C语言程序加以实现。
2.1 Mex文件及其编写环境
Mex文件是个动态链接子程序,它可在Matlab中被直接调用来控制多种硬件接口。Mex文件分为两部分:控制实现部分以及入口程序部分,它们分别负责程序的功能实现和与Matlab的数据连接。
本设计中,Mex文件使用VC2008进行编写,新建工程类型为MFC DLL,Cypress公司提供适用于CY7C68013A的API函数库,可以通过将CyAPI.h和CyAPI.lib添加到VC工程中直接加以调用,从而实现各种USB接口操作[1-2]。
2.2 Mex控制实现部分
程序中,Mex控制实现部分的具体功能依次为:调用USB驱动模块,打开USB设备,读取USB数据,将读取的数据写到缓冲区中。它由入口程序调用,部分程序代码[3]如下:
2.3 Mex入口程序
Mex入口程序是Matlab与Mex控制实现部分的接口,其参数prhs、nrhs、plhs、nlhs分别为输入参数数列、输入参数的个数、输出参数数列以及输出参数的个数。
本段代码只负责接收USB数据,所以Mex接口程序中没有输入参数,输入参数数列为空,程序将读取的USB数据直接通过plhs指针传输给主程序,实现与主程序的数据传递功能。相关程序代码如下:
2.4 Mex文件的调用
在Mex文件编写完之后,通过VC生成.DLL文件,将此文件复制到Matlab的当前目录(current path)下,在Matlab的命令窗口或者.M文件中输入.DLL文件的文件名即可实现Matlab对其的调用,从而实现了Matlab对USB数据的读写操作。
3 数据处理和GUI操作界面
在通过Mex文件完成了对USB数据的读取和存储后,在Matlab环境中利用数字信号处理函数对数据进行滤波、FFT等处理,从而实时地处理6个通道的数据,并将各自的频率、电压幅度等值显示在GUI界面上。
3.1 Matlab数字信号处理部分
使用Matlab进行数字信号处理的步骤如下[4-6]:
1)在.M文件调用Mex文件生成的.DLL得到USB接口传输到上位机的数据,并将每个通道的数据分别放入各自数组中。
2)因为雷达差频信号经采集卡的信号调理电路后,原本的交流信号叠加在1 V的直流电平之上,因此在进行FFT之前需要通过数字信号处理去掉直流分量,以保证直流分量不会对频率和幅度测量结果产生影响。利用detrend函数去掉信号中叠加的直流成分。
3)因为该雷达差频信号夹杂有低频干扰信号,所以在FFT之前需要进行高通滤波。
本程序利用[B,A]=ellip(N,Rp,Rs,wn,‘high’)函数设计数字椭圆高通滤波器,再利用filter函数对各通道数据进行滤波。其中,椭圆滤波器参数N,Rp,Rs,wn在本程序中设有默认值,用户也可以在GUI界面中根据需要对任意参数的值进行修改。
4)利用FFT函数对滤波后的数据进行快速傅里叶变换。因为FFT程序中所用数据点数与原含有信号数据点数相同时,频谱图具有较高的质量,可以减少因补零或截断而产生的影响,本程序中每个通道数据缓存区数组大小为1 024,所以对每个通道进行1 024点FFT,通过进一步地运算,便可得到信号的瞬时频率和电压幅度。
3.2 GUI操作界面
MATLAB GUI是一种新型的图形用户界面开发方式,用户可以通过GUI界面与Matlab程序进行交互。本程序的GUI操作界面如图2所示,该界面应用的控件包括控制按钮、参数设置编辑框和结果显示文本框[7]。
图2 GUI操作界面Fig.2 GUI operating interface
4 结 论
Matlab拥有强大的数据处理和分析功能,但不能直接对USB接口数据进行实时读写操作。文中将Mex文件作为Matlab与C语言程序的软件接口,使Matlab能够调用VC函数来接收USB数据采集卡传递的数据,然后进一步对采集到的多通道数据分别进行数字信号处理,得到每个通道的信号频率和电压幅度,并显示在Matlab GUI界面上,从而实现了基于Matlab的USB数据接收与处理软件系统。
[1]石波,陈淑珍,沈海鸥.VC与Matlab接口方法的剖析[J].计算机工程,2000,26(3):98-100.SHI Bo, CHEN Shu-zhen,SHEN Hai-ou.The analyze of interface method between Matlab and visual C++[J].Computer Engineering, 2000, 26(3):98-100.
[2]许大好,李询,谢倩.用Matlab控制NI数据采集卡实现实时数据采集[J].常州工学院学报,2006,19(5):35-38.XU Da-hao, LI Xun, XIE Qian.Data acquisition system based on NI card and Matlab environment[J].Journal of Changzhou Institute of Technology, 2006, 19(5):35-38.
[3]王世香.精通MATLAB接口与编程[M].1版.北京:电子工业出版社,2007.
[4]胡广书.数字信号处理理论算法与实现[M].2版.北京:清华大学出版社,2003.
[5]万永革.数字信号处理的 MATLAB实现[M].北京:科学出版社,2007.
[6]方勇.数字信号处理——原理与实践[M].北京:清华大学出版社,2005.
[7]苏金明.MATLAB7.0实用指南[M].北京:电子工业出版社,2006.