基帶編碼軟件課程設計設計報告_第1頁
已閱讀1頁,還剩19頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p><b>  課程設計報告書</b></p><p>  設計題目 : 基帶碼型編碼軟件 </p><p>  學院(系): 物理與電子工程學院 </p><p>  專 業(yè): 通信工程

2、 </p><p>  年級班級 : 2006級通信工程(1)班 </p><p>  學 號:    </p><p>  學生姓名 : XXX </p><p>  起止日期 :

3、2011年8月29日至2011年9月16日 </p><p>  指導教師: XXX </p><p><b>  內容摘要:</b></p><p>  數字基帶傳輸是數字傳輸技術的一種基本形式,是研究數字頻帶傳輸系統(tǒng)的基礎。數字基帶碼型的選擇對于數字基帶傳輸系統(tǒng)的性能具有重要意義

4、。基于AMI碼、HDB3碼、CMI碼、曼切斯特碼、差分曼切斯特碼的編碼原理,用Visual C++6.0設計AMI碼、HDB3碼、CMI碼、曼切斯特碼、差分曼切斯特碼的編碼軟件,能夠根據用戶輸入的二進制信息序列及設定的編碼類型給出對應的編碼結果,并以圖形化的方式顯示出波形來。本軟件編碼器詳細敘述了其相關編碼算法和關鍵技術,系統(tǒng)以MFC的單文檔為模板,界面設計人性化,操作簡易明了。編碼算法有多種參數設置。對學習AMI、HDB3碼、CMI碼

5、、曼切斯特碼、差分曼切斯特碼有很大的幫助,使學習者可以更加直觀了認識這幾個碼型的編碼規(guī)則,同時也可以應用于實際中某些適合這類碼型傳輸的系統(tǒng),為這些系統(tǒng)提供編碼使其更利于傳輸。</p><p><b>  關鍵詞:</b></p><p>  Visual C++6.0,HDB3,AMI,CMI,曼切斯特碼,編碼器,隨機碼,極性,線條寬度,顏色,波形</p>

6、<p><b>  目 錄</b></p><p><b>  一、設計要求:4</b></p><p><b>  二、設計意義:4</b></p><p><b>  三、設計原理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)設計方法分析5</p><p>  3.6、系統(tǒng)的設計思路5</p><p>  四、系統(tǒng)的具體設計與實現(xiàn)6<

8、;/p><p>  4.1編碼算法設計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、機信號生成算法14</p><p>  4.2、 畫圖設計14</p><p>  五、調試結果與現(xiàn)象分析15</p><p>  六、系統(tǒng)不足之處18</p><p><b>  七、心得體會18</b></p><p><b>  八、參考文獻19</b>&l

10、t;/p><p><b>  一、設計要求:</b></p><p>  基本要求:用C++等高級語言設計AMI碼、HDB3碼的編碼軟件,要求能根據用戶輸入的二進制信息序列及設定的編碼類型給出對應的編碼結果,并以圖形化的方式顯示出波形來。能夠設置一些參數:如線的顏色、寬度;能夠控制是否顯示網格線、是否在編碼波形旁邊顯示其編碼結果等。能產生由用戶設定信息序列長度的隨機序列,

11、并給出此序列的編碼結果,并以圖形化的方式顯示出波形來。</p><p>  擴展要求:能夠對其它常見基帶碼型,如Manchester碼、差分Manchester碼、多電平碼等進行編碼和顯示。 </p><p><b>  二、設計意義:</b></p><p>  通過本次課程設計,系統(tǒng)了解和掌握通信系統(tǒng)的基帶碼型編碼軟件設計過程、方法及實現(xiàn);

12、掌握運用C++高級語言設計通信軟件的方法,為以后設計和實現(xiàn)通信系統(tǒng)打下良好基礎。</p><p><b>  三、設計原理</b></p><p>  3.1、 AMI碼</p><p>  AMI碼全稱是傳號交替反轉碼。其編碼規(guī)則是將二進制消息代碼“1”(傳號)交替地變換為傳輸碼的“+1”和“-1”,而“0”(空號)保持不變。例如</

13、p><p>  AMI碼對應的基帶信號是正負極性交替的脈沖序列,而0電位持不變的規(guī)律。AMI碼的優(yōu)點是,由于+1與-1 交替, AMI碼的功率譜中不含直流成分,高、低頻分量少,能量集中在頻率為1/2碼速處。位定時頻率分量雖然為0,但只要將基帶信號經全波整流變?yōu)閱螛O性歸零波形,便可提取位定時信號。此外,AMI碼的編譯碼電路簡單,便于利用傳號極性交替規(guī)律觀察誤碼情況。鑒于這些優(yōu)點,AMI碼是CCITT建議采用的傳輸碼性之

