2023年語音壓縮存儲與回放實驗報告_第1頁
2023年語音壓縮存儲與回放實驗報告_第2頁
2023年語音壓縮存儲與回放實驗報告_第3頁
2023年語音壓縮存儲與回放實驗報告_第4頁
2023年語音壓縮存儲與回放實驗報告_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

DSP課程設計

實驗報告

語音壓縮、存儲和回放

院系:電子信息工程學院

小組成員:

通信0607王穎06282023

自動化0601王燕06212023

目錄

一、設計任務書封面1

二、設計內容與規(guī)定3

三、設計算法原理說明4

四、程序設計、調試與結果分析7

CMD程序,C語言程序7

調試過程15

波形與數據顯示16

五、設計(安裝)與調試的體會17

六、參考文獻18

語音的壓縮、存儲與回放

一、設計規(guī)定與目的

(1)使用DSP實現語音壓縮和解壓縮的基本算法,算法類型自定,例如可以采用G.711、

G.729等語音壓縮算法。

(2)采用A/D轉換器從MIC輸入口實時采集語音信號,進行壓縮后存儲到DSP的片內和

片外RAM存儲器中,存儲時間不小于10秒。

(3)存儲器存滿之后,使用DSP進行實時解壓縮,并從SPEAKER輸出口進行回放輸出。

⑷使用指示燈對語音存儲和回放過程進行指示。

發(fā)揮部分:

使用多種算法進行語音的壓縮、存儲和解壓縮,比較它們之間的優(yōu)缺陷。

二、實驗目的

1、通過本實驗掌握5402DSP片上外設多通道緩沖串行口mcbspo

2、學習掌握tic320ad50CODEC編譯碼器的內部結構、工作原理。

3、學習A律語音壓縮以及C語言下的編程方法。

三、實驗原理

1.語音采集與輸出模塊

語音采集與輸出模塊采用的是TI公司推出的一款高性能的立體聲音頻Codec芯片TLC

320AD50C,內置耳機輸出放大器,支持MIC和UNEIN兩種輸入方式(二選一),且對輸入

和輸出都具有可編程增益調節(jié)。AD50的模數轉換(ADCs)和數模轉換(DACs)部件高度集成

在芯片內部,采用了先進的Sigma-delta過采樣技術,可以在8K到96K的頻率范圍內提供

16bit、2Obit、24bit和32bit的采樣,ADC和DAC的輸出信噪比分別可以達成90dB和

lOOdB。與此同時,AD50還具有很低的能耗,回放模式下功率僅為23mW,省電模式下

更是小于15uWe由于具有上述優(yōu)點,使得AD50是一款非常抱負的音頻模擬I/O器件,

可以很好的應用在隨聲聽(如CD,MP3……)、錄音機等數字音頻領域⑵。由TLC320AD5

0C組成的語音輸入與輸出模塊不僅采樣率高最高可達96K,且外圍電路簡樸,性價比高。

2.語音編碼

(1)概念:

語音編碼一般分為兩類:一類是波形編碼,一類是被稱為“聲碼器技術”的編碼。

PCM編碼即脈沖編碼調制。

波形編碼的最簡樸形式就是脈沖編碼調制(PulsecodemoduIation),這種方式

將語音變換成與其幅度成正比的二進制序列,而二進制數值往往采用脈沖表達,并用脈沖對

采樣幅度進行編碼,所以叫做脈沖編碼調制。

脈沖編碼調制沒有考慮語音的性質,所以信號沒有得到壓縮。

(2)量化:

脈沖編碼調制用同等的量化級數進行量化,即采用均勻量化,而均勻量化是基本的量化

方式。但是均勻量化有缺陷,在信號動態(tài)范圍較大而方差較小的時候,其信噪比會下降。

國際上有兩種非均勻量化的方法:A律和u律,u律是最常用的一種。在美國,7位u律是

長途電話質量的標準。而我國采用的是A律壓縮,并且有標準的A律PCM編碼芯片。

⑶DPCM&ADPCM:

減少傳輸比特率的方法之一是減少編碼的信息量,這要消除語音信號中的冗余度。相鄰

的語音樣本之間存在明顯的相關性,因此對相鄰樣本間的差信號進行編碼,便可使信息量得

到壓縮。由于差分信號比原語音信號的動態(tài)范圍和平均能量都小。這種編碼叫Differentia

1PCM,簡稱DPCM,即差分脈沖編碼調制。

