版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- dsp課程設(shè)計---語音的壓縮、存儲和回放
- dsp課程設(shè)計報告----語音壓縮、存儲與回放
- dsp課程設(shè)計-語音采集壓縮存儲與回放
- dsp課程設(shè)計--基于tm320vc5402語音采集壓縮存儲與回放
- dsp課程設(shè)計--基于tms320vc5402語音采集壓縮存儲與回放
- dsp數(shù)字信號處理課程設(shè)計報告-- 語音壓縮與回放
- dsp課程設(shè)計--語音噪聲濾波
- dsp語音信號處理課程設(shè)計
- dsp課程設(shè)計報告---語音噪聲濾波
- 存儲和運輸課程設(shè)計
- dsp語音錄放課程設(shè)計--基于tms320c5416 dsp的語音信號的采集和放送
- dsp課程設(shè)計
- 課程設(shè)計-基于單片機的語音存儲及回放系統(tǒng)課程設(shè)設(shè)計
- cdma通信系統(tǒng)語音轉(zhuǎn)換及壓縮編碼課程設(shè)計
- dsp技術(shù)課程設(shè)計---語音信號擴展u律
- dsp課程設(shè)計---dsp芯片簡介
- dsp課程設(shè)計報告
- dsp課程設(shè)計實驗
- dsp課程設(shè)計報告
- dsp課程設(shè)計實驗
評論
0/150
提交評論