VC++編程實(shí)現(xiàn)對(duì)波形數(shù)據(jù)的頻譜分析教學(xué)教材_第1頁(yè)
VC++編程實(shí)現(xiàn)對(duì)波形數(shù)據(jù)的頻譜分析教學(xué)教材_第2頁(yè)
VC++編程實(shí)現(xiàn)對(duì)波形數(shù)據(jù)的頻譜分析教學(xué)教材_第3頁(yè)
VC++編程實(shí)現(xiàn)對(duì)波形數(shù)據(jù)的頻譜分析教學(xué)教材_第4頁(yè)
VC++編程實(shí)現(xiàn)對(duì)波形數(shù)據(jù)的頻譜分析教學(xué)教材_第5頁(yè)
已閱讀5頁(yè),還剩29頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Good is good, but better carries it.精益求精,善益求善。VC+編程實(shí)現(xiàn)對(duì)波形數(shù)據(jù)的頻譜分析-VC+編程實(shí)現(xiàn)對(duì)波形數(shù)據(jù)的頻譜分析-摘要:本文介紹了采用離散傅立葉變換(DFT)實(shí)現(xiàn)對(duì)采樣得到的波形數(shù)據(jù)文件進(jìn)行頻譜分析的一般方法,并且為了提高運(yùn)算效率、節(jié)省中間存儲(chǔ)單元,最終采用了時(shí)間抽選奇偶分解的庫(kù)利-圖基算法實(shí)現(xiàn)快速離散傅立葉變換,對(duì)采樣數(shù)據(jù)進(jìn)行了高效的頻譜分析,并用MicrosoftVisualC+6.0編寫實(shí)現(xiàn)。關(guān)鍵字:MicrosoftVisualC+6.0、離散傅立葉變換、快速傅立葉變換、采樣一、引言頻譜分析是電子工程上一個(gè)非常重要的手段,許多計(jì)算機(jī)輔助

2、電路分析(CAA)類軟件都具備這種分析能力,以便電子工程師能清楚的看到某波形的頻譜分布情況。而要對(duì)一個(gè)輸入信號(hào)源作頻譜分析,將其由時(shí)域信號(hào)轉(zhuǎn)變?yōu)轭l域信號(hào),就必然要用到傅立葉分析,而無(wú)論是在時(shí)域還是在頻域,都要對(duì)連續(xù)函數(shù)進(jìn)行積分運(yùn)算。很顯然,要通過(guò)計(jì)算機(jī)實(shí)現(xiàn)此變換必須預(yù)先通過(guò)抽樣將原始的連續(xù)數(shù)據(jù)轉(zhuǎn)變?yōu)殡x散數(shù)據(jù),并將計(jì)算范圍收縮到一個(gè)有限區(qū)間。因此在允許一定程度近似的條件下,可以使用離散傅立葉變換(DFT)對(duì)波形數(shù)據(jù)進(jìn)行頻譜分析。二、快速傅立葉變換(FFT)算法構(gòu)成原理要計(jì)算一個(gè)N點(diǎn)的離散傅立葉變換需要同一個(gè)N*N點(diǎn)的W矩陣(關(guān)于W矩陣請(qǐng)參閱信號(hào)與系統(tǒng)方面的書籍)相運(yùn)算,隨著N值的增大,運(yùn)算次數(shù)顯

