《DSP處理器原理與應(yīng)用》課件第8章_第1頁
《DSP處理器原理與應(yīng)用》課件第8章_第2頁
《DSP處理器原理與應(yīng)用》課件第8章_第3頁
《DSP處理器原理與應(yīng)用》課件第8章_第4頁
《DSP處理器原理與應(yīng)用》課件第8章_第5頁
已閱讀5頁,還剩129頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第8章利用DSP實現(xiàn)語音信號采集與分析8.1引言

8.2語音codec芯片TLV320AIC23的設(shè)計和控制原理

8.3I2C模塊

8.4本章小結(jié)習(xí)題與思考題

近二十年來,全球半導(dǎo)體產(chǎn)業(yè)的飛速發(fā)展帶動相關(guān)的軟件、硬件設(shè)計達(dá)到新的水平,使得很多比較復(fù)雜的數(shù)字信號處理算法可以實時實現(xiàn)并且得到廣泛應(yīng)用。突出的代表就是數(shù)字信號處理器(DSP)與語音信號壓縮編碼算法相結(jié)合,并且在日常通信系統(tǒng)中得到廣泛應(yīng)用,例如數(shù)字移動電話、IP電話等。網(wǎng)絡(luò)通信的發(fā)展、微處理器和信號處理專用芯片的發(fā)展,為語音處理技術(shù)的應(yīng)用提供了更加廣闊的平臺。所有這些因素都促進(jìn)了對更加有效、可靠、高質(zhì)量的語音編碼系統(tǒng)的需要,從而促進(jìn)了語音編碼技術(shù)的持續(xù)發(fā)展。8.1引言在數(shù)字信號處理的諸多應(yīng)用當(dāng)中,音頻信號處理是相當(dāng)重要的一個環(huán)節(jié)。本章重點介紹如何利用TMS320VC5509DSP以及相關(guān)codec芯片進(jìn)行語音信號的處理。

TLV320AIC23是一個高性能的多媒體數(shù)字語音編解碼器,它的內(nèi)部ADC和DAC轉(zhuǎn)換模塊帶有完整的數(shù)字濾波器(digitalinterpolationfilters)。數(shù)據(jù)傳輸寬度可以是16位、20位、24位和32位,采樣頻率范圍為8~96kHz。在ADC采集達(dá)到96kHz時噪音為90dBA,能夠高保真的保存音頻信號。在DAC轉(zhuǎn)換達(dá)到96kHz時噪音為100dBA,能夠高品質(zhì)地數(shù)字回放音頻,在回放時僅僅減少23mW。8.2語音codec芯片TLV320AIC23的設(shè)計和控制原理8.2.1工作原理

TLV320AIC23內(nèi)部有11個可編程控制寄存器,通過不同設(shè)置,可以改變芯片的工作狀態(tài),如采樣率、左右聲道音量等。這些寄存器都是通過AIC23的控制接口來編程的??刂平涌谟址譃镾PI(三線)和I2C(兩線)接口,外部引腳MODE置1/0決定采用哪種接口方式。

SPI接口模式是三線串行傳輸方式。SDIN為輸入串行數(shù)據(jù),SCLK為串行時鐘,控制字共16位,由高位開始傳輸,在時鐘的上升沿鎖存每一位數(shù)據(jù),當(dāng)16位控制數(shù)據(jù)(一個控制字)傳輸完成后,產(chǎn)生一個上升沿將控制字鎖存到AIC23的內(nèi)部。SPI模式時序如圖8-1所示。

圖8-1SPI模式時序圖

I2C是兩線串行傳輸方式。SDIN為輸入串行數(shù)據(jù),SCLK為串行時鐘,具體應(yīng)用可參考手冊。當(dāng)SCLK為高電平時,SDIN產(chǎn)生下降沿時開始數(shù)據(jù)傳輸。傳輸開始后,首先傳輸?shù)氖墙邮諗?shù)據(jù)設(shè)備的地址。R/W決定傳輸?shù)姆较?,TLV320AIC23為只能寫入控制字的器件,因此R/W僅在為0時有效。TLV320AIC23只能工作在從設(shè)備模式,其地址由CS管腳的狀態(tài)確定,當(dāng)CS為0時,地址為0011010;當(dāng)CS為1時,地址為0011011,缺省值為0。

I2C總線中的器件當(dāng)接收到總線上發(fā)送的地址與自己地址相同時,通過在第9個時鐘周期內(nèi)將SDIN的電平拉低來確認(rèn)數(shù)據(jù)的傳輸。在傳輸8位數(shù)據(jù)后,重復(fù)上述控制。當(dāng)SCLK為高電平,且SDIN出現(xiàn)上升沿時,傳輸停止。所傳輸?shù)?6位控制字分為兩個部分:高7位b15~b9是寄存器地址,低9位b8~b0是寫入寄存器中的控制數(shù)據(jù)。其時序如圖8-2所示。具體I2C總線的工作原理以及TMS320VC5509中I2C模塊的應(yīng)用在本章的后面部分加以詳細(xì)介紹。

圖8-2I2C模式時序圖

TLV320AIC23與TMS320VC5509的連接示意圖如圖8-3所示,從圖中可以看出MODE接0,確定為I2C控制方式,CS為0,確定地址為0011010,SCLK、SDIN分別與DSP的I2C接口SCL、SDA相連接。DSP的McBSP0作為數(shù)據(jù)的發(fā)送和接收端口。

圖8-3TMS320VC5509與TLV320AIC23的連接示意圖8.2.2TLV320AIC23內(nèi)部寄存器

