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

下載本文檔

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

文檔簡介

1、<p><b>  DSP課程設(shè)計</b></p><p>  ——語音壓縮、存儲和回放</p><p>  自動化0803 王志平</p><p>  電 子0801 顧曉珺</p><p><b>  DSP實驗報告——</b></p><p>  語音壓縮、

2、存儲和回放</p><p>  自動化0803 王志平</p><p>  電 子0801 顧曉珺</p><p><b>  一、設(shè)計任務(wù)書</b></p><p>  語音信號是信息的重要形式, 語音信號處理有著廣泛的應(yīng)用領(lǐng)域,而語音壓縮在語音信號的傳輸、存儲等方面有非常廣泛的作用,而且在通信領(lǐng)域中已經(jīng)有較成熟的發(fā)

3、展和廣泛應(yīng)用。本設(shè)計要求采用DSP及其A/D、D/A轉(zhuǎn)換器進行語音信號的壓縮、存儲和回放。</p><p><b>  設(shè)計要求及目標(biāo)</b></p><p><b>  基本部分:</b></p><p> ?。?)使用DSP實現(xiàn)語音壓縮和解壓縮的基本算法,算法類型自定,例如可以采用G.711、G.729等語音壓縮算法。

4、</p><p> ?。?)采用A/D轉(zhuǎn)換器從MIC輸入口實時采集語音信號,進行壓縮后存儲到DSP的片內(nèi)和片外RAM存儲器中,存儲時間不小于10秒。</p><p>  (3)存儲器存滿之后,使用DSP進行實時解壓縮,并從SPEAKER輸出口進行回放輸出。</p><p> ?。?)使用指示燈對語音存儲和回放過程進行指示。</p><p>&

5、lt;b>  發(fā)揮部分:</b></p><p>  使用多種算法進行語音的壓縮、存儲和解壓縮,比較它們之間的優(yōu)缺點。</p><p><b>  設(shè)計思路 </b></p><p>  語音信號的幅度(發(fā)音強度)并非均勻分布,由于小信號占的比例比大信號大很多,因此可以進行非均勻量化。達到這一目標(biāo)的基本做法是,對大信號使用大

6、的量化間隔,而小信號則使用小的臺階。ITU-T G.711建議的PCM A律和µ律語音壓縮標(biāo)準(zhǔn)可以分別將13比特和14比特壓縮為8比特,達到語音壓縮的目的。</p><p><b>  要求完成的任務(wù)</b></p><p> ?。?)編寫C語言程序,并在CCS集成開發(fā)環(huán)境下調(diào)試通過。</p><p> ?。?)實現(xiàn)設(shè)計所要求的各項功

7、能。</p><p>  (3)按要求撰寫設(shè)計報告。</p><p>  二、設(shè)計方案、原理說明</p><p><b>  1.設(shè)計方案</b></p><p> ?。?)使用DSP實現(xiàn)語音壓縮和解壓縮的基本算法,算法類型采用G.711的a律壓擴算法。</p><p> ?。?)采用A/D轉(zhuǎn)換器

8、從MIC輸入口實時采集語音信號,進行壓縮后存儲到DSP的片內(nèi)RAM存儲器中,存儲時間約為10秒。</p><p>  (3)當(dāng)采樣數(shù)據(jù)達到規(guī)定次數(shù)后,使用DSP進行實時解壓縮,并從SPEAKER輸出口進行回放輸出。</p><p> ?。?)使用DSK板的指示燈對語音存儲和回放過程進行指示:</p><p>  循環(huán)閃爍:板子自檢,程序開始</p>&

9、lt;p>  LED0亮:錄音(10秒鐘左右)</p><p><b>  LED0滅:放音</b></p><p><b>  原理說明</b></p><p>  壓縮算法介紹(Speech codec)</p><p>  現(xiàn)主要有的speech codec有: G.711, G.723

10、, G.726 , G.729, ILBC QCELP, EVRC, AMR, SMV ITU 推出G.7XX系列的speech codec, 目前廣泛應(yīng)用的有:G.711,G.723, G.726, G.729. 每一種又有很多分支,如G.729就有g(shù).729A, g.729B and g.729AB G.711G.711就是語音模擬信號的一種非線性量化,細分有二種:G.711 A-law and G.711 u-law.不同的國家

11、和地方都會選取一種作為自己的標(biāo)準(zhǔn). G.711 bitrate 是64kbps. 詳細的資料可以在ITU上下到相關(guān)的spec,下面主要列出一些性能參數(shù):</p><p>  G.711(PCM方式:PCM=脈碼調(diào)制 :Pulse Code Modulation) </p><p>  ? 采樣率:8kHz ? 信息量:64kbps/channel ? 理論延遲:0.125msec ?

