2023年全國(guó)碩士研究生考試考研英語(yǔ)一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩40頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、<p>  DSP課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告</p><p><b>  語(yǔ)音噪聲濾波</b></p><p>  院(系):電子信息工程學(xué)院 </p><p>  班級(jí): 自動(dòng)化0804 </p><p>  姓名: </p><p&g

2、t;  學(xué)號(hào): </p><p>  指導(dǎo)教師: </p><p><b>  目錄</b></p><p><b>  一、實(shí)驗(yàn)背景3</b></p><p><b>  二、設(shè)計(jì)要求3</b></p>

3、<p><b>  三、設(shè)計(jì)思路3</b></p><p><b>  四、算法原理4</b></p><p>  1、直接存儲(chǔ)器訪(fǎng)問(wèn)DMA4</p><p>  2、A/D和D/A轉(zhuǎn)換器6</p><p>  3、FIR濾波器算法6</p><p>

4、<b>  4、LMS算法7</b></p><p>  5、利用DSP產(chǎn)生回波8</p><p>  6、利用自適應(yīng)濾波實(shí)現(xiàn)回波對(duì)消9</p><p>  五、用C語(yǔ)言實(shí)現(xiàn)LMS算法11</p><p>  六、用MATLAB設(shè)計(jì)FIR濾波器15</p><p><b>  

5、七、程序設(shè)計(jì)17</b></p><p>  1、主程序(firlab.c)17</p><p>  2、中斷服務(wù)程序(dma2isr.c)22</p><p>  3、鏈接命令文件(5402a.cmd)24</p><p>  4、中斷向量表(c5402vec.asm)26</p><p>&l

6、t;b>  八、程序調(diào)試30</b></p><p><b>  九、結(jié)果分析31</b></p><p><b>  十、感想40</b></p><p><b>  一、實(shí)驗(yàn)背景</b></p><p>  我們的日常生活中離不開(kāi)語(yǔ)音通信,如接打電話(huà)

7、、收聽(tīng)音樂(lè)等。語(yǔ)音通信的過(guò)程主要分為三個(gè)部分,即發(fā)送部分——將音頻信號(hào)轉(zhuǎn)化為電信號(hào),經(jīng)發(fā)送端設(shè)備變換為適合傳輸?shù)男问桨l(fā)送出去;傳輸部分——通過(guò)傳輸信道將電信號(hào)進(jìn)行傳輸;接收部分——經(jīng)接收端設(shè)備恢復(fù)出原來(lái)的語(yǔ)音信號(hào),經(jīng)耳機(jī)或者喇叭轉(zhuǎn)換為接收者可以聽(tīng)到的聲音信號(hào)。</p><p>  但是由于環(huán)境的原因,我們采集到語(yǔ)音信號(hào)經(jīng)常含有不同程度的噪聲。與語(yǔ)音通信系統(tǒng)的三個(gè)部分相對(duì)應(yīng),語(yǔ)音通信系統(tǒng)中的噪聲一般也來(lái)自三個(gè)方面:

8、一是信號(hào)發(fā)送端空間環(huán)境中的音頻噪聲信號(hào)經(jīng)麥克風(fēng)變換為電信號(hào)之后,與有用信號(hào)其同傳遞到接收端;二是信號(hào)接收端空間環(huán)境中的音頻噪聲對(duì)信號(hào)接收者的影響;三是信號(hào)處理設(shè)備產(chǎn)生的電噪聲及傳輸信道中的電噪聲。</p><p>  當(dāng)語(yǔ)音信號(hào)受到背景噪聲干擾而使語(yǔ)音通信質(zhì)量變得不可接受時(shí),要對(duì)語(yǔ)音信號(hào)中的噪聲進(jìn)行濾除,也就是本次實(shí)驗(yàn)要完成的語(yǔ)音噪聲濾波。</p><p><b>  二、設(shè)計(jì)要

9、求</b></p><p><b>  1、基本部分:</b></p><p> ?。?) 對(duì)DMA進(jìn)行初始化;</p><p> ?。?) 對(duì)A/D、D/A進(jìn)行初始化;</p><p> ?。?) 編寫(xiě)DMA中斷服務(wù)程序和濾波算法程序,實(shí)現(xiàn)語(yǔ)音信號(hào)的實(shí)時(shí)濾波;</p><p><

10、;b>  2、發(fā)揮部分:</b></p><p> ?。?) 使用DSP產(chǎn)生帶回波的語(yǔ)音信號(hào);</p><p>  利用自適應(yīng)濾波實(shí)現(xiàn)語(yǔ)音信號(hào)的回波對(duì)消。</p><p> ?。?) 比較采用不同窗和階數(shù)時(shí)濾波器的濾波效果;</p><p> ?。?) 測(cè)試所設(shè)計(jì)濾波器的幅頻特性和相頻特性,并與MATLAB下的設(shè)計(jì)結(jié)果進(jìn)行比

11、較。</p><p><b>  三、設(shè)計(jì)思路</b></p><p>  首先利用DSP的DMA方式對(duì)外部含噪聲的語(yǔ)音信號(hào)進(jìn)行實(shí)時(shí)采集,語(yǔ)音信號(hào)先經(jīng)過(guò)A/D轉(zhuǎn)換為數(shù)字信號(hào),利用MCBSP的接收寄存器接收數(shù)據(jù)。編寫(xiě)濾波算法程序,或調(diào)用DSPLIB中的濾波函數(shù),對(duì)信號(hào)進(jìn)行濾波。濾波后的數(shù)據(jù)利用DMA方式送到D/A轉(zhuǎn)換器轉(zhuǎn)換為模擬信號(hào)。設(shè)計(jì)流程框圖如下:</p>