14、一。 </p><p>  AMI碼的不足是,當原信碼出現(xiàn)連“0”串時,信號的電平長時間不跳變,造成提取定時信號的困難。解決連“0”碼問題的有效方法之一是采用HDB3碼。 </p><p>  3.2、HDB3碼</p><p>  HDB3碼的全稱是三階高密度雙極性碼,它是AMI碼的一種改進型, 其目的是為了保持AMI碼的優(yōu)點而克服其缺點, 使連“0”個數不超

15、過3個。其編碼規(guī)則如下: </p><p> ?。?) 當信碼的連“0”個數不超過3時,仍按AMI碼的規(guī)則編,即傳號極性交替;  (2)當連“0”個數超過3時,則將第4個“0”改為非“0”脈沖,記為+V或-V,稱</p><p>  之為破壞脈沖。相鄰V碼的極性必須交替出現(xiàn),以確保編好的碼中無直流;</p><p>  (3)為了便于識別, V碼的極性

16、應與其前一個非“0”脈沖的極性相同,否則,將四連“0”的第一個“0”更改為與該破壞脈沖相同極性的脈沖,并記為+B或-B;</p><p> ?。?) 破壞脈沖之后的傳號碼極性也要交替。 例如: </p><p>  其中的±V脈沖和±B脈沖與±1脈沖波形相同,用V或B符號的目的是為了示意是將原信碼的“0”變換成“1”碼。 </p><p&

17、gt;  雖然HDB3碼的編碼規(guī)則比較復雜,但譯碼卻比較簡單。 從上述原理看出,每一個破壞符號V總是與前一非0符號同極性(包括B在內)。這就是說,從收到的符號序列中可以容易地找到破壞點V,于是也斷定V符號及其前面的3個符號必是連0符號,從而恢復4個連0碼,再將所有-1變成+1后便得到原消息代碼。 </p><p>  HDB3碼保持了AMI碼的優(yōu)點外,同時還將連“0”碼限制在3個以內,故有利于位定時信號的提取。H

18、DB3碼是應用最為廣泛的碼型,A律PCM四次群以下的接口碼型均為HDB3碼。</p><p><b>  3.3 CMI碼</b></p><p>  CMI碼是傳號反轉碼的簡稱,與雙相碼類似,它也是一種雙極性二電平碼。其編碼規(guī)則是:“1”碼交替用“11”和“00”兩位碼表示;“0”碼固定地用“01”表示。例如:</p><p>  CMI碼易

19、于實現(xiàn),含有豐富的定時信息。此外,由于10喂禁用碼組,不會出現(xiàn)三個以上的連碼,這個規(guī)律可用于宏觀檢錯。</p><p><b>  3.4曼徹斯特碼</b></p><p>  曼徹斯特碼即雙性碼,它用一個周期的正負對稱方波表示“0”,而用其反相波形表示“1”。編碼規(guī)則之一是:“1”碼用“10”兩位碼表示;“0”碼用“01”表示。例如:</p><

20、p>  其波形是一種雙極性NRZ波形,只有極性相反的兩個電平。它在每個碼元間隔的中心點都存在電平跳變,所以含有豐富的位定時信息,且沒有直流分量,編碼過程也簡單。缺點是占用帶寬加倍,使頻帶利用率降低。</p><p>  3.5、系統(tǒng)設計方法及系統(tǒng)主要功能概述</p><p>  在該編碼系統(tǒng)設計中,我們采用了面向對象的技術。基于AMI碼、HDB3碼、CMI碼和曼徹斯特碼的編碼原理,

21、本編碼器采用Visual C++6.0設計。所采用編譯器的是Visual C++6.0,它是微軟開發(fā)的基于Windows下的面向對像的編程軟件,它有著強大的MFC支持,在可視化設計方面有著強大的優(yōu)勢,并且高度支持C++標準,是一個進行C++編程的超強集成環(huán)境。</p><p>  本設計為實現(xiàn)用戶友好交互信息,采用拆分單文檔實現(xiàn),一部分實現(xiàn)用戶輸入信息序列及相關信息的顯示,另一部分實現(xiàn)編碼結果圖形顯示。本設計中用

