dsp課程設計報告---語音噪聲濾波_第1頁
已閱讀1頁,還剩40頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  DSP課程設計實驗報告</p><p><b>  語音噪聲濾波</b></p><p>  院(系):電子信息工程學院 </p><p>  班級: 自動化0804 </p><p>  姓名: </p><p&g

2、t;  學號: </p><p>  指導教師: </p><p><b>  目錄</b></p><p><b>  一、實驗背景3</b></p><p><b>  二、設計要求3</b></p>

3、<p><b>  三、設計思路3</b></p><p><b>  四、算法原理4</b></p><p>  1、直接存儲器訪問DMA4</p><p>  2、A/D和D/A轉換器6</p><p>  3、FIR濾波器算法6</p><p>

4、<b>  4、LMS算法7</b></p><p>  5、利用DSP產生回波8</p><p>  6、利用自適應濾波實現回波對消9</p><p>  五、用C語言實現LMS算法11</p><p>  六、用MATLAB設計FIR濾波器15</p><p><b>  

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

6、t;b>  八、程序調試30</b></p><p><b>  九、結果分析31</b></p><p><b>  十、感想40</b></p><p><b>  一、實驗背景</b></p><p>  我們的日常生活中離不開語音通信,如接打電話

7、、收聽音樂等。語音通信的過程主要分為三個部分,即發(fā)送部分——將音頻信號轉化為電信號,經發(fā)送端設備變換為適合傳輸的形式發(fā)送出去;傳輸部分——通過傳輸信道將電信號進行傳輸;接收部分——經接收端設備恢復出原來的語音信號,經耳機或者喇叭轉換為接收者可以聽到的聲音信號。</p><p>  但是由于環(huán)境的原因,我們采集到語音信號經常含有不同程度的噪聲。與語音通信系統的三個部分相對應,語音通信系統中的噪聲一般也來自三個方面:

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

9、求</b></p><p><b>  1、基本部分:</b></p><p>  (1) 對DMA進行初始化;</p><p>  (2) 對A/D、D/A進行初始化;</p><p> ?。?) 編寫DMA中斷服務程序和濾波算法程序,實現語音信號的實時濾波;</p><p><

10、;b>  2、發(fā)揮部分:</b></p><p> ?。?) 使用DSP產生帶回波的語音信號;</p><p>  利用自適應濾波實現語音信號的回波對消。</p><p> ?。?) 比較采用不同窗和階數時濾波器的濾波效果;</p><p>  (4) 測試所設計濾波器的幅頻特性和相頻特性,并與MATLAB下的設計結果進行比

11、較。</p><p><b>  三、設計思路</b></p><p>  首先利用DSP的DMA方式對外部含噪聲的語音信號進行實時采集,語音信號先經過A/D轉換為數字信號,利用MCBSP的接收寄存器接收數據。編寫濾波算法程序,或調用DSPLIB中的濾波函數,對信號進行濾波。濾波后的數據利用DMA方式送到D/A轉換器轉換為模擬信號。設計流程框圖如下:</p>

12、;<p>  加有噪聲色語音信號由DSK板的MIC端口輸入,經A/D轉換器轉換為數字信號后到達DSP的DMA通道2,DSP接收到信號后調用中斷服務程序進行濾波,可選擇濾波模式進行不同種類的濾波,濾波后的信號在CCS上顯示,或通過DMA通道3將信號輸出到D/A轉換器,轉換為模擬信號后從SPEAKER端口輸出。</p><p><b>  四、算法原理</b></p>

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

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

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

16、R11(41H)為DMA傳送數據的首地址,并選擇DMA源地址工作在不調整方式,選擇MCBSP1接收事件為DMA同步事件,以實現DMA和MCBSP的結合。A/D轉換器的數據按MCBSP1的設置被傳送到DSP內部接收寄存器DRR11中,再由DMA通道2將DRR11中的數據讀到指定數據存儲區(qū)INP-BUFFER中完成數據采集。DMA在傳送外部來的數據時不會影響CPU的正常運行,當DMA通道2采集完一組數據后產生一個DMA中斷事件中斷CPU,來

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

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

19、后的信號輸出利用了DMA通道3進行傳輸進入D/A轉換器等輸出,因此需要對DMA通道2和通道3進行初始化配置。</p><p>  詳細的DMA初始化程序請見后面的程序清單。</p><p>  2、A/D和D/A轉換器</p><p>  A/D模數轉換器是將輸入電壓信號轉換為輸出的數字信號。由于數字信號本身不具有實際意義,僅僅表示一個相對大小,所以任何一個模數轉換

