dsp課程設計---語音的壓縮、存儲和回放_第1頁
已閱讀1頁,還剩21頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  DSP課程設計</b></p><p>  實 驗 報 告</p><p>  語音壓縮、存儲和回放計</p><p>  院(系):電子信息工程學院 </p><p><b>  目 錄</b></p><p>  一、設計任務書………

2、……………………………………………………3</p><p>  二、設計內容………………………………………………………………3</p><p>  三、算法原理說明……………………………………………………..…3</p><p>  四、設計方案……………………………………………………………8</p><p>  五、程序設計、調試與結果分析

3、………………………………………11</p><p>  六、設計(安裝)與調試的體會…………………………………………22</p><p>  七、參考文獻………………………………………………………………22</p><p>  語音的壓縮、存儲與回放</p><p><b>  一、實驗目的</b></p>

4、<p>  1、應用DSP算法實現對語音信號的壓縮、存儲和回放。</p><p>  2、熟悉使用C語言編寫較復雜的程序; </p><p>  3、熟悉C語言對外設(DSK板或示波器)的訪問(軟件編程、硬件連接); </p><p>  4、熟練使用軟件CCS5000對程序的完整調試過程。</p><p>  二、實驗設計要求及

5、目標</p><p>  1、使用DSP實現語音壓縮和解壓縮的基本算法,算法類型自定,例如可以采用G.711、G.729等語音壓縮算法。</p><p>  2、采用A/D轉換器從MIC輸入口實時采集語音信號,進行壓縮后存儲到DSP的片內和片外RAM存儲器中,存儲時間不小于10秒。</p><p>  3、存儲器存滿之后,使用DSP進行實時解壓縮,并從SPEAKER

6、輸出口進行回放輸出。</p><p>  4、使用指示燈對語音存儲和回放過程進行指示。</p><p><b>  三、實驗原理</b></p><p><b>  1、語音編碼 </b></p><p>  語音編碼一般分為兩類:一類是波形編碼,一類是被稱為“聲碼器技術”的編碼。</p>

7、;<p>  PCM編碼即脈沖編碼調制。</p><p>  波形編碼的最簡單形式就是脈沖編碼調制(Pulse code modulation),這種方式將語音變換成與其幅度成正比的二進制序列,而二進制數值往往采用脈沖表示,并用脈沖對采樣幅 度進行編碼,所以叫做脈沖編碼調制。</p><p>  脈沖編碼調制沒有考慮語音的性質,所以信號沒有得到壓縮。</p>&

8、lt;p><b>  2、量化: </b></p><p>  脈沖編碼調制用同等的量化級數進行量化,即采用均勻量化,而均勻量化是基本的量化方 式。但是均勻量化有缺點,在信號動態(tài)范圍較大而方差較小的時候,其信噪比會下降。</p><p>  國際上有兩種非均勻量化的方法:A律和u律,u律是最常用的一種。在美國,7位u律是長途電話質量的標準。 而我國采用的是A律壓

9、縮,而且有標準的A律PCM編碼芯片。</p><p>  3、DPCM&ADPCM:</p><p>  降低傳輸比特率的方法之一是減少編碼的信息量,這要消除語音信號中的冗余度。相鄰的語音樣本之間存在明顯的相關性,因此對相鄰樣本間的差信號進行編碼,便可使信息量得到壓縮。因為差分信號比原語音信號的動態(tài)范圍和平均能量都小。這種編碼叫Differential PCM,簡稱DPCM,即差分

10、脈沖編碼調制。</p><p>  ADPCM即自適應差分脈沖編碼調制,是包括短時預測的編碼系統。CCITT(國際電報電話咨詢委員會)在1984年提出的32 kbit/s的編碼器建議就是采用ADPCM作為長途傳輸中的國際通用語音編碼方案。這種ADPCM編碼方案達到64 kbit/s PCM的語音傳輸質量,并具有很好的抗誤碼性能。</p><p><b>  4、A律壓縮</

11、b></p><p>  本實驗中采用了A律壓縮。</p><p>  語音信號通常是小信號概率大,大信號出現的概率小,為提高小信號時的量化信躁比,壓縮比特速率,可為非線性量化。語音壓縮是把16位的數據比特轉化為8位數據比特,從而到達語音壓縮的目的。</p><p>  在主程序中通過A/D抽樣量化,可以得到16位的線性編碼,再由編碼表通過軟件計算得到8位A律

