dsp課程設(shè)計(jì)--語(yǔ)音壓縮,存儲(chǔ)和回訪_第1頁(yè)
已閱讀1頁(yè),還剩23頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、<p><b>  DSP課程設(shè)計(jì)</b></p><p>  ——語(yǔ)音壓縮、存儲(chǔ)和回放</p><p>  自動(dòng)化0803 王志平</p><p>  電 子0801 顧曉珺</p><p><b>  DSP實(shí)驗(yàn)報(bào)告——</b></p><p>  語(yǔ)音壓縮、

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

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

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

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

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

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

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

9、lt;p>  LED0亮:錄音(10秒鐘左右)</p><p><b>  LED0滅:放音</b></p><p><b>  原理說(shuō)明</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就是語(yǔ)音模擬信號(hào)的一種非線性量化,細(xì)分有二種:G.711 A-law and G.711 u-law.不同的國(guó)家

11、和地方都會(huì)選取一種作為自己的標(biāo)準(zhǔn). G.711 bitrate 是64kbps. 詳細(xì)的資料可以在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是一個(gè)雙速率的語(yǔ)音編碼器,是 ITU-T建議的應(yīng)用于低速率多媒體服務(wù)中語(yǔ)音或其它音頻信號(hào)的壓縮算法;其目標(biāo)應(yīng)用系統(tǒng)包括H.323、H.324等多媒體通信系統(tǒng),目前該算法已成為IP電話系統(tǒng)中的必選算法之一;編碼器的幀長(zhǎng)為30ms,還有7

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

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

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

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

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

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

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

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

21、后每段都是剩下部分的1/2。;依次取第八段為V~V/2 第七段為V/2~V/4;第一段為V/128~0。</p><p>  第二步:把每段均勻劃分為16等份,每一份表示一個(gè)量化級(jí),顯然8段共16x8=128= 個(gè)量化級(jí),需要二進(jìn)制7位編碼表示。可以看出每個(gè)量化級(jí)是不均勻的。在小信號(hào)的量化臺(tái)階很小,使小信號(hào)時(shí)量化噪聲減小。如果按均勻量化計(jì)算,以最小臺(tái)階 為單位,最大信號(hào)需用L=128X16=2048

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

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

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

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

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

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

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

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

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

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

32、 一個(gè)連接耳機(jī)(J6)的音頻輸出</p><p>  麥克風(fēng)的輸入信號(hào)最大允許標(biāo)準(zhǔn)是500mVp。在DSK上有10dB前置放大器增益。當(dāng)接入信號(hào)源的輸入時(shí),需要使用隔直電容(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)換器以及抗混疊濾波器,采樣速率最高可達(dá)22.05kHz。</p><p>  此外,ADC之后有一個(gè)抽取濾波器以提高輸入信號(hào)的信噪比,在DAC之前有一個(gè)插值濾波器以保證輸出信號(hào)平滑輸出。</p><p>  AD50與DSP芯片通過(guò)同步串行通信接口(MCBSP1)相連。</p><

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

35、</p><p>  在ADC之后有一個(gè)抽取濾波器:提高輸入信號(hào)的信噪比</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功能實(shí)現(xiàn)自動(dòng)緩存功

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

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

41、當(dāng)XRDY=1時(shí),發(fā)送器就緒,可以從XDR1或2種發(fā)送數(shù)據(jù)。</p><p>  所以在實(shí)際實(shí)驗(yàn)中我們采用以下語(yǔ)句命令:</p><p><b>  a.接收數(shù)據(jù)時(shí)</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ù)時(shí)</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ù)通過(guò)串行口McBSP1發(fā)送</p><p>  程序設(shè)計(jì)、調(diào)試與結(jié)果分析</p><p><b>  1.流程圖:</b>&

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

45、 ************/</p><p>  /*********** 語(yǔ)音的壓縮、存儲(chǔ)和回放 ************/</p><p>  /****************************************************************************/</p>

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

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

48、lt;/p><p>  /* 用板子上的1個(gè)LED來(lái)指示錄放音狀態(tài) */</p><p>  /* 循環(huán)閃爍:板子自檢,程序開(kāi)始 */</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)/* 量化過(guò)程的屏蔽數(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、 //延時(shí)子程序</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)錄音壓縮存儲(chǔ)回放</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(),對(duì)采樣進(jìn)

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ù)個(gè)數(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ù)個(gè)數(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); //延時(shí)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ù)通過(guò)串行口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、--------延時(shí)--------*/</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>  /*------閃燈,檢驗(yàn)板子------

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ù)時(shí)

92、標(biāo)志位(第7位)等于1</p><p><b>  } </b></p><p><b>  else </b></p><p><b>  {</b></p><p>  mask = 0x55;// 負(fù)數(shù)時(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ù)大于量化最大值時(shí)的情況 </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ù)大于量化最大值時(shí),直接返回最大值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)試運(yùn)行:</p><p>  (1)編譯程序之前的準(zhǔn)備工作</p><p>  a.頭文件的添加,本實(shí)驗(yàn)中的具體路徑為:C:\ti\c5400\dsk5402\include,在build options選項(xiàng)中的preprocessor(預(yù)編譯)選項(xiàng)中的Include Seach Path中的路徑應(yīng)該與此路徑一致,否則程序編譯將報(bào)錯(cuò),報(bào)錯(cuò)的

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

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

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

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

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

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

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

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

115、gt;<p>  (c)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ù)上面的具體文件作以下補(bǔ)充:</p><p> ?。╠)sections是COFF文件中最重要的概念,它至少包含以下三個(gè)段:</p><p>  .text 段:包含可執(zhí)行代碼;<

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

120、/p><p>  .usect段:為未初始化變量保留存儲(chǔ)空間的自定義段;</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命令時(shí),將停止對(duì)當(dāng)前段的匯編,然后將緊接著的程序代碼或數(shù)據(jù)匯編到指定的段中,直到再遇見(jiàn)另一條命令為止。</p><p>  未初始化段:是‘C54x存儲(chǔ)器中的保留空間,通常定義在RAM區(qū)。</p><p>

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論