<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 電源與新能源 > 設(shè)計(jì)應(yīng)用 > 基于VC++的動(dòng)態(tài)信號(hào)分析系統(tǒng)的設(shè)計(jì)方案

          基于VC++的動(dòng)態(tài)信號(hào)分析系統(tǒng)的設(shè)計(jì)方案

          作者: 時(shí)間:2016-12-09 來源:網(wǎng)絡(luò) 收藏

          隨著科技水平的不斷提高,機(jī)械工程振動(dòng)測(cè)試技術(shù)也隨之進(jìn)入了一個(gè)嶄新的階段。動(dòng)態(tài)信號(hào)分析作為一門以捕捉和處理各種動(dòng)態(tài)信息為目的的綜合技術(shù)在當(dāng)代科學(xué)技術(shù)中占有相當(dāng)重要的地位。近年來,多通道、高性能動(dòng)態(tài)信號(hào)分析系統(tǒng)推出并已廣泛應(yīng)用于各個(gè)領(lǐng)域。并且隨著使用者對(duì)動(dòng)態(tài)信號(hào)的分析需求越來越多樣化,使得柔性化設(shè)計(jì)成為動(dòng)態(tài)信號(hào)分析系統(tǒng)研制的主流方向。國(guó)外的動(dòng)態(tài)信號(hào)儀器采樣精度高、功能強(qiáng)大,但產(chǎn)品的價(jià)格相對(duì)很高。而目前國(guó)內(nèi)的測(cè)試分析系統(tǒng)與國(guó)外的相比,還有一定的差距。因此,研制擁有自主知識(shí)產(chǎn)權(quán)的實(shí)時(shí)的動(dòng)態(tài)信號(hào)分析系統(tǒng)有著非?,F(xiàn)實(shí)的科學(xué)意義和工程實(shí)用價(jià)值。

          基于此,本文以Windows XP系統(tǒng)為開發(fā)平臺(tái),采用面向?qū)ο蟮木幊碳夹g(shù)和VC++為開發(fā)工具,研制一套基于VC++的動(dòng)態(tài)信號(hào)分析系統(tǒng)。軟件開發(fā)采用模塊化的設(shè)計(jì)細(xì)想,把各種功能對(duì)象化并進(jìn)行封裝,提高了各模塊的可移植性和重復(fù)使用性。系統(tǒng)可實(shí)現(xiàn)對(duì)單個(gè)和多個(gè)信號(hào)的實(shí)時(shí)同步采集,并能對(duì)信號(hào)進(jìn)行分析處理,還能實(shí)現(xiàn)數(shù)據(jù)分段存儲(chǔ)和波形回放查看。

          1 系統(tǒng)總體設(shè)計(jì)

          系統(tǒng)總體設(shè)計(jì)的好壞直接關(guān)系到整個(gè)測(cè)試分析任務(wù)的成敗以及完成質(zhì)量的好壞。從硬件上看,系統(tǒng)總體上由計(jì)算機(jī)、USB 接口、數(shù)據(jù)采集硬件、傳感器等組成。

          從軟件上看,該系統(tǒng)包括固件程序、驅(qū)動(dòng)程序及應(yīng)用軟件。

          固件程序是采集卡商家以寫好燒進(jìn)采集卡硬件的程序,負(fù)責(zé)采集卡的采集工作。

          驅(qū)動(dòng)程序和應(yīng)用軟件則裝在計(jì)算機(jī)中,驅(qū)動(dòng)程序是遵循USB協(xié)議編寫的負(fù)責(zé)應(yīng)用軟件與采集卡正常通信的程序。

          應(yīng)用軟件是人機(jī)交互接口,是實(shí)現(xiàn)信號(hào)分析處理各項(xiàng)功能的關(guān)鍵部分。

          軟件系統(tǒng)設(shè)計(jì)與開發(fā)是本項(xiàng)目開發(fā)的重點(diǎn)和難點(diǎn)。利用VC++為開發(fā)平臺(tái),進(jìn)行系統(tǒng)軟件設(shè)計(jì)。本項(xiàng)目的軟件系統(tǒng)設(shè)計(jì)主要包括:軟件系統(tǒng)總體框架設(shè)計(jì)、數(shù)據(jù)采集模塊設(shè)計(jì)、信號(hào)分析與處理模塊設(shè)計(jì)、數(shù)據(jù)存儲(chǔ)模塊設(shè)計(jì)等。

          動(dòng)態(tài)信號(hào)分析系統(tǒng)總體設(shè)計(jì)框圖如圖1所示。

          2 系統(tǒng)統(tǒng)一架構(gòu)

          軟件設(shè)計(jì)以Windows XP 系統(tǒng)為開發(fā)平臺(tái),采用面向?qū)ο蟮木幊碳夹g(shù)和VC++ 6.0為開發(fā)工具實(shí)現(xiàn)。軟件開發(fā)采用模塊化的設(shè)計(jì)細(xì)想,把各種功能對(duì)象化并進(jìn)行封裝,提高了各模塊的可移植性和重復(fù)使用性。采用統(tǒng)一的軟件體系和總體模塊組成結(jié)構(gòu),即每個(gè)模塊都包含程序控制、參數(shù)設(shè)置、數(shù)據(jù)分析和數(shù)據(jù)顯示四個(gè)子模塊。

          其中參數(shù)設(shè)置模塊、數(shù)據(jù)分析模塊和數(shù)據(jù)顯示模塊為功能模塊,程序控制模塊是系統(tǒng)的中樞部分,它負(fù)責(zé)協(xié)調(diào)各個(gè)模塊有效的配合和工作,接受操作者給出的各種指令,調(diào)用相應(yīng)的分析模塊算法,并把分析結(jié)果通過數(shù)據(jù)可視化接口顯示給用戶。子模塊的菜單、工具條及快捷鍵是程序控制模塊的外在表現(xiàn),并通過這些外在的表現(xiàn)與操作者交互,轉(zhuǎn)化為各個(gè)功能模塊能夠理解的內(nèi)部指令,統(tǒng)一調(diào)用功能模塊,實(shí)現(xiàn)用戶預(yù)期的指令目標(biāo)。

          數(shù)據(jù)分析模塊采用動(dòng)態(tài)鏈接庫(kù)技術(shù),集成和封裝了系統(tǒng)所需的算法,并提供接口供程序控制模塊調(diào)用,是每個(gè)子模塊的核心部分。

          數(shù)據(jù)顯示模塊負(fù)責(zé)將數(shù)據(jù)處理的結(jié)果以豐富的方式呈現(xiàn)給用戶,供用戶對(duì)處理結(jié)果進(jìn)行評(píng)判或進(jìn)一步的處理。

          四個(gè)子模塊的組成關(guān)系如圖2所示。

          3 系統(tǒng)的軟件設(shè)計(jì)

          軟件系統(tǒng)設(shè)計(jì)與開發(fā)是整個(gè)分析系統(tǒng)開發(fā)的重點(diǎn)和難點(diǎn)。采用VC++為開發(fā)平臺(tái),進(jìn)行系統(tǒng)軟件設(shè)計(jì)。

          軟件系統(tǒng)設(shè)計(jì)主要包括:軟件系統(tǒng)總體架構(gòu)設(shè)計(jì)、數(shù)據(jù)采集模塊設(shè)計(jì)、信號(hào)分析與處理模塊設(shè)計(jì)、數(shù)據(jù)存儲(chǔ)模塊設(shè)計(jì)等。

          軟件系統(tǒng)總體架構(gòu)設(shè)計(jì)見第2部分,不再贅述。數(shù)據(jù)采集模塊、數(shù)據(jù)分析與處理模塊和數(shù)據(jù)存儲(chǔ)模塊。三個(gè)模塊之間,相互聯(lián)系,其功能分別如下:

          數(shù)據(jù)采集模塊:采集卡參數(shù)設(shè)置、采集設(shè)備的啟??刂坪蛷?fù)位,實(shí)現(xiàn)數(shù)據(jù)采集功能(連續(xù)采集或單次采集);數(shù)據(jù)分析和處理模塊:通過從數(shù)據(jù)采集模塊或存儲(chǔ)模塊的獲得數(shù)據(jù),結(jié)合分析參數(shù)的設(shè)置,實(shí)現(xiàn)信號(hào)實(shí)時(shí)波形顯示、頻譜分析、相關(guān)分析、包絡(luò)譜分析、統(tǒng)計(jì)特征分析等;數(shù)據(jù)存儲(chǔ)模塊:實(shí)現(xiàn)數(shù)據(jù)的存儲(chǔ)和讀取,并回放顯示、分析處理的功能。

          3.1 系統(tǒng)界面設(shè)計(jì)

          程序設(shè)計(jì)中,選用單文檔結(jié)構(gòu)來編制應(yīng)用程序。

          基本布局設(shè)計(jì)如下:窗口頂部為菜單工具條區(qū)域,左下部分為數(shù)據(jù)顯示區(qū)域,右下部為數(shù)據(jù)信息瀏覽和控制區(qū)域。系統(tǒng)主界面如圖3所示。

          首先將客戶區(qū)分割為1行2列兩個(gè)部分:左側(cè)為電壓值數(shù)字顯示窗口,關(guān)聯(lián)的類為CADDigitView(派生自CScrollView);右側(cè)為圖形顯示窗口,關(guān)聯(lián)的類為CAD-WaveView(派生自CScrollView)。參數(shù)設(shè)置及分析控制采用2個(gè)對(duì)話欄,派生自CDialogBar,用戶可以通過其進(jìn)行采集卡參數(shù)設(shè)置和信號(hào)采集、分析控制。由于程序功能較為簡(jiǎn)單,故在界面上幾乎就可以進(jìn)行全部的操作,使用上極其方便。

          3.2 主要處理算法

          3.2.1 FFT

          頻譜分析是數(shù)字信號(hào)處理技術(shù)的一個(gè)非常重要的手段,以便能清楚的看到某波形的頻譜分布情況.而要對(duì)一個(gè)輸入信號(hào)源作頻譜分析,將其由時(shí)域信號(hào)轉(zhuǎn)變?yōu)轭l域信號(hào),就必然要用到傅里葉分析。快速傅里葉變換(Fast Fourier Transform,FFT)的迅速發(fā)展,使數(shù)字頻譜分析取得了突破性的進(jìn)展。FFT的算法種類較多,而且選擇使用的方式也各不一樣,本文選用時(shí)間抽選奇偶分解快速離散傅里葉變換。

          基2型FFT算法的步驟如下:

          (1)將原始序列按下標(biāo)的奇、偶性質(zhì)不斷分解,一直由一個(gè)N 項(xiàng)序列分解為N 個(gè)單項(xiàng)重排序列;

          (2)計(jì)算N 個(gè)單項(xiàng)序列的DFT.此時(shí),N = 1,而0  n  N - 1,所以,n = k = 0,于是:

          即單項(xiàng)序列的DFT就是其自身,這樣就求得了N 個(gè)單項(xiàng)重排序列的DFT;

          (3)對(duì)N 個(gè)單項(xiàng)重排子序列的DFT兩兩合成,最終得到一個(gè)N 項(xiàng)序列的DFT,這就是原始序列的DFT.

          根據(jù)上面的指導(dǎo)思想,就可編制FFT計(jì)算程序。

          在進(jìn)行FFT時(shí),按照“蝴蝶圖”所描述的計(jì)算方法對(duì)輸入的時(shí)域序列按奇偶分解后的序列排序而輸出的頻域序列仍是按自然順序排列的。此方法無須中間存儲(chǔ)單元,但需要倒一次序.

          下面代碼用于完成對(duì)原始采樣時(shí)域序列的快速傅里葉變換,A,M 分別表示指向原始采樣數(shù)據(jù)數(shù)組的指針和序列長(zhǎng)度的2的整數(shù)次冪:

          1 kHz 矩形波頻譜圖,包括實(shí)譜、虛譜、幅值譜、相位譜如圖4所示。

          3.2.2 相關(guān)性分析

          在信號(hào)分析中,相關(guān)性是一個(gè)非常重要的概念,它表達(dá)了兩個(gè)信號(hào)(或一個(gè)信號(hào)不同時(shí)刻)之間的線性相關(guān)程度。

          相關(guān)函數(shù)及其離散化數(shù)據(jù)計(jì)算公式為:

          式中:N 為采樣點(diǎn)數(shù);Δt 為采樣間隔;n 為時(shí)間序列;r為時(shí)延序列(時(shí)間位移數(shù))。

          自相關(guān)分析算法:

          (1)標(biāo)準(zhǔn)方法

          根據(jù)式(3)直接計(jì)算采樣數(shù)據(jù)之間的平均乘積,然后以此作為自相關(guān)函數(shù)估計(jì)。本次即采用該方法設(shè)計(jì)算法;

          (2)間接方法

          該方法得到的不是通常的自相關(guān)函數(shù),是“循環(huán)”相關(guān)函數(shù)。該方法通過在原數(shù)據(jù)補(bǔ)0后經(jīng)FFT,計(jì)算其自功率譜后做IFFT,取前半部分而得到其自相關(guān)函數(shù)。

          互相關(guān)函數(shù)及其離散化數(shù)據(jù)計(jì)算公式為:

          互相關(guān)分析算法:

          (1)標(biāo)準(zhǔn)方法

          根據(jù)式(5)直接計(jì)算采樣數(shù)據(jù)之間的平均乘積,然后以此作為互相關(guān)函數(shù)估計(jì)。本次即采用該方法設(shè)計(jì)算法;

          (2)間接方法

          該方法同F(xiàn)FT,計(jì)算其互功率譜后做IFFT,取前半部分而得到其互相關(guān)函數(shù)。

          兩個(gè)不同頻率的正弦波信號(hào)的相關(guān)信號(hào)如圖5 所示,因?yàn)轭l率不同,所以不相關(guān),其波形接近值恒為零的直線。

          3.2.3 包絡(luò)線分析

          信號(hào)的包絡(luò)通常有3種提取方法:Hilbert幅值解調(diào)法、檢波-濾波法和高通絕對(duì)值解調(diào)法。

          Hilbert法解調(diào)出的包絡(luò)是對(duì)信號(hào)絕對(duì)值的包絡(luò),其解調(diào)幅值代表真實(shí)包絡(luò),且在ARM系統(tǒng)中,Hilbert變換可以方便地借助FFT來實(shí)現(xiàn),所以,本文采用Hilbert變換法提取信號(hào)的包絡(luò)。

          具體的步驟如下:

          (1)對(duì)x(t) 做FFT,得X(k),k = 0,1,2,-,N - 1,注意k = N 2,-,N - 1 對(duì)應(yīng)負(fù)頻率;

          (2)Z(k) 的取值:

          (3)對(duì)Z(k) 做逆FFT,即得到x(n) 的解析信號(hào)z(n) ;

          (4)| z(n)|即為 x(n)的包絡(luò)。

          通過以上分析編程實(shí)現(xiàn)了對(duì)信號(hào)的包絡(luò)解調(diào)。

          圖6 所示為一調(diào)制波波形,對(duì)其進(jìn)行包絡(luò)分析,結(jié)果如圖7所示。

          4 閃屏現(xiàn)象及其解決方案

          VC 中基于MFC 編寫的程序中,窗口的移動(dòng)縮放、鼠標(biāo)點(diǎn)擊等操作都會(huì)引起窗口重繪.本應(yīng)用程序中使用繪圖方式輸出采集數(shù)據(jù)、信號(hào)波形圖、頻譜圖等,繪制比較復(fù)雜,也比較消耗CPU時(shí)間,因此頻繁的重繪會(huì)引起畫面閃爍,影響信號(hào)動(dòng)態(tài)顯示分析效果,為此這里采用了雙緩存技術(shù),解決閃屏問題。

          雙緩存技術(shù)就是先在內(nèi)存中準(zhǔn)備一塊區(qū)域,把要顯示的位圖都加載到內(nèi)存中,然后調(diào)用BitBlt函數(shù),把內(nèi)存設(shè)備復(fù)制到顯示設(shè)備上,這個(gè)過程比較簡(jiǎn)單,就是將圖面的每個(gè)像素一次復(fù)制到輸出設(shè)備,不需消耗太多的時(shí)間,這樣就可以防止閃屏,改善顯示效果。

          雙緩沖繪圖主要代碼如下:

          5 系統(tǒng)測(cè)試分析

          為驗(yàn)證系統(tǒng)的正確性和可靠性,產(chǎn)生如下信號(hào):

          取分析長(zhǎng)度(時(shí)間塊)T = 10 s,從式中可以看出有4種頻率


          上一頁 1 2 下一頁

          關(guān)鍵詞: VC++動(dòng)態(tài)信

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();