ADPCM即自適應差分脈沖編碼調制,是涉及短時預測的編碼系統(tǒng)。CCITT(國際電報

電話征詢委員會)在1984年提出的32kbit/s的編碼器建議就是采用ADPCM作為長途傳輸

中的國際通用語音編碼方案。這種ADPCM編碼方案達成64kbit/sPCM的語音傳輸質

量,并具有很好的抗誤碼性能。

(4)a律壓縮

a律壓縮示意圖

A律壓縮編碼表

A律壓縮編碼表

線性輸入編碼壓縮編碼

0000000wxyza000wxyz

OOOOO0Iwxyza00Iwxyz

000001wxyzab0lOwxyz

000Olwxyzabc01Iwxyz

0001wxyzabed1OOwxyz

001wxyzabede101wxyz

01wxyzabcdef11Owxyz

1wxyzabcdefg111wxyz

采用DSP可以直接對PCM編碼后的語音信號進行口律和A律壓縮。圖1是DSP硬

件實現數據壓縮解壓的簡樸流程,DSP將傳輸來的壓縮后的數據進行解壓成16位或者3

2位,然后對解壓后的數據進行分析、解決,最后將解決后的數據按照規(guī)定壓縮成8位的數

據格式輸出到相應設備,供其他設備讀取。

圖1數據壓縮解壓流程

圖2是DSP將數據解壓的值,DSP將壓縮的8位數據解壓成16位的DSP通用數據格

式,其中高13位為解壓后的數據,低3位補0。這是由于6.711的A律壓縮只能對13

位數據操作。DSP將解壓后的數據放在緩沖串口的發(fā)送寄存器中,只要運營發(fā)送指令,緩沖

串口就會將數據發(fā)送出去。緩沖串口對接受數據的解壓過程和壓縮過程完全相反。圖3是|J

律數據解壓的示意圖。

15320

發(fā)送緩沖器'S—I0_

A律一

圖2A律數據解壓

15210

發(fā)送緩沖器:值I0二

u律

圖3口律數據解壓

DSP內部的緩沖串口(McBSPs)帶有硬件實現的p律/A律壓縮解壓,用戶只需要在相

應寄存器中進行設立就可以了。

在進行A律壓縮時,采樣后的12位數據,默認其最高位為符號位,壓縮時要保持最高位

即符號位不變,原數據的后11位要壓縮成7位。這7位碼由3位段落碼和4位段內碼組

成。具體的壓縮變換后的數據根據后11位數據大小決定.

表2A律數據壓縮表

12位碼(十進制)■階符號位段落碼(二進制)段內碼(二進制)

01111

16-31100010000-1111

32?63200100000?1111

64~127400110000~1111

3?255801000000-1111

256-5111601010000-1111

51270233201100000~1111

1024~20476401110000-1111

除對串行口數據實現壓擴解決外,這套硬件在McBSP不使用時還可以當作一個特殊的

解決單元對內部數據實現壓擴解決,他有兩種實現方法。

法一:當串行口的發(fā)送和接受部分都處在復位狀態(tài)時,DRR1和DXR1內部通過壓擴邏輯

連接在一起,數據從DXR1寫入并根據XCOMPAND解決,然后根據RCOMPAND再解決,在

4個CPU時鐘后從DRR1中讀出數據。該解決比軟件實現快,不利之處在于解決完后沒有同

步信息告知CPU和DMA。

法二:在數據環(huán)回模式下,McBSP也實現了一種內連。數據解決與第一種方法相同,但它

可以提供中斷信號(或同步事件)給CPU(或DMA)。這里數據解決的時間是根據串行口的比

特律擬定的。

此外,在通常情況下McBSP先傳輸信號的高位后傳輸低位,但是在字長為8比特的數據傳

輸時,McBSP提供了比特倒序的功能,即可以先傳輸低位后傳輸高位。

在本實驗中,我們通過軟件編程來完畢線性碼轉換成A律。

語音信號通常是小信號概率大,大信號出現的概率小,為提高小信號時的量化信躁比,

壓縮比特速率,可為非線性量化。語音壓縮是把16位的數據比特轉化為8位數據比特,從

而到達語音壓縮的目的。

在主程序中通過A/D抽樣量化,可以得到16位的線性編碼,再由編碼表通過軟件計算得

到8位A律編碼,其中最高位為符號位,第6位到第4位為段落碼,低4位為段內碼。將8

位的壓縮結果存儲到系統(tǒng)RAM中進行緩存,根據抽樣率、語音存儲時間以及系統(tǒng)RAM的容