12、;<p>  加有噪聲色語(yǔ)音信號(hào)由DSK板的MIC端口輸入,經(jīng)A/D轉(zhuǎn)換器轉(zhuǎn)換為數(shù)字信號(hào)后到達(dá)DSP的DMA通道2,DSP接收到信號(hào)后調(diào)用中斷服務(wù)程序進(jìn)行濾波,可選擇濾波模式進(jìn)行不同種類(lèi)的濾波,濾波后的信號(hào)在CCS上顯示,或通過(guò)DMA通道3將信號(hào)輸出到D/A轉(zhuǎn)換器,轉(zhuǎn)換為模擬信號(hào)后從SPEAKER端口輸出。</p><p><b>  四、算法原理</b></p>

13、<p>  1、直接存儲(chǔ)器訪(fǎng)問(wèn)DMA</p><p>  直接存儲(chǔ)器訪(fǎng)問(wèn)(Direct Memory Access)是C54x DSP非常重要的片上外設(shè),DMA控制器可以在不影響CPU的情況下完成數(shù)據(jù)的傳輸,因此數(shù)據(jù)傳輸速度快,在要求信號(hào)實(shí)時(shí)采集和處理的系統(tǒng)中常采用DMA方式進(jìn)行信號(hào)采集和傳輸。C5402有6個(gè)可獨(dú)立編程的DMA通道,每個(gè)DMA通道受各自的5個(gè)16位寄存器控制:源地址寄存器DMSRC、

14、目的地址寄存器DMDST、單元計(jì)數(shù)寄存器DMCTR、同步事件和計(jì)數(shù)寄存器DMSFC、發(fā)送模式控制寄存器DMMCR。目的地址寄存器DMDST規(guī)定DMA要傳送數(shù)據(jù)目的地址和首地址。單元計(jì)數(shù)寄存器DMCTR規(guī)定DMA傳送數(shù)據(jù)的個(gè)數(shù)為DMCTR寄存器的值加1。同步事件和幀計(jì)數(shù)寄存器DMSFC規(guī)定DMA傳送數(shù)據(jù)的同步事件類(lèi)型和傳送一塊數(shù)據(jù)所含幀信號(hào)的個(gè)數(shù)。發(fā)送模式控制寄存器DMMCR規(guī)定DMA通道的傳輸模式,當(dāng)DMA工作在自動(dòng)初始化模式時(shí),CPU

15、在一個(gè)DMA事件完成后自動(dòng)裝載下一個(gè)DMA初始化設(shè)置并繼續(xù)進(jìn)行數(shù)據(jù)傳送。DINM位和IMOD位設(shè)置DMA中斷產(chǎn)生方式。CTMOD位設(shè)置發(fā)送計(jì)數(shù)模式控制,CTMOD位為0時(shí),DMA工作在多幀模式,CTMOD位為1時(shí),</p><p>  本實(shí)驗(yàn)利用DMA通道2與MCBSP1通道結(jié)合來(lái)讀取A/D轉(zhuǎn)換器的數(shù)據(jù),利用DMA通道3與MCBSP1通道結(jié)合來(lái)將處理后的數(shù)據(jù)發(fā)送至D/A轉(zhuǎn)換器。選擇MCBSP1通道的接收寄存器DR

16、R11(41H)為DMA傳送數(shù)據(jù)的首地址,并選擇DMA源地址工作在不調(diào)整方式,選擇MCBSP1接收事件為DMA同步事件,以實(shí)現(xiàn)DMA和MCBSP的結(jié)合。A/D轉(zhuǎn)換器的數(shù)據(jù)按MCBSP1的設(shè)置被傳送到DSP內(nèi)部接收寄存器DRR11中,再由DMA通道2將DRR11中的數(shù)據(jù)讀到指定數(shù)據(jù)存儲(chǔ)區(qū)INP-BUFFER中完成數(shù)據(jù)采集。DMA在傳送外部來(lái)的數(shù)據(jù)時(shí)不會(huì)影響CPU的正常運(yùn)行,當(dāng)DMA通道2采集完一組數(shù)據(jù)后產(chǎn)生一個(gè)DMA中斷事件中斷CPU,來(lái)

17、通知CPU對(duì)其進(jìn)行相應(yīng)的處理,此時(shí)DMA通道2可以按照設(shè)定繼續(xù)采集下一組數(shù)據(jù),實(shí)現(xiàn)了數(shù)據(jù)采集與CPU處理的并行操作。</p><p>  當(dāng)一組數(shù)據(jù)處理完成后,將數(shù)據(jù)存放在數(shù)據(jù)存儲(chǔ)區(qū)OUT-BUFFER中,選擇OUT-BUFFER為DMA通道3的首地址,并選擇源工作地址工作在不調(diào)整方式。選擇MCBSP1通道的發(fā)送寄存器DXR11(43H)為DMA通道3傳送數(shù)據(jù)的目的地址,并選擇DMA源地址工作在不調(diào)整方式,選擇M

18、CBSP1接收事件為DMA同步事件,以實(shí)現(xiàn)DMA和MCBSP的結(jié)合。</p><p>  在CCS集成開(kāi)發(fā)環(huán)境中,與DMA相關(guān)的頭文件有regs54xx.h和dma54xx.h。在這兩個(gè)頭文件中,定義了DMA的寄存器資源、使用方法和DMA寄存器的地址和基本訪(fǎng)問(wèn)方式,以及寄存器的各個(gè)比特域和訪(fǎng)問(wèn)方法,因此需要進(jìn)行C源程序的開(kāi)始處包含這兩個(gè)頭文件。輸入信號(hào)經(jīng)A/D轉(zhuǎn)換后,利用DMA通道2進(jìn)行傳輸進(jìn)入DSP處理,而濾波