12、 品質(zhì):MOS值4.10               G.723.1:  G.723.1是一個雙速率的語音編碼器,是 ITU-T建議的應(yīng)用于低速率多媒體服務(wù)中語音或其它音頻信號的壓縮算法;其目標(biāo)應(yīng)用系統(tǒng)包括H.323、H.324等多媒體通信系統(tǒng),目前該算法已成為IP電話系統(tǒng)中的必選算法之一;編碼器的幀長為30ms,還有7

13、.5ms的前瞻,編碼器的算法時延為37.5ms;編碼器首先對語音信號進行傳統(tǒng)電話帶寬的濾波(基于G.712),再對語音信號用傳統(tǒng)8000-Hz速率進行抽樣(基于G.711),并變換成16 bit線性PCM碼作為該編碼器的輸入;在解碼器中對輸出進行逆操作來重構(gòu)語音信號;高速率編碼器使用多脈沖最大似然量化(MP-MLQ),低速率編碼器使用代數(shù)碼激勵線性預(yù)測(ACELP)方法,編碼器和解碼器都必須支持此兩種速率,并能夠在幀間對兩種速率進行轉(zhuǎn)換

14、;此系統(tǒng)同樣能夠?qū)σ魳泛推渌纛l信號進行壓縮和解壓縮,但它對語音信號來說是最優(yōu)的;采用了執(zhí)行不連續(xù)傳輸?shù)撵o音壓縮,這就意味著</p><p>  G.729:    G..729語音壓縮編譯碼算法采用共軛結(jié)構(gòu)的代數(shù)碼激勵線性預(yù)測(CSACELP),是基于CELP編碼模型的算法;能夠?qū)崿F(xiàn)很高的語音質(zhì)量(長話音質(zhì))和很低的算法延世;算法幀長為10ms,編碼器含5ms前瞻,算法時延15ms;其重建

15、語音質(zhì)量在大多數(shù)工作環(huán)境下等同于32kb/s的ADPCM(G.726),MOS分大于4.0;編碼時輸入16bitPCM語音信號,輸出2進制比特流;譯碼時輸入為2進制比特流,輸出16bitPCM語音信號;在語音信號8KHz取樣的基礎(chǔ)上,16bit線性PCM后進行編碼,壓縮后數(shù)據(jù)速率為8Kbps;具有相當(dāng)于16:1的壓縮率。</p><p>  G.729(CS-ACELP方式:Conjugate Structure

16、 Algebraic Code Excited Linear Prediction) ? 采樣率:8kHz ? 信息量:8kbps/channel ? 幀長:10msec ? 理論延遲:15msec ? 品質(zhì):MOS值3.9 均勻量化、非均勻量化</p><p>  如果采用相等的量化間隔對采樣得到的信號作量化,那么這種量化稱為均勻量化。均勻量化就是采用相同的“等分尺”來度量采樣得到的幅度,也稱為線性

17、量化,如圖2所示。</p><p>  均勻量化PCM就是直接對聲音信號作A/D轉(zhuǎn)換,在處理過程中沒有利用聲音信號的任何特性,也沒有進行壓縮。該方法將輸入的聲音信號的振幅范圍分成B個等份(B為量化位數(shù)),所以落入同一等份數(shù)的采樣值都編碼成相同的B位二進制碼。只要采樣頻率足夠大,量化位數(shù)也適當(dāng),便能獲得較高的聲音信號數(shù)字化效果。為了滿足聽覺上的效果,均勻量化PCM必須使用較多的量化位數(shù)。這樣所記錄和產(chǎn)生的音樂,可以

18、達到最接近原聲的效果。當(dāng)然提高采樣率及分辨率后,將引起儲存數(shù)據(jù)空間的增大。 </p><p><b>  PCM的編碼規(guī)律</b></p><p>  PCM: Pulse Code Modulation 脈沖編碼調(diào)制,一般速率為64kbps,是指對語音信號直接采樣量化的一種編碼辦法,采樣速率為8000Hz,每樣點用8bit表示。CD 用16bit 44.1kHz采樣

19、的PCM。 數(shù)字電話用的也是PCM,PCM是非線性編碼,根據(jù)G.711建議,編碼結(jié)束后需要做偶數(shù)位翻轉(zhuǎn)。即如果編碼后結(jié)果是 0110 1001 則在發(fā)送的時候需要經(jīng)過偶數(shù)位翻轉(zhuǎn)得到: 0011 1100 。PCM碼的壓縮分a律u律,在中國使用a律。PCM碼有很多種,網(wǎng)絡(luò)上主要有4種:MANCHESTER碼,差分Manchester碼,AMI碼,HDB3碼,2B1Q碼。分別用于以太網(wǎng),ISDN,DDN,電話。</p><