量設立語音存儲緩沖區(qū)的大小,待緩沖區(qū)存滿后,將緩沖區(qū)內的數據進行解壓縮,然后輸出

到SPEAKER接口輸出端。

若使用A/D轉換器,必須一方面對A/D轉換器進行初始化設立,即設立A/D轉換器的

工作模式、輸入增益以及抽樣頻率等。

3.程序設計

(1)、程序流程

存儲器的分派(5402.cmd)

MEMORY

PAGE0:VECS:origin=0080h,length=0080h/*Interna1

ProgramRAM*/

PRAM:origin=7600h,1ength=80OOh/*Internal

ProgramRAM*/

PAGE1:SCRATCH:origin=0060h,length=0020h/*ScratchPad

DataRAM*/

DMARAM:origin=OCOOh,length=0300h/*DMA

buffer*/

DATA:origin=1100h,1ength=0080h/*In

ternalDataRAM*/

STACK:origin=118Oh,1ength=0560h/*Stack

MemorySpace*/

INRAM:origin=19OOh,length=0100h/*Internal

DataRAM*/

HPRAM0:origin=1A00h,length=0002h/*HPImem

oryaccessiblebyIiostandDSP*/

HPRAMI:origin=1A02h,1ength=028Oh/*HPI

memoryaccessiblebyHostandDSP*/

HPRAM2:origin=1C82h,length=0280h/*HPImemory

accessib1ebyHostandDSP*/

EXRAM:origin=lFlOh,1ength=9000h/*External

DataRAM*/

)

SECTIONS

.cinit>PRAMPAGE0

.text>PRAMPAGE0

.vectors>VECSPAGE0

initvar>PRAMPAGE0

detect>PRAMPAGE0

vrcprg>PRAMPAGE0

matprg>PRAMPAGE0

,stack>STACKPAGE1

.trap>SCRATCHPAGE1

.cons>EXRAMPAGE1

.data>EXRAMPAGE1

bss>EXRAMPAGE1

,cio>EXRAMPAGE1

,switch>EXRAMPAGE1

tables>EXRAMPAGE1

var>EXRAMPAGE1

svctab>EXRAMPAGE1/*SS_VLSPtable*/

vctab>EXRAMPAGE1/*VLSPtable*/

uvctab>EXRAMPAGE1/*UVLSPtable*/

cuvtab>EXRAMPAGE1/*StochaSticcodebook*/

cdbktab>EXRAMPAGE1/*variouscodebooktabies

*/

logtab>EXRAMPAGE1/*tablefcrlog2*/

powtab>EXRAMPAGE1/*tableforp]ow2*/

hamtab>EXRAMPAGE1/*tableforhamming*/

1gwtab>EXRAMPAGE1/*tableforlagwindow*/

acostab>EXRAMPAGE1/*tab1efora;rccos*/

sqrtab>EXRAMPAGE1/*tableforsquareroot

*/

acbtab>EXRAMPAGE1/*tabieforthresho1dsina

cb*/

pm03tab>EXRAMPAGE1tableforx"(-0.3)

computation*/

costab>EXRAMPAGE1/*tableforcosine*/

V23>INRAMPAGE1

FSK>INRAMPAGE1

hpibuffO>HPRAMOPAGE1

hpibuff1>HPRAMlPAGE1

hpibuff2>HPRAM2PAGE1

dmabuff>DMARAMPAGE1

}

/*主程序設計*/

/*語音采集及回放程序*/

/*用A律進行壓縮及解壓*/

/*采用AD50進行A/D,D/A轉換*/

/火燈循環(huán)閃爍程序開始*/

/*L0:錄音*/

/*L1:放音*/

#include<type.h>/*頭文獻*/

#include<board.h>

#inc1ude<codec.h>

#include<mcbsp54.h>

/*宏定義*/

#defineoSIGN_BIT(0x80)/*SignbitforaA-lawbyte.*/

#defineoQUANT_MASKO(oxf)?>/*Quantizationfieldmask.*/

#defineNSEGS*8)。/*NumberofA-lawsegments.*/

#define<>SEG_SHIFT(4)oo/*Leftshiftforsegmentnumber.

*/

#defineSEG_MASK(Ox70)“*Segmentfieldmask.*/

/*函數聲明

*/

voiddelay(sl6period);

voidled(sl6ent);

voidinitcodec(void);

voidflashenable(void);

unsignedchardata2a1aw(si6pcm_val);

intalaw2data(unsignedcharoa_va1);