20、器都需要一個參考模擬量作為轉換的標準,而輸出的數字量則表示輸入信號相對于參考信號的大小。A/D轉換器能夠將接收的語音信號(模擬信號)轉化為數字信號,供CPU進行處理。</p><p>  D/A轉換器是將數字信號轉換為模擬信號的電路。實現原理就是將輸入的二進制代碼按其權值的大小轉換成相應的模擬量,然后將所有的模擬量相加,使其與數字量成正比。D/A轉換器能夠將數字信號轉換為語音信號送SPEAKER端口輸出。<

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

22、t;p>  y(n)=∑ x(n-k)+ ∑ y(n-k) (1)</p><p>  式中x(n)為輸人序列,y(n)為輸出序列, 和 為濾波器系數,,N是濾波器階數。當所有的 均為零時,則有</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>  對(3)式進行z變換,整理后可得FIR濾波器的傳遞函數:</p><p>  H(z)= ∑h(k) (4)</p><p>  FIR(Finite Impulse Response)濾波器,即有限長單位沖激響應濾波器,是指系統的單位脈沖響應h[k]僅

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

25、lt;/p><p>  y(n)= ∑h(k)x(n-k) (5)</p><p>  式(5)中 x[n]為最近(t=nT)的輸人信號,x[n-k]是延時了k個取樣周期的輸人信號,h[k]是第k個延時的加權值(即濾波器系數),可由MATLAB設計出來,y[n]是時刻t=nT時濾波器的輸出信號,N是濾波器的階數也稱濾波器的抽頭數,為實整數,且須滿足N*t<1/ ,其中 為采樣頻率。因為該

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

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

28、。其次,有一個對橫向濾波器抽頭權值進行自適應控制過程的算法。橫向濾波器各部分的細節(jié)如下圖所示。</p><p>  抽頭輸入u(k),u(k-1),……,u(k-M+1),其中M+1是延遲單元的個數,這些輸入張成一個多維空間。相應的 (k), (k), ..., (k)為抽頭權向量h(k)的元素。通過LMS算法計算這個向量所得的值表示一個估計,當迭代次數趨于無窮時,該估計的期望值可能接近維納最優(yōu)解,在濾波過

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

30、在打電話的過程中,常常能聽見自己說話的聲音在話筒里重復,實際上就是自己的聲音泄露到了接收系統中。在一些特定的系統中出現這種現象將會對信號的正常收發(fā)產生不利影響。因此,回聲在上述系統中會嚴重影響了通話的清晰度,多點回聲甚至會引起通訊網之間聲音的振蕩。</p><p>  可通過設置時間的延遲,將過去的信號衰減加到現在的信號上,以產生回波。</p><p>  這次實驗我們的回聲信號定義為語音

31、信號的延遲再進行適當的衰減。即將麥克輸入的語音信號疊加上述麥克輸入語音信號的延時衰減后的信號,用此混合信號模擬真實的回波信號。因此回聲通道的傳輸函數為:</p><p>  其中S為衰減,M為延遲點數。聽到的回波是混合信號,此時不僅能聽到自己的聲音,也能聽到幾個衰減后疊加的回聲,該回聲為近端輸入的延遲和衰減。</p><p><b>  回波產生程序如下:</b>&l

32、t;/p><p>  while (!MCBSP_RRDY(HANDSET_CODEC)) {}; //codec句柄如未準備好則等待</p><p>  dk = *(volatile u16*)DRR1_ADDR(HANDSET_CODEC); //從ADC讀數</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、利用自適應濾波實現回

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

35、。通過使用M抽頭的FIR自適應濾波器來模擬回聲信道h,可以使所得y(k)通近回聲信號,進而達到回聲消除的目的由此可見,回聲消除的關鍵是自適應地調整使其通近h,可通過現有的各種自適應濾波算法實現。</p><p>  這個實驗采用的LMS算法,即最小均方誤差算法設計的自適應濾波器進行未知系統識別,以將回聲信號濾除。該自適應濾波器是FIR橫向濾波器,可以根據輸出自動修改濾波器的權系數,從而逼近未知系統回聲通道。算法的