20、;p>  A律壓擴其特性可表示為:</p><p>  很明顯,小信號時為線性特性,大信號時近似為對數(shù)特性。這種壓擴特性常把壓縮、量化和編碼合為一體。A律可用13段折線逼近(相當(dāng)于A=87.6),便于用數(shù)字電路實現(xiàn)。</p><p>  13段折線的壓縮過程為:</p><p>  第一步:把x(x>0 部分)劃分為不均勻的8段。第一分點取在V/2處,然

21、后每段都是剩下部分的1/2。;依次取第八段為V~V/2 第七段為V/2~V/4;第一段為V/128~0。</p><p>  第二步:把每段均勻劃分為16等份,每一份表示一個量化級,顯然8段共16x8=128= 個量化級,需要二進制7位編碼表示??梢钥闯雒總€量化級是不均勻的。在小信號的量化臺階很小,使小信號時量化噪聲減小。如果按均勻量化計算,以最小臺階 為單位,最大信號需用L=128X16=2048

22、= 個量化級表示,既需要11位編碼。這樣非均勻編碼使小信號量化臺階縮小了16倍,相當(dāng)于小信號信噪比改善了20dB。</p><p>  第三步:把y軸均勻劃分為8段,每段均勻分為16分。這樣y也分為128個量化級,與x軸的128個量化級對應(yīng)。因此,壓擴特性各段的斜率 是不同的。第一段斜率 其他段為: </p><p>  以上分段為x取

23、正值時的情況。而x取負值時,壓擴特性與x取正值成奇對稱。在正8段和負8段中,正1,2段和負1,2段斜率相同,合為一段。所以原來的16段折線變?yōu)?3段折線。 </p><p><b>  DSK知識準(zhǔn)備</b></p><p> ?。?)DSK系統(tǒng)基本結(jié)構(gòu):</p><p>  5402 DSK主要包括100MHz VC5402 DSP,1個軟件

24、等待周期的64K字的外部SRAM存儲器,256K字的FLASH存儲器,內(nèi)嵌的并口仿真器,模擬輸入/輸出音頻接口,以及擴展板接口。其結(jié)構(gòu)如下圖:</p><p>  RAM 1枚:1個軟件等待的64K×16bit的SRAM(CY7C1021V33)</p><p>  FLASH 1枚:256K×16bit 的 FLASH存儲器(AM39VF400A)</p>

25、<p>  接口2個:用于仿真的JTAG測試總線控制器</p><p>  和一個連接到PC機并口的主機端接口HPI</p><p>  信號采集和輸出端口:麥克風(fēng)/耳機音頻接口 </p><p><b>  下面分別介紹:</b></p><p><b>  a.DSP芯片</b>&

26、lt;/p><p>  DSK 支持TMS320VC5402 DSP,工作頻率可以高達100MHz,工作的內(nèi)核電壓為1.8V,I/O 電壓為3.3V</p><p><b>  b.外部數(shù)據(jù)存儲器</b></p><p>  DSK提供了64字SRAM??梢允褂玫耐獠繑?shù)據(jù)存儲器的大小取決于DROM 的設(shè)置。如果DROM=0,那么0x4000~0xF

27、FFF(48K words)的空間是外部存儲器(FLASH 或SRAM)。如果DROM=1,外部存儲器只能使用0x4000~0xEFFF。</p><p>  是否可以訪問板上或擴展板存儲器取決于DMSEL 控制寄存器位。如果DMSEL=0(缺省),那么可以使用板上的數(shù)據(jù)存儲器。如果DMSEL=1,那么可以使用擴展板存儲器,并且地址開始于0x8000。數(shù)據(jù)存儲器空間資源也取決于MP/MC 狀態(tài)。</p>

28、;<p><b>  c.外部程序存儲器</b></p><p>  DSK提供了256K字的FLASH。外部程序存儲器的可用大小取決于OVLY 位的設(shè)置和MP/MC# 跳線的設(shè)置。如果 OVLY位=0 、MP/MC#=0,那么程序存儲器的空間0x0000~0xEFFF(60K words)映射到外部存儲器,是FLASH 還是SRAM 決定于控制寄存器的FLASHENB 狀態(tài)位

29、。在上電狀態(tài),F(xiàn)LASHENB位置位是為了允許從FLASH 引導(dǎo)。然后軟件清除此位,使具有1個等待狀態(tài)的SRAM 使用這個相同的存儲器空間。如果MP/MC = 1 并且 OVLY = 0,那么0x0000~0xFFFF 空間是分配給外部存儲器( FLASH 或SRAM )。使用 FLASH 存儲器的情況下(FLASHENB=1),總線的速率為100MHz,訪問FLASH需要7個等待狀態(tài)。</p><p>  在S

