周宏強(qiáng)
[摘 要]:本文采用虛擬儀器軟件NI Measurement Studio實(shí)現(xiàn)了典型的信號(hào)處理系統(tǒng)。該程序在VC++.NET環(huán)境中調(diào)試通過,通過引入Measurement Studio用戶界面控件和分析函數(shù)庫(kù),該設(shè)計(jì)可以將混有高斯白噪聲的正弦信號(hào)通過濾波提取出,并且分別計(jì)算得到其頻譜。該方法開發(fā)效率高,試驗(yàn)結(jié)果準(zhǔn)確可靠。
[關(guān)鍵詞]:Measurement StudioVisual C++ 頻譜 濾波
一、引言
本文實(shí)現(xiàn)了一個(gè)采用虛擬儀器軟件Measurement Studio的信號(hào)處理系統(tǒng)。Measurement Studio是美國(guó)國(guó)家儀器公司(National Instruments)針對(duì)測(cè)控工程、高級(jí)科學(xué)分析、數(shù)據(jù)采集(DAQ)等領(lǐng)域而開發(fā)的最優(yōu)化儀器控制助手。Measurement Studio集成到Visual Studio的開發(fā)環(huán)境中,提供包括各種類別和測(cè)試、測(cè)量與自動(dòng)化應(yīng)用的控件,極大地縮短了應(yīng)用開發(fā)時(shí)間。典型的信號(hào)處理系統(tǒng)包括信號(hào)的濾波,頻譜變換等。本文使用Visual C++與Measurement Studio設(shè)計(jì)實(shí)現(xiàn)了信號(hào)的濾波及頻譜變換。
二、構(gòu)建一個(gè)Measurement Studio應(yīng)用程序
以Visual Studio .NET 2003為例,介紹使用Visual C++開發(fā)Measurement Studio程序的方法。在安裝Measurement Studio成功后,打開菜單,選擇新建項(xiàng)目,在彈出的對(duì)話框中左側(cè)項(xiàng)目一欄中選擇“Measurement Studio Projects/Visual C++ Projects”,模板一欄中選擇“MFC Application”,填上項(xiàng)目名稱點(diǎn)擊確定按鈕。然后,會(huì)彈出Measurement Studio MFC Application向?qū)?。然?根據(jù)自己的開發(fā)需求進(jìn)行選擇,以確定應(yīng)用程序的特性。
在生成的對(duì)話框模板上放置四個(gè)CWGraph控件,一個(gè)CWSlide控件,兩個(gè)Button以及四個(gè)Static Text控件。其布局如圖1示:
三、信號(hào)濾波
在為“產(chǎn)生信號(hào)”按鈕添加響應(yīng)函數(shù),主要功能是產(chǎn)生正弦信號(hào)和高斯白噪聲,通過濾波得到原始的正弦信號(hào)。源代碼如下:
double NoiseAmp=0.5;//噪聲幅度
double SineAmp=1.0;/正弦信號(hào)幅度
double Cycles=5.0;//正弦信號(hào)周期
double phase=0.0;//正弦信號(hào)相位
CNiReal64Vector vNoise(1000);//噪聲數(shù)據(jù)
CNiReal64Vector vFNoise(1000);//濾波后噪聲數(shù)據(jù)
CNiReal64Vector vData(1000);//原始數(shù)據(jù)
CNiReal64Vector vFilter(1000);//濾波后數(shù)據(jù)
double fs=1000;/1000個(gè)采樣點(diǎn)
double FreqLowCut=24;//低通濾波器截止頻率24 Hz
double FreqHighCut=150;//高通濾波器截止頻率150 Hz
CNiMath::WhiteNoiseWave(vNoise, NoiseAmp, -1); //產(chǎn)生高斯白噪聲
//濾除噪聲信號(hào)的低頻部分
CNiMath::ButterworthHighPass(vNoise, vFNoise, fs, FreqHighCut);
//產(chǎn)生正弦波
CNiMath::SineWave(vData, phase, SineAmp, (Cycles/vData.GetSize()));
vData=vData+vFNoise; //噪聲加入到正弦波中
//將信號(hào)通過低通濾波器
CNiMath::ButterworthLowPass(vData, vFilter, fs, FreqLowCut);
m_Graph1.PlotY(vData); //在”有噪信號(hào)”圖表控件上繪制數(shù)據(jù)曲線
m_Graph3.PlotY(vFilter); //在”去噪信號(hào)”圖表控件上繪制數(shù)據(jù)曲線
四、計(jì)算信號(hào)頻譜
信號(hào)處理中往往需要計(jì)算信號(hào)的頻譜,可以通過Measurement Studio提供的庫(kù)函數(shù)直接計(jì)算信號(hào)的雙邊譜,下面的源代碼是以有噪信號(hào)為例計(jì)算信號(hào)的單邊譜:
CNiReal64Vector realData1,imagData1;//數(shù)據(jù)實(shí)部、虛部
realData1.SetSize(vData.GetSize());
imagData1.SetSize(vData.GetSize());
realData1=vData;
CNiMath::FFT(realData1,imagData1);//FFT變換
UINT numPts = vData.GetSize()/2;
double scalingFactor = 1.0/fs;
double deltaFreq = fs*scalingFactor;
CNiReal64Vector frequencyData1(numPts);
CNiReal64Vector zaosheng1(numPts);
for(unsigned long i = 0;i< numPts;i++)
{
double a=abs(realData1[i]);
double b=abs(imagData1[i]);
zaosheng1[i]=sqrt((a*a+b*b));
}
for(UINT i=1;i { frequencyData1[i]=zaosheng1[i]*scalingFactor*sqrt(2.0); } frequencyData1[0] = zaosheng1[0]*scalingFactor; m_Graph2.PlotY(frequencyData1,0.0,deltaFreq);//繪制第一幅圖的頻譜 五、結(jié)束語(yǔ) 通過使用Measurement Studio提供的用戶界面控件和分析函數(shù)庫(kù),在Visual C++環(huán)境中實(shí)現(xiàn)了典型的信號(hào)處理系統(tǒng),降低了開發(fā)此類程序的復(fù)雜性,縮短了程序開發(fā)周期。實(shí)踐證明,本方法具有準(zhǔn)確性高、可靠穩(wěn)定性好等特點(diǎn)。 參考文獻(xiàn): [1]陳后金.數(shù)字信號(hào)處理[M].北京:高等教育出版社,2005. [2]孫沉芳.基于MeasurementStudio的數(shù)字濾波器設(shè)計(jì)與實(shí)現(xiàn)[J].蘭州交通大學(xué)學(xué)報(bào),2006,(12):33-35. [3]岳瑋.基于MeasurementStudio的數(shù)據(jù)采集系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].北京機(jī)械工業(yè)學(xué)院學(xué)報(bào),2006,(9):1-3.