AIC23內(nèi)部共有11個可編程寄存器,地址為0000000~0001001和一個復(fù)位寄存器0001111。通過這些寄存器,我們可以設(shè)置輸入增益、耳機(jī)輸出增益以及采樣時鐘和采樣頻率等。

表8-1詳細(xì)說明了在對TLV320AIC23進(jìn)行編程時,TLV320AIC23內(nèi)部寄存器的含義。

表8-1TLV320AIC23的內(nèi)部寄存器含義表8-2~表8-12為表8-1中所示的所有寄存器的具體內(nèi)容。

表8-2左聲道輸入控制

LRS:左右聲道同時更新。0=禁止;1=激活。

LIM:左聲道輸入衰減。0=Normal;1=靜音。

LIV[4:0]:左聲道輸入控制衰減(10111=0dB缺省)。

最大11111=+12dB;最小00000=-34.5dB表8-3右聲道輸入控制

RLS:左右聲道同時更新。0=禁止;1=激活。

RIM:右聲道輸入衰減。0=Normal;1=靜音。

RIV[4:0]:右聲道輸入控制衰減(10111=0dB缺省)。

最大11111=+12dB;最小00000=-

34.5dB。

X:保留表8-4左耳機(jī)通道控制

LRS:左右耳機(jī)通道控制。0=禁止;1=激活。

LZC:0點檢查。0=Off;1=On。

LHV[6:0]:左耳機(jī)通道控制音量衰減(1111001=0dB默認(rèn))。

最大1111111=+6dB;最小0110000=–73dB(靜音)。表8-5右耳機(jī)通道控制

RLS:左右耳機(jī)通道控制。0=禁止;1=激活。

RZC:0點檢查。0=Off;1=On。

RHV[6:0]:右耳機(jī)通道控制音量衰減(1111001=0dB默認(rèn))。

最大1111111=+6dB;最小0110000=-73dB(靜音)。表8-6模擬音頻通道控制

STA[1:0]:側(cè)音衰減。00

=

-

6dB;01

=

-

9dB;10

=

-

12dB;11

=

-

15dB。

STE:側(cè)音激活。0=禁止;1=激活。

DAC:DAC選擇。0=DAC關(guān)閉;1=DAC選擇。

BYP:旁路。0=禁止;1=激活。

INSEL:模擬輸入選擇。0=線路;1

=麥克風(fēng)。

MICM:麥克風(fēng)衰減。0=普通;1=衰減。

MICB:麥克風(fēng)增益。0

=

0dB;1=

20dB。

DACM:DAC軟件衰減。0=禁止;1=激活。

DEEMP[1:0]:消除高頻成分控制。00

=

禁止;01

=

32kHz;10=44.1kHz;11

=48kHz。

ADCHP:ADC濾波器。0=禁止;1=激活。

X:保留表8-7數(shù)字音頻通道控制

表8-8啟動控制

OFF:設(shè)備電源。0

=On;1=OFF。

CLK:時鐘。0

=On;1

=

OFF。

OSC:振蕩器。0=On;1

=

OFF。

OUT:輸出。0=On;1

=

OFF。

DAC:DAC。0=On;1

=

OFF。

ADC:ADC。0=On;1

=

OFF。

MIC:麥克風(fēng)輸入。0

=On;1=OFF。

LINE:Line輸入。0

=On;1

=

OFF。

表8-9數(shù)字音頻格式

MS:主從選擇。0=從模式;1=主模式。

LRSWAP:DAC左/右通道交換。0=禁止;1=激活。

LRP:DAC左/右通道設(shè)定。0=右通道在LRCIN高電平;1=

右通道在LRCIN低電平。

IWL[1:0]:輸入長度。00=16bit;01=20bit;10=24bit;11=32bit。

FOR[1:0]:數(shù)據(jù)初始化。11=DSP初始化,幀同步來自于兩個字;10=I2S初始化;

01=MSB優(yōu)先左聲道排列;00=MSB優(yōu)先右聲道排列。

X:保留

表8-10樣本速度控制

CLKIN:時鐘輸入分頻。0=MCLK;1=MCLK/2。

CLKOUT:時鐘輸出分頻。0=MCLK;1=MCLK/2。

SR[3:0]:采樣速率控制。

BOSR:基礎(chǔ)速度比率。

USB模式:0=250;1=272。

Normal模式:0=256;1=384。

USB/Normal:時鐘模式選擇。0=Normal;1=USB。

X:保留

ACT:激活控制。0=停止;1=激活。

X:保留表8-11數(shù)字界面激活

RES:寫000000000到這個寄存器引發(fā)初始化。

關(guān)于TLV320AIC23的更詳細(xì)信息,請參考相關(guān)數(shù)據(jù)手冊。表8-12初始化寄存器

8.3.1I2C總線特點與工作原理

集成電路芯片間總線I2C(Inter-IntegratedCircuit)是Philips公司提出的一種允許芯片間在簡單的二線總線上工作的串行接口和軟件協(xié)議,主要用于智能集成電路和器件間的數(shù)據(jù)通信。8.3I2C模塊

I2C總線最主要的優(yōu)點是其簡單性和有效性。由于接口直接在組件之上,因此I2C總線占用的空間非常小,減少了電路板的空間和芯片管腳的數(shù)量,降低了互聯(lián)成本??偩€的長度可高達(dá)25英尺,并且能夠以10kb/s的最大傳輸速率支持40個組件。I2C總線的另一個優(yōu)點是,它支持多主控,其中任何能夠進(jìn)行發(fā)送和接收的設(shè)備都可以成為主總線。一個主控能夠控制信號的傳輸和時鐘頻率。當(dāng)然,在任何時間點上只能有一個主控。