30、RAM 情況下(FLASHENB=0),總線速率為100MHz 時,訪問SRAM需要1 個等待狀態(tài)。如果MP/MC = 1并且OVLY = 1,則只有x4000~0xFFFF 是映射到外部存儲器的。</p><p>  d.I/O空間存儲器</p><p>  I/O空間由2部分組成,一部分是系統(tǒng)基于CPLD的控制空間,另一部分是擴展板存儲器空間。DM_SEL位是外部存儲器存取控制寄存器位

31、,能夠控制I/O空間的訪問。如果DSP向此位寫1,那么擴展板存儲器的I/O空間是不能被訪問的。如果向此位寫0,那么擴展板存儲器的I/O空間可以被訪問。 </p><p>  e.模擬輸入/輸出音頻接口</p><p>  音頻接口使用了2 個標(biāo)準(zhǔn)的3.5mm 的連接器:</p><p>  一個連接麥克風(fēng)(J5)的音頻輸入</p><p> 

32、 一個連接耳機(J6)的音頻輸出</p><p>  麥克風(fēng)的輸入信號最大允許標(biāo)準(zhǔn)是500mVp。在DSK上有10dB前置放大器增益。當(dāng)接入信號源的輸入時,需要使用隔直電容(0.1u)。音頻輸入可以編程控制,在軟件的控制下,可以提供0dB、+6dB、+12dB的增益。音頻輸出也是可以編程控制的,在軟件的控制下,可以提供0dB、-6dB、-12dB的增益。</p><p>  DSK板上使用

33、了AD50 CODEC作為A/D和D/A的轉(zhuǎn)換設(shè)備。它是內(nèi)部集成了16位的A/D和D/A轉(zhuǎn)換器以及抗混疊濾波器,采樣速率最高可達22.05kHz。</p><p>  此外,ADC之后有一個抽取濾波器以提高輸入信號的信噪比,在DAC之前有一個插值濾波器以保證輸出信號平滑輸出。</p><p>  AD50與DSP芯片通過同步串行通信接口(MCBSP1)相連。</p><

34、p> ?。?)TLC320AD50C的內(nèi)部結(jié)構(gòu)及初始化程序</p><p>  TLC320AD50C是TI公司生產(chǎn)的一個SIGMA-DELTA型16位串行A/D、D/A轉(zhuǎn)換電路。采樣速率可通過DSP編程來設(shè)置,最高可達22.05 kHz。</p><p>  內(nèi)含抗混疊濾波器和重構(gòu)濾波器。</p><p>  在DAC之前有一個插值濾波器:保證輸出信號平滑,

35、</p><p>  在ADC之后有一個抽取濾波器:提高輸入信號的信噪比</p><p>  A/D、D/A轉(zhuǎn)換器的初始化編程:</p><p>  /* 獲取設(shè)置A/D和D/A的句柄 */</p><p>  hHandset = codec_open(HANDSET_CODEC);</p><p>  /* 設(shè)置C

36、ODEC的工作參數(shù) */</p><p>  /* DAC和ADC工作在15+1bit模式 */</p><p>  codec_dac_mode(hHandset, CODEC_DAC_15BIT); </p><p>  codec_adc_mode(hHandset, CODEC_ADC_15BIT);</p><p>  /* ADC

37、模擬增益設(shè)置為6dB */</p><p>  codec_ain_gain(hHandset, CODEC_AIN_6dB); </p><p>  /* 設(shè)置DAC模擬輸出增益為-6dB */</p><p>  codec_aout_gain(hHandset, CODEC_AOUT_MINUS_6dB);</p><p>  /* 設(shè)

38、置抽樣頻率為8KHz */</p><p>  codec_sample_rate(hHandset,SR_8000);</p><p> ?。?)McBSP的結(jié)構(gòu)及寄存器部分配置</p><p>  McBSP:多通道緩沖串行口(Multi-channel Buffered Serial Port),是串行口的一種。它既可以利用DSP提供的DMA功能實現(xiàn)自動緩存功

39、能,又可以實現(xiàn)時分多路通信功能。TMS320C5402有兩個McBSP串口,分別為McBSP0、McBSP1。</p><p>  McBSP由引腳、接收發(fā)送部分、時鐘及禎同步信號產(chǎn)生、多通道選擇以及CPU中斷信號和DMA同步信號組成。</p><p>  引腳中我們用到的只有兩個: DR和DX,通過這兩個引腳實現(xiàn)DSP與外部設(shè)備的通信和數(shù)據(jù)交換。DR用來接收數(shù)據(jù),DX完成數(shù)據(jù)的發(fā)送。這兩