36、實現基于TMS320C5402DSP芯片和CCS系統的C語言。 </p><p>  遠端的信號通過回聲通道產生回聲信號d(n),該信號一般為遠端信號的衰減和延遲。遠端信號通過自適應濾波器產生回聲預測信號y(n)。在k時刻,它們之差為剩余回聲信號:</p><p>  用它來控制LMS自適應濾波器的系數ω(n)</p><p>  其中μ為自適應步長因子,一般取0μ

37、1,可視為常數,k時刻濾波器的輸出為:</p><p>  以上三個方程是LMS最小均方誤差算法的核心方程,也是C語言編程的依據。LMS的算法流程圖如下:</p><p>  五、用C語言實現LMS算法</p><p>  由C語言實現LMS算法的C語言程序如下所示:</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>  然而算法的效率與濾波器的長度有關,因此應當適當減小濾波器的長度;同時也應該適當的提高FIR濾波器的階數。同時替換原有的LMS算法的C語言實現程序,更換為CCS的diplib庫中的函數short dlms(PARAM)取代自定的lms()函數,同時用dsplib庫里的函

42、數short fir(PARAM)產生回聲通道的輸出信號(也就是用預定階數的FIR濾波器模擬回聲通道),該輸出信號作為自適應濾波器的理想輸出信號,對之進行逼近進而得到預定結果。</p><p>  Dsplib庫中的dlsm函數和fir函數的子程序:</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>  這兩個函數是用C5000匯編語言編寫的,具有很高的執(zhí)行效率,使用這個函數可以大大提高運算速度,以解決用C語言編寫的程序效率不能滿足要求的問題。下面以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子函數定義的各個變量的意義如下表所示: </p><p>  注意:h和d的存儲地址要求起點必須位于Kbit邊界處,即起始地址值的最低有效位必須是0,必須在CMD文件中開辟對齊1K邊界的空間,并且只能在頭文件中進行段的配置。否則編譯無法通過。</p><p>  同理,F

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()函數中的h、d參數。DATA 為tms320.h中定義的short整型。</p><p>  為了

66、降低計算量,輸入緩沖數組長度應該盡量小,取長度為LENGTH_IN=5。采用數據壓入方式,將最新的聲音采樣值存入數組x[0],然后將存儲的數據從低位壓入高位。其實現程序update(DATA x[],DATA dk)如下:</p><p>  void update(DATA x[],DATA dk) //dk為當前采樣值</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; // 當前采樣值存入最低位</p><p><b>  }</b></p><p>  六、用MATLAB設計FIR濾波器</p><p>  用MATLAB設計FIR流程如下:

69、</p><p>  打開MATLAB,在命令窗中輸入fdatool,打開濾波器設計與分析工具。</p><p>  更改濾波器的各個參數值,因為語音信號的頻率成分主要分布在300Hz到3400Hz,所以我們只要設計300Hz到3400Hz的帶通FIR濾波器就可以實現對語音信號中摻雜的噪聲的濾除。在FDA中選擇帶通FIR濾波器,階數選擇15,抽樣頻率選擇16kHz,阻帶截頻分別為0.25

70、kHz和3.45 kHz,通帶截頻分別為0.3 kHz和3.4 kHz。</p><p>  點擊“Desgin filter” 完成濾波器設計,濾波器的波形如下圖所示。</p><p>  然后將設計好的結果導出為fir.h文件。下面就是導出的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>  七、程序設計</b></p><p>  實驗中用到的源程序有以下幾個:</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>  /*存放輸入數據*/</p><p>  #pragma DATA_SECTION(inp_buffer,"audio_buffer");</p><p>  int inp_buffer[0x200];</p><p>  /*存放輸出數據*/</p><p>  #pragma DATA

82、_SECTION(out_buffer,"outt_buffer");</p><p>  int out_buffer[0x200];</p><p>  int out1_buffer[0x200];</p><p>  /*存放濾波器系數*/</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的數據類型曾經是 int*/</p><p><b>  /*帶通濾波器*/</b></p><p><b>  /*帶阻濾波器*/</b></p><p&

85、gt;<b>  /*全通濾波器*/</b></p><p>  /*存放延遲數據*/</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>  /************************計算濾波器的FFT******************************************/</p><p>  cbrev(coeffs,y,SS/2);</p><p>  rfft(y,SS,0);</p><p>  /**

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

評論

0/150

提交評論