I2C總線是由數(shù)據(jù)線SDA和時鐘SCL構(gòu)成的串行總線,可發(fā)送和接收數(shù)據(jù)。在CPU與被控IC之間、IC與IC之間進(jìn)行雙向傳送時,最高傳送速率為100kb/s。各種被控制電路均并聯(lián)在這條總線上,但就像電話機(jī)一樣只有撥通各自的號碼才能工作,所以每個電路和模塊都有唯一的地址。在信息的傳輸過程中,I2C總線上并接的每一模塊電路既是主控器(或被控器),又是發(fā)送器(或接收器),這取決于它所要完成的功能。CPU發(fā)出的控制信號分為地址碼和控制量兩部分,地址碼用來選址,即接通需要控制的電路,確定控制的種類;控制量決定該調(diào)整的類別(如對比度、亮度等)及需要調(diào)整的量。這樣,各控制電路雖然掛在同一條總線上,卻彼此獨立,互不相關(guān)。

I2C總線在傳送數(shù)據(jù)過程中共有三種類型信號,它們分別是:開始信號、結(jié)束信號和應(yīng)答信號。

開始信號:SCL為高電平時,SDA由高電平向低電平跳變,開始傳送數(shù)據(jù)。

結(jié)束信號:SCL為低電平時,SDA由低電平向高電平跳變,結(jié)束傳送數(shù)據(jù)。

應(yīng)答信號:接收數(shù)據(jù)的IC在接收到8bit數(shù)據(jù)后,向發(fā)送數(shù)據(jù)的IC發(fā)出特定的低電平脈沖,表示已收到數(shù)據(jù)。CPU向受控單元發(fā)出一個信號后,等待受控單元發(fā)出一個應(yīng)答信號,CPU接收到應(yīng)答信號后,根據(jù)實際情況做出是否繼續(xù)傳遞信號的判斷,若未收到應(yīng)答信號,則判斷為受控單元出現(xiàn)故障。

I2C規(guī)程運用主/從雙向通信。器件發(fā)送數(shù)據(jù)到總線上,則定義為發(fā)送器,器件接收數(shù)據(jù)則定義為接收器。主器件和從器件都可以工作于接收和發(fā)送狀態(tài)。總線必須由主器件(通常為微控制器)控制,主器件產(chǎn)生串行時鐘(SCL)控制總線的傳輸方向,并產(chǎn)生起始和停止條件。SDA線上的數(shù)據(jù)狀態(tài)僅在SCL為低電平的期間才能改變,SCL為高電平的期間,SDA狀態(tài)的改變被用來表示起始和停止條件。8.3.2TMS320VC5509DSP的I2C模塊功能

TMS320VC5509DSP的內(nèi)部集成了I2C模塊。其為DSP提供與內(nèi)部IC總線(I2C總線)V2.1兼容的接口。和這個2線的串口總線連接的外部設(shè)備,可以通過該I2C模塊傳輸

1~8bit的數(shù)據(jù)(I2C模塊傳輸?shù)臄?shù)據(jù)單元可以小于8bit。但為了方便起見,一般將數(shù)據(jù)的單元稱為一個數(shù)據(jù)byte)。

I2C模塊支持所有與I2C兼容的主從設(shè)備。圖8-4所示是多個I2C模塊雙向傳輸?shù)睦印?/p>

圖8-4多個I2C模塊雙向傳輸每一個連接到I2C總線上的設(shè)備,包括C55XDSP,都用一個惟一的地址。每個設(shè)備是發(fā)送器還是接收器取決于設(shè)備的功能。連接到I2C總線上的設(shè)備,在傳輸數(shù)據(jù)時,也可以看作是主設(shè)備或從設(shè)備。主設(shè)備在總線上初始化數(shù)據(jù)傳輸,且產(chǎn)生傳輸所需要的時鐘信號。在傳輸過程中,主設(shè)備所尋址的設(shè)備就是從設(shè)備。I2C模塊支持多個主設(shè)備模式,連接到同一個I2C總線上的多個設(shè)備都可以控制該I2C總線。

用于數(shù)據(jù)通信時I2C模塊有一個串行數(shù)據(jù)引腳(SDA)和一個串行時鐘引腳(SCL)。這兩個引腳在C55X及連接到I2C總線的其他設(shè)備之間傳遞信息。這兩個引腳都是雙向的。它們都需要用上拉電阻連接到高電平。當(dāng)總線空閑時,這兩個引腳都為高。這兩個引腳的驅(qū)動器配置為漏極開路來實現(xiàn)線與功能。

I2C模塊包括以下基本模塊:

●一個串行接口:一個數(shù)據(jù)引腳(SDA)和一個時鐘引腳(SCL)。

●數(shù)據(jù)寄存器,暫時存放SDA引腳和CPU或DMA控制器之間傳輸?shù)臄?shù)據(jù)。

●控制和狀態(tài)寄存器。

●一個外設(shè)總線接口,使能CPU和DMA控制器,訪問I2C模塊寄存器。

●一個時鐘同步器,用來同步I2C的輸入時鐘(來自DSP時鐘發(fā)生器)和SCL引腳上的時鐘,還要同步不同頻率主設(shè)備的數(shù)據(jù)傳輸。

●一個預(yù)分頻器,用來對I2C模塊的輸入時鐘分頻。

●SDA和SCL引腳上都有一個噪聲濾波器。

●一個仲裁器,當(dāng)I2C模塊是主模塊時,仲裁該模塊與其他的主模塊。

●中斷產(chǎn)生邏輯,可向CPU發(fā)出中斷。

●DMA事件產(chǎn)生邏輯,可以使DMA控制器與I2C模塊的數(shù)據(jù)接收和發(fā)送同步。