40、個引腳分別對應(yīng)兩個寄存器DRR和DXR,如果準(zhǔn)備就緒,從這兩個寄存器中就可以讀取數(shù)據(jù)了。(注:兩個McBSP串口,所以兩個寄存器分別用DRR1、DXR1、 DRR2、DXR2表示)</p><p>  那么如何判斷接收器和發(fā)送器是否準(zhǔn)備就緒呢?這就采用了SPCR1、SPCR2控制位來判斷。當(dāng)RRDY=0時,接收器未就緒;當(dāng)RRDY=1時,接受器就緒,可以從DDR1或2種讀取數(shù)據(jù)。當(dāng)XRDY=0時,發(fā)送器尚未就緒;

41、當(dāng)XRDY=1時,發(fā)送器就緒,可以從XDR1或2種發(fā)送數(shù)據(jù)。</p><p>  所以在實際實驗中我們采用以下語句命令:</p><p><b>  a.接收數(shù)據(jù)時</b></p><p>  while (!MCBSP_RRDY(HANDSET_CODEC)) {}; </p><p>  //查詢、等待接收hand

42、set處的采樣</p><p>  data = *(volatile u16*)DRR1_ADDR(HANDSET_CODEC); </p><p>  //從handset處讀取采樣</p><p><b>  b.發(fā)送數(shù)據(jù)時</b></p><p>  while (!MCBSP_XRDY(HANDSET_COD

43、EC)) {}; </p><p>  *(volatile u16*)DXR1_ADDR(HANDSET_CODEC) = data1;</p><p>  //a律解壓完成后,DSP將數(shù)據(jù)通過串行口McBSP1發(fā)送</p><p>  程序設(shè)計、調(diào)試與結(jié)果分析</p><p><b>  1.流程圖:</b>&

44、lt;/p><p><b>  源程序:</b></p><p>  /****************************************************************************/</p><p>  /*********** DSP技術(shù)與應(yīng)用課程設(shè)計

45、 ************/</p><p>  /*********** 語音的壓縮、存儲和回放 ************/</p><p>  /****************************************************************************/</p>

46、<p>  /* */</p><p>  /* 功能描述 */</p><p>  /* 利用主芯片為

47、TMS320VC5402的DSK實驗板完成實驗 */</p><p>  /* 采用a律壓擴標(biāo)準(zhǔn)對采集的數(shù)字數(shù)據(jù)進行壓縮和解壓 */</p><p>  /* 采用TLC320AD50C芯片實現(xiàn)對信號的AD/DA轉(zhuǎn)換(在DSK320VC5402板上) */&

48、lt;/p><p>  /* 用板子上的1個LED來指示錄放音狀態(tài) */</p><p>  /* 循環(huán)閃爍:板子自檢,程序開始 */</p><p>  /* LED0亮:錄音(10秒鐘左右)

49、 */</p><p>  /* LED0滅:放音 */</p><p>  /*

50、 */</p><p>  /****************************************************************************/</p><p>  /*************************************************************************

51、***/</p><p>  /* 頭文件 */</p><p>  /****************************************************************************/</p><p

52、>  #include <board.h></p><p>  #include <codec.h></p><p>  #include <mcbsp54.h></p><p>  #include <type.h></p><p>  /************************

53、****************************************************/</p><p>  /* 宏定義 /</p><p>  /*********************************************

54、*******************************/</p><p>  #defineSIGN_BIT(0x80) /* 標(biāo)志位 */</p><p>  #defineQUANT_MASK(0xf)/* 量化過程的屏蔽數(shù) */</p><p>  #defineSEG_SHIFT(4) /* 左移位數(shù) */

55、</p><p>  #defineSEG_MASK(0x70) /* 段值的屏蔽數(shù) */</p><p>  /****************************************************************************/</p><p>  /*

56、函數(shù)聲明 /</p><p>  /****************************************************************************/</p><p>  void delay(s16 period);

57、 //延時子程序</p><p>  void led(s16 cnt); //亮燈試板子程序</p><p>  void initialisecodec(void); //初始化codec</p><p>  unsig

58、ned char datacompress(s16 pcm_val); //a律壓縮子程序</p><p>  int datadecompress(unsigned char a_val); //a律解壓縮子程序</p><p>  static int search(int val,short*table,int size);//查表轉(zhuǎn)化子

59、程序</p><p>  /****************************************************************************/</p><p>  /* 全局變量 /</p><p>

60、;  /****************************************************************************/</p><p>  HANDLE hHandset; //定義句柄變量hHandset,用于設(shè)置A/D和D/A</p><p>  s16 data;