19、后的信號(hào)輸出利用了DMA通道3進(jìn)行傳輸進(jìn)入D/A轉(zhuǎn)換器等輸出,因此需要對(duì)DMA通道2和通道3進(jìn)行初始化配置。</p><p>  詳細(xì)的DMA初始化程序請(qǐng)見(jiàn)后面的程序清單。</p><p>  2、A/D和D/A轉(zhuǎn)換器</p><p>  A/D模數(shù)轉(zhuǎn)換器是將輸入電壓信號(hào)轉(zhuǎn)換為輸出的數(shù)字信號(hào)。由于數(shù)字信號(hào)本身不具有實(shí)際意義,僅僅表示一個(gè)相對(duì)大小,所以任何一個(gè)模數(shù)轉(zhuǎn)換

20、器都需要一個(gè)參考模擬量作為轉(zhuǎn)換的標(biāo)準(zhǔn),而輸出的數(shù)字量則表示輸入信號(hào)相對(duì)于參考信號(hào)的大小。A/D轉(zhuǎn)換器能夠?qū)⒔邮盏恼Z(yǔ)音信號(hào)(模擬信號(hào))轉(zhuǎn)化為數(shù)字信號(hào),供CPU進(jìn)行處理。</p><p>  D/A轉(zhuǎn)換器是將數(shù)字信號(hào)轉(zhuǎn)換為模擬信號(hào)的電路。實(shí)現(xiàn)原理就是將輸入的二進(jìn)制代碼按其權(quán)值的大小轉(zhuǎn)換成相應(yīng)的模擬量,然后將所有的模擬量相加,使其與數(shù)字量成正比。D/A轉(zhuǎn)換器能夠?qū)?shù)字信號(hào)轉(zhuǎn)換為語(yǔ)音信號(hào)送SPEAKER端口輸出。<

21、/p><p>  要使用A/D和D/A轉(zhuǎn)換器,必須首先對(duì)A/D和D/A轉(zhuǎn)換器進(jìn)行初始化設(shè)置,即設(shè)置A/D轉(zhuǎn)換器的工作模式(15+1bit模式,16bit模式)、輸入增益(0dB,6dB,12dB)以及抽樣頻率(8000Hz,16000Hz)等。</p><p>  3、FIR濾波器算法</p><p>  數(shù)字濾波器原理一般具有如下差分方程:</p>&l

22、t;p>  y(n)=∑ x(n-k)+ ∑ y(n-k) (1)</p><p>  式中x(n)為輸人序列,y(n)為輸出序列, 和 為濾波器系數(shù),,N是濾波器階數(shù)。當(dāng)所有的 均為零時(shí),則有</p><p>  y(n)= ∑ x(n-k) (2)</p><p>  (2)式是FIR濾波器的差分方程,其一般形式為</p>&

23、lt;p>  y(n)= ∑h(k)x(n-k) (3)</p><p>  對(duì)(3)式進(jìn)行z變換,整理后可得FIR濾波器的傳遞函數(shù):</p><p>  H(z)= ∑h(k) (4)</p><p>  FIR(Finite Impulse Response)濾波器,即有限長(zhǎng)單位沖激響應(yīng)濾波器,是指系統(tǒng)的單位脈沖響應(yīng)h[k]僅

24、在有限范圍內(nèi)有非零值的濾波器。</p><p>  FIR數(shù)字濾波器的設(shè)計(jì)方法主要有窗函數(shù)法和頻率抽樣設(shè)計(jì)法,其中窗函數(shù)法是基本而有效的設(shè)計(jì)方法。</p><p>  下面為FIR濾波器的算法實(shí)現(xiàn)方法。</p><p>  FIR濾波為有限沖擊響應(yīng)濾波,其濾波結(jié)構(gòu)是一個(gè)分節(jié)的延時(shí)線(xiàn),每節(jié)的輸出加權(quán)累加,得到濾波器的輸出。由前面的分析知,F(xiàn)IR濾波器數(shù)學(xué)上可表示為:&

25、lt;/p><p>  y(n)= ∑h(k)x(n-k) (5)</p><p>  式(5)中 x[n]為最近(t=nT)的輸人信號(hào),x[n-k]是延時(shí)了k個(gè)取樣周期的輸人信號(hào),h[k]是第k個(gè)延時(shí)的加權(quán)值(即濾波器系數(shù)),可由MATLAB設(shè)計(jì)出來(lái),y[n]是時(shí)刻t=nT時(shí)濾波器的輸出信號(hào),N是濾波器的階數(shù)也稱(chēng)濾波器的抽頭數(shù),為實(shí)整數(shù),且須滿(mǎn)足N*t<1/ ,其中 為采樣頻率。因?yàn)樵?/p>

26、濾波器的沖激響應(yīng)在N個(gè)周期后變?yōu)?也就是每次乘加運(yùn)算都要用到之前N個(gè)數(shù)。濾波器系數(shù)可通過(guò)MATLAB設(shè)計(jì)得到。 </p><p><b>  4、LMS算法</b></p><p>  LMS(least-mean-square)算法,即最小均方算法,是由Widrow和Hof在1960年創(chuàng)建的,直到現(xiàn)在它還是應(yīng)用最廣泛的自適應(yīng)濾波算法。LMS算法是隨機(jī)梯度算法族中的一

27、員。該算法在隨機(jī)輸入維納濾波器遞推計(jì)算中使用確定性梯度。LMS算法的一個(gè)顯著特點(diǎn)就是它的簡(jiǎn)單性。此外,它不需要計(jì)算有關(guān)的相關(guān)函數(shù),也不需要矩陣求逆運(yùn)算。事實(shí)上,正是因?yàn)長(zhǎng)MS算法的簡(jiǎn)單性,使得它成為其他自適應(yīng)濾波算法的參照標(biāo)準(zhǔn)。</p><p>  這兩個(gè)過(guò)程一起工作組成一個(gè)反饋環(huán),如下圖所示。</p><p>  首先有一個(gè)橫向?yàn)V波器(圍繞它構(gòu)造LMS算法),該部件的作用在于完成濾波過(guò)程