22、戶可有AMI碼、HDB3碼、CMI碼和曼徹斯特碼四種編碼類型可選擇。并能對前一個1碼或前一個v碼的正負極性,坐標軸與分割線的顯示與否,圖形線條寬度、顏色等相關參數進行設置。輸入原始信號,系統(tǒng)經過特定算法編碼給出編碼結果并畫出編碼波形給與用戶形象化的結果。系統(tǒng)會實時對用戶所做的操作進行結果反饋,有很好的用戶交互性。</p><p>  3.6、系統(tǒng)的設計思路</p><p>  軟件編碼器的

23、基本操作流程是:用戶選擇編碼類型并設置相關參數設置,然后輸入原始信號(或通過隨機碼按鈕產生相應長度的隨機碼信號),系統(tǒng)經過特定算法編碼給出編碼結果并畫出編碼波形給與用戶形象化的結果。系統(tǒng)會實時對用戶所做的操作進行結果反饋,有很好的用戶交互性。根據上述分析,系統(tǒng)結構如圖3.4.1所示</p><p><b>  圖3.4.1</b></p><p>  用戶層提供用戶與

24、仿真系統(tǒng)交互的接口。</p><p>  系統(tǒng)層根據接口層的輸入,建立仿真模塊的動態(tài)模型,并調用相應的算法返回仿真結果。</p><p>  數據層存儲仿真層運行算法處理的各種中間數據。</p><p>  四、系統(tǒng)的軟件設計流程及描述</p><p><b>  4.1編碼算法設計</b></p><

25、;p>  4.1.1 AMI編碼算法</p><p><b> ?。?)流程圖:</b></p><p><b>  (2)具體描述:</b></p><p>  1)在AMI碼編碼函數中將編碼碼型標識符號變量CodeChoose賦值為“AMI”。定義字符串變量strAMI來存儲用GetDlgItemText獲取的輸

26、入信號和編碼結果,并定義整形變量SignalLength存儲用GetLength來獲取的輸入信號長度,定義變量flag1來保存前一個1碼的極性。</p><p>  2)然后用for語句對輸入信號進行檢測,用GetAt(i)來獲取第i位信號,并用if語句進行判斷,若輸入信號為1再判斷前一個1碼的極性,若前一個1碼為正,則此輸入信號1碼應編為負極性碼,用SetAt將其替換為‘e’(代表-1),并將flag1賦值為“

27、-1”保存當前1碼的極性。若前一個1碼為負,則此輸入信號1碼應編為正極性碼,用SetAt將其替換為‘E’(代表+1),并將flag1賦值為“+1”保存當前1碼的極性。</p><p>  3)設置好每位輸入信號后退出for語句,定義變量strAMITemp來保存編碼的中間結果,以供繪圖使用。用Replace將“e”取代“-1”, 將“E”取代“+1”,用 SetDlgItemText將編碼結果顯示在編碼結果編輯框

28、中。使主框架類指針變量pCDrMFrame指向當前視圖類的父框架類指針。主框架類的公有成員變量Code存放編碼結果的中間結果strAMITemp,并用Invalidate();語句強迫調用畫圖函數OnDraw();這就完成了AMI碼的編碼。</p><p> ?。?)實現(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碼設置");</p><p>  this->GetDlgItem(IDC_STATIC_POLARV)->ShowWin

31、dow(SW_HIDE);//隱藏前一個V碼極性的選項</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);//取輸入信號</p><p>  CString flag1=polar1;//保存1碼的極性</p><p>  int SignalLength=strAMI.GetLength();//獲得輸入信號的長度</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編碼的中間結果,可以供繪圖時使用strAMI.Replace("e","-1");//e取代-1</p><p>  strAMI.Replace("E","+1");//E取代+1</p><p>  this->Set

37、DlgItemText(IDC_EDIT_OUPUT,strAMI);//在編碼結果編輯框中顯示編碼結果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>  (2)具體描述:</b></p><p>  1)在

39、HDB3碼編碼函數中將編碼碼型標識符號變量CodeChoose賦值為“HDB3”。定義字符串變量stHDB3來存儲用GetDlgItemText獲取的輸入信號和編碼結果,并定義整形變量SignalLength存儲用GetLength來獲取的輸入信號長度,定義變量flag1來保存前一個1碼的極性, flagv來保存前一個v碼的極性,Zerocount來計算連0個數。</p><p>  2)然后用for語句對輸入信

40、號進行檢測,用GetAt(i)來獲取第i位信號,并用if語句進行判。</p><p>  3)若輸入信號為1,Zerocount清0,再判斷前一個1碼的極性,若前一個1碼為正,則此輸入信號1碼應編為負極性碼,用SetAt將其替換為‘e’(代表-1),并將flag1賦值為“-1”保存當前1碼的極性。若前一個1碼為負,則此輸入信號1碼應編為正極性碼,用SetAt將其替換為‘E’(代表+1),并將flag1賦值為“+1