61、 //錄音采集數(shù)據(jù)變量,16位</p><p>  s16 data1; //放音數(shù)據(jù)變量,16位</p><p><b>  u16 i=0;</b></p><p>  u16 temp1;

62、 //壓縮部分中間變量,16位</p><p><b>  u16 j=0;</b></p><p>  u16 k,l=0;</p><p>  u8 temp2; //解壓部分中間變量,8位</p&

63、gt;<p>  u16 buffer[20000]; //緩沖器數(shù)組設(shè)置,16位</p><p>  static short seg_end[8]={0x1F,0x3F,0x7F,0xFF,0x1FF,0x3FF,0x7FF,0xFFF};</p><p><b>  //非均勻量化標(biāo)準(zhǔn)</b

64、></p><p>  /****************************************************************************/</p><p>  /* 主函數(shù) /</p><p

65、>  /****************************************************************************/</p><p>  void main()</p><p><b>  {</b></p><p>  if (brd_init(100)) //初始化DSK板,設(shè)

66、置頻率100MHz</p><p><b>  return;</b></p><p>  led(2); //閃燈兩次</p><p>  initialisecodec(); //初始化codec</p><p>  while (1)

67、 //始終循環(huán)錄音壓縮存儲回放</p><p><b>  {</b></p><p>  while (!MCBSP_RRDY(HANDSET_CODEC)) {}; </p><p>  //查詢、等待接收handset處的采樣</p><p>  brd_led_enable(

68、BRD_LED0);</p><p>  data = *(volatile u16*)DRR1_ADDR(HANDSET_CODEC); </p><p>  //從handset處讀取采樣</p><p>  temp1=datacompress(data); </p><p>  //調(diào)用子函數(shù)datacompress(),對采樣進