28、。其次,有一個(gè)對(duì)橫向?yàn)V波器抽頭權(quán)值進(jìn)行自適應(yīng)控制過(guò)程的算法。橫向?yàn)V波器各部分的細(xì)節(jié)如下圖所示。</p><p>  抽頭輸入u(k),u(k-1),……,u(k-M+1),其中M+1是延遲單元的個(gè)數(shù),這些輸入張成一個(gè)多維空間。相應(yīng)的 (k), (k), ..., (k)為抽頭權(quán)向量h(k)的元素。通過(guò)LMS算法計(jì)算這個(gè)向量所得的值表示一個(gè)估計(jì),當(dāng)?shù)螖?shù)趨于無(wú)窮時(shí),該估計(jì)的期望值可能接近維納最優(yōu)解,在濾波過(guò)

29、程中,期望響應(yīng)d(k)與抽頭輸入向量z(k)一道參與處理。在這種情況下,給定一個(gè)輸入,橫向?yàn)V波器產(chǎn)生一個(gè)輸入,橫向?yàn)V波器產(chǎn)生一個(gè)輸出y(k)作為期望響應(yīng)d(k)的估計(jì)。因此,我們可把估計(jì)誤差e(k)定義為期望響應(yīng)與實(shí)際濾波器輸出之差,估計(jì)誤差e(k)與抽頭輸入向量z(k)都被加到自適應(yīng)部分,因此圍繞抽頭權(quán)值的反饋環(huán)是閉環(huán)的。</p><p>  5、利用DSP產(chǎn)生回波</p><p>  

30、在打電話(huà)的過(guò)程中,常常能聽(tīng)見(jiàn)自己說(shuō)話(huà)的聲音在話(huà)筒里重復(fù),實(shí)際上就是自己的聲音泄露到了接收系統(tǒng)中。在一些特定的系統(tǒng)中出現(xiàn)這種現(xiàn)象將會(huì)對(duì)信號(hào)的正常收發(fā)產(chǎn)生不利影響。因此,回聲在上述系統(tǒng)中會(huì)嚴(yán)重影響了通話(huà)的清晰度,多點(diǎn)回聲甚至?xí)鹜ㄓ嵕W(wǎng)之間聲音的振蕩。</p><p>  可通過(guò)設(shè)置時(shí)間的延遲,將過(guò)去的信號(hào)衰減加到現(xiàn)在的信號(hào)上,以產(chǎn)生回波。</p><p>  這次實(shí)驗(yàn)我們的回聲信號(hào)定義為語(yǔ)音

31、信號(hào)的延遲再進(jìn)行適當(dāng)?shù)乃p。即將麥克輸入的語(yǔ)音信號(hào)疊加上述麥克輸入語(yǔ)音信號(hào)的延時(shí)衰減后的信號(hào),用此混合信號(hào)模擬真實(shí)的回波信號(hào)。因此回聲通道的傳輸函數(shù)為:</p><p>  其中S為衰減,M為延遲點(diǎn)數(shù)。聽(tīng)到的回波是混合信號(hào),此時(shí)不僅能聽(tīng)到自己的聲音,也能聽(tīng)到幾個(gè)衰減后疊加的回聲,該回聲為近端輸入的延遲和衰減。</p><p><b>  回波產(chǎn)生程序如下:</b>&l

32、t;/p><p>  while (!MCBSP_RRDY(HANDSET_CODEC)) {}; //codec句柄如未準(zhǔn)備好則等待</p><p>  dk = *(volatile u16*)DRR1_ADDR(HANDSET_CODEC); //從ADC讀數(shù)</p><p>  bf[i]=dk;

33、 //放入緩沖區(qū)</p><p>  if(i==10000) </p><p>  i=0; </p><p>  *(volatile u16*)DXR1_ADDR(HANDSET_CODEC) = dk+bf[i+1]/2; //延遲+衰減</p><p>  6、利用自適應(yīng)濾波實(shí)現(xiàn)回

34、波對(duì)消</p><p>  聲學(xué)回聲消除的功能原理框圖如下圖所示:</p><p>  其基本原理可概括為,自適應(yīng)地合成回聲,并從有回聲干擾地信號(hào)中減去該合成回聲。一般回聲消除算法通過(guò)自適應(yīng)濾波來(lái)完成,其基本原理如下圖所示:</p><p>  其中,遠(yuǎn)端信號(hào)x(k)通過(guò)回聲信道h產(chǎn)生回聲y(k),近端信號(hào)d(k)是由回聲y(k)和近端聲音信號(hào)(可包含噪聲信號(hào))得到

35、。通過(guò)使用M抽頭的FIR自適應(yīng)濾波器來(lái)模擬回聲信道h,可以使所得y(k)通近回聲信號(hào),進(jìn)而達(dá)到回聲消除的目的由此可見(jiàn),回聲消除的關(guān)鍵是自適應(yīng)地調(diào)整使其通近h,可通過(guò)現(xiàn)有的各種自適應(yīng)濾波算法實(shí)現(xiàn)。</p><p>  這個(gè)實(shí)驗(yàn)采用的LMS算法,即最小均方誤差算法設(shè)計(jì)的自適應(yīng)濾波器進(jìn)行未知系統(tǒng)識(shí)別,以將回聲信號(hào)濾除。該自適應(yīng)濾波器是FIR橫向?yàn)V波器,可以根據(jù)輸出自動(dòng)修改濾波器的權(quán)系數(shù),從而逼近未知系統(tǒng)回聲通道。算法的