3、著上升,當(dāng)點(diǎn)數(shù)達(dá)到1024時(shí),需要進(jìn)行復(fù)數(shù)乘法運(yùn)算1,048,576次,顯然這種算法在實(shí)際運(yùn)用中無(wú)法保證當(dāng)點(diǎn)數(shù)較大時(shí)的運(yùn)算速度,無(wú)法滿足對(duì)信號(hào)的實(shí)時(shí)處理。根據(jù)W矩陣中W元素的周期性和對(duì)稱性我們可以將一個(gè)N點(diǎn)的DFT運(yùn)算分解為兩組N/2點(diǎn)的DFT運(yùn)算,然后取和即可,為進(jìn)一步提高效率,將上述兩個(gè)矩陣按奇偶順序逐級(jí)分解下去。當(dāng)采樣點(diǎn)數(shù)為2的指數(shù)次方M時(shí),可分解為M級(jí)子矩陣運(yùn)算,全部工作量?jī)H為:復(fù)數(shù)乘法:M*N/2次復(fù)數(shù)加法:N*M次而直接DFT需要的運(yùn)算量為:復(fù)數(shù)乘法:N*N次復(fù)數(shù)加法:N*(N-1)次當(dāng)點(diǎn)數(shù)N為幾十個(gè)點(diǎn)時(shí)FFT的優(yōu)勢(shì)還不明顯,而一旦達(dá)到幾千、幾百個(gè)點(diǎn)時(shí)優(yōu)勢(shì)是十分明顯的:N=1024

4、時(shí):DFT需1048576次運(yùn)算,F(xiàn)FT僅需5120次運(yùn)算,改善比204.8。N=2048時(shí):DFT需4194304次運(yùn)算,F(xiàn)FT僅需11264次運(yùn)算,改善比達(dá)到372.4。三、時(shí)間抽選奇偶分解快速離散傅立葉變換的程序?qū)崿F(xiàn)當(dāng)采樣點(diǎn)數(shù)較多時(shí),如變換前和變換后的序列都按自然順序排列,則中間運(yùn)算過(guò)程會(huì)占用大量的中間存儲(chǔ)單元,造成效率的低下和存儲(chǔ)單元的浪費(fèi)。根據(jù)FFT的實(shí)現(xiàn)原理我們可以對(duì)采樣序列進(jìn)行逐次奇偶抽選,打亂以前的次序重新排序,然后按此順序參加運(yùn)算,可以實(shí)現(xiàn)即位運(yùn)算提高存儲(chǔ)單元的利用率。(一)復(fù)數(shù)的描述方法進(jìn)行傅立葉變換時(shí)不可避免的要用到復(fù)數(shù),而在VC中并沒有現(xiàn)成的可用于表示復(fù)數(shù)的數(shù)據(jù)類型,可

5、以自己定義一個(gè)含有兩個(gè)成員變量的數(shù)據(jù)結(jié)構(gòu)來(lái)表示復(fù)數(shù),這兩個(gè)成員變量可分別用于表示復(fù)數(shù)的實(shí)部與虛部:typedefstructtagComplexfloatRe;/復(fù)數(shù)的實(shí)部floatIm;/復(fù)數(shù)的虛部Complex;(二)倒序的實(shí)現(xiàn)在進(jìn)行快速傅立葉變換時(shí),可以將輸入的時(shí)域序列和輸出的頻域序列都按照自然順序排列;也可以按照蝴蝶圖所描述的計(jì)算方法對(duì)輸入的時(shí)域序列按奇偶分解后的序列排序而輸出的頻域序列仍是按自然順序排列的;還有一中方式是輸入的時(shí)域序列是不進(jìn)行抽選的自然序列,而輸出的頻域序列則是按奇偶分解后的順序排列的。這三種方式各有優(yōu)點(diǎn),第一種對(duì)輸入、輸出不需要進(jìn)一步排序,但由于自然排序不符合蝴蝶圖

6、運(yùn)算規(guī)律,會(huì)占用大量中間存儲(chǔ)單元。而后兩種則無(wú)須中間存儲(chǔ)單元,但需要倒一次序。權(quán)衡利弊,當(dāng)采樣點(diǎn)較多時(shí)還是采用后兩種方式好,多一次倒序運(yùn)算對(duì)現(xiàn)在的高性能計(jì)算機(jī)而言并不是什么負(fù)擔(dān)。下面代碼用于對(duì)原始采樣序列的時(shí)間抽選奇偶分解工作,其中A、N分別表示指向采樣序列復(fù)數(shù)數(shù)組的指針和序列的長(zhǎng)度。intNV2=N/2;intNM1=N-1;intI,J,K=0;ComplexT;/用于中介的復(fù)數(shù)變量TI=J=1;while(I=NM1)if(IJ)T=AJ-1;/將AJ-1的內(nèi)容和AI-1的內(nèi)容互換,借助于中間變量TAJ-1=AI-1;AI-1=T;K=NV2;while(KJ)J-=K;K/=2;J+=