69、行a律壓縮</p><p>  /*----------把低地址數(shù)據(jù)放在高八位 高地址數(shù)據(jù)放在低八位-----------*/</p><p>  i++; </p><p>  if(i%2==1)</p><p><b>  {</b></p><p>  //temp1=0

70、0000000abcdefgh 第奇數(shù)個數(shù)據(jù)</p><p>  buffer[j]=(temp1<<=8); </p><p>  //奇數(shù)數(shù)據(jù)左移8位送給buffer[j] buffer[j]=abcdefgh00000000</p><p><b>  }</b></p><p><

71、b>  else</b></p><p><b>  { </b></p><p>  //temp1=00000000ijklmnop 第偶數(shù)個數(shù)據(jù)</p><p>  buffer[j]=(buffer[j]|temp1); </p><p>  //偶數(shù)數(shù)據(jù)與temp1取或,組成新的數(shù)據(jù) &

72、lt;/p><p>  //buffer[j]=abcdefghijklmnop</p><p><b>  j++;</b></p><p><b>  }</b></p><p>  if(i>=40000) </p><p><b>  i=0;</b

73、></p><p>  if(j>=20000)</p><p><b>  {</b></p><p><b>  j=0;</b></p><p>  brd_led_disable(BRD_LED0); //熄滅數(shù)碼管0 表示錄音結(jié)束</p><p>

74、;  delay(100); //延時100 </p><p>  /* ---------------------------放音部分 -------------------------------*/</p><p>  for(k=0;k<40000;k++)</p><p><b>  {<

75、;/b></p><p>  if(k%2==0)</p><p><b>  {</b></p><p>  temp2=(buffer[l]>>8)&0x0ff;//同上面錄音原理相同</p><p><b>  }</b></p><p>&l

76、t;b>  else</b></p><p><b>  {</b></p><p>  temp2=buffer[l]&0x0ff;</p><p><b>  l++;</b></p><p><b>  }</b></p><

77、p>  if(l>=20000)</p><p><b>  l=0;</b></p><p>  data1=datadecompress(temp2);</p><p>  while (!MCBSP_XRDY(HANDSET_CODEC)) {}; </p><p>  *(volatile u1

78、6*)DXR1_ADDR(HANDSET_CODEC) = data1;</p><p>  //a律解壓完成后,DSP將數(shù)據(jù)通過串行口McBSP1發(fā)送</p><p><b>  }</b></p><p>  }//if(j>=20000)結(jié)束</p><p>  }//while結(jié)束 </p

79、><p><b>  }</b></p><p>  /****************************************************************************/</p><p>  /* 主程序結(jié)束

80、 */</p><p>  /****************************************************************************/</p><p>  /****************************************************************************/<

81、/p><p>  /* 子函數(shù) */</p><p>  /****************************************************************************/</p><p>  /*

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

83、<p><b>  {</b></p><p>  for(j=0; j<period>>1; j++);</p><p><b>  }</b></p><p><b>  }</b></p><p>  /*------閃燈,檢驗板子------

84、*/</p><p>  void led(s16 cnt)</p><p><b>  {</b></p><p>  while ( cnt-- )</p><p><b>  {</b></p><p>  brd_led_toggle(BRD_LED0);</p

85、><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><p><

86、b>  }</b></p><p><b>  }</b></p><p>  /*------codec初始化程序------*/</p><p>  void initialisecodec(void)</p><p><b>  {</b></p><p&

87、gt;  hHandset = codec_open(HANDSET_CODEC); // 獲取設(shè)置A/D和D/A的句柄</p><p>  /*----設(shè)置CODEC的工作參數(shù)----*/</p><p>  codec_dac_mode(hHandset, CODEC_DAC_15BIT); </p><p>  // DAC工作在15+1bit模

88、式</p><p>  codec_adc_mode(hHandset, CODEC_ADC_15BIT); </p><p>  // ADC工作在15+1bit模式</p><p>  codec_ain_gain(hHandset, CODEC_AIN_6dB); </p><p>  // ADC

89、模擬增益設(shè)置為6dB </p><p>  codec_aout_gain(hHandset, CODEC_AOUT_MINUS_6dB); </p><p>  // DAC模擬輸出增益為-6dB </p><p>  codec_sample_rate(hHandset,SR_4000); // 設(shè)置抽樣頻率為4KHz</p><

90、p><b>  }</b></p><p>  /*--------a律壓縮-------*/</p><p>  unsigned char datacompress(s16 pcm_val) </p><p><b>  {</b></p><p>  intmask;<

91、;/p><p><b>  intseg;</b></p><p>  unsigned charaval;</p><p>  if (pcm_val >= 0) </p><p><b>  {</b></p><p>  mask = 0xD5;// 正數(shù)時

92、標(biāo)志位(第7位)等于1</p><p><b>  } </b></p><p><b>  else </b></p><p><b>  {</b></p><p>  mask = 0x55;// 負數(shù)時標(biāo)志位為 0 </p><p>  pc

93、m_val = -pcm_val;</p><p><b>  }</b></p><p>  seg = search(pcm_val, seg_end, 8); </p><p>  // 調(diào)用alaw子程序?qū)⒎盗炕癁槎沃?</p><p>  if (seg >= 8)

94、// 數(shù)據(jù)大于量化最大值時的情況 </p><p>  return (0x7F ^ mask);</p><p>  else //數(shù)據(jù)處于量化區(qū)間的情況</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、</p><p>  return (aval ^ mask);</p><p><b>  }</b></p><p><b>  }</b></p><p>  /*-------alaw的子程序--------*/</p><p>  static int search

97、(int val, short *table, int size)</p><p><b>  {</b></p><p><b>  inti;</b></p><p>  for (i = 0; i < size; i++) </p><p><b>  {</b>

98、;</p><p>  if (val <= *table++)</p><p>  return (i);</p><p><b>  }</b></p><p>  return (size); //當(dāng)數(shù)據(jù)大于量化最大值時,直接返回最大值8</p><p><b>  }

99、</b></p><p>  /*--------a律解壓--------*/</p><p>  int datadecompress(unsigned chara_val)</p><p><b>  {</b></p><p><b>  intt;</b></p>

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

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

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

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

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

105、*************/</p><p>  /* 結(jié)束 */</p><p>  /****************************************************************************/</p

106、><p>  3.CCS程序調(diào)試運行:</p><p> ?。?)編譯程序之前的準(zhǔn)備工作</p><p>  a.頭文件的添加,本實驗中的具體路徑為:C:\ti\c5400\dsk5402\include,在build options選項中的preprocessor(預(yù)編譯)選項中的Include Seach Path中的路徑應(yīng)該與此路徑一致,否則程序編譯將報錯,報錯的

107、原因是某些頭文件無法找到。</p><p>  b.還有就是library的庫文件就需要自己從TI文件夾中尋找添加。</p><p> ?。╝)drv5402.lib是軟件仿真所用的仿真器所必需的庫文件;</p><p> ?。╞)dsk5402.lib是驅(qū)動DSK板所必需的庫文件;</p><p>  (c)rts.lib,這個庫提供目標(biāo)D

108、SP運行時間支持。</p><p>  c.添加.cmd文件。</p><p>  (2)選擇Project/Rebuild All或單擊(Rebuild All)菜單條按鈕,</p><p>  CCS重新進行編輯、匯編、連接工程里的所有文件。</p><p>  這個處理的有關(guān)信息在窗口底部一個小框里顯示。</p><

109、p> ?。?)默認時,.out文件編譯到位于當(dāng)前工程文件夾中的調(diào)試(debug)目錄中; 也可以通過CCS工具條選擇一個存儲目錄。</p><p> ?。?)選擇File/Load Program.選中yuyin.out,并按Open。</p><p> ?。╟:\ti\myprojects\yuyin\Debug\ 文件夾中。)</p><p>  CCS將