36、實(shí)現(xiàn)基于TMS320C5402DSP芯片和CCS系統(tǒng)的C語(yǔ)言。 </p><p>  遠(yuǎn)端的信號(hào)通過(guò)回聲通道產(chǎn)生回聲信號(hào)d(n),該信號(hào)一般為遠(yuǎn)端信號(hào)的衰減和延遲。遠(yuǎn)端信號(hào)通過(guò)自適應(yīng)濾波器產(chǎn)生回聲預(yù)測(cè)信號(hào)y(n)。在k時(shí)刻,它們之差為剩余回聲信號(hào):</p><p>  用它來(lái)控制LMS自適應(yīng)濾波器的系數(shù)ω(n)</p><p>  其中μ為自適應(yīng)步長(zhǎng)因子,一般取0μ

37、1,可視為常數(shù),k時(shí)刻濾波器的輸出為:</p><p>  以上三個(gè)方程是LMS最小均方誤差算法的核心方程,也是C語(yǔ)言編程的依據(jù)。LMS的算法流程圖如下:</p><p>  五、用C語(yǔ)言實(shí)現(xiàn)LMS算法</p><p>  由C語(yǔ)言實(shí)現(xiàn)LMS算法的C語(yǔ)言程序如下所示:</p><p>  double lms (double w[],doub

38、le x[],double dk,double ek) //移植到CCS中的lms算法</p><p><b>  {</b></p><p><b>  s16 i;</b></p><p>  double uek,yk;</p><p><b>  yk=0;</b>

39、;</p><p>  for(i=0;i<N;++i)</p><p><b>  {</b></p><p>  yk=yk+w[i]*x[i];</p><p><b>  }</b></p><p><b>  ek=dk-yk;</b>&

40、lt;/p><p>  uek=2*mu*ek;</p><p>  for(i=0;i<N;i++)</p><p><b>  {</b></p><p>  w[i]=w[i]+uek*x[i];</p><p><b>  }</b></p>&l

41、t;p>  return(ek);</p><p><b>  }</b></p><p>  然而算法的效率與濾波器的長(zhǎng)度有關(guān),因此應(yīng)當(dāng)適當(dāng)減小濾波器的長(zhǎng)度;同時(shí)也應(yīng)該適當(dāng)?shù)奶岣逨IR濾波器的階數(shù)。同時(shí)替換原有的LMS算法的C語(yǔ)言實(shí)現(xiàn)程序,更換為CCS的diplib庫(kù)中的函數(shù)short dlms(PARAM)取代自定的lms()函數(shù),同時(shí)用dsplib庫(kù)里的函

42、數(shù)short fir(PARAM)產(chǎn)生回聲通道的輸出信號(hào)(也就是用預(yù)定階數(shù)的FIR濾波器模擬回聲通道),該輸出信號(hào)作為自適應(yīng)濾波器的理想輸出信號(hào),對(duì)之進(jìn)行逼近進(jìn)而得到預(yù)定結(jié)果。</p><p>  Dsplib庫(kù)中的dlsm函數(shù)和fir函數(shù)的子程序:</p><p>  Dlsm.h的程序如下,路徑:C:\ti\c5400\dsplib\EXAMPLES\DLMS</p>&

43、lt;p>  //*****************************************************************************</p><p>  // Filename: dlms_t.c</p><p>  // Version: 0.01</p><p>  // Description: test

44、 for dlms routine</p><p>  //*****************************************************************************</p><p>  #include <math.h></p><p>  #include <tms320.h></p&

45、gt;<p>  #include <dsplib.h></p><p>  #include "test.h"</p><p><b>  short i;</b></p><p>  short eflagr= PASS;</p><p>  short eflagh=

46、PASS;</p><p>  void main(void)</p><p><b>  {</b></p><p>  /* clear */</p><p>  for (i=0;i<NH;i++) h[i] =0;// clear coeff buffer (optional)</p>&l

47、t;p>  for (i=0;i<NX;i++) r[i] =0;// clear output buffer (optional)</p><p>  for (i=0; i<NH; i++) dbuffer[i] = 0; // clear delay buffer (a must)</p><p>  /* compute */</p><p&

48、gt;  dlms(x,h,r,&dp,des,STEP, NH, NX);</p><p>  /* test */</p><p>  eflagr = test(r, rtest, NX, MAXERROR);// for r</p><p>  eflagh = test(h, htest, NH, MAXERROR);// for h</

49、p><p>  if (eflagr != PASS)</p><p><b>  {</b></p><p><b>  exit(-1);</b></p><p><b>  }</b></p><p>  if (eflagh != PASS)<

50、/p><p><b>  {</b></p><p><b>  exit(-1);</b></p><p><b>  }</b></p><p><b>  return;</b></p><p><b>  }</

51、b></p><p>  FIR.h的程序如下,路徑:C:\ti\c5400\dsplib\EXAMPLES\FIR</p><p>  //*****************************************************************************</p><p>  // Filename: fir_t.c

52、</p><p>  // Version: 0.01</p><p>  // Description: test for fir routine</p><p>  //*****************************************************************************</p><p

53、>  #include <math.h></p><p>  #include <tms320.h></p><p>  #include <dsplib.h></p><p>  #include "test.h"</p><p><b>  short i;</

54、b></p><p>  short eflag1= PASS;</p><p>  short eflag2= PASS;</p><p>  DATA *dbptr = &db[0];</p><p>  void main(void)</p><p><b>  {</b>&

55、lt;/p><p>  /* 1. Test for single-buffer */</p><p>  /* clear */</p><p>  for (i=0; i<NX; i++) r[i] = 0; // clear output buffer (optional)</p><p>  for (i=0; i<

56、NH; i++) db[i] = 0; // clear delay buffer (a must)</p><p>  /* compute */</p><p>  fir(x, h, r, &dbptr, NH, NX);</p><p>  /* test */</p><p>  eflag1 = test (r, rtes