12、編碼,其中最高位為符號位,第6位到第4位為段落碼,低4位為段內碼。將8位的壓縮結果存儲到系統RAM中進行緩存,根據抽樣率、語音存儲時間以及系統RAM的容量設置語音存儲緩沖區(qū)的大小,待緩沖區(qū)存滿后,將緩沖區(qū)內的數據進行解壓縮,然后輸出到SPEAKER接口輸出端。</p><p>  若使用A/D轉換器,必須首先對A/D轉換器進行初始化設置,即設置A/D轉換器的工作模式、輸入增益以及抽樣頻率等。</p>

13、<p>  A律的壓縮可以按照下列公式進行定義:</p><p>  其中:A是壓縮參數(在歐洲,A=87.6)x是需要壓縮的歸一化整數。</p><p>  A律壓縮示意圖如下:</p><p>  從線性到A律的壓縮轉換如下表所示:</p><p>  其中,壓縮后的碼字組成:比特0-3表矢量化值,比特4-6表示段值,壓縮后的

14、碼字符號放在比特7,為了簡化未寫出。</p><p><b>  5、μ律壓縮</b></p><p><b>  μ律壓縮的特點是:</b></p><p>  其中:y為歸一化的壓縮輸出電壓,即y=壓縮器輸出電壓/壓縮器可能輸出最大電壓;</p><p>  x為歸一化的壓縮輸入電壓,即x=壓縮

15、器輸入電壓/壓縮器可能輸入最大電壓;</p><p>  μ為壓擴參數,表示壓縮的程度。</p><p>  在使用μ律的處理過程為:壓縮和解壓,壓縮是指在發(fā)送端對輸入信號進行壓縮處理,再均勻量化,相當于非均勻量化;解壓是在接收端進行相應的解壓處理,以恢復原始信號。</p><p>  經過壓縮的采樣信號,按8位二進制編碼,編碼表如下:</p><

16、;p>  8位碼有三部分組成:極性碼(0:負極性信號;1:正極性信號)、段落碼、電平碼。</p><p>  μ律解壓編碼表與編碼表左右相反。μ律編碼=極性碼(musign)+段落碼(muchord)+電平碼(mustep),算法如下:</p><p>  muchord=(19-T|EXP)<<4=190-(T|EXP)*16+10H;</p><p

17、>  musign=(AH*(-1))<<7=(AH*FFFFH)*128=AH*(FFFFH<<7)=AH*FF80H;</p><p>  mustep=(((|int|+33)<<(T|EXP))<<-26)-10;</p><p>  6、語音采集與輸出模塊</p><p>  語音采集與輸出模塊采用的是

18、TI公司推出的一款高性能的立體聲音頻Codec芯片TLC320AD50C,內置耳機輸出放大器,支持MIC和LINE IN兩種輸入方式(二選一),且對輸入和輸出都具有可編程增益調節(jié)。AD50的模數轉換(ADCs)和數模轉換(DACs)部件高度集成在芯片內部,采用了先進的Sigma-delta過采樣技術,可以在8K到96K的頻率范圍內提供16bit、20bit、24bit和32bit的采樣,ADC和DAC的輸出信噪比分別可以達到90dB和1

19、00dB。與此同時,AD50還具有很低的能耗,回放模式下功率僅為23mW,省電模式下更是小于15uW。由于具有上述優(yōu)點,使得AD50是一款非常理想的音頻模擬I/O器件,可以很好的應用在隨聲聽(如CD,MP3……)、錄音機等數字音頻領域[2]。由TLC320AD50C組成的語音輸入與輸出模塊不僅采樣率高最高可達96K,且外圍電路簡單,性價比高。</p><p>  7、 DSK 包括:</p><

20、;p>  主芯片 1枚:100 MHz TMS320VC5402 DSP</p><p>  RAM 1枚:1個軟件等待的64K×16bit的SRAM(CY7C1021V33)</p><p>  FLASH 1枚:256K×16bit 的 FLASH存儲器(AM39VF400A)</p><p>  接口 2個:一個連接到PC機并口的主