110、程序裝載到目標(biāo)DSP上,打開顯示程序反匯編指令的Disassembly窗口。</p><p> ?。?)選擇View/Mixed Source/ASM,這樣可以同時查看C源程序和產(chǎn)生的匯編代碼。</p><p> ?。?)在混合窗口單擊匯編指令(單擊有效指令,而不是指令的地址或指令所傳遞的區(qū)域),單擊F1,CCS可以尋找此指令的幫助。這是學(xué)習(xí)指令的很好的方法。</p><

111、;p> ?。?)選擇Debug/Go Main。從主程序開始執(zhí)行。</p><p> ?。?)選擇Debug/Run或單擊(Run)按鈕。</p><p>  (9)選擇Debug/ Halt,退出程序運行。</p><p><b>  3.結(jié)果分析</b></p><p>  編譯運行結(jié)果如下圖:</p&g

112、t;<p><b>  4.涉及的問題</b></p><p> ?。?)編譯出錯,找不到頭文件。</p><p><b>  解決方法:</b></p><p>  一是修改頭文件的路徑,選擇Project/Build Option,出現(xiàn)編譯選項對話框,選擇Complier項,在Category中選擇Pre

113、processor,在右側(cè)Inclde Search Path中,添入正確的頭文件的路徑。</p><p>  二是將工程中用到的頭文件保存在Include文件夾中,與源文件放在一起,這樣,編譯時,會自動修改頭文件路徑,無須手動修改。</p><p> ?。?)理解cmd文件中的內(nèi)容。</p><p> ?。╝).cmd文件類型及作用:</p><

114、;p>  .cmd是鏈接器命令文件,用于存儲器配置。</p><p> ?。╞).cmd文件結(jié)構(gòu):</p><p>  .cmd由兩條鏈接偽指令來描述:MEMORY 和SECTIONS,其中:</p><p>  MEMORY定義用戶目標(biāo)系統(tǒng)存儲器的配置;</p><p>  SECTIONS控制段的構(gòu)建和存儲器的分配。 </p&

115、gt;<p> ?。╟)5402.cmd全文及其解釋如下:</p><p>  MEMORY </p><p><b>  { </b></p><p>  PAGE 0: PARAM : origin=0x1000, length=0x0efd </p><p

116、>  PAGE 1: DARAM : origin=0x2000, length=0x2000 </p><p><b>  } </b></p><p>  SECTIONS </p><p><b>  { </b></p><p>

117、;  .text : { } > PARAM PAGE 0 </p><p>  .cinit: { } > PARAM PAGE 0 </p><p>  .data: { } > DARAM PAGE 1 </p><p>  .bss: { } > DARAM PAGE 1 </p><p&g

118、t;  .const: { } > DARAM PAGE 1 </p><p><b>  } </b></p><p>  根據(jù)上面的具體文件作以下補充:</p><p> ?。╠)sections是COFF文件中最重要的概念,它至少包含以下三個段:</p><p>  .text 段:包含可執(zhí)行代碼;<

119、;/p><p>  .data 段:包含初始化數(shù)據(jù);</p><p>  .bss 段:為未初始化變量保留存儲空間。</p><p>  其他為自定義段(或匯編器生成段),如:.usect段,.sect段,.cinit段等。</p><p>  此外,匯編器和鏈接器可以建立、命名和鏈接自定義段,鏈接時作為一個單獨的部分分配到存儲器: <

120、/p><p>  .usect段:為未初始化變量保留存儲空間的自定義段;</p><p>  .sect 段:建立包含代碼和數(shù)據(jù)的自定義段 </p><p>  .cinit段:包含初始化變量表和常數(shù),C/C++ 的全局變量;</p><p> ?。╡)段的分類:可分為已初始化段和未初始化段。</p><p>  已初始

121、化段:包含數(shù)據(jù)或程序代碼。例如:.text段,.data段和用.sect匯編命令建立的自定義段。</p><p>  當(dāng)匯編器遇到.text或.data或.sect命令時,將停止對當(dāng)前段的匯編,然后將緊接著的程序代碼或數(shù)據(jù)匯編到指定的段中,直到再遇見另一條命令為止。</p><p>  未初始化段:是‘C54x存儲器中的保留空間,通常定義在RAM區(qū)。</p><p>

溫馨提示

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

評論

0/150

提交評論