57、t, NX, MAXERROR);</p><p>  /* 2. Tests for dual-buffer */</p><p>  /* clear */</p><p>  for (i=0; i<NX; i++) r[i] = 0; // clear output buffer (optional)</p><p>

58、  for (i=0; i<NH; i++) db[i] = 0; // clear delay buffer (a must)</p><p>  dbptr = &db[0];</p><p>  /* compute */</p><p>  if (NX>=4)</p><p><b>  {</b

59、></p><p>  fir(x, h, r, &dbptr, NH, NX/4);</p><p>  fir(&x[NX/4], h, &r[NX/4], &dbptr, NH, NX/4);</p><p>  fir(&x[2*NX/4], h, &r[2*NX/4], &dbptr, NH,

60、NX/4);</p><p>  fir(&x[3*NX/4], h, &r[3*NX/4], &dbptr, NH, NX/4);</p><p><b>  }</b></p><p>  /* test */</p><p>  eflag2 = test (r, rtest, NX, MA

61、XERROR);</p><p>  if (eflag1 != PASS)</p><p><b>  {</b></p><p><b>  exit(-1);</b></p><p><b>  }</b></p><p>  if (eflag2

62、 != PASS)</p><p><b>  {</b></p><p><b>  exit(-2);</b></p><p><b>  }</b></p><p><b>  return;</b></p><p><

63、b>  }</b></p><p>  這兩個(gè)函數(shù)是用C5000匯編語(yǔ)言編寫(xiě)的,具有很高的執(zhí)行效率,使用這個(gè)函數(shù)可以大大提高運(yùn)算速度,以解決用C語(yǔ)言編寫(xiě)的程序效率不能滿(mǎn)足要求的問(wèn)題。下面以dlsm.h為例,其使用方法如下:</p><p>  short oflag = dlms (DATA *x, DATA *h, DATA *r, DATA **d, DATA *de

64、s, DATA step, ushort nh, ushort nx)</p><p>  其C子函數(shù)定義的各個(gè)變量的意義如下表所示: </p><p>  注意:h和d的存儲(chǔ)地址要求起點(diǎn)必須位于Kbit邊界處,即起始地址值的最低有效位必須是0,必須在CMD文件中開(kāi)辟對(duì)齊1K邊界的空間,并且只能在頭文件中進(jìn)行段的配置。否則編譯無(wú)法通過(guò)。</p><p>  同理,F(xiàn)

65、IR.h的使用方法如下:</p><p>  oflag = short fir (DATA *x, DATA *h, DATA *r, DATA **dbuffer, ushort nh, ushort nx)</p><p>  注意:h、d的地址要求同dlms()函數(shù)中的h、d參數(shù)。DATA 為tms320.h中定義的short整型。</p><p>  為了

66、降低計(jì)算量,輸入緩沖數(shù)組長(zhǎng)度應(yīng)該盡量小,取長(zhǎng)度為L(zhǎng)ENGTH_IN=5。采用數(shù)據(jù)壓入方式,將最新的聲音采樣值存入數(shù)組x[0],然后將存儲(chǔ)的數(shù)據(jù)從低位壓入高位。其實(shí)現(xiàn)程序update(DATA x[],DATA dk)如下:</p><p>  void update(DATA x[],DATA dk) //dk為當(dāng)前采樣值</p><p><b>  {</b>&

67、lt;/p><p>  s16 j,k; </p><p>  for(j=1;j<LENGTH_IN;++j)</p><p><b>  { </b></p><p>  k=LENGTH_IN-j;</p><p>  x[k]=x[k-1]; //從低位壓向高位&

68、lt;/p><p><b>  }</b></p><p>  x[0]=dk; // 當(dāng)前采樣值存入最低位</p><p><b>  }</b></p><p>  六、用MATLAB設(shè)計(jì)FIR濾波器</p><p>  用MATLAB設(shè)計(jì)FIR流程如下:

69、</p><p>  打開(kāi)MATLAB,在命令窗中輸入fdatool,打開(kāi)濾波器設(shè)計(jì)與分析工具。</p><p>  更改濾波器的各個(gè)參數(shù)值,因?yàn)檎Z(yǔ)音信號(hào)的頻率成分主要分布在300Hz到3400Hz,所以我們只要設(shè)計(jì)300Hz到3400Hz的帶通FIR濾波器就可以實(shí)現(xiàn)對(duì)語(yǔ)音信號(hào)中摻雜的噪聲的濾除。在FDA中選擇帶通FIR濾波器,階數(shù)選擇15,抽樣頻率選擇16kHz,阻帶截頻分別為0.25

70、kHz和3.45 kHz,通帶截頻分別為0.3 kHz和3.4 kHz。</p><p>  點(diǎn)擊“Desgin filter” 完成濾波器設(shè)計(jì),濾波器的波形如下圖所示。</p><p>  然后將設(shè)計(jì)好的結(jié)果導(dǎo)出為fir.h文件。下面就是導(dǎo)出的fir.h文件。</p><p><b>  /*</b></p><p>

71、  * Filter Design and Analysis Tool - Generated Filter Coefficients - C Source </p><p>  * Generated by MATLAB - Signal Processing Toolbox</p><p><b>  */</b></p><p>  /

72、* General type conversion for MATLAB generated C-code */</p><p>  #include "tmwtypes.h"</p><p><b>  /* </b></p><p>  * Expected path to tmwtypes.h </p>

73、<p>  * C:\MATLAB6p5\extern\include\tmwtypes.h </p><p><b>  */</b></p><p>  const int BL = 16;</p><p>  const real64_T B[16] = {-1737, -22, 494, -1762, -41

74、17, -2011, 5080, 11684, 11684, 5080, -2011, -4117, -1762, 494, -22, -1737};</p><p><b>  七、程序設(shè)計(jì)</b></p><p>  實(shí)驗(yàn)中用到的源程序有以下幾個(gè):</p><p>  1.主程序(firlab.c)</

