




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
2012年數(shù)字通信計(jì)算機(jī)仿真圖1數(shù)字通信系統(tǒng)框圖首先,在發(fā)送端將輸入的數(shù)字序列通過編碼器轉(zhuǎn)換為二進(jìn)制,形成數(shù)字基帶號(hào),接著通過低通濾波器濾除高頻干擾信號(hào),再通過調(diào)制器進(jìn)行振幅調(diào)制。其次,將信號(hào)發(fā)送即經(jīng)過信道進(jìn)行傳輸,在傳輸過程中有噪聲的加入。最后,在接收端將收到的信號(hào)先通過帶通濾波器濾除低、高頻干擾信號(hào),接著進(jìn)行同步解調(diào),再進(jìn)行低通濾波,最后進(jìn)行抽樣判決得到發(fā)送的信號(hào)。1.低通濾波器窗函數(shù)⑴漢寧(Hanning)窗升余弦窗(n1.低通濾波器窗函數(shù)⑴漢寧(Hanning)窗升余弦窗(n)=0.51-cosG兀n/(N一1)TR(n)wH
n主瓣寬度為8n/N,第一旁瓣比主瓣低31dB。⑵哈明(Hamming)改進(jìn)的升余弦窗(n)=0.54-0.46cos(1)(2nn!(N-1))]R(n)」NwHn主瓣寬度為8n/N,第一旁瓣比主瓣低40Db。(3)布萊克曼(Blackman)窗(n)=0.42-0.5cosG兀n/(N-1))+0.08cos(4兀n:(N-1))]」(n)(2)(3)主瓣寬度為12n/N,第一旁瓣比主瓣低57dB。(4)(4)(9)(9)2.調(diào)制調(diào)制信號(hào)可以看成一個(gè)雙極性矩形脈沖序列與正弦載波相乘即e(t)二COSwtce(t)二COSwtcnSn其中g(shù)(t)持續(xù)時(shí)間為Ts的脈沖序列,而an的取值服從下述關(guān)系卜1其中g(shù)(t)持續(xù)時(shí)間為Ts的脈沖序列,而an的取值服從下述關(guān)系卜1;概率為pa=<n[1;概率為1-p若令則上式變?yōu)閟(t)=Yag(t-nT)nSne(t)=s(t)COswt(5)(6)(7)c圖2數(shù)字線性調(diào)制方框圖基帶信號(hào)形成器把數(shù)字序列{an}轉(zhuǎn)換成所需的基帶矩形脈沖序列,與載波相乘后即把其頻譜搬移到土fc附近,實(shí)現(xiàn)了ASK/PSK。3.頻率采樣法設(shè)待設(shè)計(jì)的濾波器的傳輸函數(shù)用H(ejro)表示,對(duì)它在3=0和?=2n之間等間隔采樣N點(diǎn),得到Hd(k)H(k)=H(ejw),k=0,1,...,N-1(8)d宀(8)N再對(duì)N點(diǎn)Hd(k)進(jìn)行IDFT,得到h(n)h(n)=£H(k)ejnkn,n=0,1,...,N—1k=0k=04.解調(diào)圖4.解調(diào)圖3ASK信號(hào)的相干解調(diào)z(t)=y(t)coswtc=s(t)cOS2wtc=sG)(1+cos2wt)/2c'=—s(t)+—s(t)cos(2wt)(—0)22c(—0)5.MFC概述MFC是用來編寫Windows應(yīng)用程序的C++類庫,該類以層次結(jié)構(gòu)組織起來,其中封裝了大部分WindowsAPI函數(shù)和Windows控件,它所包含的功能涉及到整個(gè)Windows操作系統(tǒng)。不僅為用戶提供了Windows圖形環(huán)境下應(yīng)用程序的框架,而且還提供了創(chuàng)建應(yīng)用程序的組件。使用MFC類庫和VisualC++提供的高度可視的應(yīng)用程序開發(fā)工具,可使應(yīng)用程序變得更簡(jiǎn)單,開發(fā)周期極大地縮短,提高了代碼的可靠性和可重用性。VisualC++6.0為了減輕程序員的工作量,特別增強(qiáng)了應(yīng)用程序向?qū)У墓δ?。?yīng)用程序向?qū)槌绦騿T提供了一個(gè)基于MFC的應(yīng)用程序框架,程序員可以在此基礎(chǔ)上添加實(shí)現(xiàn)特定功能的代碼。通過應(yīng)用程序向?qū)Ы?yīng)用程序框架一般可以通過以下步驟來實(shí)現(xiàn):在File菜單下選擇New,在New對(duì)話框中選擇MFCAppWizard(exe),在ProjectName文本輸入框中輸入新建的項(xiàng)目名,如Huangweitong后單擊按鈕。在彈出的MFCAppWizard-Step1對(duì)話框中可以設(shè)置應(yīng)用程序的類型,指定應(yīng)用程序的結(jié)構(gòu)是否采用文檔視圖結(jié)構(gòu),以及資源文件所使用的語種等。應(yīng)用程序的類型包括以下幾種:Singledocument單文檔應(yīng)用程序。Multipledocument多文檔應(yīng)用程序。Dialogdocument基于對(duì)話框的應(yīng)用程序。應(yīng)用程序資源文件所使用的語種可以通過下拉列表選擇,在中國(guó)一般都選擇中文作為資源文件的語種。在設(shè)置好上述選項(xiàng)后,單擊Next按鈕,將彈出MFCAppWizard-Step2of6對(duì)話框。在MFCAppWizard-Step2of6對(duì)話框中可以設(shè)置應(yīng)用程序所使用的數(shù)據(jù)庫支持,它可以是以下值之一:None在應(yīng)用程序中忽略所有的數(shù)據(jù)庫支持。Headerfilesonly包括定義基本數(shù)據(jù)庫類的頭文件,但不創(chuàng)建對(duì)應(yīng)訂制表的數(shù)據(jù)庫類或視圖類。Databaseviewwithoutfilesupport創(chuàng)建對(duì)應(yīng)指定表的一個(gè)數(shù)據(jù)庫類和一個(gè)視圖類,不附加標(biāo)準(zhǔn)文件支持。Databaseviewwithfilesupport創(chuàng)建對(duì)應(yīng)指定表的一個(gè)數(shù)據(jù)庫類和一個(gè)視圖類,并附加標(biāo)準(zhǔn)文件支持。設(shè)置好應(yīng)用程序的數(shù)據(jù)庫支持后,單擊Next按鈕,將彈出MFCAppWizard-Step3of6對(duì)話框。在MFCAppWizard-Step3of6對(duì)話框中可以設(shè)置應(yīng)用程序所支持的復(fù)合文檔類型。這一步使程序員可以向應(yīng)用程序中加入OLE支持。設(shè)置好應(yīng)用程序?qū)LE的支持后,用戶單擊Next按鈕將進(jìn)入MFCAppWizard-Step4of6對(duì)話框。在MFCAppWizard-Step4of6對(duì)話框中用戶可以設(shè)置應(yīng)用程序的外觀,其中可以配置的選項(xiàng)如下:Dockingtoolbar一個(gè)工具欄。Initialstatusbar一個(gè)初始狀態(tài)欄。Printingandprintpreview打印和打印預(yù)覽支持。Context-sensitiveHelp上下文相關(guān)幫助。3Dcontrols使用3D控件。MAPI(MessagingAPI)是否使用消息API。WindowsSockets是否使用Windows套接字。在MFCAppWizard-Step4of6對(duì)話框中還可以設(shè)置工具欄的外觀,它可以是以下兩個(gè)值之一:Normal普通的工具欄。InternetExplorerReBars具有風(fēng)格的工具欄。同時(shí)還可以在MFCAppWizard-Step4of6對(duì)話框中設(shè)置需要顯示的最近使用的文件個(gè)數(shù)。在設(shè)置好上述選項(xiàng)后,單擊Next按鈕將彈出MFCAppWizard-Step5of6對(duì)話框。在MFCAppWizard-Step5of6對(duì)話框中可以設(shè)置應(yīng)該用程序的風(fēng)格,它可以是下面兩個(gè)值之一:MFCStandard標(biāo)準(zhǔn)的MFC應(yīng)用程序。WindowsExplorer具有WindowsExplorer風(fēng)格的應(yīng)用程序。在MFCAppWizard-Step5of6對(duì)話框中還可以設(shè)置是否在應(yīng)用程序向?qū)傻拇a中加注釋。它可以是下面兩個(gè)值之一:Yes,please在向?qū)傻拇a中加注注釋。No,thankyou在向?qū)傻拇a中不加注釋。同時(shí)在MFCAppWizard-Step5of6對(duì)話框中還可以設(shè)置使用MFC庫文件的方式,它可以是下面兩個(gè)值之一:AsasharedDLL以共享動(dòng)態(tài)鏈接庫的方式使用MFC庫文件。Asastaticallylinkedlibrary以靜態(tài)鏈接庫的方式使用MFC庫文件。在設(shè)置好上述選項(xiàng)后,單擊Next按鈕將進(jìn)入AppWizard-Step6of6對(duì)話框。在MFCAppWizard-Step6of6對(duì)話框中可以設(shè)置向?qū)傻奈募皖惷T谠O(shè)置好文件名和類名后,單擊Finish按鈕,彈出NewProjectInformation對(duì)話框,在該對(duì)話框中列出了關(guān)于新建立的應(yīng)用程序項(xiàng)目文件的相關(guān)信息。這樣應(yīng)用程序向?qū)械墓ぷ骶腿客瓿闪?,這時(shí)向?qū)б呀?jīng)為用戶生成了一個(gè)可執(zhí)行的應(yīng)用程序框架。6.基于對(duì)話框的應(yīng)用程序的創(chuàng)建對(duì)話框(Dialog)在Windows應(yīng)用程序中無處不在,起著非常重要的作用,它是用戶與應(yīng)用程序的主要交互途徑。它主要用來接收用戶輸入,對(duì)話框?qū)嶋H上是一個(gè)真正的窗口,不但可以接收消息,而且還可以被移動(dòng)和關(guān)閉,甚至可以在它的用戶區(qū)中進(jìn)行繪圖操作。在MFC中對(duì)話框被封裝在CDialog類中,CDialog類是CWnd類的派生類。對(duì)話框分為模態(tài)對(duì)話框和非模態(tài)對(duì)話框兩種。當(dāng)程序建立一對(duì)話框時(shí),就必須決定該對(duì)話框是模態(tài)的還是非模態(tài)的。從編程的觀點(diǎn)看,意味著要在建立和撤消兩個(gè)對(duì)話框之間進(jìn)行選擇;從用戶觀點(diǎn)來看,對(duì)話框的模式影響到在對(duì)話框可見的情況下是否可進(jìn)行其他工作的問題。模式是指對(duì)話框不同狀態(tài)的一個(gè)術(shù)語。模態(tài)對(duì)話框壟斷了用戶的輸入,當(dāng)一個(gè)模態(tài)對(duì)話框打開時(shí),它建立自己的消息循環(huán),使得用戶只能與計(jì)算機(jī)進(jìn)行交互,而其它的用戶界面對(duì)象收不到輸入信息。我們平時(shí)所遇到的大部分對(duì)話框都是模態(tài)對(duì)話框。非模態(tài)對(duì)話框不壟斷用戶的輸入,當(dāng)一個(gè)非模態(tài)對(duì)話框打開時(shí),它不建立自己的消息循環(huán),而是和應(yīng)用程序共用同一個(gè)消息循環(huán),這樣一來用戶不僅能與該對(duì)話框進(jìn)行交互,而且能與其它用戶界面對(duì)象進(jìn)行交互。第一,建立應(yīng)用程序的項(xiàng)目文件。用MFC的AppWizard建立一個(gè)應(yīng)用程序時(shí),首先要生成該應(yīng)用程序的項(xiàng)目文件。其步驟如下:在VisualC++的主菜單欄中選擇File菜單中的New選項(xiàng)。出現(xiàn)一個(gè)New對(duì)話框,該窗口中有4個(gè)選項(xiàng)卡:Files、Projects、Workspaces和OtherDocuments。選擇Projects選項(xiàng)卡,并在該選項(xiàng)卡中選擇MFCAppWizard(exe)項(xiàng)。在ProjectName編輯框中輸入要?jiǎng)?chuàng)建的項(xiàng)目的名稱。(4)Location編輯框中描述的是存放該項(xiàng)目文件的路徑(位置),這可以根據(jù)用戶需要,輸入自己希望存放該文件的位置。在Platforms編輯框中選擇Win32,我們使用的是在32位操作系統(tǒng)。確定項(xiàng)目文件的類型、名稱和路徑選項(xiàng)后,單擊OK按鈕,就可以開始制作該項(xiàng)目文件了。VisualC++顯示MFCAppWizard-Step1的窗口。這是生成項(xiàng)目文件的第一步,在這一步中,用戶將選擇創(chuàng)建什么類型的應(yīng)用程序以及資源文件使用什么語言。首先因?yàn)槲覀円傻膽?yīng)用程序是基于對(duì)話框的應(yīng)用程序,所以在“Whattypeofapplicationwouldyouliketocreat?”中,選擇Dialogbased選項(xiàng)。然后在“Whatlanguagewouldyouliketoyourresourcesin?”中,選擇“中文【中國(guó)】APPWZCHS.DLL”項(xiàng)。最后單擊Next按鈕,進(jìn)入下一步。VisualC++顯示一個(gè)MFCAppWizard-Step2of4的窗口,該窗口是生成項(xiàng)目文件的第二步。首先在“Whatfeatureswouldyouliketoinclude?”問題中,選擇AboutBox(關(guān)于About對(duì)話框)和3DControls(使用三維圖形控件)選項(xiàng)。然后在“Pleaseenteratitleforyourdialog”編輯框中可以給應(yīng)用程序主窗口命名。最后確定以上各項(xiàng)后,單擊Next按鈕,進(jìn)入下一步。VisualC++顯示一個(gè)MFCAppWizard-Step3of4的窗口。首先在“Wouldyouliketogeneratesourcefilecomments?”中,詢問是否在生成源代碼文件中加注釋,應(yīng)選擇Yes。因?yàn)樵贛FCAppWizard生成的應(yīng)用程序源代碼文件(.cpp文件)中加上代碼的注釋,有助于閱讀和理解源代碼的含義。然后在“HowdoyouliketousetheMFClibrary?”問題中,選擇MFC使用的動(dòng)態(tài)鏈接庫(DDL),而不是靜態(tài)鏈接庫。使用動(dòng)態(tài)鏈接庫可以在應(yīng)用程序程序運(yùn)行的時(shí)侯鏈接起來,而不是在編譯的時(shí)候就鏈接,使生成的應(yīng)用程序exe文件比較小。最后單擊Next按鈕,進(jìn)入最后一步。VisualC++顯示出生成項(xiàng)目文件的最后一步,出現(xiàn)一個(gè)MFCAppWizard-Step4of4的窗口,可以看到AppWizard給出的所創(chuàng)建的類名和文件名,如果用戶愿意,可以改變類的名稱,但一般不必改變它。單擊Finish按鈕,顯示一個(gè)NewProjectInformation的窗口,該窗口顯示了前面幾步所選擇的全部設(shè)置,包括應(yīng)用程序類型、新創(chuàng)建的類以及應(yīng)用程序的全部特征,還顯示了該應(yīng)用程序?qū)⑸a(chǎn)在哪個(gè)路徑之中。通過這些用戶可以最后檢查一下應(yīng)用程序的設(shè)置是否完全正確,如果發(fā)現(xiàn)不對(duì)的地方,可以單擊Cancel鍵取消前面的操作,用AppWizard重新制作。檢查后若完全正確,則單擊Exit按鈕。AppWizard完成應(yīng)用程序的自動(dòng)生成工作,在指定的目錄下生成應(yīng)用程序框架所必需的全部文件。第二,應(yīng)用程序的可視化編程部分。因?yàn)閼?yīng)用程序是基于對(duì)話框的,所以AppWizard生成一個(gè)的對(duì)話框窗口作為應(yīng)用程序的主窗口,現(xiàn)在要做的就是在這個(gè)對(duì)話框中進(jìn)行界面設(shè)計(jì)。添加并編輯控件創(chuàng)建對(duì)話框的第一步就是添加控件到對(duì)話框中??梢蕴砑拥綄?duì)話框中的控件主要有圖片(Picture)、靜態(tài)文本(StaticText)、編輯框(EditBox)、成組框(GroupBox)、按鈕(Button)、復(fù)選框(CheckBox)、單選鈕(RadioBox)、組合框(ComboBox)、列表框(ListBox)、水平滾動(dòng)條(HorizontalScrollBar)、垂直滾動(dòng)條(VerticalScrollBar)、微調(diào)(Spin)、進(jìn)展條(Progress)、軌道條(Slider)、熱鍵(HotKey)、列表控件(ListControl)、制表控件(TabControl)和動(dòng)畫(Animate)等。這些控件類型都顯示在控件工具欄中。添加控件最簡(jiǎn)單的方法就是將控件從控件工具欄拖到對(duì)話編輯窗口的指定位置后釋放鼠標(biāo)。此外,還可以先從控件工具欄單擊要添加的控件類型(如果要添加多個(gè)同一類型的控件,則應(yīng)同時(shí)按住Ctrl鍵),然后將光標(biāo)移到要添加控件的位置,單擊并拖到鼠標(biāo),當(dāng)控件大小滿足要求時(shí)釋放鼠標(biāo)。添加控件后可以單擊來選擇要修改的控件,或者使用控件工具欄的選擇工具或按住Shift鍵再單擊來選擇多個(gè)控件,選擇控件后,就可以對(duì)其進(jìn)行移動(dòng)、復(fù)制、刪除和調(diào)整。此外,還可以使用控件的屬性窗口來修改控件屬性。即將鼠標(biāo)移到控件上,單擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇屬性命令,顯示一個(gè)屬性窗口,在此窗口中輸入控件的ID標(biāo)識(shí)符(這個(gè)標(biāo)識(shí)符將成為識(shí)別該空間的依據(jù))以及控件的標(biāo)題。給界面對(duì)象鏈接變量每個(gè)控件實(shí)際上就是一個(gè)對(duì)象,對(duì)MFC類庫中的函數(shù)調(diào)用都是通過對(duì)象實(shí)現(xiàn)的。將鼠標(biāo)移到要連接變量的控件上,單擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇ClassWizard命令,VisualC++顯示一個(gè)MFCClassWizard的對(duì)話框窗口,在此窗口選擇MemberVariables選項(xiàng)卡。在ControlIDs列表框中單擊要連接變量的控件的ID號(hào),使之亮度顯示,單擊右邊的AddVariables按鈕,設(shè)置其變量名、類別及變量類型。這樣就把變量加到了該對(duì)話框類中。如圖4所示。
圖4給控件鏈接變量給控件鏈接代碼要給控件映射一個(gè)消息處理函數(shù),當(dāng)事件發(fā)生時(shí)(如“單擊該按鈕”或編輯框里的內(nèi)容發(fā)生變化時(shí)等),發(fā)送一個(gè)消息,應(yīng)用程序收到消息后就執(zhí)行相應(yīng)的消息處理函數(shù)。首先將鼠標(biāo)移到控件上,單擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇ClassWizard命令,VisualC++顯示一個(gè)MFCClassWizard的對(duì)話框窗口。然后在ObjectIDs列表里選擇要添加消息處理函數(shù)的那一控件的ID標(biāo)識(shí)符,在Message列表里選擇相應(yīng)的命令方式。這個(gè)命令方式?jīng)Q定用戶與用程序之間交互的方式,即用戶以何種方式發(fā)送消息給應(yīng)用程序,使其執(zhí)行相應(yīng)的消息處理函數(shù)。接著單擊右邊的AddFunction按鈕。在彈出的窗口AddMemberFunction中接受建議的函數(shù)名,則在ClassWizard窗口的MemberFunction列表框中增加了一個(gè)成員函數(shù),如圖5所示。最后單擊ClassWizard窗口中的EditCode按鈕,此時(shí)VisualC++顯示源代碼文件(.cpp),并將光標(biāo)停在剛生成的函數(shù)處,等待用戶定義函數(shù)的內(nèi)容。在函數(shù)體中輸入要實(shí)現(xiàn)的功能代碼即可。IFCClassTizard|MemberVariables|Automation|ActiveXEvents|ClassInfo|MessageMapsAProject:AASK_ProD:\..-\ASK_Pro\ASK_ProDlg.h,D:\...\ASK_I4ObjectIDs:4BpfChannelDemodulateFIDBpfChannelDemodulateFIDIDCIDCIDCIDCIntensiIDCLiIDCIDCIntensiIDCLiMemberfunctions:VDoDataExchangeWOnChangeldON_IDC_ID:EN_CHANGEWOnChangelntensityON」DC_lntensity:EN_CHANGE件添加響應(yīng)函數(shù)ON_IDC_Lpf:BN件添加響應(yīng)函數(shù)ON_IDC_Lpf:BN」5KEDDesT3)初始化對(duì)話框中的控件^運(yùn)行所建立的應(yīng)用程序時(shí),往往要求對(duì)話框窗Des口中的控件有一定的初始功能(如編輯框里有一定的初始值I),齦可以對(duì)函數(shù)OnInitDialog()進(jìn)行代碼編輯,此函數(shù)中的內(nèi)容為程序開始運(yùn)行時(shí)需要初始化的相關(guān)內(nèi)容。7.ASK數(shù)字通信系統(tǒng)的軟件實(shí)現(xiàn)對(duì)象IDCaption基本輸入組合框IDC_STATIC基本輸入“學(xué)號(hào)”編輯框IDC_ID無表1對(duì)話框中個(gè)對(duì)象的屬性“噪聲強(qiáng)度”編輯框IDC_Intensity無表2對(duì)話框的控件變量控件名稱控件ID對(duì)應(yīng)的控件變量控件變量類型學(xué)號(hào)IDCIDnMyIDint噪聲強(qiáng)度IDCIntensitynIntensityint表3控件對(duì)應(yīng)的響應(yīng)函數(shù)控件名稱控件ID響應(yīng)的消息響應(yīng)消息的函數(shù)學(xué)號(hào)IDCIDENCHANGEOnChangeId噪聲強(qiáng)度IDCIntensityENCHANGEOnChangeIntensity低通濾波器IDCLpfBNCLICKEDOnLpf帶通濾波器IDCBpfBNCLICKEDOnBpf基帶信號(hào)IDCBaseSignalBNCLICKEDOnBaseSignal過低通IDCPassLpf1BNCLICKEDOnPassLpf1調(diào)制IDCModulateBNCLICKEDOnModulate噪聲IDCNoiseBNCLICKEDOnNoise信道IDCChannelBNCLICKEDOnChannel過帶通IDCPassBpfBNCLICKEDOnPassBpf解調(diào)IDCDemodulateBNCLICKEDOnDemodulate過低通IDCPassLpf2BNCLICKEDOnPassLpf2恢復(fù)判決IDCAdjustBNCLICKEDOnAdjustSigTranmit類的生成及功能在ASK_Pro的主菜單欄中選擇插入菜單中的新建類選項(xiàng),出現(xiàn)一個(gè)NewClass對(duì)話框,在該對(duì)話框的Classtype中選擇GenericClass,在Name中輸入類名SigTranmit,單擊右邊的0K按鈕。此時(shí)在ASK_Pro項(xiàng)目中生成了一個(gè)名為SigTranmit的類,該類用于實(shí)現(xiàn)ASK數(shù)字通信系統(tǒng)的全過程,包括發(fā)送端對(duì)信號(hào)進(jìn)行編碼、濾波(過低通濾波器)、和調(diào)制,信號(hào)傳輸?shù)倪^程(即過信道),和接收端對(duì)信號(hào)的濾波(過帶通濾波器)、解調(diào)、濾波(過低通濾波器)、和恢復(fù)判決。在SigTranmit.h中定義SigTranmit類的兩個(gè)int類型的私有數(shù)據(jù)成員mylD和mylntensity。它們分別分別為該ASK數(shù)字通信系統(tǒng)中將要傳輸?shù)男盘?hào)及信道中噪聲的強(qiáng)度,需要用戶設(shè)置,即將它們同對(duì)話框中用來接收用戶輸入的學(xué)號(hào)信息和噪聲強(qiáng)度信息的控件變量nMylD和nIntensity連接起來,將nMylD的值賦給myID,將nIntensity的值賦給mylntensity。SigTranmit.h中還定義了三個(gè)int類型和十二個(gè)float類型的私有數(shù)據(jù)成員,具體如下所示:Intc:用來存放窗函數(shù)選擇結(jié)果的變量。intS0[16]:用來存放在Basesignal函數(shù)中對(duì)數(shù)字信息編碼后的信號(hào)。intS1[16]:用來存放在Adjust函數(shù)中對(duì)信號(hào)抽樣取平均后的信號(hào)。floatMod[16*M]:用來存放生成的載波信號(hào)。floatSa[16*M]:用來存放通過系統(tǒng)中每一個(gè)環(huán)節(jié)后的信號(hào)。floatSal[16*M]:用來存放在Basesignal函數(shù)對(duì)信號(hào)進(jìn)行采樣后的信號(hào)。floatAR[16*M]:用來存放在Dft函數(shù)中對(duì)傳入的數(shù)組進(jìn)行DFT運(yùn)算后的實(shí)部。floatAI[16*M]:用來存放在Dft函數(shù)中對(duì)傳入的數(shù)組進(jìn)行DFT運(yùn)算后的虛部。floatA[16*M]:用來存放在Dft函數(shù)中對(duì)傳入的數(shù)組進(jìn)行DFT運(yùn)算后的頻域幅值。floatHl[16*M]:用來存放生成的低通濾波器的單位取樣響應(yīng)。floatH2[16*M]:用來存放在Idft數(shù)中對(duì)傳入的數(shù)組進(jìn)行IDFT運(yùn)算后的數(shù)據(jù)。floatNo[16*M]:用來存放生成的噪聲floatHb[N]:用來存放帶通濾波器的頻域單位取樣響應(yīng)。floatP[N]:用來存放在Idft數(shù)中進(jìn)行IDFT運(yùn)算所需要的數(shù)據(jù)。floatWn[N]:用來存放窗函數(shù)的單位取樣響應(yīng)。在SigTranmit.h中聲明SigTranmit類的二十五個(gè)公有成員函數(shù),并在SigTranmit.cpp中對(duì)它們進(jìn)行定義。各函數(shù)原型及功能如下所示:CSigTranmit(void):系統(tǒng)自動(dòng)生成的構(gòu)造函數(shù),我在函數(shù)體內(nèi)給私有變量c賦值,使得用戶沒有進(jìn)行創(chuàng)函數(shù)選擇時(shí),c有默認(rèn)值。voidSetDigtal(intID,intIntensity):該函數(shù)用于設(shè)置SigTranmit類的共有數(shù)據(jù)成員myID和myIntensity的初始值。voidBasesignal():該函數(shù)用于對(duì)學(xué)號(hào)信息進(jìn)行編碼、采樣,生成數(shù)字基帶信號(hào);接著調(diào)用voidDft(floatx[],intm)函數(shù)對(duì)采樣后的信號(hào)進(jìn)DFT運(yùn)算,得到信號(hào)的頻域特性。voidLpf():該函數(shù)體里首先用窗函數(shù)法生成低通濾波器;接著調(diào)用函數(shù)voidConv(floatarray1[],floatarray2[])對(duì)低通濾波器和數(shù)字基帶信號(hào)的進(jìn)行卷積運(yùn)算,實(shí)現(xiàn)信號(hào)過低通的模擬;最后調(diào)用voidDft(floatx[],intm)函數(shù)對(duì)過低通濾波器后的信號(hào)進(jìn)行DFT運(yùn)算,得到信號(hào)的頻域特性。voidmodulate。:該函數(shù)實(shí)現(xiàn)對(duì)濾波后的信號(hào)的振幅調(diào)制,并調(diào)用voidDft(floatx[],intm)函數(shù)對(duì)過調(diào)制后的信號(hào)進(jìn)行DFT運(yùn)算,得到信號(hào)的頻域特性。voidChannel。:該函數(shù)體里首先調(diào)用voidNoise(floatinten)函數(shù)生成高斯白噪聲;接著將調(diào)制后的信號(hào)與高斯白噪聲相加以模擬信號(hào)過信道的過程,最后調(diào)用voidDft(floatx[],intm)函數(shù)對(duì)過信道后的信號(hào)進(jìn)行DFT運(yùn)算,得到信號(hào)的頻域特性。voidBpf():該函數(shù)體里首先用頻率采樣法生成帶通濾波器,并調(diào)用函數(shù)voidIdft(floath[])得到其時(shí)域的特性;接著調(diào)用函數(shù)voidConv(floatarray1[],floatarray2[])對(duì)帶通濾波器和數(shù)字信號(hào)的卷積,以模擬接收到的信號(hào)過帶通;最后調(diào)用voidDft(floatx[],intm)函數(shù)對(duì)過帶通濾波器后的信號(hào)進(jìn)行DFT運(yùn)算,得到信號(hào)的頻域特性。voidDemodulate。:該函數(shù)首先實(shí)現(xiàn)對(duì)過帶通后的信號(hào)進(jìn)行同步解調(diào);其次調(diào)用voidDft(floatx[],intm)函數(shù)對(duì)解調(diào)后的信號(hào)進(jìn)行DFT運(yùn)算,得到信號(hào)的頻域特性。voidAdjust():該函數(shù)首先實(shí)現(xiàn)對(duì)解調(diào)后的信號(hào)進(jìn)行恢復(fù)判決,即取平均后再采樣;最后調(diào)用voidDft(floatx[],intm)函數(shù)對(duì)過帶通濾波器后的信號(hào)進(jìn)行DFT運(yùn)算,得到信號(hào)的頻域特性。voidDft(floatx[],intm):該函數(shù)實(shí)現(xiàn)對(duì)傳入的參數(shù)x[]的m點(diǎn)DFT運(yùn)算,得到信號(hào)的頻域特性。voidIdft(floath[]):該函數(shù)實(shí)現(xiàn)對(duì)傳入的參數(shù)h[]的IDFT運(yùn)算,得到信號(hào)的時(shí)域特性。voidConv(floa1arrayl[],floatray2[]該函數(shù)實(shí)現(xiàn)傳入的兩個(gè)參數(shù)arrayl和array2的卷積運(yùn)算。voidNoise(floatin該函數(shù)用來生成高斯白噪聲。voidSetHl(float咳函:數(shù)用來設(shè)置私有變量Hl[N]的值。voidSetHb(floatH該函數(shù)用來設(shè)置私有變量Hb[N]的值。voidSetc(intMy該函數(shù)用來設(shè)置私有變量c的值。intGetmylntensity該函數(shù)用來獲取私有變量myIntensit的值。intGetc()該函數(shù)用來獲取私有變量c的值。float*GetSa該函數(shù)用來獲取私有變量Sa[16*M]的值。float*GetA該函數(shù)用來獲取私有變量A[16*M]的值。float*GetHl該函數(shù)用來獲取私有變量Hl[N]的值。float*GetH2該函數(shù)用來獲取私有變量H2[N]的值。float*GetHb該函數(shù)用來獲取私有變量Hb[N]的值。float*GetNo該函數(shù)用來獲取私有變量No[16*M]的值。~CSigTranmit(void系統(tǒng)自動(dòng)生成的析構(gòu)函數(shù),用于執(zhí)行釋放對(duì)象時(shí)的清理工作。畫圖函數(shù)的定義該系統(tǒng)在ASK_ProDlg類中定義了兩個(gè)名字分別為GraphO和Graph的共有成員函數(shù),通過調(diào)用它們實(shí)現(xiàn)在對(duì)話框右邊的時(shí)域波形和頻域波形靜態(tài)文本框里畫圖。其中Graph。用來畫低通濾波器和帶通濾波器的特性圖,Graph用來畫信號(hào)在傳輸過程中的特性圖,即在每個(gè)按鈕控件的消息響應(yīng)函數(shù)的最后都通過調(diào)用畫圖函數(shù)來實(shí)現(xiàn)畫圖功能。它們的代碼分別如下:voidCASK_ProDlg::Graph(floatS[],floatFrep[]){CWnd*pWnd=GetDlgItem(IDC_T);CDC*pDC=pWnd->GetDC();CRectrect;pWnd->GetClientRect(rect);intW=rect.Width(畫圖區(qū)域?qū)挾萯ntH=rect.Height畫圖區(qū)域高度RedrawWindow();//設(shè)置背景色CBrushnewbrush;newbrush.CreateSolidBrush(RGB(255,255,255));pDC->Rectangle(rect);intStepX=int((W-l)/(l6*M));doublemaxt=findmax(S,(l6*M));doubleStepY=(H/2T0)/(fabs(maxt縱坐標(biāo)步長(zhǎng)//確定畫圖起始位置intox=int((W-(l6*M)*StepX)/2);intoyt=rect.bottom-int(H/2);//畫坐標(biāo)CPenCoordinatePen,pen;CoordinatePen.CreatePen(PS_SOLID,1,RGB(0,255,0));pen.CreatePen(PS_SOLID,1,RGB(0,0,0));pDC->SelectObject(&CoordinatePen);pDC->MoveTo(rect.left,oyt);pDC->LineTo(rect.left+W,oyt);pDC->SelectObject(&pen);pDC->MoveTo(ox,oyt);for(inti=0;i<(16*M);i++){pDC->LineTo(ox+i*StepX,int(oyt-StepY*S[i]));}//頻譜圖CWnd*pWnd1=GetDlgItem(IDC_F);CDC*pDC1=pWnd1->GetDC();CRectrect1;pWnd1->GetClientRect(rect1);intWl=rectl.Width();〃畫圖區(qū)域?qū)挾萯ntH1=rect1.Height();〃畫圖區(qū)域高度CBrushnewbrushl;newbrush1.CreateSolidBrush(RGB(255,255,255));pDC1->Rectangle(rect1);//坐標(biāo)定位intStepX1=int(2*(W1-1)/(16*M));〃橫坐標(biāo)步長(zhǎng)floatmaxt1=findmax(Frep,int((16*M)/2));floatStepY1=(4*H1/5-10)/(fabs(maxt1));〃縱坐標(biāo)步長(zhǎng)//確定畫圖起始位置intoxf=int((W1-(16*M)*StepX1/2)/2);intoyf=rect1.bottom-int(H1/5);CPenCoordinatePen1,pen1;CoordinatePen1.CreatePen(PS_SOLID,1,RGB(0,255,0,));pen1.CreatePen(PS_SOLID,1,RGB(0,0,0));pDC1->SelectObject(&CoordinatePen1);//畫坐標(biāo)pDC1->MoveTo(rect1.left,oyf);pDC1->LineTo(rect1.left+W1,oyf);pDC1->TextOut(oxf,oyf+5,L"0");pDC1->TextOut(oxf+StepX1*16*M/2-StepXl*3,oyf+5,L"n");pDC1->SelectObject(&pen1);pDC1->MoveTo(oxf,oyf);for(i=0;i<(16*M)/2;i++){pDC1->MoveTo(oxf+StepX1*i,oyf);pDC1->LineTo(oxf+StepX1*i,int(oyf-StepY1*Frep[i]));}}8.軟件實(shí)現(xiàn)過程中的幾個(gè)問題的說明第一,SigTranmit對(duì)象的定義。該系統(tǒng)中實(shí)現(xiàn)了ASK數(shù)字通信系統(tǒng)的仿真,整個(gè)過程是在系統(tǒng)執(zhí)行控件的消息響應(yīng)函數(shù)來實(shí)現(xiàn)的,而消息響應(yīng)函數(shù)中對(duì)信號(hào)的一系列運(yùn)算及處理都是通過SigTranmit對(duì)象調(diào)用自身的成員函數(shù)來實(shí)現(xiàn)的。這就出現(xiàn)了在哪里定義這個(gè)類對(duì)象的問題。方案一:SigTranmit類聲明后直接定義了一個(gè)類對(duì)象mySignall。問題:系統(tǒng)編譯不成功,顯示類對(duì)象mySignal1沒有定義。失敗原因:對(duì)SigTranmit類對(duì)象mySignall的使用是在CASK_ProDlg類的成員函數(shù)中的,在SigTranmit類聲明中定義的類對(duì)象mySignall在這里不可見。方案二:在每個(gè)需要SigTranmit類對(duì)象的控件的消息響應(yīng)函數(shù)中都定義一次,即在每個(gè)函數(shù)中都有如下語句:SigTranmitmySignall;問題:編譯成功,但對(duì)話框靜態(tài)文本框中的圖形不正確,說明信號(hào)傳輸過程有問題。失敗原因:在每個(gè)需要SigTranmit類對(duì)象的控件的消息響應(yīng)函數(shù)中都定義一次mySignall,此時(shí)mySignall只是一個(gè)臨時(shí)變量,只在其所在的函數(shù)中有效,當(dāng)函數(shù)執(zhí)行完后它也就消失了。這樣的話每次處理的數(shù)據(jù)都是一個(gè)隨機(jī)值,不是系統(tǒng)里要求傳輸?shù)挠脩糨斎氲臄?shù)據(jù)。解決方法:在CASK_ProDlg類的聲明中定義SigTranmit類對(duì)象mySignall,即將它作為CASK_ProDlg類的公有數(shù)據(jù)成員。類的成員函數(shù)中可以訪問自身類中的數(shù)據(jù)成員,故在CASK_ProDlg類的成員函數(shù)中可以訪問mySignall,從而問題得到解決。第二,畫圖函數(shù)的定義。該系統(tǒng)中實(shí)現(xiàn)了ASK數(shù)字通信系統(tǒng)的仿真,但整個(gè)實(shí)現(xiàn)過程的可見性便是與用戶交互的對(duì)話框。為了能夠看到系統(tǒng)中信號(hào)傳輸?shù)母鱾€(gè)環(huán)節(jié)的特性,我們?cè)趯?duì)話框中添加了兩個(gè)靜態(tài)文本框用來顯示信號(hào)的時(shí)域及頻域波形,而這個(gè)功能的實(shí)現(xiàn)則是通過執(zhí)行畫圖函數(shù)來完成的。方案一:在SigTranmit類中定義畫圖函數(shù)Graph,這樣在控件的消息響應(yīng)函數(shù)中由SigTranmit類對(duì)象mySignall來調(diào)用它。問題:編譯不成功,顯示兩個(gè)錯(cuò)誤:其一,畫圖函數(shù)中調(diào)用的RedrawWindow函數(shù)不是沒有參數(shù)的函數(shù)。其二,畫圖函數(shù)中調(diào)用的GetDlgItem函數(shù)不是只有一個(gè)參數(shù)的函數(shù)。失敗原因:函數(shù)GetDlgItem有兩種原型:一種是只有一個(gè)參數(shù),另一種是有兩個(gè)參數(shù)。我們?cè)诋媹D函數(shù)Graph中通過語句GetDlgItem(IDC_F)和GetDlgItem(IDC_T)來分別獲取將要畫圖的兩個(gè)靜態(tài)文本框的ID,但由于Graph是在SigTranmit類中定義的,系統(tǒng)并不知道要在哪個(gè)窗口中獲取這兩個(gè)ID,即應(yīng)調(diào)用有兩個(gè)參數(shù)的GetDlgItem函數(shù),其中一個(gè)參數(shù)為要畫圖的靜態(tài)文本框的ID,另一個(gè)為它所存在的窗口的指針。同理,RedrawWindow函數(shù)也調(diào)用錯(cuò)誤。方案二:將畫圖函數(shù)Graph定義在CASK_ProDlg類中,即將它定義為CASK_ProDlg類的共有成員函數(shù)。在控件的消息響應(yīng)函數(shù)中處理完消息后用this->Graph(No,A)語句調(diào)用它實(shí)現(xiàn)畫圖。問題:編譯成功,但畫的低通濾波器和帶通濾波器的特性圖均不正確,只在靜態(tài)文本框的一個(gè)小區(qū)域內(nèi)有圖。失敗原因:系統(tǒng)中傳輸?shù)男盘?hào)長(zhǎng)度為3
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 福建省長(zhǎng)汀、連城一中等六校聯(lián)考2024-2025學(xué)年高三5月份綜合模擬檢測(cè)試題英語試題含解析
- 2025年甘肅省天水市清水縣第六中學(xué)高三年級(jí)調(diào)研測(cè)試(英語試題)試題含解析
- 云南三鑫職業(yè)技術(shù)學(xué)院《土木工程施工設(shè)計(jì)》2023-2024學(xué)年第一學(xué)期期末試卷
- 松原市前郭爾羅斯蒙古族自治縣2024-2025學(xué)年數(shù)學(xué)五年級(jí)第二學(xué)期期末達(dá)標(biāo)檢測(cè)模擬試題含答案
- 第11課 元朝的建立與統(tǒng)一 教案2024-2025學(xué)年七年級(jí)歷史下冊(cè)新課標(biāo)
- 現(xiàn)階段在高中生中大規(guī)模推廣體育運(yùn)動(dòng)種類的調(diào)研
- 裝修鋼結(jié)構(gòu)施工方案
- 加固現(xiàn)澆閣樓施工方案
- 坡屋面保溫施工方案
- 外墻保溫膠泥施工方案
- 2024-2029年中國(guó)體外診斷試劑行業(yè)市場(chǎng)全景調(diào)研與投資前景預(yù)測(cè)報(bào)告
- 2024年高考英語作文【5篇】
- 結(jié)直腸癌免疫治療
- 老年學(xué)概論(第3版) 課件 第5-7章 衰老生物學(xué)、老年人口學(xué)、老年心理學(xué)
- 人教版八年級(jí)物理下冊(cè)《第八章運(yùn)動(dòng)和力》單元測(cè)試卷-含答案
- 江蘇省南京師范大學(xué)附屬中學(xué)樹人學(xué)校2023-2024學(xué)年九年級(jí)下學(xué)期3月月考數(shù)學(xué)試卷
- 阿拉伯國(guó)家聯(lián)盟課件
- 油氣管道視頻監(jiān)控系統(tǒng)總體設(shè)計(jì)方案
- 毫米波集成電路詳述
- 打印設(shè)備維護(hù)服務(wù)投標(biāo)方案
- JGT454-2014 建筑門窗、幕墻中空玻璃性能現(xiàn)場(chǎng)檢測(cè)方法
評(píng)論
0/150
提交評(píng)論