21、機端接口HPI和用于仿真的JTAG測試總線控制器 </p><p>  信號采集和輸出端口:麥克風/耳機音頻接口</p><p>  8、TMS320C5402的結構及原理 </p><p>  TMS320C5402采用先進的改進的哈佛結構和8條總線結構,解決了馮諾伊曼(Von-Neumann)結構中高速數據傳輸時的傳輸通道上的瓶頸現象,使處理器的性能大大提高,程

22、序數據總線相互獨立,允許同時訪問程序存儲器和數據存儲器,實現高度并行操作。此外,還可以在數據總線與程序總線之間相互傳送數據,從而使處理器具有在單個周期內同時執(zhí)行算數運算、邏輯運算、移位操作、乘法/累加運算以及訪問程序和數據存儲器的強大功能。</p><p>  TMS320C5402的內部多總線結構保證在一個機器周期內可以多次訪問程序空間和數據空間;指令執(zhí)行時的多重流水線結構將指令周期降低到了最小值;多處理單元可

23、以在一個指令周期內同時進行運算,而這種結構恰好滿足了數字信號處理中的一些特殊要求如FIR、IIR、FFT等運算。由于C5402有7種有效靈活的尋址方式的軟件特點,僅為10ns的指令執(zhí)行周期,還有一些特殊的運算指令更好地滿足了數字信號處理中特有的運算需要。 </p><p>  TMS320C5402具有高速的,全雙工串行口,可用來與系統中的其他C54x器件,編碼解碼器,串行A/D,D/A轉換器以及其他的串行器件直

24、接接口。這兩個串行口均為多通道緩沖串行口McBSP(Multi-channel Buffered Serial Port)。它支持全雙工通信,雙緩沖數據寄存器,允許連續(xù)的數據流。內置μ-律和A-律壓擴硬件。</p><p><b>  DSP功能框圖</b></p><p>  9、AD50的結構與原理</p><p>  AD50是單片音頻接

25、口芯片(AIC)。它內部集成了16位的D/A和A/D轉換器,采樣速率最高可達22.05kb/s,其采樣速率可通過DSP編程來設置。在DAC之前有一個插值濾波器以保證輸出信號平滑和ADC之后有一個抽取濾波器以提高輸入信號的信噪比。 AD50內部有7個數據和控制寄存器,用于編程控制它們的工作狀態(tài)。它的數據傳輸模式和采樣速率都可以通過DSP對其控制寄存器的編程來實現,因此,在許多場合下,AD50都作為DSP的AIC來實現音頻處理。</p

26、><p>  寄存器0:空操作寄存器。 </p><p>  寄存器1:軟件復位 </p><p><b>  軟件掉電 </b></p><p>  選擇16位或15位工作方式 </p><p>  硬件或軟件二次通信請求方式的選擇 </p><p>  寄存器2:使能ALT

27、DATA輸入端 </p><p>  為ADC選擇16/15位方式 </p><p>  寄存器3:選擇FS與FSD之間延遲SCLK的個數 </p><p>  告訴主機有幾個從機被聯上 </p><p>  寄存器4:為輸入和輸出放大器選擇放大器增益 </p><p>  選擇N來設置采樣頻率,fs=MCLK/(12

28、8*N)或MCLK/(512*N) </p><p>  在MCLK輸入端使能外部時鐘輸入并旁通內部的PLL </p><p>  寄存器5,6:保留 </p><p>  在CCS 集成開發(fā)環(huán)境中,與tlc320ad50 CODEC 編譯碼器相關的頭文件是codec.h。它位于C:\ti\c5400\dsk5402\include 目錄下。在這個頭文件中,定義了與

29、ad50 CODEC 相關的枚舉變量和庫函數。除了可以調用codec.h 中提供的庫函數之外,我們還可以利用這些枚舉變量重新編寫自己的codec 函數,使用枚舉變量相或產生所需要的ad50 寄存器的初始化值。Codec.h 中的庫函數位于函數庫dsk5402.lib 和 drv5402.lib 中。函數庫dsk5402.lib 和 drv5402.lib 是作為兩個單獨的文件,連同include 文件和頭文件一起提供給用戶的,如果你的應