圖8-5是I2C模塊框圖。I2CDXR、I2CDRR、I2CXSR、I2CRSR分別是用于發(fā)送和接收的4個寄存器。CPU或DMA控制器把要發(fā)送的數(shù)據(jù)寫到I2CDXR,從I2CDRR中讀接收到的數(shù)據(jù)。當(dāng)I2C配置成發(fā)送器,寫到I2CDXR中的數(shù)據(jù),就復(fù)制到I2CXSR,從SDA引腳一次l位串行移出。當(dāng)I2C配置成接收器,接收到的數(shù)據(jù)先移到I2CRSR,然后復(fù)制到I2CDRR。

圖8-5I2C模塊框圖8.3.3復(fù)位和關(guān)閉I2C模塊

可以通過以下兩種方式復(fù)位/關(guān)閉I2C模塊:

(1)將I2C模式寄存器(I2CMDR)中的I2C復(fù)位bit(IRS)置0。I2CSTR中的所有狀態(tài)bits都強(qiáng)制恢復(fù)到默認(rèn)值,I2C保持關(guān)閉狀態(tài)直到IRS變?yōu)?。SDA和SDL引腳處于高阻狀態(tài)。

(2)將RESET引腳拉低,使DSP復(fù)位。整個DSP保持復(fù)位態(tài),直到RESET引腳拉高。復(fù)位釋放后,所有的I2C寄存器都恢復(fù)到默認(rèn)值。將IRSbit強(qiáng)制為0,復(fù)位I2C模塊。I2C模塊將處于復(fù)位狀態(tài),直到寫1給IRS。

配置或重新配置I2C模塊時,IRS必須為0。使IRS為0可以節(jié)省功率和清除錯誤條件。8.3.4I2C模塊寄存器

表8-13列出了I2C模塊的寄存器。所有寄存器,除了接收和發(fā)送移位寄存器(I2CRSR和I2CXSR)之外,都可以通過I/O空間的16bit地址被CPU訪問。

表8-13I2C模塊寄存器下面對本章中使用到的寄存器加以介紹。

1.

I2C模式寄存器(I2CMDR)

I2CMDR是一個16bit的I/O空間映射寄存器,它包括I2C模塊的控制bits。其示意圖如圖8-6所示。I2CMDR寄存器的每一位的功能在表8-14里作了說明。

圖8-6I2C模式寄存器(I2CMDR)

表8-14I2C模式寄存器續(xù)表續(xù)表續(xù)表2.I2C預(yù)分頻寄存器(I2CPSC)

I2C預(yù)分頻寄存器I2CPSC是一個16bitI/O映射寄存器,用來對I2C的輸入時鐘分頻,獲得期望的模塊時鐘,如圖8-7和表8-15所示。圖8-7I2C預(yù)分頻寄存器(I2CPSC)

IPSC必須在I2C模塊復(fù)位(I2CMDR中IRS

=

0)時進(jìn)行初始化。

預(yù)分頻的頻率只有在IRS變?yōu)?時才有效。IRS

=

1時,改變IPSC的值無效。表8-15I2C預(yù)分頻寄存器(I2CPSC)各域的說明圖8-8時鐘分頻值(ICCL和ICCH)的作用

3.

I2C時鐘分頻寄存器(I2CCLKL和I2CCLKH)

當(dāng)I2C模塊是主設(shè)備時,需要對模塊時鐘進(jìn)行分頻,獲得SCL引腳上的主時鐘。如圖8-8所示,主時鐘的波形取決于兩個分頻值:

(1)

I2CCLKL的ICCL(如表8-16所示)。對于每個主時鐘周期,ICCL決定信號電平為低的持續(xù)時間。

(2)

I2CCLKH的ICCH(如表8-17所示)。對于每個主時鐘周期,ICCH決定信號電平為高的持續(xù)時間。

表8-16I2C時鐘低電平分頻寄存器(I2CCLKL)的說明表8-17I2C時鐘高電平分頻寄存器(I2CCLKH)的說明主時鐘周期(Tmst)是模塊時鐘周期(Tmod)的整數(shù)倍:

(8-1)

其中,d取決于分頻值IPSC,如表8-18所示。

表8-18延時d與IPSC之間的關(guān)系

4.I2C自身地址寄存器(I2COAR)

I2C自身地址寄存器(I2COAR)是一個16bit映射到DSP的I/O空間的寄存器。圖8-9是I2COAR的示意圖,表8-19對其作了說明。I2C模塊用這個寄存器來指定自身的從設(shè)備地址,用來與I2C總線上的其他從設(shè)備區(qū)分開。如果選擇7bit尋址模式(I2CMDR中XA

=

0),則只用到I2CSAR中的bit6~0,對bit9~7寫0。圖8-9I2C自身地址寄存器(I2COAR)

表8-19I2C自身地址寄存器(I2COAR)的說明

5.

I2C數(shù)據(jù)接收寄存器(I2CDRR)

I2CDRR(如圖8-10和表8-20所示)是一個16bitI/O映射的寄存器,由CPU或DMA控制器用來讀接收的數(shù)據(jù)。I2C模塊可以接收1到8bit的數(shù)據(jù)byte,這由I2CMDR中的BCbit決定。每次從SDA引腳上移進(jìn)一個bit到接收移位寄存器(I2CRSR)。接收完一個數(shù)據(jù)byte,I2C模塊就將12CRSR中的數(shù)據(jù)復(fù)制到I2CDRR中。

如果I2CDRR中的數(shù)據(jù)byte少于8bit,則只有一些bit是有效的,其他bit都沒有定義。

例如,如果BC

=

011(數(shù)據(jù)長度為3

bit),接收的數(shù)據(jù)存放在I2CDRR(2~0)中,I2CDRR(7~3)的值就沒有定義。

