版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- dsp課程設(shè)計(jì)--語(yǔ)音噪聲濾波
- 語(yǔ)音濾波器課程設(shè)計(jì)報(bào)告
- 基于dsp的語(yǔ)音噪聲濾波器設(shè)計(jì)
- dsp課程設(shè)計(jì)報(bào)告--fir濾波器設(shè)計(jì)
- dsp課程設(shè)計(jì)報(bào)告(fir濾波器的dsp實(shí)現(xiàn))
- 語(yǔ)音濾波器課程設(shè)計(jì)--語(yǔ)音濾波器
- 語(yǔ)音濾波器課程設(shè)計(jì)
- 語(yǔ)音濾波器課程設(shè)計(jì)
- dsp課程設(shè)計(jì)報(bào)告----語(yǔ)音壓縮、存儲(chǔ)與回放
- 語(yǔ)音濾波器課程設(shè)計(jì)
- dsp課程設(shè)計(jì)--濾波器
- dsp應(yīng)用課程設(shè)計(jì)---有噪聲的語(yǔ)音信號(hào)分析與處理設(shè)計(jì)
- 語(yǔ)音濾波器的課程設(shè)計(jì)
- 基于dsp的fir濾波器設(shè)計(jì)課程設(shè)計(jì)報(bào)告
- 語(yǔ)音信號(hào)的濾波課程設(shè)計(jì)
- dsp語(yǔ)音信號(hào)處理課程設(shè)計(jì)
- 利用dsp實(shí)現(xiàn)自適應(yīng)濾波dsp課程設(shè)計(jì)
- dsp課程設(shè)計(jì)-fir濾波器設(shè)計(jì)
- dsp課程設(shè)計(jì)-fir濾波器設(shè)計(jì)
- dsp課程設(shè)計(jì)報(bào)告
評(píng)論
0/150
提交評(píng)論