30、用程序中用到了其中的庫函數,就需要與這兩個函數庫進行鏈接(link)dsk5402.lib 是一個主要的函數庫,其內部使用了drv5402.lib 的頭文件。</p><p>  AD50與C5402之間的數據傳送采用串行方式,包括兩種傳輸模式:16位和15+1位傳輸模式。15+1位模式時,其中的D0位表示二次通信。它們各自的時序如下:</p><p><b>  10、程序存儲

31、芯片</b></p><p>  實驗中,電路選用的芯片SST39VF400是一個低功耗FLASH。</p><p>  芯片硬件特點:A17至A0為外部地址管腳,D15至D0為1條數據線,CE#為片選控制管腳(低有效),OE#為輸出控制管腳(低有效),WE#為寫入控制管腳(低有效)。工作在2.7V至3.6V電壓下,存儲容量位256KW,其中的數據可以保持100年以上,可重復編

32、程次數高達10萬次。</p><p><b>  11、風和耳機接口</b></p><p>  音頻接口使用了2 個工業(yè)標準的3.5mm 的連接器:</p><p>  一個連接麥克風的音頻輸入;</p><p>  一個連接耳機的音頻輸出。</p><p>  (1)音頻輸入是交流偶合的并且包

33、括:1 個固定增益為10dB 的放大器;實現單端到差分的轉換(在此之前,連接到DSP 的McBSP1 上的TLC320AD50對其進行數字化);電壓偏置(支持電池電源和駐極體麥克風);被動濾波(在DSK 的音頻插口和CODEC 之間)用來增強性能,為駐極體麥克風設計的麥克風的輸入它需要一個電壓偏置。如果使用電容來隔離偏置電壓,就能夠使用動態(tài)的麥克風。麥克風的輸入信號最大允許標準是500mV(350mVrms)。在DSK上有10dB前置放

34、大器增益。</p><p> ?。?)音頻輸出是可以編程控制的,在軟件的控制下,可以在6dB增幅的范圍內,增加增益+0~+2dB。音頻輸入可以編程控制的,在6dB增幅范圍內,提供+0~+12dB的增益。</p><p><b>  四、程序設計思路</b></p><p>  DSP程序設計應包括用戶程序、存儲器配置程序。為了實現語音信號的采集

35、與回放,先將語音信號采集,運用a律壓縮算法將信號壓縮并存入存貯器中,當放音開始時運用a律解壓算法將信號解壓并從存儲器中釋放出來,實現語音的回放。</p><p><b>  1、軟件設計流程</b></p><p>  2、TMS320VC5402 mcbsp的串口的初始化</p><p>  首先將DSP的串口1復位,再對串口1的16個寄存器

36、進行編程,使串口1工作在以下狀態(tài):禁止SPI模式,但數據相,每幀一字,每字16位,幀同步脈沖低電平有效,并且?guī)叫盘柡鸵莆恍盘栍型獠繒r鐘產生。</p><p>  hHandset = codec_open(HANDSET_CODEC); </p><p>  此語句調用了函數codec_open()對串口1進行了初步設置,設置成功返回codec的句柄放在變量 hHandset中,作為

37、調用其他函數的實參。</p><p>  3、AD50的初始化</p><p>  該初始化過程調用了5個函數對AD50的5項參數進行了設置,包括adc和dac的工作模式,模擬輸入和輸出的增益;以及A/D、D/A的轉換速率。</p><p>  codec_dac_mode(hHandset, CODEC_DAC_15BIT); /* DAC in 15-

38、bit mode */</p><p>  codec_adc_mode(hHandset, CODEC_ADC_15BIT); /* ADC in 15-bit mode */</p><p>  codec_ain_gain(hHandset, CODEC_AIN_6dB); /* 6dB gain on analog input to ADC */</p&g

39、t;<p>  codec_aout_gain(hHandset, CODEC_AOUT_MINUS_6dB); /* -6dB gain on analog output from DAC */</p><p>  codec_sample_rate(hHandset,SR_800); /* 8Hz sampling rate */</p><p>  4、FLAS

