宋連珺,柏正堯
(云南大學 信息學院,昆明 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.