CPU和DMA控制器不能訪問I2CRSR。

圖8-10I2C數(shù)據(jù)接收寄存器(I2CDRR)

表8-20I2C數(shù)據(jù)接收寄存器(I2CDRR)的說明

6.I2C數(shù)據(jù)發(fā)送寄存器(I2CDXR)

CPU或DMA控制器將要發(fā)送的數(shù)據(jù)寫入I2CDXR(如圖8-11和表8-21所示)。這個16bit的I/O映射寄存器接收1bit到8bit的數(shù)據(jù)。在往I2CDXR寫之前,通過正確設(shè)置I2CMDR中的BCbit,來確定一個數(shù)據(jù)byte里有多少bits。寫一個少于8bit的數(shù)據(jù)byte時,I2CDXR中的值要右對齊。

一個byte寫入I2CDXR后,I2C模塊將這個數(shù)據(jù)byte復(fù)制發(fā)送移位寄存器(I2CXSR),然后每次一個bit從SDA引腳移出。

CPU和DMA控制器不能訪問I2CXSR。

圖8-11I2C數(shù)據(jù)發(fā)送寄存器(I2CDXR)

表8-21I2C數(shù)據(jù)發(fā)送寄存器(I2CDXR)的說明

一、任務(wù)目標(biāo)

(1)了解語音codec芯片TLV320AIC23的設(shè)計和程序控制原理。

(2)了解數(shù)字回聲產(chǎn)生原理、編程及其參數(shù)選擇、控制。

(3)熟悉VC5509DSP擴(kuò)展存儲器的編程使用方法。任務(wù)19語音采集和放送

二、所需設(shè)備

計算機(jī),ICETEK-VC5509-EDU實驗箱(或ICETEK仿真器,ICETEK-VC5509-A系統(tǒng)板,相關(guān)連線及電源),耳機(jī),麥克風(fēng)。

三、相關(guān)原理

1.TLV320AIC23芯片性能指標(biāo)及控制方法

(1)初始化配置:DSP通過I2C總線將配置命令發(fā)送到AIC23,配置完成后,AIC23開始工作。

(2)語音信號的輸入:AIC23通過其中的A/D轉(zhuǎn)換采集輸入的語音信號,每采集完一個信號后,將數(shù)據(jù)發(fā)送到DSP的McBSP接口上,DSP可以讀取到語音數(shù)據(jù),每個數(shù)據(jù)為16位無符號整數(shù),左右通道各有一個數(shù)值。

(3)語音信號的輸出:DSP可以將語音數(shù)據(jù)通過McBSP接口發(fā)送給AIC23,AIC23的D/A器件將他們變成模擬信號輸出。

2.?dāng)?shù)字回聲原理

在實際生活中,當(dāng)聲源遇到物體時,會發(fā)生反射,反射的聲波和聲源聲波一起傳輸,聽者會發(fā)現(xiàn)反射聲波部分比聲源聲波慢一些,類似人們面對山體高聲呼喊后可以在過一會兒聽到回聲的現(xiàn)象。聲音遇到較遠(yuǎn)的物體產(chǎn)生的反射會比遇到較近的物體的反射波晚些到達(dá)聲源位置,所以回聲和原聲的延遲隨反射物體的距離大小改變。同時,反射聲音的物體對聲波的反射能力,決定了聽到的回聲的強(qiáng)弱和質(zhì)量。另外,生活中的回聲的成分比較復(fù)雜,有反射、漫反射、折射,還有回聲的多次反、折射效果。當(dāng)已知一個數(shù)字音源后,可以利用計算機(jī)的處理能力,用數(shù)字的方式通過計算模擬回聲效應(yīng)。簡單地講,可以在原聲音流中疊加延遲一段時間后的聲流,實現(xiàn)回聲效果。當(dāng)然通過復(fù)雜運算,可以計算各種效應(yīng)的混響效果。如此產(chǎn)生的回聲,我們稱之為數(shù)字回聲。

3.程序說明

該項目的程序流程圖如圖8-12所示。

圖8-12語音的采集與放送程序流程圖

4.程序清單

(1)項目源程序audio.c的流程圖如圖8-12左側(cè)所示。其程序的主要部分如下:

#include"5509.h"

#include"util.h"

voidwait(unsignedintcycles);

voidEnableAPLL();

voidmain()

{

SDRAM_init();

EnableAPLL();

PLL_Init(40);

AIC23_Init();

for(;;)

{

AIC23_Mixer();

}

}

(2)整個項目的流程如圖8-12右側(cè)所示。AIC23_Mixer函數(shù)位于aic23.c程序中,aic23.c程序如下所示:

#include"5509.h"

#include"util.h"

#include"extaddr.h"

#include"math.h"

//AIC23控制寄存器地址(注意:AIC23控制寄存器地址為7位,而寄存器的內(nèi)容為9位,因此用8位來表示其地址時,相當(dāng)于將其左移一位,具體寄存器內(nèi)容見8.2.2小節(jié))

#defineAIC23_LT_LINE_CTL 0x00//0

#defineAIC23_RT_LINE_CTL 0x02//1

#defineAIC23_LT_HP_CTL 0x04//2

#defineAIC23_RT_HP_CTL 0x06//3

#defineAIC23_ANALOG_AUDIO_CTL 0x08//4

#defineAIC23_DIGITAL_AUDIO_CTL 0x0A//5

#defineAIC23_POWER_DOWN_CTL 0x0C//6

#defineAIC23_DIGITAL_IF_FORMAT 0x0E//7

#defineAIC23_SAMPLE_RATE_CTL 0x10//8

#defineAIC23_DIG_IF_ACTIVATE 0x12//9

