版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 課程設(shè)計(jì)報(bào)告書</b></p><p> 設(shè)計(jì)題目 : 基帶碼型編碼軟件 </p><p> 學(xué)院(系): 物理與電子工程學(xué)院 </p><p> 專 業(yè): 通信工程
2、 </p><p> 年級(jí)班級(jí) : 2006級(jí)通信工程(1)班 </p><p> 學(xué) 號(hào): </p><p> 學(xué)生姓名 : XXX </p><p> 起止日期 :
3、2011年8月29日至2011年9月16日 </p><p> 指導(dǎo)教師: XXX </p><p><b> 內(nèi)容摘要:</b></p><p> 數(shù)字基帶傳輸是數(shù)字傳輸技術(shù)的一種基本形式,是研究數(shù)字頻帶傳輸系統(tǒng)的基礎(chǔ)。數(shù)字基帶碼型的選擇對(duì)于數(shù)字基帶傳輸系統(tǒng)的性能具有重要意義
4、?;贏MI碼、HDB3碼、CMI碼、曼切斯特碼、差分曼切斯特碼的編碼原理,用Visual C++6.0設(shè)計(jì)AMI碼、HDB3碼、CMI碼、曼切斯特碼、差分曼切斯特碼的編碼軟件,能夠根據(jù)用戶輸入的二進(jìn)制信息序列及設(shè)定的編碼類型給出對(duì)應(yīng)的編碼結(jié)果,并以圖形化的方式顯示出波形來。本軟件編碼器詳細(xì)敘述了其相關(guān)編碼算法和關(guān)鍵技術(shù),系統(tǒng)以MFC的單文檔為模板,界面設(shè)計(jì)人性化,操作簡(jiǎn)易明了。編碼算法有多種參數(shù)設(shè)置。對(duì)學(xué)習(xí)AMI、HDB3碼、CMI碼
5、、曼切斯特碼、差分曼切斯特碼有很大的幫助,使學(xué)習(xí)者可以更加直觀了認(rèn)識(shí)這幾個(gè)碼型的編碼規(guī)則,同時(shí)也可以應(yīng)用于實(shí)際中某些適合這類碼型傳輸?shù)南到y(tǒng),為這些系統(tǒng)提供編碼使其更利于傳輸。</p><p><b> 關(guān)鍵詞:</b></p><p> Visual C++6.0,HDB3,AMI,CMI,曼切斯特碼,編碼器,隨機(jī)碼,極性,線條寬度,顏色,波形</p>
6、<p><b> 目 錄</b></p><p><b> 一、設(shè)計(jì)要求:4</b></p><p><b> 二、設(shè)計(jì)意義:4</b></p><p><b> 三、設(shè)計(jì)原理4</b></p><p> 3.1、 AMI碼
7、4</p><p> 3.2、HDB3碼4</p><p> 3.3、CMI碼5</p><p> 3.4、 曼徹斯特碼5</p><p> 3.5、系統(tǒng)設(shè)計(jì)方法分析5</p><p> 3.6、系統(tǒng)的設(shè)計(jì)思路5</p><p> 四、系統(tǒng)的具體設(shè)計(jì)與實(shí)現(xiàn)6<
8、;/p><p> 4.1編碼算法設(shè)計(jì)6</p><p> 4.1.1 AMI編碼算法6</p><p> 4.1.2 HDB3 編碼算法8</p><p> 4.1.3 CMI 編碼算法10</p><p> 4.1.4 曼徹斯特碼編碼算法12</p><p> 4.1.5 隨
9、機(jī)信號(hào)生成算法14</p><p> 4.2、 畫圖設(shè)計(jì)14</p><p> 五、調(diào)試結(jié)果與現(xiàn)象分析15</p><p> 六、系統(tǒng)不足之處18</p><p><b> 七、心得體會(huì)18</b></p><p><b> 八、參考文獻(xiàn)19</b>&l
10、t;/p><p><b> 一、設(shè)計(jì)要求:</b></p><p> 基本要求:用C++等高級(jí)語(yǔ)言設(shè)計(jì)AMI碼、HDB3碼的編碼軟件,要求能根據(jù)用戶輸入的二進(jìn)制信息序列及設(shè)定的編碼類型給出對(duì)應(yīng)的編碼結(jié)果,并以圖形化的方式顯示出波形來。能夠設(shè)置一些參數(shù):如線的顏色、寬度;能夠控制是否顯示網(wǎng)格線、是否在編碼波形旁邊顯示其編碼結(jié)果等。能產(chǎn)生由用戶設(shè)定信息序列長(zhǎng)度的隨機(jī)序列,
11、并給出此序列的編碼結(jié)果,并以圖形化的方式顯示出波形來。</p><p> 擴(kuò)展要求:能夠?qū)ζ渌R娀鶐Тa型,如Manchester碼、差分Manchester碼、多電平碼等進(jìn)行編碼和顯示。 </p><p><b> 二、設(shè)計(jì)意義:</b></p><p> 通過本次課程設(shè)計(jì),系統(tǒng)了解和掌握通信系統(tǒng)的基帶碼型編碼軟件設(shè)計(jì)過程、方法及實(shí)現(xiàn);
12、掌握運(yùn)用C++高級(jí)語(yǔ)言設(shè)計(jì)通信軟件的方法,為以后設(shè)計(jì)和實(shí)現(xiàn)通信系統(tǒng)打下良好基礎(chǔ)。</p><p><b> 三、設(shè)計(jì)原理</b></p><p> 3.1、 AMI碼</p><p> AMI碼全稱是傳號(hào)交替反轉(zhuǎn)碼。其編碼規(guī)則是將二進(jìn)制消息代碼“1”(傳號(hào))交替地變換為傳輸碼的“+1”和“-1”,而“0”(空號(hào))保持不變。例如</
13、p><p> AMI碼對(duì)應(yīng)的基帶信號(hào)是正負(fù)極性交替的脈沖序列,而0電位持不變的規(guī)律。AMI碼的優(yōu)點(diǎn)是,由于+1與-1 交替, AMI碼的功率譜中不含直流成分,高、低頻分量少,能量集中在頻率為1/2碼速處。位定時(shí)頻率分量雖然為0,但只要將基帶信號(hào)經(jīng)全波整流變?yōu)閱螛O性歸零波形,便可提取位定時(shí)信號(hào)。此外,AMI碼的編譯碼電路簡(jiǎn)單,便于利用傳號(hào)極性交替規(guī)律觀察誤碼情況。鑒于這些優(yōu)點(diǎn),AMI碼是CCITT建議采用的傳輸碼性之
14、一。 </p><p> AMI碼的不足是,當(dāng)原信碼出現(xiàn)連“0”串時(shí),信號(hào)的電平長(zhǎng)時(shí)間不跳變,造成提取定時(shí)信號(hào)的困難。解決連“0”碼問題的有效方法之一是采用HDB3碼。 </p><p> 3.2、HDB3碼</p><p> HDB3碼的全稱是三階高密度雙極性碼,它是AMI碼的一種改進(jìn)型, 其目的是為了保持AMI碼的優(yōu)點(diǎn)而克服其缺點(diǎn), 使連“0”個(gè)數(shù)不超
15、過3個(gè)。其編碼規(guī)則如下: </p><p> ?。?) 當(dāng)信碼的連“0”個(gè)數(shù)不超過3時(shí),仍按AMI碼的規(guī)則編,即傳號(hào)極性交替; (2)當(dāng)連“0”個(gè)數(shù)超過3時(shí),則將第4個(gè)“0”改為非“0”脈沖,記為+V或-V,稱</p><p> 之為破壞脈沖。相鄰V碼的極性必須交替出現(xiàn),以確保編好的碼中無(wú)直流;</p><p> ?。?)為了便于識(shí)別, V碼的極性
16、應(yīng)與其前一個(gè)非“0”脈沖的極性相同,否則,將四連“0”的第一個(gè)“0”更改為與該破壞脈沖相同極性的脈沖,并記為+B或-B;</p><p> ?。?) 破壞脈沖之后的傳號(hào)碼極性也要交替。 例如: </p><p> 其中的±V脈沖和±B脈沖與±1脈沖波形相同,用V或B符號(hào)的目的是為了示意是將原信碼的“0”變換成“1”碼。 </p><p&
17、gt; 雖然HDB3碼的編碼規(guī)則比較復(fù)雜,但譯碼卻比較簡(jiǎn)單。 從上述原理看出,每一個(gè)破壞符號(hào)V總是與前一非0符號(hào)同極性(包括B在內(nèi))。這就是說,從收到的符號(hào)序列中可以容易地找到破壞點(diǎn)V,于是也斷定V符號(hào)及其前面的3個(gè)符號(hào)必是連0符號(hào),從而恢復(fù)4個(gè)連0碼,再將所有-1變成+1后便得到原消息代碼。 </p><p> HDB3碼保持了AMI碼的優(yōu)點(diǎn)外,同時(shí)還將連“0”碼限制在3個(gè)以內(nèi),故有利于位定時(shí)信號(hào)的提取。H
18、DB3碼是應(yīng)用最為廣泛的碼型,A律PCM四次群以下的接口碼型均為HDB3碼。</p><p><b> 3.3 CMI碼</b></p><p> CMI碼是傳號(hào)反轉(zhuǎn)碼的簡(jiǎn)稱,與雙相碼類似,它也是一種雙極性二電平碼。其編碼規(guī)則是:“1”碼交替用“11”和“00”兩位碼表示;“0”碼固定地用“01”表示。例如:</p><p> CMI碼易
19、于實(shí)現(xiàn),含有豐富的定時(shí)信息。此外,由于10喂禁用碼組,不會(huì)出現(xiàn)三個(gè)以上的連碼,這個(gè)規(guī)律可用于宏觀檢錯(cuò)。</p><p><b> 3.4曼徹斯特碼</b></p><p> 曼徹斯特碼即雙性碼,它用一個(gè)周期的正負(fù)對(duì)稱方波表示“0”,而用其反相波形表示“1”。編碼規(guī)則之一是:“1”碼用“10”兩位碼表示;“0”碼用“01”表示。例如:</p><
20、p> 其波形是一種雙極性NRZ波形,只有極性相反的兩個(gè)電平。它在每個(gè)碼元間隔的中心點(diǎn)都存在電平跳變,所以含有豐富的位定時(shí)信息,且沒有直流分量,編碼過程也簡(jiǎn)單。缺點(diǎn)是占用帶寬加倍,使頻帶利用率降低。</p><p> 3.5、系統(tǒng)設(shè)計(jì)方法及系統(tǒng)主要功能概述</p><p> 在該編碼系統(tǒng)設(shè)計(jì)中,我們采用了面向?qū)ο蟮募夹g(shù)。基于AMI碼、HDB3碼、CMI碼和曼徹斯特碼的編碼原理,
21、本編碼器采用Visual C++6.0設(shè)計(jì)。所采用編譯器的是Visual C++6.0,它是微軟開發(fā)的基于Windows下的面向?qū)ο竦木幊誊浖兄鴱?qiáng)大的MFC支持,在可視化設(shè)計(jì)方面有著強(qiáng)大的優(yōu)勢(shì),并且高度支持C++標(biāo)準(zhǔn),是一個(gè)進(jìn)行C++編程的超強(qiáng)集成環(huán)境。</p><p> 本設(shè)計(jì)為實(shí)現(xiàn)用戶友好交互信息,采用拆分單文檔實(shí)現(xiàn),一部分實(shí)現(xiàn)用戶輸入信息序列及相關(guān)信息的顯示,另一部分實(shí)現(xiàn)編碼結(jié)果圖形顯示。本設(shè)計(jì)中用
22、戶可有AMI碼、HDB3碼、CMI碼和曼徹斯特碼四種編碼類型可選擇。并能對(duì)前一個(gè)1碼或前一個(gè)v碼的正負(fù)極性,坐標(biāo)軸與分割線的顯示與否,圖形線條寬度、顏色等相關(guān)參數(shù)進(jìn)行設(shè)置。輸入原始信號(hào),系統(tǒng)經(jīng)過特定算法編碼給出編碼結(jié)果并畫出編碼波形給與用戶形象化的結(jié)果。系統(tǒng)會(huì)實(shí)時(shí)對(duì)用戶所做的操作進(jìn)行結(jié)果反饋,有很好的用戶交互性。</p><p> 3.6、系統(tǒng)的設(shè)計(jì)思路</p><p> 軟件編碼器的
23、基本操作流程是:用戶選擇編碼類型并設(shè)置相關(guān)參數(shù)設(shè)置,然后輸入原始信號(hào)(或通過隨機(jī)碼按鈕產(chǎn)生相應(yīng)長(zhǎng)度的隨機(jī)碼信號(hào)),系統(tǒng)經(jīng)過特定算法編碼給出編碼結(jié)果并畫出編碼波形給與用戶形象化的結(jié)果。系統(tǒng)會(huì)實(shí)時(shí)對(duì)用戶所做的操作進(jìn)行結(jié)果反饋,有很好的用戶交互性。根據(jù)上述分析,系統(tǒng)結(jié)構(gòu)如圖3.4.1所示</p><p><b> 圖3.4.1</b></p><p> 用戶層提供用戶與
24、仿真系統(tǒng)交互的接口。</p><p> 系統(tǒng)層根據(jù)接口層的輸入,建立仿真模塊的動(dòng)態(tài)模型,并調(diào)用相應(yīng)的算法返回仿真結(jié)果。</p><p> 數(shù)據(jù)層存儲(chǔ)仿真層運(yùn)行算法處理的各種中間數(shù)據(jù)。</p><p> 四、系統(tǒng)的軟件設(shè)計(jì)流程及描述</p><p><b> 4.1編碼算法設(shè)計(jì)</b></p><
25、;p> 4.1.1 AMI編碼算法</p><p><b> (1)流程圖:</b></p><p><b> ?。?)具體描述:</b></p><p> 1)在AMI碼編碼函數(shù)中將編碼碼型標(biāo)識(shí)符號(hào)變量CodeChoose賦值為“AMI”。定義字符串變量strAMI來存儲(chǔ)用GetDlgItemText獲取的輸
26、入信號(hào)和編碼結(jié)果,并定義整形變量SignalLength存儲(chǔ)用GetLength來獲取的輸入信號(hào)長(zhǎng)度,定義變量flag1來保存前一個(gè)1碼的極性。</p><p> 2)然后用for語(yǔ)句對(duì)輸入信號(hào)進(jìn)行檢測(cè),用GetAt(i)來獲取第i位信號(hào),并用if語(yǔ)句進(jìn)行判斷,若輸入信號(hào)為1再判斷前一個(gè)1碼的極性,若前一個(gè)1碼為正,則此輸入信號(hào)1碼應(yīng)編為負(fù)極性碼,用SetAt將其替換為‘e’(代表-1),并將flag1賦值為“
27、-1”保存當(dāng)前1碼的極性。若前一個(gè)1碼為負(fù),則此輸入信號(hào)1碼應(yīng)編為正極性碼,用SetAt將其替換為‘E’(代表+1),并將flag1賦值為“+1”保存當(dāng)前1碼的極性。</p><p> 3)設(shè)置好每位輸入信號(hào)后退出for語(yǔ)句,定義變量strAMITemp來保存編碼的中間結(jié)果,以供繪圖使用。用Replace將“e”取代“-1”, 將“E”取代“+1”,用 SetDlgItemText將編碼結(jié)果顯示在編碼結(jié)果編輯框
28、中。使主框架類指針變量pCDrMFrame指向當(dāng)前視圖類的父框架類指針。主框架類的公有成員變量Code存放編碼結(jié)果的中間結(jié)果strAMITemp,并用Invalidate();語(yǔ)句強(qiáng)迫調(diào)用畫圖函數(shù)OnDraw();這就完成了AMI碼的編碼。</p><p> ?。?)實(shí)現(xiàn)代碼如下:</p><p><b> // AMI碼編碼</b></p><
29、p> void CBIANMAView::OnRadioAmi() </p><p> { CodeChoose = "AMI";</p><p> // TODO: Add your control notification handler code here</p><p> this->GetDlgItem(IDC
30、_STATIC_SETPOLAR)->ShowWindow( SW_SHOW );</p><p> this->GetDlgItem(IDC_STATIC_SETPOLAR)->SetWindowText("AMI碼設(shè)置");</p><p> this->GetDlgItem(IDC_STATIC_POLARV)->ShowWin
31、dow(SW_HIDE);//隱藏前一個(gè)V碼極性的選項(xiàng)</p><p> this->GetDlgItem(IDC_RADIO_POSV)->ShowWindow(SW_HIDE);</p><p> this->GetDlgItem(IDC_RADIO_NEGV)->ShowWindow(SW_HIDE);</p><p> CStr
32、ing strAMI;</p><p> this->GetDlgItemText(IDC_EDIT_INPUT,strAMI);//取輸入信號(hào)</p><p> CString flag1=polar1;//保存1碼的極性</p><p> int SignalLength=strAMI.GetLength();//獲得輸入信號(hào)的長(zhǎng)度</p>
33、;<p> for(int i=0;i<SignalLength;i++) //編碼</p><p><b> {</b></p><p> if(strAMI.GetAt(i)=='1')</p><p> { if(flag1=="+1")</p><p
34、> {strAMI.SetAt(i,'e');//e代表-1</p><p> flag1="-1";</p><p><b> }</b></p><p><b> else </b></p><p> { strAMI.SetAt
35、(i,'E');//E代表+1</p><p> flag1="+1";</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> C
36、String strAMITemp=strAMI;//strAMITemp存放AMI編碼的中間結(jié)果,可以供繪圖時(shí)使用strAMI.Replace("e","-1");//e取代-1</p><p> strAMI.Replace("E","+1");//E取代+1</p><p> this->Set
37、DlgItemText(IDC_EDIT_OUPUT,strAMI);//在編碼結(jié)果編輯框中顯示編碼結(jié)果pCDrMFrame= (CMainFrame*)this->GetParentFrame();</p><p> pCDrMFrame->CodeChoose = "AMI";</p><p> pCDrMFrame->Code=strAMIT
38、emp;</p><p> pCDrMFrame->Invalidate();</p><p> 4.1.2 HDB3 編碼算法</p><p><b> ?。?)流程圖: </b></p><p><b> ?。?)具體描述:</b></p><p> 1)在
39、HDB3碼編碼函數(shù)中將編碼碼型標(biāo)識(shí)符號(hào)變量CodeChoose賦值為“HDB3”。定義字符串變量stHDB3來存儲(chǔ)用GetDlgItemText獲取的輸入信號(hào)和編碼結(jié)果,并定義整形變量SignalLength存儲(chǔ)用GetLength來獲取的輸入信號(hào)長(zhǎng)度,定義變量flag1來保存前一個(gè)1碼的極性, flagv來保存前一個(gè)v碼的極性,Zerocount來計(jì)算連0個(gè)數(shù)。</p><p> 2)然后用for語(yǔ)句對(duì)輸入信
40、號(hào)進(jìn)行檢測(cè),用GetAt(i)來獲取第i位信號(hào),并用if語(yǔ)句進(jìn)行判。</p><p> 3)若輸入信號(hào)為1,Zerocount清0,再判斷前一個(gè)1碼的極性,若前一個(gè)1碼為正,則此輸入信號(hào)1碼應(yīng)編為負(fù)極性碼,用SetAt將其替換為‘e’(代表-1),并將flag1賦值為“-1”保存當(dāng)前1碼的極性。若前一個(gè)1碼為負(fù),則此輸入信號(hào)1碼應(yīng)編為正極性碼,用SetAt將其替換為‘E’(代表+1),并將flag1賦值為“+1
41、”保存當(dāng)前1碼的極性。</p><p> 4)若輸入信號(hào)為0,Zerocount+1,判斷Zerocount是否等于4,若等于4,判斷前一個(gè)V碼極性.。若為+V將第四個(gè)0替換為x(代表-V),并將flagv賦值為-V,再判斷此時(shí)的前一個(gè)1碼極性,若為正極性,則將第一個(gè)0碼替換為y(代表-B),并將flag1賦值為-1。若為-V將第四個(gè)0替換為X(代表+V),并將flagv賦值為+V,再判斷此時(shí)的前一個(gè)1碼極性,
42、若為正負(fù)極性,則將第一個(gè)0碼替換為Y(代表+B),并將flag1賦值為+1。</p><p> 5)設(shè)置好每位輸入信號(hào)后退出for語(yǔ)句,定義變量strHDB3Temp來保存編碼的中間結(jié)果,以供繪圖使用。用Replace將“e”取代“-1”, 將“E”取代“+1”, “x”取代“-V”, “X”取代“+V”, “y”取代“-B”, “Y”取代“+B”,用 SetDlgItemText將編碼結(jié)果顯示在編碼結(jié)果編輯框
43、中。使主框架類指針變量pCDrMFrame指向當(dāng)前視圖類的父框架類指針。主框架類的公有成員變量Code存放編碼結(jié)果的中間結(jié)果strHDB3Temp,并用Invalidate();語(yǔ)句強(qiáng)迫調(diào)用畫圖函數(shù)OnDraw();這就完成了HDB3碼的編碼。</p><p><b> 實(shí)現(xiàn)代碼如下:</b></p><p> // HDB3碼編碼</p><
44、p> void CBIANMAView::OnRadioHdb3() </p><p> { // TODO: Add your control notification handler code here</p><p> CodeChoose="HDB3";</p><p> if(GetCheckedRadioButton(I
45、DC_RADIO_POSV,IDC_RADIO_NEGV)==0)</p><p> { polarv="+V";</p><p> CheckRadioButton(IDC_RADIO_POSV,IDC_RADIO_NEGV,IDC_RADIO_POSV);</p><p><b> }</b></p>
46、;<p> this->GetDlgItem(IDC_STATIC_SETPOLAR)->ShowWindow( SW_SHOW );</p><p> this->GetDlgItem(IDC_STATIC_SETPOLAR)->SetWindowText("HDB碼設(shè)置");</p><p> this->GetDl
47、gItem(IDC_STATIC_POLARV)->ShowWindow(SW_SHOW);</p><p> this->GetDlgItem(IDC_RADIO_POSV)->ShowWindow(SW_SHOW);</p><p> this->GetDlgItem(IDC_RADIO_NEGV)->ShowWindow(SW_SHOW);</
48、p><p> CString strHDB3;</p><p> this->GetDlgItemText(IDC_EDIT_INPUT,strHDB3);//取輸入信號(hào)</p><p> CString flag1=polar1;//保存1碼的極性</p><p> CString flagv=polarv;//保存v碼的極性&l
49、t;/p><p> int Zerocount=0;//計(jì)算連零個(gè)數(shù)</p><p> int SignalLength=strHDB3.GetLength();//獲得輸入信號(hào)的長(zhǎng)度</p><p> for(int i=0;i<SignalLength;i++) //編碼</p><p><b> {</b>
50、;</p><p> if(strHDB3.GetAt(i)=='1')</p><p> { Zerocount=0;</p><p> if(flag1=="+1")</p><p> {strHDB3.SetAt(i,'e');//e代表-1</p><
51、;p> flag1="-1";</p><p><b> }</b></p><p><b> else </b></p><p> { strHDB3.SetAt(i,'E');//E代表+1</p><p> flag1="
52、+1";</p><p><b> }</b></p><p><b> }</b></p><p><b> else</b></p><p> { Zerocount++;</p><p> if(Zerocount==4)&l
53、t;/p><p> { Zerocount=0;</p><p> if(flagv=="+V")</p><p> { strHDB3.SetAt(i,'x');//x代表-V</p><p> flagv="-V";</p><p> if(fl
54、ag1=="+1")</p><p> { strHDB3.SetAt(i-3,'y');//y代表-B</p><p> flag1="-1";</p><p><b> }</b></p><p><b> }</b></p
55、><p><b> else</b></p><p> { strHDB3.SetAt(i,'X');//X代表+V</p><p> flagv="+V";</p><p> if(flag1=="-1")</p><p> {
56、strHDB3.SetAt(i-3,'Y');//Y代表+B</p><p> flag1="+1";</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p>
57、;<p><b> }</b></p><p><b> }</b></p><p> CString strHDB3Temp=strHDB3;//strAMITemp存放AMI編碼的中間結(jié)果,可以供繪圖時(shí)使用</p><p> strHDB3.Replace("e","
58、-1");//e取代-1</p><p> strHDB3.Replace("E","+1");//E取代+1</p><p> strHDB3.Replace("x","-V");//x取代-v</p><p> strHDB3.Replace("X"
59、;,"+V");//X取代+v</p><p> strHDB3.Replace("y","-B");//y取代-B</p><p> strHDB3.Replace("Y","+B");//Y取代+B</p><p> this->SetDlgItemT
60、ext(IDC_EDIT_OUPUT,strHDB3);//在編碼結(jié)果編輯框中顯示編碼結(jié)果</p><p> pCDrMFrame= (CMainFrame*)this->GetParentFrame();</p><p> pCDrMFrame->CodeChoose="HDB3";</p><p> pCDrMFrame-&
61、gt;Code=strHDB3Temp;</p><p> pCDrMFrame->Invalidate();</p><p> 4.1.3 CMI編碼算法</p><p><b> ?。?)流程圖: </b></p><p><b> (2)具體描述:</b></p>&
62、lt;p> 1)在CMI碼編碼函數(shù)中將編碼碼型標(biāo)識(shí)符號(hào)變量CodeChoose賦值為“CMI”。定義字符串變量strCMI來存儲(chǔ)用GetDlgItemText獲取的輸入信號(hào)和編碼結(jié)果,并定義整形變量SignalLength存儲(chǔ)用GetLength來獲取的輸入信號(hào)長(zhǎng)度,定義變量flag1來保存前一個(gè)1碼的極性。</p><p> 2)然后用for語(yǔ)句對(duì)輸入信號(hào)進(jìn)行檢測(cè),用GetAt(i)來獲取第i位信號(hào),
63、并用if語(yǔ)句進(jìn)行判斷,若輸入信號(hào)為1再判斷前一個(gè)1碼的極性,若前一個(gè)1碼為正,則此輸入信號(hào)1碼應(yīng)編為11,用SetAt將其替換為‘c’(代表11),并將flag1賦值為“-1”保存當(dāng)前1碼的極性。若前一個(gè)1碼為負(fù),則此輸入信號(hào)1碼應(yīng)編為00,用SetAt將其替換為‘C’(代表00),并將flag1賦值為“+1”保存當(dāng)前1碼的極性。若輸入信號(hào)為0則將此碼編為01,用SetAt將其替換為‘o’(代表01).</p><p
64、> 3)設(shè)置好每位輸入信號(hào)后退出for語(yǔ)句,定義變量strCMITemp來保存編碼的中間結(jié)果,以供繪圖使用。用Replace將“c”取代“11”, 將“C”取代“00”, 將“o”取代“01”,用 SetDlgItemText將編碼結(jié)果顯示在編碼結(jié)果編輯框中。使主框架類指針變量pCDrMFrame指向當(dāng)前視圖類的父框架類指針。主框架類的公有成員變量Code存放編碼結(jié)果的中間結(jié)果strCMITemp,并用Invalidate();
65、語(yǔ)句強(qiáng)迫調(diào)用畫圖函數(shù)OnDraw();這就完成了CMI碼的編碼。</p><p><b> 實(shí)現(xiàn)代碼如下:</b></p><p><b> // CMI碼編碼</b></p><p> void CBIANMAView::OnRadioCmi() </p><p> { CodeCho
66、ose="CMI";</p><p> // TODO: Add your control notification handler code here</p><p> this->GetDlgItem(IDC_STATIC_SETPOLAR)->ShowWindow( SW_SHOW );</p><p> this->
67、;GetDlgItem(IDC_STATIC_SETPOLAR)->SetWindowText("CMI碼設(shè)置");</p><p> this->GetDlgItem(IDC_STATIC_POLARV)->ShowWindow( SW_HIDE );</p><p> this->GetDlgItem(IDC_RADIO_POSV)-&g
68、t;ShowWindow( SW_HIDE );</p><p> this->GetDlgItem(IDC_RADIO_NEGV)->ShowWindow( SW_HIDE );</p><p> CString strCMI;</p><p> this->GetDlgItemText(IDC_EDIT_INPUT,strCMI);//取
69、輸入信號(hào)</p><p> CString flag1=polar1;//保存1碼的極性</p><p> int SignalLength=strCMI.GetLength();//獲得輸入信號(hào)的長(zhǎng)度</p><p> for(int i=0;i<SignalLength;i++) //編碼</p><p> { if(st
70、rCMI.GetAt(i)=='1')</p><p> { if(flag1=="+1")</p><p> {strCMI.SetAt(i,'c');//c代表11</p><p> flag1="-1";</p><p><b> }<
71、/b></p><p><b> else </b></p><p> { strCMI.SetAt(i,'C');//E代表00</p><p> flag1="+1";</p><p><b> }</b></p>&l
72、t;p><b> }</b></p><p><b> else</b></p><p> { strCMI.SetAt(i,'o');//E代表01</p><p><b> }</b></p><p><b> }</b&g
73、t;</p><p> CString strCMITemp=strCMI;//strAMITemp存放AMI編碼的中間結(jié)果,可以供繪圖時(shí)使用</p><p> strCMI.Replace("c","11");//c取代11</p><p> strCMI.Replace("C","00&
74、quot;);//C取代00</p><p> strCMI.Replace("o","01");//C取代01</p><p> this->SetDlgItemText(IDC_EDIT_OUPUT,strCMI);//在編碼結(jié)果編輯框中顯示編碼結(jié)果</p><p> pCDrMFrame= (CMainFra
75、me*)this->GetParentFrame();</p><p> pCDrMFrame->CodeChoose="CMI";</p><p> pCDrMFrame->Code=strCMITemp;</p><p> pCDrMFrame->Invalidate();</p><p>
76、;<b> }</b></p><p><b> }</b></p><p> 4.1.4 MANCHESTER編碼算法</p><p><b> ?。?)流程圖: </b></p><p><b> ?。?)具體描述:</b></p>
77、<p> 1)在MANCHESTER碼編碼函數(shù)中將編碼碼型標(biāo)識(shí)符號(hào)變量CodeChoose賦值為“MANCHESTER”。定義字符串變量strMANCHESTER來存儲(chǔ)用GetDlgItemText獲取的輸入信號(hào)和編碼結(jié)果,并定義整形變量SignalLength存儲(chǔ)用GetLength來獲取的輸入信號(hào)長(zhǎng)度。</p><p> 2)然后用for語(yǔ)句對(duì)輸入信號(hào)進(jìn)行檢測(cè),用GetAt(i)來獲取第i位信
78、號(hào),并用if語(yǔ)句進(jìn)行判斷,若輸入信號(hào)為1則此輸入信號(hào)編為10,用SetAt將其替換為‘m’(代表10),若輸入信號(hào)為0則將此碼編為01,用SetAt將其替換為‘M’(代表01).</p><p> 3)設(shè)置好每位輸入信號(hào)后退出for語(yǔ)句,定義變量strMANCHESTERTemp來保存編碼的中間結(jié)果,以供繪圖使用。用Replace將“m”取代“10”, 將“M”取代“01”,用 SetDlgItemText將編
79、碼結(jié)果顯示在編碼結(jié)果編輯框中。使主框架類指針變量pCDrMFrame指向當(dāng)前視圖類的父框架類指針。主框架類的公有成員變量Code存放編碼結(jié)果的中間結(jié)果strMANCHESTERTemp,并用Invalidate();語(yǔ)句強(qiáng)迫調(diào)用畫圖函數(shù)OnDraw();這就完成了MANCHESTER碼的編碼。</p><p><b> 實(shí)現(xiàn)代碼如下:</b></p><p> /
80、/ MANCHESTER碼編碼</p><p> void CBIANMAView::OnRadioManchester() </p><p> { CodeChoose="MANCHESTER";</p><p> CString strMANCHESTER;</p><p> this->GetDlg
81、ItemText(IDC_EDIT_INPUT,strMANCHESTER);//取輸入信號(hào)</p><p> int SignalLength=strMANCHESTER.GetLength();//獲得輸入信號(hào)的長(zhǎng)度</p><p> for(int i=0;i<SignalLength;i++) //編碼</p><p> { if(strMAN
82、CHESTER.GetAt(i)=='1')</p><p> {strMANCHESTER.SetAt(i,'m');//c代表10</p><p><b> }</b></p><p><b> else</b></p><p> { strMANCH
83、ESTER.SetAt(i,'M');//E代表01 </p><p><b> }</b></p><p><b> }</b></p><p> CString strMANCHESTERTemp=strMANCHESTER;//strMANCHESTERTemp存放MANCHESTER編碼的中
84、間結(jié)果,可以供繪圖時(shí)使用</p><p> strMANCHESTER.Replace("m","10");//C取代10</p><p> strMANCHESTER.Replace("M","01");//C取代01</p><p> this->SetDlgItemTe
85、xt(IDC_EDIT_OUPUT,strMANCHESTER);//在編碼結(jié)果編輯框中顯示編碼結(jié)果</p><p> pCDrMFrame= (CMainFrame*)this->GetParentFrame();</p><p> pCDrMFrame->CodeChoose="MANCHESTER";</p><p> p
86、CDrMFrame->Code=strMANCHESTERTemp;</p><p> pCDrMFrame->Invalidate();</p><p><b> }</b></p><p> 4.1.5 隨機(jī)信號(hào)生成算法</p><p> 為了方便信號(hào)生成,本系統(tǒng)還設(shè)計(jì)了可隨用戶自定義長(zhǎng)度的隨機(jī)原
87、始信號(hào)生成算法。</p><p><b> 實(shí)現(xiàn)代碼如下:</b></p><p> void CBIANMAView::OnButton1() </p><p><b> {</b></p><p> // TODO: Add your control notification handl
88、er code here</p><p> UpdateData(1);</p><p> CString str,strtemp;</p><p><b> str="";</b></p><p><b> int j;</b></p><p>
89、 srand( (unsigned)time( NULL ) ); //設(shè)置一個(gè)隨機(jī)起點(diǎn)</p><p> for(int i=0;i<m_edit_long;i++)</p><p><b> {</b></p><p> j=rand()%2;</p><p> strtemp.Format(&q
90、uot;%d",j);</p><p> str=str+strtemp;</p><p><b> }</b></p><p> m_input=str;</p><p> UpdateData(0);</p><p> strtemp.Format("%d&quo
91、t;,m_edit_long);</p><p> str="信號(hào)長(zhǎng)度:"+strtemp;</p><p> (GetDlgItem(IDC_SINGAL_LEN))->SetWindowText(str);</p><p> OnChangeEditInput();</p><p><b> }
92、</b></p><p><b> 4.2、 畫圖設(shè)計(jì)</b></p><p> 為了使用戶能對(duì)編碼結(jié)果能有更形象化的了解,該系統(tǒng)還設(shè)計(jì)了編碼結(jié)果圖形顯示。各種碼型編碼后畫波形由以下程序?qū)崿F(xiàn)。</p><p><b> 實(shí)現(xiàn)代碼如下:</b></p><p> void CDra
93、wView::OnDraw(CDC* pDC)</p><p> { CDocument* pDoc = GetDocument();</p><p> CRect Rect;</p><p> CWnd* pWnd = pDC->GetWindow();</p><p> pWnd->GetWindowRect(Rec
94、t);</p><p> CMainFrame*pCDrMFrame = (CMainFrame*)this->GetParentFrame();</p><p> if(pCDrMFrame->Code.GetLength() == 0)</p><p><b> return;</b></p><p&
95、gt; if(pCDrMFrame->ShowCoodinate) </p><p><b> {</b></p><p> DrawCoordinate(pDC,pCDrMFrame->m_linewith);//畫坐標(biāo)軸</p><p><b> }</b></p><p>
96、 if(pCDrMFrame->ShowDottedLine)</p><p><b> {</b></p><p> DrawDottedLine(pDC,pCDrMFrame->Code.GetLength());//畫虛線</p><p><b> }</b></p><p&g
97、t; if(pCDrMFrame->CodeChoose=="AMI")</p><p><b> {</b></p><p> DrawAMI(pDC, pCDrMFrame->Code, pCDrMFrame->color1, pCDrMFrame->color2, pCDrMFrame->m_linewit
98、h); //畫AMI編碼</p><p> DrawTheCode(pDC,pCDrMFrame->firstCode); //畫輸入信號(hào)原碼</p><p><b> }</b></p><p> if(pCDrMFrame->CodeChoose=="HDB3")</p><p>
99、;<b> {</b></p><p> DrawHDB3(pDC, pCDrMFrame->Code, pCDrMFrame->color1, pCDrMFrame->color2, pCDrMFrame->m_linewith); //畫HDB3編碼</p><p> DrawTheCode(pDC,pCDrMFrame->fi
100、rstCode); //畫輸入信號(hào)原碼</p><p><b> }</b></p><p> if(pCDrMFrame->CodeChoose=="CMI")</p><p><b> {</b></p><p> DrawCMI(pDC, pCDrMFrame
101、->Code, pCDrMFrame->color1, pCDrMFrame->color2, pCDrMFrame->m_linewith); //畫CMI編碼</p><p> DrawTheCode(pDC,pCDrMFrame->firstCode);</p><p><b> }</b></p><p&g
102、t; if(pCDrMFrame->CodeChoose=="MANCHESTER")</p><p><b> {</b></p><p> DrawMANCHESTER(pDC, pCDrMFrame->Code, pCDrMFrame->color1, pCDrMFrame->color2, pCDrMFrame
103、->m_linewith); //畫MANCHESTER編碼</p><p> DrawTheCode(pDC,pCDrMFrame->firstCode);</p><p><b> }</b></p><p><b> }</b></p><p> 五、調(diào)試結(jié)果與現(xiàn)象分析 &
104、lt;/p><p> 程序運(yùn)行效果如圖5.1所示:</p><p> 圖 5.1 系統(tǒng)運(yùn)行效果圖 </p><p> AMI碼編碼運(yùn)行效果如圖5.2所示:</p><p> 圖 5.2 AMI碼編碼運(yùn)行效果圖</p><p> HDB3碼編碼運(yùn)行效果如圖5.3所示:</p><p>
105、; 圖 5.3 HDB3碼編碼運(yùn)行效果圖</p><p> CMI碼編碼運(yùn)行效果如下所示:</p><p> MANCHESTER碼編碼運(yùn)行效果如下圖所示:</p><p> 系統(tǒng)實(shí)現(xiàn)功能:當(dāng)選擇了編碼類型后,在隨機(jī)碼生成個(gè)數(shù)里輸入信號(hào)長(zhǎng)度,點(diǎn)擊生成隨機(jī)碼則生成相應(yīng)的隨機(jī)碼并編碼畫圖;或當(dāng)選擇了編碼類型后,在原碼框內(nèi)輸入信息碼后點(diǎn)擊編碼則會(huì)生成相應(yīng)的編碼
106、并畫圖。由結(jié)果顯示表明系統(tǒng)實(shí)現(xiàn)了設(shè)計(jì)的基本要求,也實(shí)現(xiàn)了系統(tǒng)的擴(kuò)展要求。</p><p><b> 六、系統(tǒng)不足之處</b></p><p> 本系統(tǒng)還存在一些不足之處:</p><p> 1、差分曼徹斯特碼沒有編碼成功。</p><p> 2、編碼波形胖是否顯示編碼結(jié)果的功能沒有做出來。</p>
107、<p><b> 七、心得體會(huì)</b></p><p> 本次設(shè)計(jì)使我對(duì)AMI碼、HDB3碼、CMI碼、曼徹斯特碼和差分曼徹斯特碼等通信基帶碼型的編碼原理有了更深刻的認(rèn)識(shí),對(duì)C++面向?qū)ο蟪绦蛟O(shè)計(jì)也有了更深刻的了解,對(duì)從未接觸過的MFC程序設(shè)計(jì)也有了大概了解。在課程設(shè)計(jì)中通過認(rèn)真聽老師講解,看課件,還有通過MSDN索引,學(xué)會(huì)了如何去應(yīng)用一些函數(shù),如何實(shí)現(xiàn)自己想要的功能。在編程過
108、程中通過不斷出現(xiàn)問題,分析問題和解決問題,自己的糾錯(cuò)能力和編程能力得到了很大的提高。本次設(shè)計(jì)編程代碼比以前所做過的多好多,但是只要明確自己所要實(shí)現(xiàn)的功能,一個(gè)功能一個(gè)功能的去做好,然后再做好各個(gè)功能之間的聯(lián)系,最后綜合好,還是可以把這個(gè)設(shè)計(jì)做得很好的。本次設(shè)計(jì)讓我認(rèn)識(shí)到了編程思路的重要性,編程之前需要整理好一個(gè)編程思路,需要建立一個(gè)編程框架,那樣開始編的時(shí)候才能得心應(yīng)手。還有就是意識(shí)到及時(shí)做好備份保存對(duì)編程者來說還是很重要的。</
109、p><p><b> 八、參考文獻(xiàn)</b></p><p> [1] 樊昌信.通信原理(第5版).北京:國(guó)防工業(yè)大學(xué)出版社,2001</p><p> [2] 陳維興.C++面向?qū)ο蟪绦蛟O(shè)計(jì)教程(第2版).北京:清華大學(xué)出版社,2004.8</p><p> [3] 鄭阿奇.Visual C++實(shí)用教程(第3版).北
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 軟件課程設(shè)計(jì)報(bào)告
- 軟件課程設(shè)計(jì)報(bào)告
- 軟件課程設(shè)計(jì)報(bào)告(opc)
- 軟件測(cè)試課程設(shè)計(jì)報(bào)告
- 通原課程設(shè)計(jì)--pcm編碼報(bào)告
- 哈夫曼編碼課程設(shè)計(jì)報(bào)告
- 軟件工程課程設(shè)計(jì)報(bào)告
- vc++軟件課程設(shè)計(jì)報(bào)告
- 軟件綜合課程設(shè)計(jì)報(bào)告模板
- 軟件工程課程設(shè)計(jì)報(bào)告
- 數(shù)字基帶傳輸系統(tǒng)課程設(shè)計(jì)
- 編碼解碼 課程設(shè)計(jì)
- huffman編碼課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告---赫夫曼編碼
- 軟件工程課程設(shè)計(jì)報(bào)告模板
- [封面] 《軟件工程》課程設(shè)計(jì)報(bào)告
- 軟件工程課程設(shè)計(jì)個(gè)人報(bào)告
- 課程設(shè)計(jì)報(bào)告--純軟件設(shè)計(jì)出題程序
- 軟件工程課程設(shè)計(jì)-《社團(tuán)管理系統(tǒng)》課程設(shè)計(jì)報(bào)告書
- protel軟件課程設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論