staticintsearch(intval,short*?^table,intsize);

/*全局變量*/

HANDLEhHandset;

s16data;

sl6datal;

ul6i=0;

ul6temp1;

ul6j=0;

u16k,1=0;

u8temp2;

ul6buffer[20230];

staticshortseg_end[8]={OxlF,0x3F,0x7F,OxFF,0xlFF,0x3FF,0

x7FF,OxFFF);

/*主函數*/

voidmain()

if(brd_init(100))

return;

led(2);//閃燈兩次

initcodec();//初始化codec

f1ashenable();〃選擇片外FLASH為片外存儲器

/*

delay(100);

brdledtogg1e(BRD_LEDO):

for(i=0x9000;i<0xefff;i++)

(

REG_WRITE(i,*(volatileul6*)DRR1_ADDR(HANDSET_C0DEC));

delay(20);

)

brd_ledtoggle(BRDLED1);

delay(200);

for(i=0x9000;i<0xefff;i++)

(

*(volatileu16*)DXR1_ADDR(HANDSET_CODEC)-REG_READ(i);

delay(20);

}

brd_1ed_toggle(BRD_LED2);

*/

while(1)

(

while(!MCBSP_RRDY(HANDSET_CODEC)){};//等待接受h

andset處的采樣

brd1edtoggle(BRD_LEDO);

data=*(volatileul6*)DRR1_ADDR(HANDSET_CODEC);//從hands

et處讀取采樣

templ=data2alaw(data);〃對采樣進行a律

壓縮

/*把低地址數據放在高八位高地址數據放在低八位*/

i=i+1;

oif(i%2==l)

00{

buffer[j]=(templ<<=8);

o/*奇數數據左移8位templ=abcdefghOOOOOOO0

g?>buffer[p1*/

oao)

else

3(

oobuffer[j]=(buffer[j]Itempi);

g/*偶數數據與temp1取或組成新的數據

buffer[j]=ab

cdefghiabcdefghi*/

gj++;〃j加1

0)

if(i>=40000)

8(

g}

oif(j>=20230)

6(

。j=0;

。wbrd_led_disab1e(BRD_LEDO);

。?>brd1ed_toggle(BRDLED1);

//點亮二極管1表達放

音開始

/*放音部分

*/

for(k=0;k<40000;k++)

06(

。08if(k%2==0)

0b0(

。。temp2=(buffer[1]>>8)&OxOff;

08d}

。qelse

000{

。^temp2=buffer[l]&OxOff;

。。1++;

oo}

ooif(l>=20230)

。。1=0;

00data1=a1aw2data(temp2);//a律解壓

while(!MCBSP_XRDY(HANDSET_CODEC)){};

3"(volatileu16*)DXRIADDR(HANDSETCODEC)=datai;〃將

數據寫入D/A轉換器

?)

/*放音結束

o。brdled_toggle(BRDLEDO);

brd_led_toggle(BRD_LED1);

00

000

)

)

)〃主程序結束

/*子函數*/

/*******延時******/

voiddelay(s16period)

inti,j;

for(i=0;i<period;i++)

for(j=0;j<period>>l;j++);

)

)

/*****大*閃燈****火*/

voidled(si6ent)

(

while(cnt—)

brd_led_toggle(BRD_LED0);//切換LED指示燈0的顯示狀

態(tài)

odelay(1000);

brd_1ed_toggle(BRD_LED1);

火lelay(1000);

obrd_led_toggle(BRD_LED2);

delay(1000);

)

)

/*****初始化codec**/

voidinitcodec(void)

/*OpenHandsetCodec獲取設立codec的句柄*/

hHandsetcodec_open(HANDSET_CODEC);/Acquirehandiet

ocodec

/*Setcodecparameters*/

codecdac_mode(hHandset,CODEC_DAC_15BIT);//DACin15-bi

tmode

codec_adc_mode(hHandset,C0DEC_ADC_15BIT);//ADCin15—

bitmode

codec_ain_gain(hHandset,CODEC_AIN6dB);//6dBgainona

na1oginputtoADC

codec_aout_gain(hHandset,C0DEC_A0UT_MINUS_6dB);

//-6dBgainonan

alogoutputfromDAC

codec_sample_rate(hllandset,SR_8000);//8KHzsa

mp1ingrate

)

/*****設立flash****/

voidflashenab1e(void)

I

CPLD_CTRL2_REGI=0x0010;

CPLD_DMCTRL_REG|=Ox0040;

}