#defineAIC23_RESET_REG 0x1E//往該寄存器寫入0觸發(fā)AIC23復(fù)位

//AIC23控制寄存器設(shè)置

#definelt_ch_vol_ctrl 0x0017/*0*/

#definert_ch_vol_ctrl 0x0017/*1*/

#definelt_ch_headph_ctrl 0x0079/*2*/

#definert_ch_headph_ctrl 0x0079/*3*/

#definealog_au_path_ctrl 0x0000/*4*/

#definedigi_au_path_ctrl 0x0000/*5*/

#definepow_mgt_ctrl_ctrl 0x0002/*6*/

#definedigi_au_intf_ctrl 0x000D/*7*/

#defineau_FS_TIM_ctrl 0x0000/*8MCLK=12MHz,SampleRatesetting*/

#definedigi_intf1_ctrl 0x0001/*9*/

#definedigi_intf2_ctrl 0x00FF/*10*/

#defineDIGIF_FMT_MS 0x40

#defineDIGIF_FMT_LRSWAP 0x20

#defineDIGIF_FMT_LRP 0x10

#defineDIGIF_FMT_IWL 0x0c

#defineDIGIF_FMT_FOR 0x03

#defineDIGIF_FMT_IWL_16 0x00

#defineDIGIF_FMT_IWL_20 0x04

#defineDIGIF_FMT_IWL_24 0x08

#defineDIGIF_FMT_IWL_32 0xc0

#defineDIGIF_FMT_FOR_MSBRIGHT 0x00

#defineDIGIF_FMT_FOR_MSLEFT 0x01

#defineDIGIF_FMT_FOR_I2S 0x02

#defineDIGIF_FMT_FOR_DSP 0x03

#definePOWER_DEV 0x80

#definePOWER_CLK 0x40

#definePOWER_OSC 0x20

#definePOWER_OUT 0x10

#definePOWER_DAC 0x08

#definePOWER_ADC 0x04

#definePOWER_MIC 0x02

#definePOWER_LINE 0x01

#defineSRC_CLKOUT 0x80

#defineSRC_CLKIN 0x40

#defineSRC_SR 0x3c

#defineSRC_BOSR 0x02

#defineSRC_MO 0x01

#defineSRC_SR_44 0x20

#defineSRC_SR_32 0x18

#defineANAPCTL_STA 0xc0

#defineANAPCTL_STE 0x20

#defineANAPCTL_DAC 0x10

#defineANAPCTL_BYP 0x08

#defineANAPCTL_INSEL 0x04

#defineANAPCTL_MICM 0x02

#defineANAPCTL_MICB 0x01

#defineDIGPCTL_DACM 0x08

#defineDIGPCTL_DEEMP 0x06

#defineDIGPCTL_ADCHP 0x01

#defineDIGPCTL_DEEMP_DIS 0x00

#defineDIGPCTL_DEEMP_32 0x02

#defineDIGPCTL_DEEMP_44 0x04

#defineDIGPCRL_DEEMP_48 0x06

#defineDIGIFACT_ACT 0x01

#defineLT_HP_CTL_LZC 0x80

#defineRT_HP_CTL_RZC 0x80

voidAIC23_Write(unsignedshortregaddr,unsignedshortdata)

{

unsignedcharbuf[2];

buf[0]=regaddr;

buf[1]=data;

I2C_Write(I2C_AIC23,2,buf);//調(diào)用I2C_Write函數(shù),該函數(shù)位于i2c.c程序中,具體應(yīng)用

//詳見TI應(yīng)用手冊《ProgrammingtheTMS320VC5509I2CPeripheral》

}

voidMcBSP0_InitSlave()

{

PC55XX_MCSPpMcBSP0=(PC55XX_MCSP)C55XX_MSP0_ADDR;

//復(fù)位McBSP

Write(pMcBSP0->spcr1,0);

Write(pMcBSP0->spcr2,0);

//設(shè)置幀參數(shù)(32bit,發(fā)送幀與接收幀都為單段,發(fā)送接收數(shù)據(jù)無延時)

Write(pMcBSP0->xcr1,XWDLEN1_32);

Write(pMcBSP0->xcr2,XPHASE_SINGLE|XDATDLY_0);

Write(pMcBSP0->rcr1,RWDLEN1_32);

Write(pMcBSP0->rcr2,RPHASE_SINGLE|RDATDLY_0);

//發(fā)送幀同步信號高電平有效,CLKK上升沿發(fā)送數(shù)據(jù)

Write(pMcBSP0->pcr,PCR_CLKXP);

//Bringtransmitterandreceiveroutofreset

SetMask(pMcBSP0->spcr2,SPCR2_XRST);

SetMask(pMcBSP0->spcr1,SPCR1_RRST);

}

voidAIC23_Init()

{

I2C_Init();

//復(fù)位AIC23以及打開設(shè)備電源

AIC23_Write(AIC23_RESET_REG,0);

AIC23_Write(AIC23_POWER_DOWN_CTL,0);

AIC23_Write(AIC23_ANALOG_AUDIO_CTL,ANAPCTL_DAC|ANAPCTL_INSEL);

AIC23_Write(AIC23_DIGITAL_AUDIO_CTL,0);

//打開左右聲道輸入音量控制

AIC23_Write(AIC23_LT_LINE_CTL,0x000);

AIC23_Write(AIC23_RT_LINE_CTL,0x000);

//設(shè)置AIC23為主模式,44.1kHz立體聲,16bit采樣

AIC23_Write(AIC23_DIGITAL_IF_FORMAT,DIGIF_FMT_MS|DIGIF_FMT_IWL_16|DIGIF_FMT_FOR_DSP);

AIC23_Write(AIC23_SAMPLE_RATE_CTL,SRC_SR_44|SRC_BOSR|SRC_MO);

//打開話筒音量和數(shù)字接口

AIC23_Write(AIC23_LT_HP_CTL,0x07f);//0x79forspeakers

AIC23_Write(AIC23_RT_HP_CTL,0x07f);

AIC23_Write(AIC23_DIG_IF_ACTIVATE,DIGIFACT_ACT);

//設(shè)置McBSP0為從傳輸模式

McBSP0_InitSlave();

}