41、”保存當前1碼的極性。</p><p>  4)若輸入信號為0,Zerocount+1,判斷Zerocount是否等于4,若等于4,判斷前一個V碼極性.。若為+V將第四個0替換為x(代表-V),并將flagv賦值為-V,再判斷此時的前一個1碼極性,若為正極性,則將第一個0碼替換為y(代表-B),并將flag1賦值為-1。若為-V將第四個0替換為X(代表+V),并將flagv賦值為+V,再判斷此時的前一個1碼極性,

42、若為正負極性,則將第一個0碼替換為Y(代表+B),并將flag1賦值為+1。</p><p>  5)設置好每位輸入信號后退出for語句,定義變量strHDB3Temp來保存編碼的中間結果,以供繪圖使用。用Replace將“e”取代“-1”, 將“E”取代“+1”, “x”取代“-V”, “X”取代“+V”, “y”取代“-B”, “Y”取代“+B”,用 SetDlgItemText將編碼結果顯示在編碼結果編輯框

43、中。使主框架類指針變量pCDrMFrame指向當前視圖類的父框架類指針。主框架類的公有成員變量Code存放編碼結果的中間結果strHDB3Temp,并用Invalidate();語句強迫調用畫圖函數OnDraw();這就完成了HDB3碼的編碼。</p><p><b>  實現(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碼設置");</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);//取輸入信號</p><p>  CString flag1=polar1;//保存1碼的極性</p><p>  CString flagv=polarv;//保存v碼的極性&l

49、t;/p><p>  int Zerocount=0;//計算連零個數</p><p>  int SignalLength=strHDB3.GetLength();//獲得輸入信號的長度</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編碼的中間結果,可以供繪圖時使用</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);//在編碼結果編輯框中顯示編碼結果</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碼編碼函數中將編碼碼型標識符號變量CodeChoose賦值為“CMI”。定義字符串變量strCMI來存儲用GetDlgItemText獲取的輸入信號和編碼結果,并定義整形變量SignalLength存儲用GetLength來獲取的輸入信號長度,定義變量flag1來保存前一個1碼的極性。</p><p>  2)然后用for語句對輸入信號進行檢測,用GetAt(i)來獲取第i位信號,

63、并用if語句進行判斷,若輸入信號為1再判斷前一個1碼的極性,若前一個1碼為正,則此輸入信號1碼應編為11,用SetAt將其替換為‘c’(代表11),并將flag1賦值為“-1”保存當前1碼的極性。若前一個1碼為負,則此輸入信號1碼應編為00,用SetAt將其替換為‘C’(代表00),并將flag1賦值為“+1”保存當前1碼的極性。若輸入信號為0則將此碼編為01,用SetAt將其替換為‘o’(代表01).</p><p

64、>  3)設置好每位輸入信號后退出for語句,定義變量strCMITemp來保存編碼的中間結果,以供繪圖使用。用Replace將“c”取代“11”, 將“C”取代“00”, 將“o”取代“01”,用 SetDlgItemText將編碼結果顯示在編碼結果編輯框中。使主框架類指針變量pCDrMFrame指向當前視圖類的父框架類指針。主框架類的公有成員變量Code存放編碼結果的中間結果strCMITemp,并用Invalidate();

65、語句強迫調用畫圖函數OnDraw();這就完成了CMI碼的編碼。</p><p><b>  實現(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碼設置");</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、輸入信號</p><p>  CString flag1=polar1;//保存1碼的極性</p><p>  int SignalLength=strCMI.GetLength();//獲得輸入信號的長度</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編碼的中間結果,可以供繪圖時使用</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);//在編碼結果編輯框中顯示編碼結果</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>  (1)流程圖: </b></p><p><b> ?。?)具體描述:</b></p>

77、<p>  1)在MANCHESTER碼編碼函數中將編碼碼型標識符號變量CodeChoose賦值為“MANCHESTER”。定義字符串變量strMANCHESTER來存儲用GetDlgItemText獲取的輸入信號和編碼結果,并定義整形變量SignalLength存儲用GetLength來獲取的輸入信號長度。</p><p>  2)然后用for語句對輸入信號進行檢測,用GetAt(i)來獲取第i位信

78、號,并用if語句進行判斷,若輸入信號為1則此輸入信號編為10,用SetAt將其替換為‘m’(代表10),若輸入信號為0則將此碼編為01,用SetAt將其替換為‘M’(代表01).</p><p>  3)設置好每位輸入信號后退出for語句,定義變量strMANCHESTERTemp來保存編碼的中間結果,以供繪圖使用。用Replace將“m”取代“10”, 將“M”取代“01”,用 SetDlgItemText將編

