基於MATLAB的即時資料採集與分析研究時間:2009-05-15 14:12:03 來源:電子測量技術 作者:
1、引言
資料擷取系統涉及多學科,所研究的對象是物理或生物等各種非電或電訊號。根據各種非電或電訊號的特徵,利用相應的歸一化技術,將其轉換為可真實反映事物特
征的電訊號後,經A/D轉換器轉換為電腦可識別的有限長位元字編碼,以此作為研究自然科學和實現工業即時控制的重要依據,實現對宏觀和微觀自然科學
的量化認識,典型的資料擷取系統組成1所示。
在採集過程中,將感應器擷取的參數通過A/D轉換送入記憶體,然後由CPU對其進行分析、運算和處理,如數字濾波、量綱變換、誤差修正、數字顯示等。在本文
中,嘗試通過利用MATLAB的資料擷取工具箱對自主設計的資料擷取系統[1]進行類比模擬,結果實現了對設計系統的類比操作檢驗與資料分析。為了滿足實
時採集的要求,採用了Compilier編譯器[2],Compilier以M語言編製的程式為輸入,可以根據需要產生獨立啟動並執行應用程式或可以被
C/C++程式調用的動態連結程式庫檔案[3]。它支援MATLAB所有的內建函式,可使程式變得簡潔高效。
Figure 1 典型資料擷取系統的組成
2、資料擷取工具箱介紹
在MATLAB資料擷取工具箱裡整合了資料擷取的M檔案格式的函數和MEX檔案格式的動態連結程式庫。其主要特徵[4][5]如下:
(1) 提供了將即時測量資料從資料擷取硬體採集到MATLAB中的架構。
(2) 支援類比量輸入(AI)、類比量輸出(AO)以及數字量I/O子系統,包括類比量I/O即時變換。
(3) 支援PC音效卡和業界非常流行的資料擷取裝置如NI卡、並行口(LPT1-LPT3)、Keithley卡等。
(4) 採用事件驅動模式進行資料擷取。資料擷取工具箱由三部分組成:M檔案格式的函數、資料擷取引擎和硬體驅動,2所示。這些組成部分使得MATLAB與資料擷取硬體之間的資訊傳遞成為可能。
Figure 2 資料擷取引擎與硬體驅動
3、資料擷取過程
3.1 資料擷取的基本步驟
(1)建立裝置的一個對象。對象建立函數列表如下:
Table 1 對象建立函數列表
(2)添加通道或資料線。類比量I/O對象中用應添加通道,而數字量I/O對象中應添加資料線,與添加通道或資料線有關的函數列表如下:
Table 2 與添加通道或資料線有關的函數列表
(3)配置屬性。屬性分為公用屬性和通道/資料線屬性,而兩者又再被分為基本屬性與裝置特有屬性。其中公用屬性為返回裝置對象的所有可配置的公用屬性
名及其可能的屬性值,應將對象作為Set函數的輸入參數;要返回裝置對象的所有公用屬性及其當前值或為顯示某個屬性的當前值,應將對象或屬性名稱作為Get
函數的輸入參數。對於通道/資料線屬性,則使用Channel(Line)屬性。
(4)擷取或輸出資料。包括啟動裝置對象,記錄或發送資料及停
止裝置對象三個步驟。其中啟動裝置執行Start函數、提取記錄資料使用Getdata函數、發送資料前的資料排列使用Putdata函數、停止使用用
Stop函數;另外運行狀態用Running屬性標識、選項組由Logging屬性標識、發送狀態由Sending屬性標識,其取值均為On或Off。
對於數字量I/O對象,該部分處理有所不同。
(5)清除。當不再需要裝置對象時,應使用刪除函數Delete將裝置對象從記憶體中清除,並使用清除命令Clear將對象從MATLAB工作空間中清除。
3.2 應用執行個體與分析
3.2.1 MATLAB對RS232 的串口通訊設計
MATLAB是一個跨平台軟體,而此處使用的是自主設計的資料擷取卡,因此不具備直接存取的能力。但MATLAB的物件導向技術,已用一個對象把電腦串
口封裝起來,只要用Serial函數建立串口對象即可[6]。關鍵語句為:s=serial(‘COM1’,‘BaudRate’,9600)。
MATLAB封裝的串口對象支援對串口的非同步讀寫操作,通過對非同步讀寫設定,PC在執行讀寫串口函數時能立即返回,不必等待串口把資料串輸完畢。當指定數
據傳輸結束時就觸發事件,執行事件回呼函數,對事件回呼函數編程,進行資料處理,這樣可以大大提高資料處理的效率。
MEX是MATLAB的可執行程式,是MATLAB調用其它語言編寫的程式或演算法的介面,在Windows環境下是副檔名為DLL的動態連結程式庫。對MEX
編譯器進行配置的方法是:在MATLAB命令視窗中運行mex-setup,選擇VC6.0++作為編譯器。用C語言編寫連接埠讀、寫的操作程式,程式包含
有標頭檔mex.h和mexFunction函數,mexFunction函數中nelhs表示輸出變數的個數,plhs包含指向輸出變數指標的數
組,nrhs表示輸入變數的個數,prhs包含指向輸入變數指標的數組。介面編形成的MEX檔案與參考文獻[7][8]類似,在此不再累述。
3.2.2 資料擷取與分析
(1)資料讀取的MATLAB實現
主要代碼為:
%讀取通道數及總資料量
fid=fopen(‘cardiogram.add’,‘r’);
Status=fseek(fid,56,‘bof’);
nDataChNum=fread(fid,1,‘long’);
status=fseek(fid,204, ‘bof’);
nAllDataLength=fread(fid,1, ‘long’);
%按通道數迴圈讀出各通道起始地址
status=fseek(fid,76, ‘bof’);%
for i=1: nDataChNum
pChannelAdr(i)=fread(fid,1, ‘long’)
end
%按通道數迴圈讀出各通道資料
for i=1:nDataChNum
status=fseek(fid,pChannelAdr(i)+360, ‘bof’)
nSegNum=fread(fid,1, ‘log’)
status=fseek(fid,pChannelAdr(i)+160*nSegNum+1024, ‘bof’);
data=fread(fid,nAllDataLength, ‘short’);
end
sta=fclose(fid);
(2)資料處理與圖形繪製
利用MATLAB的圖形使用者介面,通過編程可以很方便地構建資料擷取與分析的使用者互動介面。將資料擷取系統採集的實際心電圖訊號,用RS232匯入到PC
中。在MATLAB環境下,運行以上已經編好的程式,即可得到如下的類比實驗結果。不過要說明的是,此處使用的資料擷取系統是八通道同步採集,而模擬時僅
使用的是其中一個通道進行的操作。
figure 3 實際心電圖訊號的採集與處理
4、結語
使用自主開發的資料擷取系統,通過合理運用串口及MTLAB強大的數值計算和分析功能,實現了基於MATLAB的即時資料處理和分析。通過類比實驗表明,該方法對於其它類似採集卡依然實用,具有一定的應用價值和發展前景。