voidAIC23_Disable()

{

PC55XX_MCSPpMcBSP0=(PC55XX_MCSP)C55XX_MSP0_ADDR;

I2C_Disable();

//復(fù)位McBSP

Write(pMcBSP0->spcr1,0);

Write(pMcBSP0->spcr2,0);

}

#defineAUDIOBUFFER0x200000

FARPTRlpAudio;

unsignedintbEcho=0,uDelay=64,uEffect=256;

voidAIC23_Mixer()

{

PC55XX_MCSPpMcBSP0=(PC55XX_MCSP)C55XX_MSP0_ADDR;

intnWork,nWork1;

FARPTRlpWork,lpWork1;

longintluWork,luWork1;

floatfWork,fWork1;

lpWork=lpAudio=AUDIOBUFFER;luWork=0;

for(luWork1=0;luWork1<0x48000;luWork1++)

far_poke(lpWork++,0);

lpWork=lpAudio;

while(1)

{

while(!ReadMask(pMcBSP0→spcr2,SPCR2_XRDY)); //等待McBSP0發(fā)送準(zhǔn)備

//好,數(shù)據(jù)傳輸完成

nWork=Read(pMcBSP0->ddr2); //讀取左右聲道的數(shù) 據(jù)

nWork=Read(pMcBSP0->ddr1); //因為耳機(jī)輸入左右 聲道相同,所以讀兩次即可

far_poke(lpWork++,nWork); //保存到緩沖區(qū)

if(bEcho) //需要制作數(shù)字回聲 否?

{

uEffect%=1024; //保證輸入在0~

1023之間

uDelay%=1024; //保證輸入在0~ 1023之間

fWork=uEffect/1024.0;

luWork1=100;

luWork1*=uDelay;

luWork1=luWork-luWork1;

if(luWork1<0) luWork1+=0x48000;

lpWork1=lpAudio;

lpWork1+=luWork1; //根據(jù)uDelay參數(shù)計算

nWork1=far_peek(lpWork1); //取得保存的音頻數(shù) 據(jù)

fWork1=nWork1;

fWork1/=512.0;

fWork1*=uEffect;

fWork1+=nWork;

fWork+=1.0;

fWork1/=fWork;

nWork=fWork1; //與當(dāng)前聲音混響

}

Write(pMcBSP0->dxr2,nWork); //送數(shù)據(jù)到McBSP0

Write(pMcBSP0->dxr1,nWork); //聲音輸出由AIC23 完成

luWork++; //循環(huán)使用緩沖區(qū)

if(luWork>=0x48000)

{

lpWork=lpAudio;luWork=0;

}

}

}四、任務(wù)步驟

(1)準(zhǔn)備。

①連接實驗設(shè)備。

②準(zhǔn)備音頻輸入、輸出設(shè)備。

a.將耳機(jī)上麥克風(fēng)插頭插到ICETEK-VC5509-A板的J5插座,即“麥克風(fēng)輸入”。

b.將耳機(jī)上音頻輸入插頭插到ICETEK-VC5509-A板的J7插座,即“耳機(jī)輸出”。

c.調(diào)節(jié)耳機(jī)上音量旋鈕到適中位置。

③設(shè)置CCS2.21在硬件仿真(Emulator)方式下運行。

④啟動CCS2.21。選擇菜單Debug→ResetCPU。

(2)打開工程文件。

(3)編譯、下載程序。選擇菜單Debug→GoMain,使程序運行到main函數(shù)入口位置。

(4)設(shè)置觀察窗口。打開源程序aic23.c,將變量bEcho、uDelay和uEffect加入觀察窗口。

(5)運行程序觀察結(jié)果。

①按“F5”鍵運行,注意觀察窗口中的bEcho

=

0,表示數(shù)字回聲功能沒有激活。

②這時從耳機(jī)中能聽到麥克風(fēng)中的輸入語音放送。

③將觀察到窗口中bEcho的取值改成非0值。

④這時可從耳機(jī)中聽到帶數(shù)字回聲道語音放送。

⑤試著分別調(diào)整uDelay和uEffect的取值,使他們保持在0~1023范圍內(nèi),同時聽聽耳機(jī)中的輸出有何變化。

(6)退出CCS。

五、結(jié)果

聲音放送可以加入數(shù)字回聲,數(shù)字回聲的強(qiáng)弱和與原聲的延遲均可在程序中設(shè)定和調(diào)整。

六、問題與思考

修改程序,實現(xiàn)第二重回聲。例如:原聲音直接放送表示為“A------”,而帶數(shù)字回聲的發(fā)送為“A—a----”,那么帶第二重回聲的為“A—a—a---”。第二重回聲的音效要比第一重的弱。(提示:可以修改AIC23_Mixer函數(shù)中的相關(guān)部分。)

一、任務(wù)目標(biāo)

(1)熟悉ICETEK-VC5509-A板上語音codec芯片TLV320AIC23的設(shè)計和程序控制原理。

(2)了解語音編碼G

.711的特點、工作原理及其編程。

(3)了解PCM編碼過程及應(yīng)用,學(xué)習(xí)A律壓縮解壓縮方法的運算過程和程序編制實現(xiàn)。

