

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> DSP課程設(shè)計(jì)</b></p><p><b> 實(shí) 驗(yàn) 報(bào) 告</b></p><p> 基于DSP的回波的產(chǎn)生與抵消</p><p> 學(xué) 院:電子信息工程學(xué)院 </p><p><b> 目錄</b></p>&l
2、t;p> 設(shè)計(jì)任務(wù)書 ……………………………………………………2</p><p> 任務(wù)設(shè)計(jì) ……………………………………………………3</p><p> 設(shè)計(jì)內(nèi)容 ……………………………………………………3</p><p> 設(shè)計(jì)方案及算法原理說明 ……………………………………4</p><p> 實(shí)
3、驗(yàn)?zāi)康?……………………………………………………4</p><p> 實(shí)驗(yàn)原理 ……………………………………………………4</p><p> 關(guān)于LMS算法 ……………………………………………5</p><p> 程序代碼 ……………………………………………………6</p><p> 程序設(shè)計(jì)及調(diào)試 …………………………
4、……………………12</p><p> 結(jié)果分析 ……………………………………………………19</p><p> 實(shí)驗(yàn)體會(huì)及總結(jié) …………………………………………………22</p><p> 參考文獻(xiàn) ……………………………………………………25</p><p><b> 設(shè)計(jì)任務(wù)書</b><
5、;/p><p> 過去,通過衛(wèi)星打國際電話時(shí),因?yàn)橥届o止衛(wèi)星的通話路徑較長,引起通話延遲(單跳250ms,雙跳500ms),因電路失配所引起的線路回聲就很明顯,所以從二十世紀(jì)80年代起人們就研究回聲消除的辦法。由簡單的回聲抑制器發(fā)展到自適應(yīng)回聲消除器,國際電聯(lián)(ITU)也相應(yīng)地制訂了回聲消除器的國際標(biāo)準(zhǔn),例如G.164、G.165 、G.167等等。進(jìn)入90年代之后,通過互聯(lián)網(wǎng)撥打長途電話,即IP電話開始流行。I
6、P電話現(xiàn)在已成為Internet上實(shí)現(xiàn)實(shí)時(shí)傳送語音信號(hào)的一種新型電信業(yè)務(wù)。</p><p> 與傳統(tǒng)的PSTN網(wǎng)絡(luò)采用電路交換技術(shù)不同,IP電話采用的是分組交換技術(shù),充分利用Internet來傳輸數(shù)據(jù),使得價(jià)格大大降低,因而具有廣泛的研究和應(yīng)用前景。IP電話以數(shù)據(jù)包的格式在因特網(wǎng)中與其他數(shù)據(jù)信息按TCP/IP協(xié)議一起傳輸,從發(fā)話端到收話端延時(shí)較長,并且是不確定的,IP電話系統(tǒng)的回聲源復(fù)雜,回聲路徑的延時(shí)和抖動(dòng)都
7、相當(dāng)大,這里的延遲包括算法延遲(0.125ms~30ms),處理延遲(≈30ms),網(wǎng)絡(luò)延遲(70~100ms)等,總延遲在100ms以上,而人耳對(duì)大于50ms的回聲就能鑒別出來,因此回聲消除成了IP電話系統(tǒng)的一個(gè)關(guān)鍵問題。</p><p> 在IP電話系統(tǒng)中,自適應(yīng)回聲消除器成為不可缺少的設(shè)備。自適應(yīng)濾波的優(yōu)點(diǎn)在于,它不僅能夠選擇信號(hào),而且能夠控制信號(hào)的特性。自適應(yīng)濾波器具有跟蹤信號(hào)和噪聲變化的能力,它的系數(shù)
8、能夠被一種自適應(yīng)算法所修改。利用DSP可以實(shí)時(shí)地對(duì)信號(hào)進(jìn)行自適應(yīng)濾波。DSP利用直接存儲(chǔ)器訪問方式DMA采集數(shù)據(jù)時(shí)不打擾CPU,因此CPU可以對(duì)信號(hào)進(jìn)行實(shí)時(shí)地濾波。</p><p> 本設(shè)計(jì)要求利用DSP的DMA方式進(jìn)行信號(hào)采集和信號(hào)輸出,同時(shí)對(duì)外部輸入的信號(hào)進(jìn)行數(shù)字濾波,完成對(duì)電話線路中較為嚴(yán)重的回波進(jìn)行抵消,實(shí)現(xiàn)電話線路中通話清晰。</p><p><b> 二、任務(wù)設(shè)計(jì)
9、</b></p><p> 首先,先測試原輸入語音信號(hào)的效果。此時(shí),說話者應(yīng)只聽到自己同步的語音。接著,對(duì)輸入的語音信號(hào)產(chǎn)生對(duì)應(yīng)的回波,使說話者能聽到自己的說話聲的同時(shí),還可以聽到多重回聲。然后編寫自適應(yīng)濾波算法程序,或調(diào)用DSPLIB中的dlms自適應(yīng)濾波函數(shù)對(duì)產(chǎn)生的回波進(jìn)行濾除,使說話者只聽到自己同步的語音,而沒有回聲。</p><p><b> 三、設(shè)計(jì)內(nèi)容
10、</b></p><p> 回聲消除的基本原理是采用一個(gè)自適應(yīng)濾渡器自動(dòng)識(shí)別回聲通道,通過自適應(yīng)濾波算法的調(diào)整,使其沖激響應(yīng)與實(shí)際回聲路徑逼近,從而得到回聲預(yù)測信號(hào)y(n),再將預(yù)測信號(hào)從近端采樣的語音信號(hào)d(n)中減去,即可實(shí)現(xiàn)回聲消除。</p><p> 本實(shí)驗(yàn)的主要內(nèi)容就是通過將過去的信號(hào)衰減加到現(xiàn)在的信號(hào)上,以產(chǎn)生回波,然后通過采用LMS算法設(shè)計(jì)一個(gè)自適應(yīng)濾波器,將
11、回波濾去,比較濾波前和濾波后信號(hào)的差異來衡量自適應(yīng)濾波器的性能。</p><p> 四、設(shè)計(jì)方案、算法原理說明</p><p><b> (一)、實(shí)驗(yàn)?zāi)康模?lt;/b></p><p> 1、掌握CCS環(huán)境的使用</p><p> 2、掌握TMS320C5402DSP芯片的基本知識(shí)</p><p&
12、gt; 3、掌握基于CCS編程設(shè)計(jì)的方法</p><p> ?。?)對(duì)DMA進(jìn)行初始化;</p><p> ?。?)對(duì)A/D、D/A進(jìn)行初始化;</p><p> ?。?)編寫DMA通道傳輸程序,實(shí)現(xiàn)數(shù)據(jù)實(shí)時(shí)采集和實(shí)時(shí)地輸出;</p><p> ?。?)設(shè)計(jì)自適應(yīng)濾波算法,或調(diào)用DSPLIB中的自適應(yīng)函數(shù),實(shí)現(xiàn)信號(hào)的自適應(yīng)濾波。</p
13、><p> ?。?)濾波后信號(hào)實(shí)時(shí)輸出的同時(shí),將數(shù)據(jù)存放在數(shù)據(jù)文件中;</p><p> (6)利用自適應(yīng)濾波實(shí)現(xiàn)語音信號(hào)回波對(duì)消。</p><p> 本程序是在CCS5000自帶程序codec的基礎(chǔ)上進(jìn)行修改和加工,codec程序包含DSP板的初始化、語音的讀取輸出、A/D、D/A轉(zhuǎn)換、濾波等一系列功能。涉及5402 DSP 多通道緩沖串行口mcbsp 和tlc3
14、20ad50 CODEC 編譯碼器的C 語言編程方法</p><p><b> (二)、實(shí)驗(yàn)原理</b></p><p> 源自接收器(耳機(jī))的聲波,通過位于聲音路徑上的固體物體反射進(jìn)入手機(jī)的麥克風(fēng)(話筒)中,或揚(yáng)聲器電話中,這就形成了聲學(xué)回聲。</p><p> 聲學(xué)回聲消除的功能原理框圖如圖1所示:</p><p&
15、gt; 圖1 回聲消除器原理框圖</p><p> 回聲消除的基本原理是采用一個(gè)自適應(yīng)濾渡器自動(dòng)識(shí)別回聲通道,通過自適應(yīng)濾波算法的調(diào)整,使其沖激響應(yīng)與實(shí)際回聲路徑逼近,從而得到回聲預(yù)測信號(hào)y(n),再將預(yù)測信號(hào)從近端采樣的語音信號(hào)d(n)中減去,即可實(shí)現(xiàn)回聲消除。自適應(yīng)算法要求收斂速度快、計(jì)算復(fù)雜度低、穩(wěn)定性好和失調(diào)誤差小。雖然許多自適應(yīng)算法在理論上實(shí)現(xiàn)回聲消除都是可行的,但通常采用的是較簡單的算法。例如廣泛
16、應(yīng)用的LMS自適應(yīng)算法。</p><p> (三)、關(guān)于LMS算法</p><p> 本實(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)回聲通道。算法的實(shí)現(xiàn)基于TMS320C5402DSP芯片和CCS系統(tǒng)的C語言。 </p><p>
17、 遠(yuǎn)端的信號(hào)通過回聲通道產(chǎn)生回聲信號(hào)d(n),該信號(hào)一般為遠(yuǎn)端信號(hào)的衰減和延遲。遠(yuǎn)端信號(hào)通過自適應(yīng)濾波器產(chǎn)生回聲預(yù)測信號(hào)y(n)。在k時(shí)刻,它們之差為剩余回聲信號(hào):</p><p><b> ?。?)</b></p><p> 用它來控制LMS自適應(yīng)濾波器的系數(shù)w(n)</p><p><b> ?。?)</b><
18、;/p><p> 其中μ為自適應(yīng)步長因子,一般取0μ1,可視為常數(shù)</p><p> k時(shí)刻濾波器的輸出為:</p><p><b> ?。?) </b></p><p> 以上(1),(2),(3)三個(gè)方程是LMS最小均方誤差算法的核心方程,也是C語言編程的依據(jù)。LMS算法流程圖如下圖所示:</p>&
19、lt;p><b> 五、程序代碼</b></p><p><b> codec.c程序</b></p><p> /*****************************************************************************/</p><p> /* Codec.
20、c*/</p><p> /* Digital Loopback example*/</p><p> /*****************************************************************************/</p><p> #include "type.h"</p>&
21、lt;p> #include "board.h"</p><p> #include "codec.h"</p><p> #include "mcbsp54.h"</p><p> #include "tms320.h"</p><p> #in
22、clude "dsplib.h"</p><p> #include "setm.h"</p><p> /*****************************************************************************/</p><p> /* Function Prototy
23、pes*/</p><p> /*****************************************************************************/</p><p> /* This delay routine does not conflict with DSP/BIOS. It is used in this */</p>
24、<p> /* example rather than brd_delay_msec which causes DSP/BIOS conflicts just */</p><p> /* because of this. If you are not using DSP/BIOS, you can change the code */</p><p> /* to u
25、se brd_delay_msec. */</p><p> void delay(void); //延遲</p><p> void update(DATA x[],DATA dk);</p><p> void initarray(DATA x[]);
26、</p><p> /*****************************************************************************/</p><p> /* Global Variables */</p><
27、p> /*****************************************************************************/</p><p> HANDLE hHandset; //CODEC句柄</p><p> DATA bf1[5000]; //緩沖區(qū)</p><p> /***********
28、******************************************************************/</p><p><b> /* MAIN*/</b></p><p> /*****************************************************************************/
29、</p><p> DATA *dp_w = &dbuffer_w[0];</p><p> DATA *dp_h = &dbuffer_h[0]; </p><p> void main() </p><p><b> {</b></p><p><b> s
30、16 j;</b></p><p><b> s16 m;</b></p><p> s16 cnt=3; //燈循環(huán)閃次數(shù),初始化等待時(shí)鐘周期數(shù)</p><p> DATA dk,out_delay,yk;//ek </p><p> s16 mode=2; //決定是否產(chǎn)生
31、回波是否使用回波抵消</p><p> s16 i; </p><p> if (brd_init(100)) //板的初始化</p><p><b> return;</b></p><p> for (i=0; i<
32、;LENGTH_IN; i++) dbuffer_h[i] = 0;</p><p> for (i=0;i<LENGTH_IN;i++) out_h[i] =0;// clear output buffer (optional) </p><p> for (i=0;i<LENGTH_W;i++) coff_w[i] =0;// clear coeff buffe
33、r (optional)</p><p> for (i=0;i<LENGTH_IN;i++) out_w[i] =0;// clear output buffer (optional)</p><p> /* blink the leds a couple times */</p><p> while ( cnt-- )
34、/*板子初始化,用燈閃來表示*/</p><p><b> {</b></p><p> brd_led_toggle(BRD_LED0);</p><p> /* brd_delay_msec(1000); */</p><p><b> delay();</b></p>&
35、lt;p> brd_led_toggle(BRD_LED1);</p><p> /* brd_delay_msec(1000); */</p><p><b> delay();</b></p><p> brd_led_toggle(BRD_LED2);</p><p> /* brd_delay_m
36、sec(1000); */</p><p><b> delay();</b></p><p><b> } </b></p><p> /* Open Handset Codec */</p><p> hHandset = codec_open(HANDSET_CODEC);
37、 /* Acquire handle to codec */</p><p> /* Set codec parameters */</p><p> codec_dac_mode(hHandset, CODEC_DAC_15BIT); /* DAC in 15-bit mode */</p><p> codec_ad
38、c_mode(hHandset, CODEC_ADC_15BIT); /* ADC in 15-bit mode */</p><p> codec_ain_gain(hHandset, CODEC_AIN_0dB); /* 0dB gain on analog input to ADC */</p><p> codec_aout_gain(h
39、Handset, CODEC_AOUT_MINUS_12dB); /* -12dB gain on analog output from DAC */</p><p> codec_sample_rate(hHandset,SR_8000); /* 8KHz sampling rate */</p><p> brd_led_toggle(BRD_LE
40、D0);</p><p> initarray(x); //初始化所有數(shù)組</p><p><b> i=0;</b></p><p><b> j=3000;</b></p><p><b> m=1500;</b></p><p>
41、 while(1) //讀數(shù)循環(huán)</p><p><b> {</b></p><p> while (!MCBSP_RRDY(HANDSET_CODEC)) {};</p><p> dk = *(volatile u16*)DRR1_ADDR(HANDSET_CODEC); </p><
42、;p> // *(volatile u16*)DXR1_ADDR(HANDSET_CODEC)=dk; //從ADC讀數(shù) </p><p> update(x,dk); </p><p> if(mode==0)</p><p><b> {</b></p><p> *(volatile
43、 u16*)DXR1_ADDR(HANDSET_CODEC)=dk;</p><p><b> }</b></p><p> else if(mode==1)</p><p><b> { </b></p><p> fir(x,coff_h,out_h,&dp_h,LENG
44、TH_H,LENGTH_IN); </p><p> if(i==5000) i=0; </p><p> if(j==5000) j=0;</p><p> if(m==5000) m=0;</p><p> bf1[i]=out_h[0];i++;//放入緩沖區(qū)</p><p> out_
45、delay=0.5*bf1[i+1]+1.5*bf1[j++]+bf1[m++]; </p><p> yk=dk+out_delay; </p><p> *(volatile u16*)DXR1_ADDR(HANDSET_CODEC)=yk;</p><p><b> }</b></p>&
46、lt;p> else if(mode==2)</p><p><b> {</b></p><p> fir(x,coff_h,out_h,&dp_h,LENGTH_H,LENGTH_IN); </p><p> if(i==5000) i=0; </p><p> if(j==5000) j=0
47、;</p><p> if(m==5000) m=0; </p><p> bf1[i]=out_h[0];i++; </p><p> out_delay=0.5*bf1[i+1]+1.5*bf1[j++]+bf1[m++]; </p><p> yk=dk+out_delay; </p>&l
48、t;p> update(y,yk); </p><p> dlms(y,coff_w,out_w,&dp_w,out_h,STEP,LENGTH_W,LENGTH_IN);</p><p> //ek=out_h[0]-out_w[0]; </p><p> *(volatile u16*)DXR1_ADDR(HANDSET_CODEC)=ou
49、t_w[i]; </p><p><b> }</b></p><p> } </p><p><b> }</b></p><p> void delay(void) </p><p>
50、<b> { </b></p><p> long int j; </p><p> for(j=0; j<100000; j++) </p><p> asm("_nop"); </p><p><b> }</b></p>
51、;<p> void update(DATA x[],DATA dk)</p><p><b> {</b></p><p> s16 j,k; </p><p> for(j=1;j<LENGTH_IN;++j)</p><p><b> { </b>
52、;</p><p> k=LENGTH_IN-j;</p><p> x[k]=x[k-1];</p><p><b> }</b></p><p><b> x[0]=dk;</b></p><p><b> }</b></p>
53、;<p> void initarray(DATA x[])</p><p><b> {</b></p><p><b> s16 i;</b></p><p> for(i=0;i<LENGTH_IN;++i)</p><p><b> {</b&
54、gt;</p><p><b> x[i]=0;</b></p><p><b> }</b></p><p><b> }</b></p><p> Codec.c的程序流程圖如下圖所示:</p><p> 首先,在輸入信號(hào)之前,應(yīng)先進(jìn)行一些
55、必要的準(zhǔn)備工作,即初始化FIR延遲輸出數(shù)組dbuffer_h[]、FIR輸出數(shù)組、自適應(yīng)濾波器系數(shù)矢量coff_w[]和自適應(yīng)濾波器的輸出數(shù)組out_w[],再進(jìn)行DSK板的初始化。。然后采集輸入的語音信號(hào),根據(jù)模式的不同進(jìn)行不同的處理以輸出不同的信號(hào)來進(jìn)行效果的比較。mode=0時(shí)為全通,即不做任何處理直接輸出;mode=1時(shí)信號(hào)通過FIR濾波器后產(chǎn)生回聲,為使現(xiàn)象更明顯可以附加一個(gè)延遲;mode=2時(shí)用自適應(yīng)濾波器逼近FIR濾波器以
56、使之輸出近似的信號(hào),用信號(hào)通過兩個(gè)系統(tǒng)產(chǎn)生的信號(hào)之差(即剩余回聲)來調(diào)整自適應(yīng)濾波器的系數(shù),使剩余回聲逐漸收斂于0。這時(shí)只聽到自己說話的聲音,因此這個(gè)系統(tǒng)可以看做是近端說話模式,即將遠(yuǎn)端信號(hào)設(shè)為0。其系統(tǒng)框圖如下圖所示:</p><p><b> 六、程序設(shè)計(jì)及調(diào)試</b></p><p> 由于實(shí)驗(yàn)條件限制(實(shí)驗(yàn)室的DSP板只有1個(gè)輸入端),不能像實(shí)際線路中那樣
57、有近端回波、遠(yuǎn)端回波,所以該實(shí)驗(yàn)中,我們簡化了這個(gè)回聲產(chǎn)生。實(shí)驗(yàn)中,我們將麥克輸入的語音信號(hào)疊加上述麥克輸入語音信號(hào)的延時(shí)衰減后的信號(hào),用此混合信號(hào)模擬真實(shí)的回波信號(hào)。</p><p><b> 回波產(chǎn)生程序如下:</b></p><p> while (!MCBSP_RRDY(HANDSET_CODEC)) {}; //codec句柄如未準(zhǔn)備好則等待</p
58、><p> dk = *(volatile u16*)DRR1_ADDR(HANDSET_CODEC); //從ADC讀數(shù)</p><p> bf[i]=dk; //放入緩沖區(qū)</p><p> if(i==10000) </p><p&
59、gt; i=0; </p><p> *(volatile u16*)DXR1_ADDR(HANDSET_CODEC) = dk+bf[i+1]/2; //延遲+衰減 </p><p> 調(diào)試中可以模擬產(chǎn)生較大延時(shí)的回波。當(dāng)對(duì)著麥克說話時(shí),不僅能耳塞中不僅能聽到自己及時(shí)的聲音也能聽到自己的回聲,而且延時(shí)特別大,感覺特別明顯。</p><p>
60、; 但是我們編寫的回波抵消算法(LMS算法)程序的效果卻并不盡如人意。噪聲特別大,甚至根本沒法聽清自己的聲音。分析原因可能是采樣輸入數(shù)據(jù)和lms算法效率不高,產(chǎn)生很大延時(shí),也產(chǎn)生了很大的噪聲,從而嚴(yán)重影響實(shí)驗(yàn)的結(jié)果。算法的開銷與濾波器的長度有關(guān),因此應(yīng)該適當(dāng)減小濾波器的長度的值。也有可是FIR濾波器的階數(shù)不夠。</p><p> 既然,因?yàn)樽约壕幍腖MS算法不能很好的抵消回波,所以我們對(duì)于我們所編寫的程序進(jìn)行
61、了一定地改進(jìn)。這一次,我們采用了C5000的dsplib庫中的函數(shù)short dlms(PARAM)取代自定的lms()函數(shù),同時(shí)用dsplib庫里的函數(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> 這兩個(gè)函數(shù)是用C5000匯編語言編寫的,具有很高的執(zhí)行效率,使用這
62、個(gè)函數(shù)可以大大提高運(yùn)算速度,以解決用C語言編寫的程序效率不能滿足要求的問題。其使用方法如下:</p><p> short oflag = dlms (DATA *x, DATA *h, DATA *r, DATA **d, DATA *des, DATA step, ushort nh, ushort nx)</p><p><b> 參數(shù)如下表所示:</b>&
63、lt;/p><p> 注意:h和d的存儲(chǔ)地址要求起點(diǎn)必須位于Kbit邊界處,即起始地址值的最低有效位必須是0,必須在CMD文件中開辟對(duì)齊1K邊界的空間,并且只能在頭文件中進(jìn)行段的配置。否則編譯無法通過。</p><p> oflag = short fir (DATA *x, DATA *h, DATA *r, DATA **dbuffer, ushort nh,</p>&
64、lt;p> ushort nx)</p><p> oflag 溢出錯(cuò)誤標(biāo)志,=1時(shí)在計(jì)算過程中發(fā)生了數(shù)據(jù)溢出;=0時(shí)無數(shù)據(jù)溢出。</p><p> x 輸入信號(hào)數(shù)組</p><p> h FIR濾波器的系數(shù)矢量,也是要逼近的對(duì)象</p><p> r 輸出數(shù)組</p><
65、;p> d 延遲緩沖區(qū),用來存放上一時(shí)刻的輸出數(shù)據(jù)</p><p> nx 向量x中的個(gè)數(shù)</p><p> nh 系數(shù)的個(gè)數(shù)\</p><p> 注意:h、d的地址要求同dlms()函數(shù)中的h、d參數(shù)。DATA 為tms320.h中定義的short整型。</p><p> 為了降低計(jì)算開銷,輸入緩沖
66、數(shù)組長度應(yīng)該盡量小,取長度為LENGTH_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></p>
67、<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]; //從低位壓向高位</p>
68、<p><b> }</b></p><p> x[0]=dk; // 當(dāng)前采樣值存入最低位</p><p><b> }</b></p><p> 用MATLAB模擬設(shè)計(jì)回聲通道,即用MATLAB產(chǎn)生一FIR低通濾波器。由于聲音為低頻信號(hào),用MATLAB的FDATOOL工具產(chǎn)生1個(gè)
69、低通FIR濾波器。在MATLAB的命令窗口輸入FDATOOL,回車進(jìn)入濾波器編輯界面,修改階數(shù)為10,頻率為Fpass=4000,Fstop=8000,Wpass=1,Wstop=30。</p><p> 用C語言頭文件輸出數(shù)據(jù),數(shù)據(jù)類型選16位有符號(hào)整型(以對(duì)應(yīng)DSP程序中的DATA類型),生成的系數(shù)如下(非實(shí)驗(yàn)采用的數(shù)據(jù)):</p><p> const int16_T B[10]
70、 = {1218, 1611, 2317, 2900, 3231, 3231, 2900, 2317, 1611,1218};</p><p> 設(shè)計(jì)FIR低通濾波器如下圖所示:</p><p> 由于程序中使用dsplib庫函數(shù)dlms()和fir()時(shí)要分配參數(shù)的地址,因此要手動(dòng)修改CMD文件。而使用宏#progma來指定自定義段時(shí)應(yīng)該在頭文件中進(jìn)行
71、,否則編譯會(huì)提示警告:</p><p> "codec.c", line 46: warning: pragma can only be applied to a file level symbol, not 'dbuffer_w'</p><p> 在編完主程序后,因引入了新的數(shù)據(jù)和變量,必須在工程文件中添加一個(gè)頭文件,將這些變量放入指定的內(nèi)存中。
72、同時(shí)修改5024.com文件。</p><p> (1)添加頭文件stem.h</p><p> /*stem.h*/</p><p> #define LENGTH_W 10 //LMS濾波器長度,</p><p> #define LENGTH_H 10 //自適應(yīng)濾波器長度</p><p> #
73、define STEP 100 //自適應(yīng)步長</p><p> #define LENGTH_IN 5 //輸入緩沖數(shù)組x[]長度</p><p> DATA x[LENGTH_IN]; //聲明輸入緩沖數(shù)組</p><p> DATA out_h[LENGTH_IN]; //FIR濾波器即回聲消除通道輸出</
74、p><p> DATA out_w[LENGTH_IN]; //自適應(yīng)濾波器輸出</p><p> DATA e[LENGTH_IN];</p><p> #pragma DATA_SECTION(coff_w,".coffw") //將數(shù)組coff_w指定到內(nèi)存段.coffw</p><p> DATA co
75、ff_w[LENGTH_W]; //聲明自適應(yīng)濾波器系數(shù)矢量</p><p> #pragma DATA_SECTION(coff_h,".coffh") //將數(shù)組coff_h指定到內(nèi)存段.coffh</p><p> DATA coff_h[LENGTH_H]={790,2661,4629,6919,8210,8210,6919,
76、4629,2661,790}; //定義FIR濾波器的系數(shù)即回聲通道的權(quán)系數(shù)</p><p> #pragma DATA_SECTION(dbuffer_h,".dbufferh") //將數(shù)組dbuffer_h指定到內(nèi)存段.dbufferh</p><p> DATA dbuffer_h[LENGTH_IN]; //該數(shù)組存放FIR上一時(shí)刻的輸出</p&
77、gt;<p> #pragma DATA_SECTION(dbuffer_w,".dbufferw") //將數(shù)組指定到內(nèi)存段.dbufferw </p><p> DATA dbuffer_w[LENGTH_IN]; //該數(shù)組存放自適應(yīng)濾波器上一時(shí)刻輸出</p><p> (2)5402.CMD</p><p><
78、;b> MEMORY</b></p><p><b> {</b></p><p> PAGE 0: VECS: origin = 0080h, length = 0080h /* Internal Program RAM */</p><p> PRAM: origin = 7600h, lengt
79、h = 8000h /* Internal Program RAM */</p><p> PAGE 1: SCRATCH: origin = 0060h, length = 0020h /* Scratch Pad Data RAM */</p><p> DMARAM: origin = 0C00h, length = 0300h /* DMA buffer */<
80、;/p><p> DATA: origin = 1100h, length = 0080h /* Internal Data RAM */</p><p> STACK: origin = 1180h, length = 0560h /* Stack Memory Space */</p><p> INRAM: origin =
81、 1900h, length = 0100h /* Internal Data RAM */</p><p> HPRAM0: origin = 1A00h, length = 0002h /* HPI memory accessible by Host and DSP */</p><p> HPRAM1: origin = 1A02h, length = 0280
82、h /* HPI memory accessible by Host and DSP */</p><p> HPRAM2: origin = 1C82h, length = 0280h /* HPI memory accessible by Host and DSP */</p><p> EXRAM: origin = 1F10h, length = 4000h /
83、* External Data RAM */</p><p> INT_DM_RAM:origin = 6000h,length = 4000h //添加部分,開辟新空間</p><p><b> }</b></p><p> /*************************************************
84、****************************/</p><p> /* DSP Memory Allocation */</p><p> /*****************************************************************
85、************/</p><p><b> SECTIONS</b></p><p><b> {</b></p><p> .cinit > PRAM PAGE 0</p><p> .text > PRAM PAGE 0</p>&l
86、t;p> .vectors > VECS PAGE 0</p><p> init_var > PRAM PAGE 0</p><p> detect > PRAM PAGE 0</p><p> vrcprg > PRAM PAGE 0</p><p> matprg >
87、PRAM PAGE 0</p><p> .stack > STACK PAGE 1</p><p> .trap > SCRATCH PAGE 1</p><p> .const > EXRAM PAGE 1</p><p> .data > EXRAM PAGE 1</p
88、><p> .bss > EXRAM PAGE 1</p><p> .cio > EXRAM PAGE 1</p><p> .switch > EXRAM PAGE 1</p><p> tables > EXRAM PAGE 1</p><p> var
89、 > EXRAM PAGE 1</p><p> svctab > EXRAM PAGE 1 /* SS_V LSP table */</p><p> vctab > EXRAM PAGE 1 /* V LSP table */</p><p> uvctab > EXR
90、AM PAGE 1 /* UV LSP table */</p><p> cuvtab > EXRAM PAGE 1 /* Stochastic codebook */</p><p> cdbktab > EXRAM PAGE 1 /* various codebook tables*/</p>&
91、lt;p> logtab > EXRAM PAGE 1 /* table for log2 */</p><p> powtab > EXRAM PAGE 1 /* table for pow2 */</p><p> hamtab > EXRAM PAGE 1 /* table for
92、hamming */</p><p> lgwtab > EXRAM PAGE 1 /* table for lag window */</p><p> acostab > EXRAM PAGE 1 /* table for arccos */</p><p> sqrtab > EXRA
93、M PAGE 1 /* table for square root */</p><p> acbtab > EXRAM PAGE 1 /* table for thresholds in acb */</p><p> pm03tab > EXRAM PAGE 1 /* table for x^(-0.3)
94、computation */</p><p> costab > EXRAM PAGE 1 /* table for cosine */</p><p> .dbufferh: {} > INT_DM_RAMPAGE 1, align (1024) //添加部分</p><p> .dbufferw: {} >
95、INT_DM_RAMPAGE 1, align (1024) // 將這些段指定到1KBIT的邊</p><p> .coffh : {} > INT_DM_RAMPAGE 1, align (1024) //界,以滿足dlms()和fir()兩</p><p> .coffw : {} > INT_DM_RAMPAGE 1, align (102
96、4) //個(gè)函數(shù)對(duì)參數(shù)的要求</p><p> V23 > INRAM PAGE 1</p><p> FSK > INRAM PAGE 1</p><p> hpibuff0 > HPRAM0 PAGE 1 </p><p> hpibuff1 > HPR
97、AM1 PAGE 1</p><p> hpibuff2 > HPRAM2 PAGE 1</p><p> dma_buff > DMARAM PAGE 1</p><p><b> }</b></p><p><b> 七、結(jié)果分析</b></p><p
98、> 經(jīng)過上述的調(diào)試之后,下面我們對(duì)于得到的最終程序,進(jìn)行一下系統(tǒng)分析:</p><p> (1)在回波抵消過程中,通過dlms設(shè)置斷點(diǎn)觀察自適應(yīng)濾波器的系數(shù)矢量coff_w趨向于Fir濾波器的系數(shù)矢量coff_h的過程</p><p> 斷點(diǎn)設(shè)置如下圖所示:</p><p> coff_h觀察結(jié)果如下圖所示:</p><p>
99、 coff_w觀察結(jié)果如下圖所示:</p><p> (2)當(dāng)輸入語音信號(hào)變化時(shí),觀察輸入變量dk的變化如下圖所示:</p><p> (3)在回波產(chǎn)生過程中,Mode=1時(shí),輸入語音信號(hào)變化時(shí)coff_w不變,過程圖如下所示:</p><p> (4)在回波產(chǎn)生過程中,當(dāng)Mode=2時(shí),out_w和out_h的對(duì)比圖如下圖示:</p><
100、p> 綜上所述,當(dāng)mode=1時(shí),如果不加附加延遲產(chǎn)生的聲音信號(hào)有輕微不易察覺的延遲和比較明顯的雜音,這是聲音經(jīng)過10階FIR濾波器濾波即回聲通道的結(jié)果,當(dāng)加入附加延時(shí)后可以模擬比較逼真的回聲效果,當(dāng)然這并不是真正的回聲,也不是LMS算法要逼近的部分,F(xiàn)IR的輸出out_h[]才是真正的回聲。</p><p> 當(dāng)mode=2時(shí),調(diào)用dlms()函數(shù)將FIR濾波器的輸出out_h[]作為自己的理想輸出d
101、es[],不斷逼近,不斷適應(yīng),最終能聽到比較純凈的聲音。但雜音是無法完全消除的,這不僅取決于LMS的算法精度、收斂速度,F(xiàn)IR濾波器的階數(shù),也與程序中dlms()和fir()函數(shù)的執(zhí)行效率有關(guān)??梢杂肅CS中的VIEW/GRAPH功能、MATLAB觀察逼近后自適應(yīng)濾波器的沖擊響應(yīng)。以下是實(shí)際測試得到的一組逼近后的自適應(yīng)濾波器的系數(shù):</p><p> coff_w[]={1046,2284,4846,7518,
102、7814,8463,6936,4411,1883,548}</p><p> 實(shí)驗(yàn)中從MATLAB得到的一組FIR低通濾波器系數(shù)為:</p><p> coff_h[]={790,2661,4629,6919,8210,8210,6919,4629,2661,790}</p><p> 從實(shí)驗(yàn)結(jié)果中,我們得到很好的回聲及對(duì)回波有十分明顯的抵消,我們對(duì)最終的效果
103、較為滿意。</p><p> 八、實(shí)驗(yàn)的體會(huì)及總結(jié)</p><p> 通過這次DSP的課程設(shè)計(jì)的學(xué)習(xí),是我們著實(shí)受益良多。以前在學(xué)習(xí)數(shù)字信號(hào)處理的時(shí)候,總是覺得內(nèi)容十分的枯燥,難以理解。況且,即便將知識(shí)背下來,也不知道應(yīng)該在何處使用,總有一種無用武之地,理論聯(lián)系不上實(shí)際的挫敗感。從完全不會(huì),甚至最初連連接板子都有問題,到最后能夠成功的完成實(shí)驗(yàn)的要求,這之間的進(jìn)步是令人興奮的。</
104、p><p> 在選定題目之后,實(shí)驗(yàn)前我們查閱了很多相關(guān)資料,并做了認(rèn)真總結(jié),這為順利完成實(shí)驗(yàn)奠定了基礎(chǔ)。在進(jìn)行準(zhǔn)備的過程中,讓我們充分認(rèn)識(shí)到了我們的不足。雖然我們學(xué)習(xí)過C語言的編程,但一旦將它應(yīng)用到實(shí)際的比較專業(yè)的問題上,我所學(xué)的知識(shí)就變得完全不夠用了。由于資料中關(guān)于回波的建立過程多是匯編程序,所以我們花了很長的時(shí)間對(duì)此進(jìn)行了研究及總結(jié)。在認(rèn)真研究之后終于明白,回波的產(chǎn)生可以通過在原信號(hào)疊加上一個(gè)輸入信號(hào)延時(shí)衰減后
105、的小信號(hào)實(shí)現(xiàn),這種混合信號(hào)可以近似看成是實(shí)際中的回波和語音信號(hào)的疊加。回波的抵消主要用到自適應(yīng)濾波器。由于對(duì)于自適應(yīng)濾波器的陌生,在最開始我們是用自己編寫的程序時(shí),出現(xiàn)了實(shí)驗(yàn)效果不理想的情況。因此,我們改變思路,利用CCS軟件中自帶的dsplib庫中的函數(shù)short dlms實(shí)現(xiàn)回波抵消,同時(shí)用dsplib庫里的函數(shù)short fir產(chǎn)生回聲通道的輸出信號(hào),該輸出信號(hào)作為自適應(yīng)濾波器的理想輸出信號(hào),經(jīng)過逼近得到預(yù)定結(jié)果。通過Fir()函
106、數(shù)與dlms()函數(shù)的比較,我們總結(jié)出從本質(zhì)上講dlms()函數(shù)與Fir()函數(shù)的結(jié)構(gòu)基本相同。換句話說,自適應(yīng)濾波器的本質(zhì)就是Fir濾波器,只是它是自適應(yīng)</p><p> 編寫完程序之后,還有更重要的部分需要進(jìn)行,那就是對(duì)程序進(jìn)行調(diào)試。根據(jù)以往的經(jīng)驗(yàn),編寫程序時(shí)有很多錯(cuò)是不易被發(fā)現(xiàn)的,所以必須進(jìn)行程序的調(diào)試才能保證程序的確實(shí)可用。具體來說,根據(jù)我們的情況,我們總結(jié)了以下的問題:首先,實(shí)驗(yàn)時(shí),要盡量避免板子的
107、不必要的接觸,由于板子的接觸點(diǎn)是其實(shí)很脆弱的,這樣會(huì)導(dǎo)致由于接觸不良,而導(dǎo)致實(shí)驗(yàn)無法正常運(yùn)行。其次,回波產(chǎn)生是通過Fir濾波器實(shí)現(xiàn)的,但簡單的濾波器程序產(chǎn)生的回波效果并不是很明顯。這時(shí),我們可以通過調(diào)節(jié)延時(shí)程序,進(jìn)而改變回波產(chǎn)生的效果(即回波間隔時(shí)間),實(shí)驗(yàn)現(xiàn)象較為明顯。最后,需要指出的是view工具欄中的graph功能是一項(xiàng)十分實(shí)用的功能,我們可以利用它觀察每一階段的對(duì)比波形,進(jìn)而對(duì)實(shí)驗(yàn)結(jié)果進(jìn)行分析和鑒定。調(diào)試時(shí)可通過將signle
108、time改為double time,同時(shí)觀察兩個(gè)不同輸出通道out-w和out_h的輸出波形。實(shí)驗(yàn)中,通過對(duì)mode變量的改變,可實(shí)現(xiàn)回波產(chǎn)生和回波抵消過程的選擇,mode=1時(shí)為回波產(chǎn)生,mode=2時(shí)為回波抵消。</p><p> 通過這一次實(shí)驗(yàn)的學(xué)習(xí),使我們大大的提高了動(dòng)手能力。同時(shí),由于是兩個(gè)人共同完成實(shí)驗(yàn),因此提高了我們的團(tuán)隊(duì)合作的意識(shí)。在實(shí)驗(yàn)的過程中我們進(jìn)行大量的討論,在討論的過程中,我們發(fā)現(xiàn)了自身
109、從前忽略的盲點(diǎn),這使我們?cè)诶碚撝R(shí)上也有很大的提高。更重要的是,我們感到通過這次課程設(shè)計(jì),學(xué)到了很多東西,這讓我們感到十分充實(shí)。</p><p> 最后,我們要感謝xx老師對(duì)我們細(xì)心的指導(dǎo)及幫助,很多問題經(jīng)過老師的講解后讓我們有了更深刻地認(rèn)識(shí),相信在以后的學(xué)習(xí)中通過交流探討,可以從老師身上收獲更多的知識(shí)和能力!</p><p><b> 九、參考文獻(xiàn)</b><
溫馨提示
- 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. 眾賞文庫僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于DSP的自適應(yīng)回波抵消技術(shù).pdf
- 基于dsp的圖像處理-dsp課程設(shè)計(jì)
- dsp課程設(shè)計(jì)---—基于dsp的gpgga提取
- dsp課程設(shè)計(jì)-基于dsp的gpgga提取
- dsp課程設(shè)計(jì)正余弦信號(hào)的產(chǎn)生
- 基于matlab回波的產(chǎn)生與消除課程設(shè)計(jì)
- dsp課程設(shè)計(jì)---基于dsp的bios模塊設(shè)計(jì)實(shí)現(xiàn)
- 基于matlab回波的產(chǎn)生與消除課程設(shè)計(jì)
- dsp課程設(shè)計(jì)---dtmf信號(hào)的產(chǎn)生及檢測
- dsp課程設(shè)計(jì)--基于三知dsp實(shí)驗(yàn)箱的dsp實(shí)驗(yàn)整合
- dsp課程設(shè)計(jì)fft的dsp實(shí)現(xiàn)
- dsp課程設(shè)計(jì)報(bào)告--fft的dsp實(shí)現(xiàn)
- dsp課程設(shè)計(jì)---dsp芯片簡介
- dsp課程設(shè)計(jì)--基于dsp的溫度控制系統(tǒng)的設(shè)計(jì)
- 基于DSP的回聲抵消器設(shè)計(jì)與實(shí)現(xiàn).pdf
- dsp課程設(shè)計(jì)——基于dsp的鋸齒波發(fā)生器設(shè)計(jì)
- dsp課程設(shè)計(jì)--基于dsp的spi接口da轉(zhuǎn)換系統(tǒng)設(shè)計(jì)
- dsp課程設(shè)計(jì)
- dsp課程設(shè)計(jì)---基于dsp的實(shí)時(shí)fir濾波器的實(shí)現(xiàn)
- 基于dsp的電機(jī)控制模塊課程設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論