79、碼結果顯示在編碼結果編輯框中。使主框架類指針變量pCDrMFrame指向當前視圖類的父框架類指針。主框架類的公有成員變量Code存放編碼結果的中間結果strMANCHESTERTemp,并用Invalidate();語句強迫調用畫圖函數OnDraw();這就完成了MANCHESTER碼的編碼。</p><p><b>  實現(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);//取輸入信號</p><p>  int SignalLength=strMANCHESTER.GetLength();//獲得輸入信號的長度</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、間結果,可以供繪圖時使用</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);//在編碼結果編輯框中顯示編碼結果</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 隨機信號生成算法</p><p>  為了方便信號生成,本系統(tǒng)還設計了可隨用戶自定義長度的隨機原

87、始信號生成算法。</p><p><b>  實現(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 ) ); //設置一個隨機起點</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="信號長度:"+strtemp;</p><p>  (GetDlgItem(IDC_SINGAL_LEN))->SetWindowText(str);</p><p>  OnChangeEditInput();</p><p><b>  }

92、</b></p><p><b>  4.2、 畫圖設計</b></p><p>  為了使用戶能對編碼結果能有更形象化的了解,該系統(tǒng)還設計了編碼結果圖形顯示。各種碼型編碼后畫波形由以下程序實現(xiàn)。</p><p><b>  實現(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);//畫坐標軸</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); //畫輸入信號原碼</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); //畫輸入信號原碼</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>  五、調試結果與現(xiàn)象分析 &

104、lt;/p><p>  程序運行效果如圖5.1所示:</p><p>  圖 5.1 系統(tǒng)運行效果圖 </p><p>  AMI碼編碼運行效果如圖5.2所示:</p><p>  圖 5.2 AMI碼編碼運行效果圖</p><p>  HDB3碼編碼運行效果如圖5.3所示:</p><p>

105、;  圖 5.3 HDB3碼編碼運行效果圖</p><p>  CMI碼編碼運行效果如下所示:</p><p>  MANCHESTER碼編碼運行效果如下圖所示:</p><p>  系統(tǒng)實現(xiàn)功能:當選擇了編碼類型后,在隨機碼生成個數里輸入信號長度,點擊生成隨機碼則生成相應的隨機碼并編碼畫圖;或當選擇了編碼類型后,在原碼框內輸入信息碼后點擊編碼則會生成相應的編碼

106、并畫圖。由結果顯示表明系統(tǒng)實現(xiàn)了設計的基本要求,也實現(xiàn)了系統(tǒng)的擴展要求。</p><p><b>  六、系統(tǒng)不足之處</b></p><p>  本系統(tǒng)還存在一些不足之處:</p><p>  1、差分曼徹斯特碼沒有編碼成功。</p><p>  2、編碼波形胖是否顯示編碼結果的功能沒有做出來。</p>

107、<p><b>  七、心得體會</b></p><p>  本次設計使我對AMI碼、HDB3碼、CMI碼、曼徹斯特碼和差分曼徹斯特碼等通信基帶碼型的編碼原理有了更深刻的認識,對C++面向對象程序設計也有了更深刻的了解,對從未接觸過的MFC程序設計也有了大概了解。在課程設計中通過認真聽老師講解,看課件,還有通過MSDN索引,學會了如何去應用一些函數,如何實現(xiàn)自己想要的功能。在編程過

108、程中通過不斷出現(xiàn)問題,分析問題和解決問題,自己的糾錯能力和編程能力得到了很大的提高。本次設計編程代碼比以前所做過的多好多,但是只要明確自己所要實現(xiàn)的功能,一個功能一個功能的去做好,然后再做好各個功能之間的聯(lián)系,最后綜合好,還是可以把這個設計做得很好的。本次設計讓我認識到了編程思路的重要性,編程之前需要整理好一個編程思路,需要建立一個編程框架,那樣開始編的時候才能得心應手。還有就是意識到及時做好備份保存對編程者來說還是很重要的。</

109、p><p><b>  八、參考文獻</b></p><p>  [1] 樊昌信.通信原理(第5版).北京:國防工業(yè)大學出版社,2001</p><p>  [2] 陳維興.C++面向對象程序設計教程(第2版).北京:清華大學出版社,2004.8</p><p>  [3] 鄭阿奇.Visual C++實用教程(第3版).北

溫馨提示

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

評論

0/150

提交評論