(4)通過實驗體會語音編解碼過程及應(yīng)用。任務(wù)20實現(xiàn)語音信號編碼解碼(G?.711)

二、所需設(shè)備

計算機(jī),ICETEK-VC5509-EDU實驗箱(或ICETEK仿真器、ICETEK-VC5509-A系統(tǒng)板、相關(guān)連線及電源),耳機(jī),麥克風(fēng)。三、相關(guān)原理

1.TLV320AIC23芯片性能指標(biāo)及控制方法同任務(wù)19。

2.G?.711語音編碼標(biāo)準(zhǔn)

G

.711是國際電報電話咨詢委員會(CCITT)和國際標(biāo)準(zhǔn)化組織(ISO)提出的一系列有關(guān)音頻編碼算法和國際標(biāo)準(zhǔn)中的一種,應(yīng)用于電話語音傳輸。

G

.711是一種工作在8kHz采樣率模式下的脈沖編碼調(diào)制(PulseCodeModulation,PCM)方案,采樣值是8位的。按照恩奎斯特法則規(guī)定,采樣頻率必須高于被采信號最大頻率成分的2倍,G

.711可以編碼的頻率范圍是從0到4kHz。G

.711可以由兩種編碼方案:A律和μ律。G

.711采用8kHz、8位編碼值,占用帶寬為64kb/s。

3.PCM編碼

在電話網(wǎng)絡(luò)中規(guī)定,傳輸語音部分采用0.3~3.3kHz的語音信號。這一頻率范圍可覆蓋大部分語音信號。它可以保留語音頻率的前3個共振峰信息,而通過分析這3個共振峰的頻率特性和幅度特性可以識別不同人聲。而0~0.3Hz和3.3~4kHz未用,也被當(dāng)成保護(hù)波段??傊?,電話網(wǎng)絡(luò)具有4kHz的帶寬。由于需要通過這一帶寬傳送小幅變化的語音信號,因此需要借助于脈沖調(diào)制編碼(PCM),使模擬的語音信號在數(shù)字化時使用固定的精度,以最小的代價得到高質(zhì)量的語音信號。

PCM編碼需要經(jīng)過連續(xù)的三步:抽樣、量化和編碼。抽樣取決于信號的振幅隨時間的變化頻率,由于電話網(wǎng)絡(luò)的帶寬是4kHz的,因此為了精確地表現(xiàn)語音信號,必須用至少

8

kHz的抽樣率來取樣。量化的任務(wù)是由模擬轉(zhuǎn)換成數(shù)字的過程,但會引入量化誤差,應(yīng)盡量采用較小的量化間隔來減小這一誤差。編碼完成數(shù)字化的最后工作,在編碼的過程中,應(yīng)保存信息的有效位,而且算法應(yīng)利于快速計算,無論是編碼還是解碼。其中,壓擴(kuò)運算可以采用兩種標(biāo)準(zhǔn):A律和μ律。μ律是美洲和日本的公認(rèn)標(biāo)準(zhǔn),而A律是歐洲采用的標(biāo)準(zhǔn)。我國采用的是A律。

4.A律壓擴(kuò)標(biāo)準(zhǔn)

A律編碼的數(shù)據(jù)對象是12位精度的,它保證了壓縮后的數(shù)據(jù)有5位的精度并存儲到一個字節(jié)(8位)中。其方程如下:

(8-2)

其中,A為壓縮參數(shù)取值87.6,x為規(guī)格化的12位(二進(jìn)制)整數(shù)。圖8-13是用折線逼近的壓縮方程曲線示意圖。

圖8-13用折線逼近的壓縮方程曲線示意圖一般地,用程序進(jìn)行A律編碼解碼有兩種方法:一種是直接計算法,這種方法程序代碼較多,時間較慢,但可節(jié)省寶貴的內(nèi)存空間;另一種是查表法,這種方法程序量小、運算速度快,但占用較多的內(nèi)存以存儲查找表。

5.程序流程圖

語音信號編碼解碼(G

.711)程序流程圖如圖8-14所示。

圖8-14語音信號編碼解碼(G

.711)程序流程圖\

四、任務(wù)步驟

(1)準(zhǔn)備。

①連接實驗設(shè)備。

②準(zhǔn)備音頻輸入、輸出設(shè)備。

a.測試計算機(jī)語音輸出:用“我的電腦”幫助啟動播放語音文件。

b.選擇播放器參數(shù)為循環(huán)播放;將耳機(jī)上音頻輸入插頭插入計算機(jī)上耳機(jī)插座,仔細(xì)聽耳機(jī)中是否有輸出,左右聲道應(yīng)該輸出不同。

c.拔下耳機(jī)音頻輸入插頭,用實驗箱附帶的音頻連接線(兩端均為雙聲道音頻插頭)連接計算機(jī)耳機(jī)輸出插座和ICETEK-VC5509-A板上J5插座(麥克風(fēng)輸入)。

d.將耳機(jī)上音頻輸入插頭插到ICETEK-VC5509-A板的J7插座(耳機(jī)輸出)。

e.調(diào)節(jié)耳機(jī)上音量旋鈕到適中位置。

③設(shè)置CCS2.21在硬件仿真(Emulator)方式下運行。

④啟動CCS2.21。選擇菜單Debug→ResetCPU。

(2)打開工程文件。

(3)編譯、下載、運行程序。

(4)設(shè)置觀察窗口。

打開aic23.c,將變量bCodec加入觀察窗口。

(5)運行程序并聽效果。

①按“F5”鍵,可以聽到立體聲線路輸入的語音信號。這時的語音信號并未經(jīng)過壓擴(kuò)處理。

②修改觀察窗口中bCodec

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論