40、H存儲器的初始化</p><p>  void flashenable(void)</p><p><b>  {</b></p><p>  CPLD_CTRL2_REG|=0x0010;</p><p>  CPLD_DMCTRL_REG|=0x0040;</p><p><b> 

41、 }</b></p><p>  5、從McBSP的接收通道讀取A/D轉換的值,然后經過壓縮解壓后將其發(fā)送到McBSP的發(fā)送通道,將解壓后的數據將數據寫入D/A轉換器。</p><p><b>  程序如下:</b></p><p><b>  while (1)</b></p><p>

42、;<b>  {</b></p><p>  /* Wait for sample from handset */</p><p>  while (!MCBSP_RRDY(HANDSET_CODEC)) </p><p>  {};/*獲取McBSP是否做好接受的準備信息*/</p><p>  /* Read sam

43、ple from and write back to handset codec */</p><p>  data=*(volatile int*)DRR1_ADDR(HANDSET_CODEC);/* 定義數據接收寄存器1的地址*/</p><p>  pre=int2alaw(data); /*or pre=int2ulaw(data);*/</p><

44、;p>  data=alaw2int(pre); /*or data=ulaw2int(pre);*/</p><p>  *(volatile int*)DXR1_ADDR(HANDSET_CODEC)=data;/* 對輸入信號進行語音處理*/</p><p><b>  6、閃燈程序</b></p><p><b

45、>  程序段:</b></p><p>  /*******閃燈******/</p><p>  void led(s16 cnt)</p><p><b>  {</b></p><p>  while ( cnt-- )</p><p><b>  {</b

46、></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(BRD_LED2);&l

47、t;/p><p>  delay(1000);</p><p><b>  }</b></p><p><b>  }</b></p><p>  程序分析:此函數用了一個while循環(huán)語句實現cnt次燈閃,通過調用delay子函數控制燈閃滅時間,其中brd_led_toggle()表示切換用戶LED,

48、改變用戶控制LED0~2的狀態(tài)。</p><p><b>  五、實驗程序</b></p><p><b>  1、C語言程序</b></p><p>  /******************************************************************/</p><

49、p>  /* 頭文件 */</p><p>  /*******************************************************************/</p><p>  #include <type.h></p>

50、;<p>  #include <board.h></p><p>  #include <codec.h></p><p>  #include <mcbsp54.h></p><p>  /**************************************************************

51、*****/</p><p>  /* 變量宏定義 */</p><p>  /*******************************************************************/</p><p>  #define SIGN

52、_BIT (0x80) /* Sign bit for a A-law byte. */</p><p>  #define QUANT_MASK (0xf) /* Quantization field mask. */</p><p>  #define NSEGS (8) /* Number of A-law seg

53、ments. */</p><p>  #define SEG_SHIFT (4) /* Left shift for segment number. */</p><p>  #define SEG_MASK (0x70) /* Segment field mask. */</p><p>  /************

54、******************************************************/</p><p>  /* 函數聲明 */</p><p>  /*****************************************************

55、**************/</p><p>  void delay(s16 period);</p><p>  void led(s16 cnt);</p><p>  void initcodec(void);</p><p>  void flashenable(void);</p><p>  unsig

56、ned char data2alaw(s16 pcm_val);</p><p>  int alaw2data(unsigned char a_val);</p><p>  static int search(int val,short *table,int size);</p><p>  /**********************************

57、*********************************/</p><p>  /* 全局變量 */</p><p>  /*******************************************************************/</p

58、><p>  HANDLE hHandset;</p><p><b>  s16 data;</b></p><p>  s16 data1;</p><p><b>  u16 i=0;</b></p><p>  u16 temp1;</p><p>

59、;<b>  u16 j=0;</b></p><p>  u16 k,l=0;</p><p><b>  u8 temp2;</b></p><p>  u16 buffer[22000];</p><p>  static short seg_end[8]={0x1F,0x3F,0x7F,0x

60、FF,0x1FF,0x3FF,0x7FF,0xFFF};</p><p>  /*******************************************************************/</p><p>  /* 主函數 */</p>

61、<p>  /*******************************************************************/</p><p>  void main()</p><p><b>  {</b></p><p>  if (brd_init(100))</p><p>&

62、lt;b>  return;</b></p><p>  led(2); //閃燈兩次</p><p>  initcodec(); //初始化codec</p><p>  flashenable(); //選擇片外FLASH為片外存儲器</p><

63、p><b>  while (1)</b></p><p><b>  {</b></p><p>  while (!MCBSP_RRDY(HANDSET_CODEC)) {}; //等待接收handset處的采樣</p><p>  if (i==0) brd_led_toggle(BRD_LED0)

64、; //點亮二極管0,表示錄音開始</p><p>  data = *(volatile u16*)DRR1_ADDR(HANDSET_CODEC); //從handset處讀取采樣</p><p>  temp1=data2alaw(data); //對采樣進行a律壓縮</p><p>  

65、/*****************************************************************/</p><p>  /* 把低地址數據放在高八位高地址數據放在低八位 */</p><p>  /*******************************************************************/

66、 </p><p>  i=i+1; </p><p>  if(i%2==1)</p><p><b>  { </b></p><p>  buffer[j]=(temp1<<=8); </p><p>  /*奇數數據左移8位 temp1=

67、abcdefgh00000000</p><p>  buffer[j]=temp1*/</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  buffer[j]

68、=(buffer[j]|temp1); </p><p>  /*偶數數據與temp1取或 組成新的數據</p><p>  buffer[j]=abcdefghiabcdefghi*/</p><p>  j++; //j加1</p><p><b>  }</b></p><p>  i

69、f(i>=44000) </p><p><b>  {</b></p><p><b>  i=0;</b></p><p><b>  }</b></p><p>  if(j>=22000)</p><p><b>  {&l

70、t;/b></p><p><b>  j=0;</b></p><p>  brd_led_toggle(BRD_LED0); //熄滅數碼管0 表示錄音結束</p><p>  brd_led_toggle(BRD_LED1); //點亮二極管1 表示放音開始</p><p>  /******

71、*************************************************************/</p><p>  /* 放音部分 */</p><p>  /************************************************

72、*******************/ for(k=0;k<44000;k++)</p><p><b>  {</b></p><p>  if(k%2==0)</p><p><b>  { </b></p><p>  temp2=(buffer[l]>>8)&

73、amp;0x0ff;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  temp2=buffer[l]&0x0ff;</p><p><b>

74、;  l++;</b></p><p><b>  }</b></p><p>  if(l>=22000)</p><p><b>  l=0;</b></p><p>  data1=alaw2data(temp2);</p><p>  while (

75、!MCBSP_XRDY(HANDSET_CODEC)) {}; </p><p>  *(volatile u16*)DXR1_ADDR(HANDSET_CODEC) = data1;</p><p><b>  }</b></p><p>  /**********************************************

76、*********************/</p><p>  /* 放音結束 */</p><p>  /*******************************************************************/</p><p&

77、gt;  if(k==44000) brd_led_toggle(BRD_LED1); //熄滅二極管1 表示放音結束 </p><p><b>  }</b></p><p><b>  } </b></p><p>  }

78、 //主程序結束</p><p>  /*******************************************************************/ </p><p>  /*

79、 子函數 */ </p><p>  /***************************************************************

80、*/</p><p>  /*******延時******/</p><p>  void delay(s16 period)</p><p><b>  {</b></p><p><b>  int i, j;</b></p><p>  for(i=0; i<pe

81、riod; i++)</p><p><b>  {</b></p><p>  for(j=0; j<period>>1; j++);</p><p><b>  }</b></p><p><b>  }</b></p><p> 

82、 /*******閃燈******/</p><p>  void led(s16 cnt)</p><p><b>  {</b></p><p>  while ( cnt-- )</p><p><b>  {</b></p><p>  brd_led_toggle(

83、BRD_LED0);</p><p>  delay(1000);</p><p>  brd_led_toggle(BRD_LED1);</p><p>  delay(1000);</p><p>  brd_led_toggle(BRD_LED2);</p><p>  delay(1000);</p>

84、;<p><b>  }</b></p><p><b>  }</b></p><p>  /*****初始化codec**/</p><p>  void initcodec(void)</p><p><b>  {</b></p><p

85、>  /* Open Handset Codec */</p><p>  hHandset = codec_open(HANDSET_CODEC); // Acquire handle to codec </p><p>  /* Set codec parameters */</p><p>  codec_dac_mode(hHa

86、ndset, CODEC_DAC_15BIT); // DAC in 15-bit mode </p><p>  codec_adc_mode(hHandset, CODEC_ADC_15BIT); // ADC in 15-bit mode </p><p>  codec_ain_gain(hHandset, CODEC_AIN_6dB

87、); // 6dB gain on analog input to ADC </p><p>  codec_aout_gain(hHandset, CODEC_AOUT_MINUS_6dB); </p><p>  // -6dB gain on analog output from DAC </p><p>  codec_sample_rate(hHa

88、ndset,SR_8000); // 8KHz sampling rate </p><p><b>  }</b></p><p>  /*****設置flash****/</p><p>  void flashenable(void)</p><p><b>  {<

89、/b></p><p>  CPLD_CTRL2_REG|=0x0010;</p><p>  CPLD_DMCTRL_REG|=0x0040;</p><p><b>  }</b></p><p>  /*****a律壓縮******/</p><p>  unsigned char d

90、ata2alaw(s16 pcm_val) </p><p><b>  {</b></p><p>  Int mask;</p><p><b>  Int seg;</b></p><p>  unsigned char aval;</p><p>  i

91、f (pcm_val >= 0) </p><p><b>  {</b></p><p>  mask = 0xD5; // 標記 (7th) bit = 1</p><p><b>  } </b></p><p><b>  else </b><

92、/p><p><b>  {</b></p><p>  mask = 0x55; // 標記 bit = 0 </p><p>  pcm_val = -pcm_val;</p><p><b>  }</b></p><p>  // Convert the s

93、caled magnitude to segment number. </p><p>  seg = search(pcm_val, seg_end, 8); </p><p>  // Combine the sign, segment, and quantization bits. </p><p>  if (seg >= 8)

94、 // out of range, 返回最大數. </p><p>  return (0x7F ^ mask);</p><p><b>  else </b></p><p><b>  {</b></p><p>  aval = seg << SEG_SHIFT;<

95、/p><p>  if (seg < 2)</p><p>  aval |= (pcm_val >> 1) & QUANT_MASK;</p><p><b>  else</b></p><p>  aval |= (pcm_val >>seg) & QUANT_MASK;&

96、lt;/p><p>  return (aval ^ mask);</p><p><b>  }</b></p><p><b>  }</b></p><p>  /****alaw的子程序**/</p><p>  static int search(int val,sho

97、rt *table,int size)</p><p><b>  {</b></p><p><b>  Int i;</b></p><p>  for (i = 0; i < size; i++) </p><p><b>  {</b></p>&

98、lt;p>  if (val <= *table++)</p><p>  return (i);</p><p><b>  }</b></p><p>  return (size);</p><p><b>  }</b></p><p>  /*****a

99、律解壓******/</p><p>  int alaw2data(unsigned char a_val)</p><p><b>  {</b></p><p><b>  Int t;</b></p><p><b>  Int seg;</b></p>

100、<p>  a_val ^= 0x55;</p><p>  t = (a_val & QUANT_MASK) << 4;</p><p>  seg = ((unsigned)a_val & SEG_MASK) >> SEG_SHIFT;</p><p>  if(seg==0) </p><

101、;p><b>  {</b></p><p><b>  t += 8;</b></p><p><b>  t=(t>>3);</b></p><p><b>  }</b></p><p>  if((seg<4)&&a

102、mp;(seg>0)) </p><p><b>  {</b></p><p>  t +=0x108;</p><p>  t=(t>>(4-seg));</p><p><b>  }</b></p><p><b>  if(seg>

103、3)</b></p><p><b>  {</b></p><p><b>  t+=0x108;</b></p><p>  t=(t<<=(seg-4));</p><p><b>  }</b></p><p>  ret

104、urn ((a_val & SIGN_BIT) ? t : -t);</p><p><b>  }</b></p><p>  /*******************************************************************/</p><p>  /*

105、結束 */</p><p>  /*******************************************************************/</p><p>  2、存儲器的分配(*.cmd)</p><p><b>  MEMORY</b>

106、;</p><p><b>  {</b></p><p>  PAGE 0: VECS: origin = 0080h, length = 0080h /* Internal Program RAM */</p><p>  PRAM: origin = 7600h, length = 8000h /* Internal

107、Program RAM */</p><p>  PAGE 1: SCRATCH: origin = 0060h, length = 0020h /* Scratch Pad Data RAM */</p><p>  DMARAM: origin = 0C00h, length = 0300h /* DMA buffer */</p><p>  DAT

108、A: origin = 1100h, length = 0080h /* Internal Data RAM */</p><p>  STACK: origin = 1180h, length = 0560h /* Stack Memory Space */</p><p>  INRAM: origin = 1900h, length = 0100h

109、 /* Internal Data RAM */</p><p>  HPRAM0: origin = 1A00h, length = 0002h /* HPI memory accessible by Host and DSP */</p><p>  HPRAM1: origin = 1A02h, length = 0280h /* HPI memory access

110、ible by Host and DSP */</p><p>  HPRAM2: origin = 1C82h, length = 0280h /* HPI memory accessible by Host and DSP */</p><p>  EXRAM: origin = 1F10h, length = 5A00h /* External Data RAM

111、*/</p><p><b>  }</b></p><p><b>  SECTIONS</b></p><p><b>  {</b></p><p>  .cinit > PRAM PAGE 0</p><p>  .text

112、 > PRAM PAGE 0</p><p>  .vectors > VECS PAGE 0</p><p>  init_var > PRAM PAGE 0</p><p>  detect > PRAM PAGE 0</p><p>  vrcprg > PRAM PAGE 0<

113、/p><p>  matprg > PRAM PAGE 0</p><p>  .stack > STACK PAGE 1</p><p>  .trap > SCRATCH PAGE 1</p><p>  .const > EXRAM PAGE 1</p><p>  .

114、data > EXRAM PAGE 1</p><p>  .bss > EXRAM PAGE 1</p><p>  .cio > EXRAM PAGE 1</p><p>  .switch > EXRAM PAGE 1</p><p>  tables > EXRAM

115、PAGE 1</p><p>  var > EXRAM PAGE 1</p><p>  svctab > EXRAM PAGE 1 /* SS_V LSP table */</p><p>  vctab > EXRAM PAGE 1 /* V LSP table */</p>

116、;<p>  uvctab > EXRAM PAGE 1 /* UV LSP table */</p><p>  cuvtab > EXRAM PAGE 1 /* Stochastic codebook */</p><p>  cdbktab > EXRAM PAGE 1 /* variou

117、s codebook tables*/</p><p>  logtab > EXRAM PAGE 1 /* table for log2 */</p><p>  powtab > EXRAM PAGE 1 /* table for pow2 */</p><p>  hamtab > EXR

118、AM PAGE 1 /* table for hamming */</p><p>  lgwtab > EXRAM PAGE 1 /* table for lag window */</p><p>  acostab > EXRAM PAGE 1 /* table for arccos */</p>

119、<p>  sqrtab > EXRAM PAGE 1 /* table for square root */</p><p>  acbtab > EXRAM PAGE 1 /* table for thresholds in acb */</p><p>  pm03tab > EXRAM PAGE 1

120、 /* table for x^(-0.3) computation */</p><p>  costab > EXRAM PAGE 1 /* table for cosine */</p><p>  V23 > INRAM PAGE 1</p><p>  FSK > INRA

121、M PAGE 1</p><p>  hpibuff0 > HPRAM0 PAGE 1</p><p>  hpibuff1 > HPRAM1 PAGE 1</p><p>  hpibuff2 > HPRAM2 PAGE 1</p><p>  dma_buff > DMARAM PAGE 1</p&g

122、t;<p><b>  }</b></p><p>  六、CCS程序調試和結果</p><p>  1、將5402 DSK板與計算機相連,連接好耳機,音頻線,電源線等。</p><p>  2、連接DSK板的電源,并裝載DSK安裝程序。</p><p>  3、雙擊桌面上的CCS 2(C5000) 圖標

123、運行CCS程序,選擇浮動菜單Import configuration->Available configuration 列表中,然后選中C5402 Device Simulator (沒接DSK板時)、C5402 DSK via Parallel Port Emulation (接DSK板時)。選中Import,最后選中save and quit以保存目標DSP的配置。</p><p>  4、運行CCS2

溫馨提示

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

評論

0/150

提交評論