75、p><p>  /*****************************************************************************/</p><p>  /* */ </p><p>  /* */</p><p>  /*

76、 */</p><p>  /* */</p><p>  /*****************************************************************************/</p><p>  #include <type.h></p>

77、<p>  #include <board.h></p><p>  #include <codec.h></p><p>  #include <dsplib.h></p><p>  #include <firlab.h></p><p>  #include <string

78、.h></p><p>  #include <math.h></p><p>  void delay(s16 period);</p><p>  extern void DMAC2ISR();</p><p>  #define SS 16 </p><p>  /*************

79、****************************************************************/</p><p>  /* 全局變量 */</p><p>  /*****************************************************************************/</p&

80、gt;<p>  HANDLE hHandset;</p><p>  unsigned int dmsefc,dmmcr,dmctr,src_addr,dst_addr;</p><p>  unsigned int dmpre,dmsrcp,dmdstp,dmidx0,dmidx1,dmfri0,dmfri1,dmgsa,dmgda,dmgcr,dmgfr;</p&

81、gt;<p>  /*存放輸入數(shù)據(jù)*/</p><p>  #pragma DATA_SECTION(inp_buffer,"audio_buffer");</p><p>  int inp_buffer[0x200];</p><p>  /*存放輸出數(shù)據(jù)*/</p><p>  #pragma DATA

82、_SECTION(out_buffer,"outt_buffer");</p><p>  int out_buffer[0x200];</p><p>  int out1_buffer[0x200];</p><p>  /*存放濾波器系數(shù)*/</p><p>  #pragma DATA_SECTION(coeffs

83、,"coefficients");</p><p><b>  /*低通濾波器*/</b></p><p>  DATA coeffs[16]={ 0, -113, 419, -878, 1031, 0, -3731, 19656, 19656,</p><p>  -3731,

84、 0, 1031, -878, 419, -113, 0};</p><p>  /*高通濾波器*//*這里COEFF的數(shù)據(jù)類(lèi)型曾經(jīng)是 int*/</p><p><b>  /*帶通濾波器*/</b></p><p><b>  /*帶阻濾波器*/</b></p><p&

85、gt;<b>  /*全通濾波器*/</b></p><p>  /*存放延遲數(shù)據(jù)*/</p><p>  #pragma DATA_SECTION(delaybuff,"delayb");</p><p>  int delaybuff[16]={0};</p><p>  int frame=0;

86、</p><p>  int flag=0;</p><p><b>  int temp;</b></p><p>  int currbuff=0;</p><p>  int choose=1;</p><p>  int *delayptr1= &(delaybuff[0]);&l

87、t;/p><p>  interrupt void DMAC2ISR();</p><p>  DATA y[SS];</p><p>  double p,q,temp1;</p><p>  u16 f[SS/2+1];</p><p>  int iii,mm;</p><p>  /****

88、*************************************************************************/</p><p>  /* MAIN */</p><p>  /***********************************************************************

89、******/</p><p>  void main()</p><p><b>  {</b></p><p>  s16 cnt=2;</p><p>  BSCR=0x8806;</p><p><b>  XPC=0;</b></p><p>

90、;  PMST=0xA0;</p><p>  brd_set_cpu_freq(100);</p><p>  TIMER_HALT(0);</p><p>  brd_set_wait_states(7,7,9);</p><p>  TIMER_RESET(0);</p><p><b>  IMR=0

91、; </b></p><p>  /************************計(jì)算濾波器的FFT******************************************/</p><p>  cbrev(coeffs,y,SS/2);</p><p>  rfft(y,SS,0);</p><p>  /**

92、******求信號(hào)的幅度譜*************************/</p><p>  f[0]=abs(y[0]);</p><p>  f[SS/2]=abs(y[1]);</p><p><b>  mm=1;</b></p><p>  for(iii=2;iii<SS;iii=iii+2)&l

93、t;/p><p><b>  {</b></p><p><b>  p=y[iii];</b></p><p>  q=y[iii+1];</p><p>  temp1=sqrt(p*p+q*q);//取幅度譜</p><p>  f[mm]=temp1;</p>

94、<p><b>  mm++;</b></p><p><b>  }</b></p><p>  /******************************************************************************/</p><p>  /************

95、*****************************************************************/</p><p>  if(brd_init_bios())</p><p><b>  return;</b></p><p>  while (cnt--)</p><p><b&

96、gt;  {</b></p><p>  brd_led_toggle(BRD_LED0);</p><p>  delay(1000);</p><p>  brd_led_toggle(BRD_LED1);</p><p>  delay(1000);</p><p>  brd_led_toggle(

97、BRD_LED2);</p><p>  delay(1000);</p><p><b>  }</b></p><p>  hHandset=codec_open(HANDSET_CODEC);</p><p>  /*設(shè)置codec參數(shù)*/</p><p>  codec_dac_mode(

98、hHandset,CODEC_DAC_15BIT);</p><p>  codec_adc_mode(hHandset,CODEC_ADC_15BIT);</p><p>  codec_ain_gain(hHandset,CODEC_AIN_6dB);</p><p>  codec_aout_gain(hHandset,CODEC_AOUT_MINUS_6dB

99、);</p><p>  codec_sample_rate(hHandset,SR_16000);</p><p>  INTR_CLR_FLAG(DMAC2);</p><p>  dma_reset_all();</p><p>  /*初始化DMA2通道*/</p><p>  dmsefc=((DSYNC_R

100、EVT1<<12));</p><p>  dmmcr=((AUTOINIT_ENABLE<<15)|(DINM_ENABLE<<14)|(IMOD_HALFBLOCK<<13)|(CTMOD_DEC<<12)|</p><p>  (INDEXMODE_NOMOD<<8)|(SPACE_DATA<<6)|

101、(INDEXMODE_INC<<2)|(SPACE_DATA));</p><p>  dmmcr=0xe045;</p><p>  dmctr= 0xFF;</p><p>  src_addr=DRR1_ADDR(HANDSET_CODEC);</p><p>  dst_addr=(unsigned int)&in

102、p_buffer;</p><p>  dma_init(DMA_CH2,dmsefc,dmmcr,dmctr,SPACE_DATA,src_addr,SPACE_DATA,dst_addr);</p><p>  DMA_FRAMECOUNT(DMA_CH2,1);</p><p>  dmgsa=src_addr;</p><p>  d

103、mgda=dst_addr;</p><p>  dmgcr=0xFF;</p><p><b>  dmgfr=1;</b></p><p>  dmpre=((HIGH_PRIORITY<<10)|(INTSEL_01<<6));</p><p>  dmsrcp=SPACE_DATA;<

104、;/p><p>  dmdstp=SPACE_DATA;</p><p><b>  dmidx0=0;</b></p><p><b>  dmidx1=0;</b></p><p><b>  dmfri0=0;</b></p><p><b>

105、;  dmfri1=0;</b></p><p>  dma_global_init(dmpre,dmsrcp,dmdstp,dmidx0,dmidx1,dmfri0,dmfri1,dmgsa,dmgda,dmgcr,dmgfr);</p><p>  DMA_ENABLE(DMA_CH2);</p><p>  temp=*(volatile u16*

106、)DRR1_ADDR(HANDSET_CODEC);</p><p>  INTR_ENABLE(DMAC2);</p><p>  INTR_GLOBAL_ENABLE;</p><p><b>  for(;;);</b></p><p><b>  }</b></p><p