7、K;I+;(三)時(shí)域信號(hào)的頻譜分析首先要將從外設(shè)輸入或采集的時(shí)域波形數(shù)據(jù)經(jīng)抽樣量化后,通過(guò)CFile類的Open()、Read()等成員函數(shù)將其讀取到緩存中,并將其轉(zhuǎn)化為復(fù)變量存放于復(fù)變量數(shù)組A中,同時(shí)需要驗(yàn)證以下數(shù)據(jù)量的長(zhǎng)度是否為2的整數(shù)次冪,如若不是則必須用0來(lái)補(bǔ)齊,否則無(wú)法用蝴蝶圖進(jìn)行分解運(yùn)算。下面代碼用于完成對(duì)原始采樣時(shí)域序列的快速傅立葉變換,A、M分別表示指向原始采樣數(shù)據(jù)數(shù)組的指針和序列長(zhǎng)度的2的整數(shù)次冪:ComplexU,W,T;intLE,LE1,I,J,IP;intN=(int)pow(2,M);/在此采用的是時(shí)間抽選奇偶分解方式,所以在參加運(yùn)算前首先要對(duì)時(shí)間序列進(jìn)行倒序Rev

8、erseOrder(A,N);intL=1;while(L=M)LE=(int)pow(2,L);LE1=LE/2;U.Re=1.0f;U.Im=0.0f;W.Re=(float)cos(PI/(1.0*LE1);/計(jì)算W算子的值W.Im=(float)-1.0*sin(PI/(1.0*LE1);if(abs(W.Re)1.0e-12)W.Re=0.0f;if(abs(W.Im)1.0e-12)W.Im=0.0f;J=1;while(J=LE1)I=J;while(I摘要:本文詳細(xì)介紹了在VB集成環(huán)境下數(shù)字波形高速顯示的方法,同時(shí)對(duì)雙通道波形顯示和數(shù)字濾波方法也進(jìn)行了介紹。關(guān)鍵詞:數(shù)字;波形;

9、顯示;濾波1前言:隨著計(jì)算機(jī)技術(shù)及電子技術(shù)的發(fā)展,數(shù)字采集技術(shù)在檢測(cè)領(lǐng)域的應(yīng)用越來(lái)越廣泛,檢測(cè)速度越來(lái)越高,檢測(cè)的數(shù)據(jù)量越來(lái)越大,特別是在無(wú)損檢測(cè)領(lǐng)域,將檢測(cè)數(shù)據(jù)通過(guò)計(jì)算機(jī)處理后繪制出波形,并實(shí)時(shí)顯示,對(duì)及時(shí)發(fā)現(xiàn)傷損、分析傷損具有重要意義。2波形顯示檢測(cè)數(shù)據(jù)通常是離散的數(shù)據(jù),將離散的數(shù)據(jù)繪制出波形,可通過(guò)在兩點(diǎn)間連接線段的方法實(shí)現(xiàn)。2.1用Line方法顯示波形VB提供了Line畫直線方法,可在窗體上增加一個(gè)圖片框控件,適當(dāng)設(shè)置圖片的大小和背景顏色,用Line方法將離散數(shù)據(jù)按檢測(cè)順序連接成線段,即可將波形顯示在圖片框中。但該方法顯示波形速度較慢,不適合高速顯示的應(yīng)用。2.2WindowsAPI函

10、數(shù)顯示波形在VB中兩點(diǎn)間連線的另一種方法是用WindowsAPI函數(shù),Win32API提供了以下兩個(gè)函數(shù),聯(lián)合使用可實(shí)現(xiàn)波形的快速顯示,經(jīng)過(guò)測(cè)試,顯示速度比使用Line方法快70%以上。LineTo函數(shù):函數(shù)功能:畫出由數(shù)組定義的點(diǎn)連接的一系列線段。函數(shù)原型:BOOLLineTo(HDChdc,intnXEnd,intnYEnd);參數(shù):hdc:設(shè)備環(huán)境句柄。nXEnd:定義線段終點(diǎn)的X坐標(biāo)。nYEnd:定義線段終點(diǎn)的Y坐標(biāo)。返回值:若函數(shù)調(diào)用成功,則返回非0值;若函數(shù)調(diào)用失敗,則返回值為0。MoveToEx函數(shù):函數(shù)功能:將當(dāng)前位置更新為指定的點(diǎn),并有選擇的返回原先的位置。函數(shù)原型:BOOL

11、MoveToEx(HDChdc,intX,intY,LPPOINTlpPoint);參數(shù):hdc:設(shè)備環(huán)境句柄。X:定義新位置的X坐標(biāo)(邏輯坐標(biāo))。Y:定義新位置的Y坐標(biāo)(邏輯坐標(biāo))。lpPoint:指向一個(gè)POINT結(jié)構(gòu),結(jié)構(gòu)中存放原先的位置。若此參數(shù)為NULL,則不返回原先的位置返回值:若函數(shù)調(diào)用成功,則返回非0值;若函數(shù)調(diào)用失敗,則返回值為0。在連接線段時(shí),首先將檢測(cè)數(shù)據(jù)放入一個(gè)數(shù)組中,用MoveToEx函數(shù)定位畫線的起始點(diǎn)坐標(biāo),然后用LineTo函數(shù)畫出起始點(diǎn)至下一個(gè)點(diǎn)之間的線段,再用MoveToEx將畫線的起始點(diǎn)定位到下一個(gè)點(diǎn),繼續(xù)用LineTo函數(shù)畫線,如此循環(huán),即可將離散點(diǎn)連接成

12、波形。例:zz=MoveToEx(Picture1.hdc,i,Mwave(i),LpPoint1)zz=LineTo(Picture1.hdc,i,Mwave(i+1)實(shí)時(shí)波形顯示界面通常計(jì)算機(jī)需要接收外部實(shí)時(shí)發(fā)送的數(shù)據(jù)并用十分形象的方式顯示出來(lái)。例如柱狀圖、餅圖等等。本應(yīng)用程序則采用波形的形式顯示,并接將之設(shè)計(jì)為可以接收多路數(shù)據(jù)的波形顯示界面。本應(yīng)用程序在VS2008環(huán)境下調(diào)試通過(guò),源碼下載連接如下/5120804.html。一.程序界面點(diǎn)擊該圖放大上圖中顯示了兩路波形即三角波和正弦波,當(dāng)然這兩路波形是由程序計(jì)算出來(lái)的并不是從外部接收的。實(shí)際工作中則可以配合串口通訊設(shè)備接收它發(fā)來(lái)的數(shù)據(jù)并顯

13、示出來(lái)。二.波形控件類介紹本程序的實(shí)現(xiàn)主要依賴于那個(gè)波形顯示控件。從下載連接那里可以下載該源碼,里面的文件中,2DPushGraph.h和2DPushGraph.cpp即是該控件的類的定義文件和實(shí)現(xiàn)文件。分析之后得到該類的一些信息。其成員函數(shù)包括:程序代碼:COLORREFm_crTextColor;/標(biāo)簽文字顏色COLORREFm_crBGColor;/背景顏色COLORREFm_crGridColor;/柵格顏色CStringm_strMaxLabel;/最大值之處的標(biāo)簽CStringm_strMinLabel;/最小值之處的標(biāo)簽boolm_bShowMinMax;/最小最大值顯示bool

14、m_bShowGrid;/是否顯示柵格boolm_bStylesModified;/是否被修改intm_nMoveOffset;/偏移intm_nMaxCoords;/最大緩沖intm_nMaxPeek;/顯示數(shù)據(jù)的最大值intm_nMinPeek;/顯示數(shù)據(jù)的最小值intm_nGridSize;/柵格間距intm_nPeekOffset;/峰值偏移其實(shí)現(xiàn)方法包括:程序代碼:boolCreateFromStatic(UINTnStaticID,CWnd*pParent);/該方法用于創(chuàng)建控件實(shí)例,通常在對(duì)話框初始化函數(shù)中調(diào)用,nStaticID為控件ID,pPatent為創(chuàng)建在那個(gè)窗口中的ID

15、。LPCTSTRGetLabelForMax()const;/獲取最大值處的標(biāo)簽LPCTSTRGetLabelForMin()const;/獲取最大值處的標(biāo)簽COLORREFGetBGColor()const;/獲得背景色COLORREFGetGridColor()const;/獲得柵格顏色voidSetBGColor(COLORREFcrColor);voidSetGridColor(COLORREFcrColor);voidSetTextColor(COLORREFcrColor);COLORREFGetLineColor(UINTuiLineID);/該方法用于獲得ID號(hào)為uiLineI

16、D的波形的線條顏色,因?yàn)橐诓ㄐ慰丶挟嬀€必須先調(diào)用boolAddLine(UINTuiLineID,COLORREFcrColor);創(chuàng)建一個(gè)波形,ID號(hào)為uiLineID。boolSetLineColor(COLORREFcrColor,UINTuiLineID);COLORREFGetTextColor()const;/獲得標(biāo)簽文本的顏色intGetGridSize()const;/獲得柵格間隔voidSetGridSize(unsignedshortusWidthAndHeight);intGetMaxPeek()const;/獲得最大值縱坐標(biāo)intGetMinPeek()const;

17、/獲得最小值縱坐標(biāo)voidSetPeekRange(intnMin,intnMax);voidSetMaxPeek(intnMax);voidSetMinPeek(intnMin);unsignedshortGetInterval()const;/獲得橫坐標(biāo)間距voidSetInterval(unsignedshortusInterval);voidSetLabelForMax(LPCTSTRlpszLabel);voidSetLabelForMin(LPCTSTRlpszLabel);boolAddLine(UINTuiLineID,COLORREFcrColor);/該方法用于在該控件上創(chuàng)

18、建一個(gè)波形。voidRemoveLine(UINTuiLineID);/清除ID號(hào)為uiLineID的波形boolPush(intnMagnitude,UINTuiLineID);/在ID號(hào)為uiLineID號(hào)的波形上添加一個(gè)數(shù)據(jù)點(diǎn),nMagnitude為幅度voidShowAsBar(UINTuiLineID,boolbAsBar);/柱狀圖顯示voidUpdate();/更新三.應(yīng)用編程運(yùn)用該控件在VS2008環(huán)境下的編程步驟如下:1.建立一個(gè)對(duì)話框的MFC工程,在對(duì)話框上按照上圖所示的界面布置控件。其中波形控件那里布置一個(gè)PictureControl控件將其ModalFrame和Type

19、均屬性設(shè)置為true,其他均設(shè)置為False。注意給PictureControl取的ID!后面編程將會(huì)用到。2.將波形控件類的定義文件和實(shí)現(xiàn)文件拷貝至你的工程目錄下。但這實(shí)際上并沒有將該類真正添加到你的工程下,需手動(dòng)添加類。常規(guī)操作,不詳述。3.在對(duì)話框的定義和實(shí)現(xiàn)文件中分別添加如下代碼:程序代碼:#include2DPushGraph.h4.在對(duì)話框定義文件中(我給的供下載的例程中的是DataRealTimeDlg.h這個(gè)文件)中定義一個(gè)該控件類的變量:程序代碼:private:C2DPushGraphm_PushGraph;5.在對(duì)話框的實(shí)現(xiàn)文件中(我給的供下載的例程中的是DataReal

20、TimeDlg.cpp這個(gè)文件)的對(duì)話框初始化函數(shù)中添加如下代碼:程序代碼:m_PushGraph.CreateFromStatic(IDC_REALCTRL,this);/這個(gè)IDC_REALCTRL即是那個(gè)PictureControl控件的ID號(hào)。m_PushGraph.ModifyStyle(0,WS_THICKFRAME);/設(shè)置風(fēng)格6.現(xiàn)在不妨試著運(yùn)行以下該程序,應(yīng)該可以觀察到那個(gè)控件顯示出來(lái)了吧。在添加以下代碼:程序代碼:m_PushGraph.AddLine(m_sin,RGB(255,255,255);m_PushGraph.AddLine(m_tra,RGB(255,0,0)

21、這兩行代碼分別添加了一個(gè)正弦波形,ID號(hào)為m_sin,一個(gè)三角波形,ID號(hào)為m_tra。不過(guò)運(yùn)行之后并沒有數(shù)據(jù)點(diǎn)繪制出來(lái)。那是應(yīng)為還沒有調(diào)用boolPush(intnMagnitude,UINTuiLineID)函數(shù)添加數(shù)據(jù)點(diǎn)。試著添加幾個(gè)數(shù)據(jù)點(diǎn)再運(yùn)行即可觀察到波形。7.還有一些控件的響應(yīng)代碼看看那個(gè)下載的例程吧。四.結(jié)束語(yǔ)成功了吧,AnyProblem,Contactmeplease!控件設(shè)計(jì)NobisStatusChart-野比的狀態(tài)波形圖控件從構(gòu)思到實(shí)現(xiàn)NobisStatusChart-野比的狀態(tài)波形圖控件從構(gòu)思到實(shí)現(xiàn)野比著源程序下載:Demo控件背景目前比較流行的WinForm程序設(shè)計(jì)

22、都會(huì)提供形象的可視化數(shù)據(jù)流動(dòng)記錄功能,如FlashGet及其衍生軟件的懸浮窗網(wǎng)速監(jiān)視圖,Windows任務(wù)管理器的CPU、內(nèi)存使用圖等。構(gòu)思為了在我們自己的程序中實(shí)現(xiàn)這種效果,就需要研究、分析它們的原理,掌握其規(guī)律,然后加以實(shí)現(xiàn)。很明顯,從軟件可重用性以及各種隨之而來(lái)的好處考慮,我們要求將這個(gè)“波形顯示”效果做成一個(gè)控件(Control)。分析還是以FlashGet的懸浮窗和Windows任務(wù)管理器作為研究對(duì)象。仔細(xì)觀察它們的工作方式,發(fā)現(xiàn)它們有以下的共同點(diǎn):在右邊更新當(dāng)前的波形值更新后的波形不消失,而是整體向左平移可以設(shè)置波形顏色、更新速度等而通過(guò)深入研究,發(fā)現(xiàn)二者不同點(diǎn)如下:不同的顯示方式

23、,有曲線顯示和直方圖顯示有無(wú)定位網(wǎng)格各部分顏色可自定義設(shè)計(jì)通過(guò)分析,可以決定如下:凡是二者共同點(diǎn),加以重點(diǎn)實(shí)現(xiàn);凡二者不同之處,通過(guò)設(shè)置屬性(Property)進(jìn)行更改。最后繪制時(shí),基于所設(shè)置的屬性,使用共同方法加以實(shí)現(xiàn)。因此自定義屬性如下:BackColor(重寫基類屬性)Enabled(重寫)ForeColor(重寫)GridColor網(wǎng)格顏色GridHeight網(wǎng)格每格高度GridShiftting是否平移網(wǎng)格GridWidth網(wǎng)格每格寬度Interval波形刷新間隔(單位:毫秒)Mode波形顯示方式(曲線/直方圖)Range數(shù)值范圍ShifttingIncrement向左平移增量Val

24、ue當(dāng)前值控件因?yàn)橐〞r(shí)更新,因此具有一個(gè)內(nèi)部的Timer對(duì)其進(jìn)行定時(shí),其Interval由控件的Interval屬性指定。對(duì)于此自定義控件,需要每次更新時(shí)在其OnPaint()事件中對(duì)整個(gè)控件進(jìn)行繪制。繪制順序?yàn)椋罕尘?網(wǎng)格-波形,如此保證所有部分均正確畫出且無(wú)遮擋。從波形看,很明顯,我們需要一個(gè)長(zhǎng)度至少等于波形控件寬度的數(shù)組來(lái)存放每時(shí)刻波形的值,因此可以確定這個(gè)數(shù)組是和控件繪圖畫布寬度一致的。算法繪圖最重要的是算法部分,如何計(jì)算如網(wǎng)格位置,如何將圖形整體平移,如何設(shè)置波形值是本控件的重點(diǎn)和難點(diǎn)部分。計(jì)算網(wǎng)格位置,以上面的ShifttingIncrement為offset參數(shù)傳入/網(wǎng)格數(shù)(不

25、計(jì)邊緣)floatdiv;floatpos=0F;/先畫垂直方向/可以少畫一根線div=(float)w/(float)gridWidth+1;for(inti=0;i(int)div;i+)pos+=gridWidth;g.DrawLine(penGrid,pos-offset,0,pos-offset,h);/畫水平方向div=(float)h/(float)gridHeight;pos=0F;for(inti=0;i(int)div;i+)pos+=gridHeight;g.DrawLine(penGrid,0,pos,w,pos);對(duì)于波形,傳入其波形值數(shù)組作為參數(shù)/從0到w繪制int

26、len=w;/根據(jù)繪制方式if(chartMode=StatusChart.ChartMode.Histogram)for(inti=0;ilen;i+)g.DrawLine(p,i,h-vali,i,h);g.DrawLine(p,len,h-vallen-1,len,h);elselen-;for(inti=0;ilen;i+)g.DrawLine(p,i,h-vali,i+1,h-vali+1);len+;g.DrawLine(p,len-1,h-vallen-2,len,h-vallen-1);如何平移,是一個(gè)難點(diǎn),需要在內(nèi)部定時(shí)器的Tick()事件中加以處理/更新網(wǎng)格偏移/只有啟用了

27、網(wǎng)格移動(dòng)才處理if(gridShiftting)iOffset+=gridShifttingIncrement;iOffset%=gridWidth;/更新圖形(整體左移)/必須在這里而不能在畫圖的同時(shí)移動(dòng),/若在畫圖中移動(dòng),則當(dāng)畫面被遮擋(OnPaint)事件不發(fā)生時(shí)無(wú)法更新intlen=w;for(inti=0;ilen;i+)/判斷數(shù)組越界if(ilen-1)vali=vali+1;elsevallen-1=currentValue;/break;/vallen=currentValue;Invalidate();最后引發(fā)控件的Invalidate()方法使控件重繪自身。效果最后的控件運(yùn)

28、行效果如下圖所示:總結(jié)通過(guò)設(shè)計(jì)并實(shí)現(xiàn)StatusChart控件,我們研究了波形狀態(tài)監(jiān)控的相關(guān)現(xiàn)象和原理,復(fù)習(xí)并使用了控件的設(shè)計(jì)生成,最后使用GDI+技術(shù)對(duì)其進(jìn)行了實(shí)現(xiàn)。VC+編程實(shí)現(xiàn)對(duì)火焰的計(jì)算機(jī)動(dòng)態(tài)仿真-摘要:本文通過(guò)對(duì)真實(shí)火焰物理特性的分析,建立了火焰動(dòng)態(tài)燃燒的數(shù)學(xué)模型,并在此數(shù)學(xué)模型基礎(chǔ)之上借助于DirectDraw技術(shù)對(duì)圖形顯示的加速,在VC+6.0下對(duì)火焰作了效果非常逼真的計(jì)算機(jī)動(dòng)態(tài)仿真。關(guān)鍵詞:火焰;DirectDraw;計(jì)算機(jī)仿真引言計(jì)算機(jī)仿真技術(shù)的基本原理都是一樣的,神秘復(fù)雜的核爆同水波、火焰、煙霧等非常平常的自然現(xiàn)象在仿真處理過(guò)程中并沒有什么太大的區(qū)別。都是經(jīng)歷了從實(shí)體對(duì)象到

29、物理特性的總結(jié),再由此建立數(shù)學(xué)模型并在數(shù)學(xué)模型基礎(chǔ)之上提出仿真算法,最后通過(guò)計(jì)算機(jī)將其動(dòng)態(tài)仿真出來(lái)等一系列步驟。本文以火焰作為仿真對(duì)象,通過(guò)對(duì)熱源、熱擴(kuò)散以及對(duì)流等特性的分析對(duì)其建立了數(shù)學(xué)模型及仿真算法,為了能充分發(fā)揮計(jì)算機(jī)對(duì)圖形的硬件加速,使用DirectDraw技術(shù)對(duì)仿真結(jié)果顯示進(jìn)行了加速,使之能逼真、流暢地對(duì)火焰的燃燒過(guò)程實(shí)行動(dòng)態(tài)模擬。簡(jiǎn)單近似模型設(shè)計(jì)雖然火焰在自然界是一種極普通的自然現(xiàn)象,但根據(jù)流體力學(xué)的相關(guān)知識(shí),火焰可以表達(dá)為一個(gè)相當(dāng)復(fù)雜的三維動(dòng)態(tài)流體系統(tǒng)。如要在計(jì)算機(jī)中對(duì)這樣一個(gè)復(fù)雜的流體系統(tǒng)做出精確的仿真將需要有相當(dāng)龐大復(fù)雜的數(shù)學(xué)模型為基礎(chǔ),而且運(yùn)算量將非常巨大,在現(xiàn)有的微型計(jì)算

30、機(jī)中幾乎很難保證其動(dòng)態(tài)實(shí)時(shí)性,這也就失去了仿真的意義。因此,在仿真時(shí)應(yīng)用盡可能簡(jiǎn)單的模型來(lái)實(shí)現(xiàn)盡可能逼真的效果。從物理角度分析,要產(chǎn)生火焰,首先要有火源,其次為了產(chǎn)生焰的效果,需要以火源為中心向上、向四周擴(kuò)散,而且由于在擴(kuò)散過(guò)程中逐漸遠(yuǎn)離火源,溫度會(huì)逐漸下降,表現(xiàn)在視覺上就是火焰的冷卻變暗。另外,由于火焰的高溫使周圍空氣受熱膨脹比重下降,因此會(huì)有空氣的對(duì)流出現(xiàn),這將把火焰向上吹起,使火焰向四周擴(kuò)散的距離要遠(yuǎn)小于向上擴(kuò)散的距離。基于以上幾點(diǎn)認(rèn)識(shí),可以采取對(duì)應(yīng)的仿真措施:對(duì)火源的設(shè)置可以用一幅二值位圖來(lái)標(biāo)識(shí),非火源以低亮度像素填充、火源點(diǎn)則設(shè)以高亮度像素,通過(guò)對(duì)位圖像素值的判別可以斷定當(dāng)前點(diǎn)是否為

31、火源。對(duì)于火源的溫度高低可用其所在點(diǎn)的亮度來(lái)描述;對(duì)于火焰擴(kuò)散的模擬,為盡量減少運(yùn)算量,在此簡(jiǎn)單地用某火源點(diǎn)(x,y)及其前后左右鄰近四點(diǎn)的均值來(lái)近似,即Pixel(x,y)=(Pixel(x,y)+Pixel(x,y-1)+Pixel(x,y+1)+Pixel(x-1,y)+Pixel(x+1,y)/5,雖然該近似算法沒有采取正余弦的方法精確,但運(yùn)算速度極快,而且在后續(xù)的實(shí)驗(yàn)效果上同采用正余弦的方法幾乎沒有任何差別;由于在仿真過(guò)程中對(duì)火焰的溫度是通過(guò)改變其亮度值來(lái)實(shí)現(xiàn)的,因此對(duì)于擴(kuò)散過(guò)程的冷卻可對(duì)像素點(diǎn)降低一個(gè)固定的亮度值來(lái)實(shí)現(xiàn)。衰減值的大小需要視所希望火焰冷卻速度的快慢而定;對(duì)流對(duì)火焰產(chǎn)生的直

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論