/*****a律壓縮******/

unsignedchardata2alaw(s16pcmva1)。

tomask;

int。seg;

unsignedchareava1;

oif(pcm_va1>=0)

°(

。mask=0xD5;。//標記(7th)bit=1

。}

oelse

°(

emask=0x55;抽//標記bit=0

pcm_va1=-pcm_va1;

d

。//Convertthesealedmagnitudetosegmentnumber.

oseg=search(pcm_va1,seg_end,8);

//Combinethesign,segment,andquantizationbits.

if(seg>=8)o//outofran

ge,返回最大數.

?>return(0x7F八mask);

?>else

aval=seg<<SEG_SHIFT;

if(seg<2)

oooavalI=(pcm_val?1)&QUANT_MASK;

oeIse

<?ava1(pcm_val>>seg)&QUANT_MASK;

oreturn(ava1mask);

。}

)

/****alaw的子程序**/

staticintsearch(intval,short沐tabie,intsize)

I

int;

ofor(i=0;i<size;i++)

°(

?if(va1<=*table++)

oreturn(i);

d

。return(size);

)

/*****a律解壓******/

intalaw2data(unsignedchar陽_va1)

I

intt;

ointoseg;

a_val=0x55;

t=(a_val&QUANTJIASK)<<4;

?seg=((unsigned)a_val&SEG_MASK)>>SEG_SHIFT;

oif(seg==0)

。?t+=8;

?>t=(t>>3);

}

。if((seg<4)&&(seg>0))

°{

t+=0x108;

t=(t?(4-seg));

)

if(seg>3)

t+=0x108;

ot=(t<<=(seg-4));

return((a_val&SIGN_BIT)?t:—t);

)

/*結束*/

四.操作過程

1.將工程文獻夾放入C盤規(guī)定目錄下。

2.打開CCS,Project-open,打開工程文獻。

3.進行編譯,連接。

4.根據錯誤提醒,對buildoption進行對的的設立,修改頭文獻途徑。

5.再編譯,連接,顯示沒有錯誤。

6.loadprogram—run,此時三盞燈循環(huán)亮,之后程序開始,第一盞燈亮

開始錄音,一段時間后第二盞燈亮開始放音,然后又開始錄音。依次循環(huán).

五.調試過程與運營結果

1.觀測數據結果

Viewwatchwindow

我們輸入buffer,顯示此數組的值,如圖D所示。

2.觀測數據圖形

ViewGraphTimeFrequency

可以加入斷點,然后按Animate動態(tài)顯示。

分別觀測語音輸入(存放在變量data中)波形,壓縮后波形(tempi),解壓后輸出波形(da

ta1),圖形分別為A,B,Co

3.觀測存儲器中數據

ViewMemory

通過多次調試,使錄音時間在保持音質的前提下達成5-6秒。

A.輸入波形(data)

用w□E3asE]E30?±

西

CJ

-stockoptiont。changethedefoultsize.-I

dComplete.

Errors,1Warnings,0Ramarks.

?.大回營H

?/C54G2DSKZCFV.lDnct-Ntorosoft

B.壓縮后波形(temp1)

Z/C5402DSK/CPU_1-C54X-CodeCoaposexStudio-[GraphicalDisplay!RTj西岡

區(qū)E>1?NditYi?Eroj.ctp.bucFcefil.r<;ELOptionToolsDSF/BIOSNind。*K.lp

圖。7|>“-31。I??AW.,1iZIZI?(?-?=%.?-

inu.i>jtKiD.bo<3,掰蛆/"-*'?

用w|30醺回日回心

-stockoptiontochangethedefaultsize.

dComplete.

Errors,1Warnings,0Remarks.

],「「|\BMd廠1臼

陽英。?.大通冷工|J

?c*o'X/C5402OSK/Crv_l.QBoel-Mtcrosoft々占二?叼。20。4

C.解壓縮后輸出波形(datal)

I^/CM07DSJt/CPIl_l-Cb4X-Coi!?C?i>ox?rStudio-[Crxphi<:M1n>xi>lxy]

B?回因

E>1?Kd>tY***Er?j?ct£?bucProf,1”柒LOptionX??l(D£P/BIOSn,nd”H?lp

I心第I匚工

i|D?bu(

國曲㈡國85回日畫d

dComplete.

Errors,1Warnings,0Remarks.

I-J"I*hBiMW/

發(fā)英,:?大陋I5工|

溫馨提示

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

最新文檔

評論

0/150

提交評論