107、>  void delay(s16 period)</p><p>  { int i,j;</p><p>  for(i=0;i<period;i++)</p><p>  { for (j=0;j<period;j++);</p><p><b>  }</b></p><p&

108、gt;<b>  }</b></p><p>  2.中斷服務(wù)程序(dma2isr.c)</p><p>  #include<codec.h></p><p>  #include<firlab.h></p><p>  #include<stdio.h></p>&l

109、t;p>  #include<stdlib.h></p><p>  extern void delay(s16 period);</p><p>  externunsigned int channel;</p><p>  externunsigned int dmsefc;</p><p>  externun

110、signed int dmmcr;</p><p>  externunsigned int dmctr;</p><p>  externunsigned int src_page;</p><p>  externunsigned int src_addr;</p><p>  externunsigned int dst_pag

111、e;</p><p>  externunsigned int dst_addr;</p><p>  externint inp_buffer[0x200];</p><p>  externint out_buffer[0x200];</p><p>  externint coeffs[16];</p><p

112、>  externint delaybuff[16];</p><p>  externint frame;</p><p>  externint flag;</p><p>  externint currbuff;</p><p>  externint *delayptr1;</p><p> 

113、 externint L=0;</p><p>  extern int choose;</p><p>  externint out1_buffer[0x200];</p><p>  void init_dma3(void) </p><p>  { while(DMPREC&0x0008){};</p>

114、<p>  dmsefc=((DSYNC_REVT1<<12));</p><p>  dmmcr=0x4141;</p><p>  dmctr=0xFF;</p><p>  src_addr=(unsigned int)&out_buffer+((unsigned int)frame*0x100);</p><

115、;p>  dst_addr=DXR1_ADDR(HANDSET_CODEC);</p><p>  dma_init(DMA_CH3,dmsefc,dmmcr,dmctr,SPACE_DATA,src_addr,SPACE_DATA,dst_addr);</p><p>  DMA_FRAMECOUNT(DMA_CH3,0);</p><p>  DMA_EN

116、ABLE(DMA_CH3);</p><p><b>  }</b></p><p>  interrupt void DMAC2ISR(void)</p><p><b>  {</b></p><p>  int *p_inp,*p_out;</p><p>  int

117、*p_out1;</p><p>  if(choose==1)</p><p><b>  {</b></p><p>  p_inp=inp_buffer+frame*0x100;</p><p>  p_out1=out1_buffer+frame*0x100;</p><p>  p_o

118、ut=out_buffer+frame*0x100;</p><p>  fir(p_inp,coeffs,p_out1,&delayptr1,16,256);</p><p>  dlms(p_inp,coeffs,p_out,&delayptr1,p_out1,327,16,256);</p><p>  init_dma3();</p&g

119、t;<p><b>  frame^=1;</b></p><p><b>  }</b></p><p>  if (choose==0)</p><p><b>  {</b></p><p>  p_inp=inp_buffer+frame*0x100;&l

120、t;/p><p>  p_out=out_buffer+frame*0x100;</p><p>  fir(p_inp,coeffs,p_out,&delayptr1,16,256);</p><p>  init_dma3();</p><p><b>  frame^=1;</b></p>&l

121、t;p><b>  }</b></p><p><b>  }</b></p><p>  3.鏈接命令文件(5402a.cmd)</p><p><b>  MEMORY</b></p><p><b>  {</b></p>&l

122、t;p><b>  PAGE 0: </b></p><p>  VEC1: origin = 0080h, length = 0078h /* Internal Program RAM */</p><p>  PRAM: origin = 2000h, length = 2000h /* Internal Program RAM */&l

123、t;/p><p>  VEC2: origin = 0xff80, length = 0x78 </p><p><b>  PAGE 1: </b></p><p>  SCRATCH: origin = 0060h, length = 0020h /* Scratch Pad Data RAM */</p><p

124、>  DMARAM: origin = 0100h, length = 0400h /* DMA buffer */</p><p>  STACK: origin = 0600h, length = 0400h </p><p>  /* Stack Memory Space */</p><p>  EXRAM: origin = 1

溫馨提示

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

評(píng)論

0/150

提交評(píng)論