dsp課程設(shè)計---基于dsp實現(xiàn)音頻變聲與自動增益控制_第1頁
已閱讀1頁,還剩28頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  DSP課程設(shè)計</b></p><p>  實 驗 報 告</p><p>  基于DSP實現(xiàn)音頻變聲與自動增益控制</p><p><b>  指導(dǎo)教師簽字: </b></p><p><b>  日期:</b></p>&l

2、t;p><b>  目 錄</b></p><p>  一、設(shè)計任務(wù)書…………………………………………………………1</p><p>  二、設(shè)計內(nèi)容……………………………………………………………5</p><p>  三、設(shè)計方案、算法原理說明…………………………………………10</p><p>  四、程序設(shè)

3、計、調(diào)試與結(jié)果分析………………………………………15</p><p>  五、設(shè)計(安裝)與調(diào)試的體會………………………………………25</p><p>  六、參考文獻(xiàn)……………………………………………………………26</p><p><b>  課程設(shè)計成績評定</b></p><p><b>  設(shè)計任務(wù)

4、書</b></p><p>  利用McBSP、Codec、DMA傳輸和中斷調(diào)用,基于DSP實現(xiàn)以下任務(wù)</p><p>  1)通過欠采樣與過采樣來實現(xiàn)男女聲音之間的轉(zhuǎn)換</p><p>  2)音頻擴(kuò)放系統(tǒng)的自動增益控制(AGC)調(diào)整和大小聲音轉(zhuǎn)換。通過計算機(jī)的媒體播放器或者其他音頻播放器向?qū)嶒灠逅腿胍纛l信號,再由實驗板的音頻輸出端的耳機(jī)聽到清晰的音

5、樂或者語音,調(diào)整計算機(jī)音量的大小,在耳機(jī)聽到的聲音大小幾乎保持不變。</p><p><b>  設(shè)計內(nèi)容</b></p><p><b>  1)實驗?zāi)康?lt;/b></p><p>  建立信號處理系統(tǒng)的概念,學(xué)會使用DSP集成開發(fā)環(huán)境的使用和調(diào)試方法;</p><p>  掌握DSP課程設(shè)計的基本

6、方法,鞏固信號處理的基本理論知識;</p><p>  熟悉McBSP、DMA的功能和外部結(jié)構(gòu),掌握其寄存器的設(shè)置;</p><p>  掌握McBSP串口的數(shù)據(jù)發(fā)送和接收流程及DMA的中斷調(diào)用處理;</p><p>  掌握McBSP、DMA及其中斷應(yīng)用程序的編寫方法;</p><p>  實現(xiàn)變聲及自動增益控制(AGC)算法并實現(xiàn);<

7、;/p><p><b>  實驗原理</b></p><p><b>  概說</b></p><p>  TMS320VC5402是TI公司C54x系列定點DSP芯片中的新產(chǎn)品它集中了此系列早期產(chǎn)品的優(yōu)點,并提供了許多新的功能,開發(fā)和使用更加方便。C5402具有靈活的指令系統(tǒng)和操作性能,它可選擇助記符指令或算術(shù)指令作為編程指

8、令,同時支持匯編語言和C語言的單獨或混合編程。C5402采用改進(jìn)的Harvanl處理結(jié)構(gòu),指令流水線操作。計算和處理速度很高,系統(tǒng)單指令周期可達(dá)到10ns。在片內(nèi)提供16k的RAM用作程序和數(shù)據(jù)存儲,其最大可擴(kuò)展尋址空間為1M字節(jié)。C5402提供的McBSP串口和DAM數(shù)據(jù)傳送方式極大地方便它在通信領(lǐng)域的應(yīng)用和開發(fā)。C5402由于其高性能價格而成為當(dāng)前語言和靜態(tài)圖象處理和主流產(chǎn)品。本文主要介紹C5402和McBSP原理、配置以及DAM方

9、式下如何實現(xiàn)利用McBSP的通信及中斷調(diào)用來實現(xiàn)男女變聲及自動增益控制(AGC)。</p><p>  McBSP的主要功能</p><p>  高速、全雙工、多通道緩存串行口McBSP,每個串行口可以支持128通道,速度達(dá)100Mbit/s。McBSP是在標(biāo)準(zhǔn)串行接口的基礎(chǔ)之上對功能進(jìn)行擴(kuò)展,因此,具有與標(biāo)準(zhǔn)串行接口相同的基本功能:</p><p><b&g

10、t;  全雙工通信</b></p><p>  擁有兩級緩沖發(fā)送和三級緩沖接收數(shù)據(jù)寄存器,允許連續(xù)數(shù)據(jù)流傳輸</p><p>  為數(shù)據(jù)發(fā)送和接收提供獨立的幀同步脈沖和時鐘信號</p><p>  能夠與工業(yè)標(biāo)準(zhǔn)的解碼器、模擬接口芯片(AICs)和其他串行A/D和D/A設(shè)備直接連接</p><p>  支持外部移位時鐘或內(nèi)部頻率可

11、編程移位時鐘。</p><p>  McBSP的工作過程</p><p>  C5402的McBSP的接口信號包括:接收數(shù)據(jù)DR、發(fā)送數(shù)據(jù)DX、發(fā)送時鐘CLKX、接收時鐘CLKR、接收幀同步 FSR、發(fā)送幀同步FSX和外部輸入時鐘CLKS。其內(nèi)部結(jié)構(gòu)如圖1所示。其中內(nèi)部數(shù)據(jù)的發(fā)送和接收移位及緩存;時鐘和幀同步生在與控制模塊實現(xiàn)McBSP數(shù)據(jù)傳輸波特率設(shè)置以及同步傳輸時同步信號的產(chǎn)生的判斷;

12、C5402提供了多信道傳輸模式,通過多信道選擇模塊過行配置;CPU和DMA中斷模塊用于觸發(fā)CPU或DMA控制器的中斷響應(yīng)。</p><p>  McBSP通過引腳DX和DR實現(xiàn)DSP與外部設(shè)備的通信數(shù)據(jù)交換。其中DX完成數(shù)據(jù)的發(fā)送,DR用來接收數(shù)據(jù)。同時通過CLKX、CLKR、FSR和FSX實現(xiàn)時鐘和幀同步控制。DSP通過McBSP的16位控制寄存器接入內(nèi)部外設(shè)總線。</p><p>  

13、通過McBSP發(fā)送數(shù)據(jù)時,CPU或DAM控制器將被發(fā)送數(shù)據(jù)寫入數(shù)據(jù)發(fā)送寄存器DXR[1,2]。否則,則等待將XSR[1,2]中的數(shù)據(jù)全部移到DX腳發(fā)送之后才將DXR[1,2]中的值復(fù)制到XSR[1,2];然后再發(fā)送同步脈沖到來之后,XSR[1,2]的值從DX引腳移出。</p><p>  McBSP的接收緩沖寄存器包括三個:接收移位寄存器RSR[1,2]、接收緩沖寄存器[1,2]和接收數(shù)據(jù)寄存器DRR[1,2]。

14、到達(dá)DR接收腳的數(shù)據(jù)移存到RSR[1,2],一旦接收到一個字(可以是8、12、16、24或32位),如果此時RBR[1,2]空,內(nèi)容復(fù)制到RBR[1,2]。在CPU 或DMA控制器沒有對DRR[1,2]進(jìn)行操作時可以將RBR[1,2]中的數(shù)據(jù)復(fù)制到DRR[1,2],CPU或DMA控制器通過讀取DRR[1,2]中的數(shù)據(jù)來實現(xiàn)串口數(shù)據(jù)接入。</p><p>  McBSP的內(nèi)部結(jié)構(gòu)</p><p&

15、gt;  McBSP寄存器的訪問</p><p>  McBSP通過一系列存儲器映射控制寄存器來進(jìn)行配置和操作。它采用子地址尋址方案。每組多通道緩存串行口有23個寄存器與之相關(guān),除RBR[1,2]、RSR[1,2]、XSR[1,2]之外,其中15個寄存器是可尋址寄存器。</p><p>  假如要對McBSP1的發(fā)送控制寄存器2(XCR2_1)進(jìn)行設(shè)置。首先,將子地址0x0005寫入子地址

16、寄存器,與此同時,存儲單元0x0049就映射為發(fā)送控制寄存器2(XCR2_1)。然后,對存儲單元0x0049的讀寫操作,就相當(dāng)于對發(fā)送控制寄存器2(XCR2_1)進(jìn)行操作。</p><p>  McBSP串口的數(shù)據(jù)發(fā)送與接收流程</p><p>  McBSP串口的復(fù)位</p><p><b>  串口初始化</b></p>&l

17、t;p>  等待兩個時鐘周期,串口的接收與發(fā)送被激活。McBSP準(zhǔn)備好狀態(tài)</p><p>  RRDY和XRDY說明McBSP串口接收和發(fā)送是否準(zhǔn)備好,串口讀DDR[1,2] 和DXR[1,2]將會影響RRDY和XRDY。</p><p>  接收準(zhǔn)備好(RRDY、REVT、RINT): 串口復(fù)位時,RRDY清為0,當(dāng)RBR[1,2] 內(nèi)容復(fù)制到DDR[1,2]時,R

18、RDY有效。該數(shù)據(jù)可以被CPU或DMA讀,一旦CPU或DMA讀過數(shù)據(jù),RRDY又清為0。RRDY直接驅(qū)動McBSP接收事件給DMA(REVT)。同時,如果SPCR1中的RINTM=00,RRDY將驅(qū)動McBSP接收中斷給CPU。</p><p>  發(fā)送準(zhǔn)備好(XRDY、XEVT、XINT):XRDY=1,說明DXR[1,2]的數(shù)據(jù)已經(jīng)復(fù)制到XSR[1,2]中,DXR[1,2]可以裝入新的數(shù)據(jù)。串口復(fù)位開放時,X

19、RDY從0變?yōu)?,說明DXR[1,2]可以裝入新的數(shù)據(jù)。一旦有新數(shù)據(jù)裝入,XRDY就清為0。XRDY直接驅(qū)動發(fā)送同步事件到DMA。同時,如果SPCR2中XINTM=00,XRDY還直接驅(qū)動發(fā)送中斷(XINT)給CPU。 </p><p><b>  串口與CPU的中斷</b></p><p>  (R/X)INTM=00:每送一個字,</p><p

20、> ?。≧/X)RDY響應(yīng)一次,且響應(yīng)串</p><p>  口中斷一次,同時產(chǎn)生DMA事件。</p><p> ?。≧/X)INTM=01:在多通道模式中,一個楨內(nèi)出現(xiàn)16通道的模塊(PARTIITION)時,邊界就會產(chǎn)生中斷,這時CPU可以檢測到那些塊。</p><p>  (R/X)INTM=10:檢測到楨同步脈沖,產(chǎn)生(R/X)INT。</p&g

21、t;<p>  (R/X)INTM=11:當(dāng)出現(xiàn)楨同步錯誤時,產(chǎn)生中斷。</p><p><b>  DMA及中斷的控制</b></p><p>  (1)輸入和輸出的DMA的2、3通道初始化及DMA中斷復(fù)用</p><p>  DMA控制器可以在不影響CPU的情況下完成數(shù)據(jù)的傳輸,其數(shù)據(jù)的源和目的可以是片內(nèi)存儲器、片上外設(shè)和片外

22、設(shè)備。</p><p>  DMA中斷是與其它某些外設(shè)復(fù)用中斷屏蔽或標(biāo)志位。通過INTOSEL字段可以設(shè)置不同的復(fù)用配置。 </p><p>  C5402有6個可獨立編程的DMA通道,每個DMA通道受各自的5個16位控制寄存器:源地址寄存器DMSRC、目的地址寄存器DMDST、單元計數(shù)寄存器DMCTR、同步事件和幀計數(shù)寄存器DMSFC、傳輸模式控制寄存器DMMCR。</p>

23、<p>  設(shè)置DMA通道2與McBSP1接收事件同步來讀取A/D轉(zhuǎn)換的數(shù)據(jù)。設(shè)置DMA通道3與McBSP1的發(fā)送事件同步來發(fā)送FIR濾波之后的數(shù)據(jù)到D/A轉(zhuǎn)換器。 </p><p>  選擇McBSP1通道的接收寄存器DRR11 作為DMA2傳送數(shù)據(jù)的源地址,并選擇源地址工作在訪問后不調(diào)整方式,設(shè)置三個數(shù)據(jù)存儲緩沖區(qū)buffer、buffer+100h、buffer+200h作為DMA2的目的首地址

24、。選擇McBSP1通道的發(fā)送寄存器DXR11 作為DMA3傳送數(shù)據(jù)的目的地址,并選擇目的地址工作在訪問后不調(diào)整方式,設(shè)置兩個數(shù)據(jù)存儲緩沖區(qū)buffer+300h、buffer+400h作為DMA3的源首地址。</p><p>  通過設(shè)置DMPREC寄存器的INTOSEL域為01b來配置5402 DMA的中斷,DMA2的中斷號為10,DMA3的中斷號為11。</p><p>  DMA通道

25、2的初始化編程:</p><p>  復(fù)位所有的DMA通道</p><p><b>  設(shè)置DMA通道參數(shù)</b></p><p><b>  每幀傳輸256個字</b></p><p><b>  DMA通道2初始化</b></p><p>  dma

26、_init(DMA_CH2, dmsefc, dmmcr, dmctr, SPACE_DATA, src_addr, SPACE_DATA, dst_addr);</p><p>  DMA通道2每次完整的DMA傳輸包括3幀</p><p>  設(shè)置DMA通道2的全局初始化寄存器</p><p>  設(shè)置DMA通道2的全局優(yōu)先級和使能控制寄存器</p>

27、<p>  調(diào)用全局寄存器初始化函數(shù)</p><p><b>  使能DMA通道2</b></p><p>  使能DMA通道2中斷</p><p><b>  總中斷使能</b></p><p>  等待DMA通道2中斷</p><p> ?。?)中斷及中斷向量

28、表</p><p>  在54系列的DSP中,不同型號DSP的IMR和IFR寄存器的定義有所不同。其中,TINT0表示定時器0的中斷位,TINT1表示定時器1的中斷位。另外,與中斷相關(guān)的還有狀態(tài)寄存器ST1中的INTM位。</p><p>  INTM位是總中斷屏蔽位,INTM=0就開放全部可屏蔽中斷。某一個中斷是否開放還取決于IMR寄存器的設(shè)置。</p><p>

29、  中斷向量表是DSP中斷程序的重要組成部分,當(dāng)有中斷發(fā)生并且處于允許狀態(tài)時,程序指針跳轉(zhuǎn)到中斷向量表中對應(yīng)的中斷地址,然后再跳轉(zhuǎn)到相應(yīng)的中斷服務(wù)程序。</p><p>  5402 DSP共有30個中斷向量,每個向量占4個字的位置。另外還有兩個保留中斷位置,所以中斷向量表的大小為128個字。</p><p>  通常中斷向量表存放的是一條跳轉(zhuǎn)指令,指向?qū)嶋H的中斷服務(wù)程序。其余的空位用NO

30、P填充;未使用的向量直接用RETE中斷返回指令返回,這是為了防止意外進(jìn)入未用中斷,其余的空位也用NOP填充。</p><p>  向量表放在匯編語言源文件vectors.asm中。</p><p>  ***********************************************************************</p><p>  *

31、 (C) Copyright Texas Instruments, Inc. 2000 *</p><p>  ***********************************************************************</p><p>  *

32、 *</p><p>  * MODULE NAME: C5402VEC.ASM *</p><p>  *

33、*</p><p>  * AUTHOR: *</p><p>  * *</p><p>  * DESCRIP

34、TION: TMS320VC5402 Interrupt Vector initialization table *</p><p>  * *</p><p>  * DATE: 00/00

35、 *</p><p>  * *</p><p>  ***********************************************************************<

36、;/p><p>  .title "5402 DSK Interrupt Vector Table Initialization"</p><p>  .ref _c_int00, _DMAC2ISR</p><p>  .sect ".vecs"</p><p>  RESET:

37、 </p><p>  BD _c_int00 ; init cpu regs and branch to _c_int00</p><p><b>  NOP</b></p><p><b>  NOP </b></p><p>  

38、NMI: BD NMI ; ~NMI</p><p><b>  NOP</b></p><p><b>  NOP</b></p><p>  **********************************************************************<

39、;/p><p>  * S/W Interrupts</p><p>  **********************************************************************</p><p>  SINT17 BD SINT17</p><p><b>  NOP</b>&

40、lt;/p><p><b>  NOP</b></p><p>  SINT18 BD SINT18</p><p><b>  NOP</b></p><p><b>  NOP</b></p><p>  SINT19 BD SINT19

41、</p><p><b>  NOP</b></p><p><b>  NOP</b></p><p>  SINT20 BD SINT20</p><p><b>  NOP</b></p><p><b>  NOP</b&

42、gt;</p><p>  SINT21 BD SINT21</p><p><b>  NOP</b></p><p><b>  NOP</b></p><p>  SINT22 BD SINT22</p><p><b>  NOP</b

43、></p><p><b>  NOP</b></p><p>  SINT23 BD SINT23</p><p><b>  NOP</b></p><p><b>  NOP</b></p><p>  SINT24 BD S

44、INT24</p><p><b>  NOP</b></p><p><b>  NOP</b></p><p>  SINT25 BD SINT25</p><p><b>  NOP</b></p><p><b>  NOP&l

45、t;/b></p><p>  SINT26 BD SINT26</p><p><b>  NOP</b></p><p><b>  NOP</b></p><p>  SINT27 BD SINT27</p><p><b>  NOP&

46、lt;/b></p><p><b>  NOP</b></p><p>  SINT28 BD SINT28</p><p><b>  NOP</b></p><p><b>  NOP</b></p><p>  SINT29 BD

47、 SINT29</p><p><b>  NOP</b></p><p><b>  NOP</b></p><p>  SINT30 BD SINT30</p><p><b>  NOP</b></p><p><b>  

48、NOP</b></p><p>  **************************************************************************</p><p>  * Rest of the Interrupts</p><p>  **************************************

49、************************************</p><p>  INT0: BD INT0</p><p><b>  NOP</b></p><p><b>  NOP</b></p><p>  INT1: BD INT1</p>

50、<p><b>  NOP</b></p><p><b>  NOP</b></p><p>  INT2: BD INT2</p><p><b>  NOP</b></p><p><b>  NOP</b></p>

51、<p>  TINT0: BD TINT0</p><p><b>  NOP</b></p><p><b>  NOP</b></p><p>  BRINT0: BD BRINT0</p><p><b>  NOP</b></p

52、><p><b>  NOP</b></p><p>  BXINT0: BD BXINT0</p><p><b>  NOP</b></p><p><b>  NOP</b></p><p>  DMAC0: BD DMAC0</p

53、><p><b>  NOP</b></p><p><b>  NOP</b></p><p>  TINT1: BD TINT1</p><p><b>  NOP</b></p><p><b>  NOP</b><

54、/p><p>  INT3: BD INT3</p><p><b>  NOP</b></p><p><b>  NOP</b></p><p>  HPINT: BD HPINT</p><p><b>  NOP</b></p

55、><p><b>  NOP</b></p><p>  DMAC2: BD _DMAC2ISR ;BRINT1/DMAC2</p><p><b>  NOP</b></p><p><b>  NOP</b></p><p>  DMAC

56、3: BD DMAC3</p><p><b>  NOP</b></p><p><b>  NOP</b></p><p>  DMAC4: BD DMAC4</p><p><b>  NOP</b></p><p><b&g

57、t;  NOP</b></p><p>  DMAC5: BD DMAC5</p><p><b>  NOP</b></p><p><b>  NOP</b></p><p>  vectors.asm說明</p><p>  .sect “.vect

58、ors”;定義中斷向量段</p><p>  .ref _c_int00 ;定義C語言的初始化入口地址.ref _timer0_isr;定義定時器0中斷服務(wù)程序的入口地址.align 0x80;中斷向量表必須對齊128字的頁邊界</p><p>  vectors.asm(中斷向量表)并不是在每一個工程當(dāng)中都是必需的。當(dāng)工程中有中斷服務(wù)程序時,才需要vectors.as

59、m來定義相應(yīng)的中斷向量表,同時需要重新定義中斷向量指針I(yè)PTR和.CMD鏈接命令文件。</p><p>  中斷向量表入口地址的定位</p><p>  5402 DSP復(fù)位時中斷指針I(yè)PTR=1FFh,所以硬件復(fù)位的中斷向量的地址是FF80h。</p><p>  中斷向量地址是由IPTR和中斷號(左移兩位后)兩部分構(gòu)成的。中斷指針占9個比特,中斷號共30個,為5

60、個比特,左移兩位后為7個比特。</p><p>  中斷向量可以重新映射到程序存儲器除了保留空間之外的任何一個128字頁的起始位置。需要修改PMST寄存器中IPTR域的值。</p><p><b>  重新定位中斷向量表</b></p><p>  第一、在中斷初始化程序中重新設(shè)置中斷指針I(yè)PTR的值。</p><p>

61、  第二、在5402.CMD鏈接命令文件中設(shè)置.vectors中斷向量段的存儲位置。將中斷向量表重新安排在4000h開始的128個字的程序存儲器空間。</p><p>  編寫C54x C語言中斷程序需要做4件事情:(1)編寫中斷初始化程序;(2)編寫中斷服務(wù)程序;(3)設(shè)置中斷向量表;(4)修改.CMD鏈接命令文件。</p><p><b> ?。?)采樣點的處

62、理</b></p><p>  A/D轉(zhuǎn)換完的數(shù)據(jù)被串口1的數(shù)據(jù)接收寄存器收到后,啟動DMA2傳輸,將數(shù)據(jù)寫到指定的數(shù)據(jù)接收緩沖區(qū),通過DMA方式完成一次數(shù)據(jù)采集。當(dāng)DMA2采集完一幀256個點數(shù)據(jù)后產(chǎn)生一次DMA2中斷,通知CPU對其進(jìn)行FIR濾波處理。此時DMA2可以按照設(shè)定繼續(xù)采集數(shù)據(jù),實現(xiàn)了數(shù)據(jù)采集與CPU處理的并行操作。 </p><p>  在DMA2的中斷服務(wù)

63、程序中,DMA2接收緩沖區(qū)1中的數(shù)據(jù)經(jīng)過FIR濾波處理后,再完成采樣點由多變少或是由少變多的處理和語音恢復(fù)。放入DMA3的發(fā)送緩沖區(qū)1,同時啟動DMA3進(jìn)行FIR數(shù)據(jù)到串口1的數(shù)據(jù)發(fā)送寄存器的DMA傳輸。FIR輸入數(shù)據(jù)緩沖區(qū)分為3個,buffer、buffer+0x100、buffer+0x200;輸出數(shù)據(jù)緩沖區(qū)分為2個,buffer+0x300、buffer+0x400;每個緩沖區(qū)的大小為256個點。輸入輸出緩沖區(qū)采用了“乒乓”方式,

64、即輸入1=〉輸出1,輸入2=〉輸出2,輸入3=〉輸出1,輸入1=〉輸出2,……</p><p>  DMA方式下數(shù)據(jù)處理流程示意圖</p><p>  DMA方式下數(shù)據(jù)處理編程流程示意圖</p><p> ?。?)CODEC初始化設(shè)置</p><p>  初始化設(shè)置包括:A/D、 D/A轉(zhuǎn)換器的工作模式;A/D輸入增益;D/A輸出增益;抽樣頻

65、率(8000Hz, 16000Hz等)。</p><p>  初始化相關(guān)的函數(shù)包含在頭文件codec.h當(dāng)中。</p><p>  CODEC的初始化編程: </p><p>  #include <type.h>//定義數(shù)據(jù)類型</p><p>  #include <board.h>//DSK板的相關(guān)驅(qū)動函數(shù)定

66、義</p><p>  #include <codec.h>//CODEC編譯碼器相關(guān)的寄存器及其函數(shù)的定義</p><p>  #include <mcbsp54.h>//MCBSP多通道緩沖串口相關(guān)的寄存器及其函數(shù)</p><p>  /**********************變量聲明***********************

67、**/</p><p>  HANDLE hHandset;//定義句柄變量hHandset,用于對CODEC的訪問</p><p>  hHandset = codec_open(HANDSET_CODEC); // 獲取CODEC的句柄</p><p>  /***************** 設(shè)置A/D、D/A的工作參數(shù) *************

68、**/</p><p>  codec_adc_mode(hdevice, CODEC_ADC_15BIT);// 工作在15-bit模式</p><p>  codec_dac_mode(hdevice, CODEC_DAC_15BIT);</p><p>  codec_ain_gain(hdevice, CODEC_AIN_6dB); //輸入增益為6dB&

69、lt;/p><p>  codec_aout_gain(hdevice, CODEC_AOUT_MINUS_6dB); //輸出增益為-6dB</p><p>  codec_sample_rate(hdevice,SR_16000); // 抽樣率為16KHz</p><p>  基于查詢算法的FIR濾波器(調(diào)用系統(tǒng)firlab.h文件的卷積的算法)</p&g

70、t;<p>  主程序中調(diào)用TI提供的fir濾波器函數(shù)進(jìn)行輸入信號的數(shù)字濾波,從而達(dá)到濾除噪聲的目的。</p><p>  FDATOOL是MATLAB下功能強(qiáng)大的濾波器設(shè)計和分析工具。在FDATOOL 下根據(jù)你所需要的FIR濾波器的參數(shù)及特性選擇不同階數(shù)、通帶、阻帶等不用需要的濾波器系數(shù),導(dǎo)出系數(shù)后用類似如下方式寫入程序:</p><p>  /* Create speci

71、fic data section for coeffiecients */</p><p>  #pragma DATA_SECTION(coeffs,"coefficients");</p><p>  /* Low Pass Filter */ </p><p>  int coeffs[16]={-2,-30,127,372,-891,-

72、1925, 4228, 14507,14507,4228,-1925,-891,372,127, -30,-2};</p><p>  然后再定義延遲緩沖區(qū)及其用戶自定義數(shù)據(jù)段,還有定義fir函數(shù)的輸入及輸出緩沖區(qū)。最后用如下程序段進(jìn)行FIR數(shù)據(jù)處理:</p><p><b>  while (1)</b></p><p><b>

73、;  {</b></p><p>  /* Wait for sample from handset */</p><p>  while (!MCBSP_RRDY(HANDSET_CODEC)) {};</p><p>  /* Read sample from handset codec */</p><p>  inp_bu

74、ffer[0] = *(volatile u16*)DRR1_ADDR(HANDSET_CODEC);</p><p>  /*數(shù)據(jù)處理開始*/</p><p><b>  //fir計算</b></p><p>  fir(inp_ptr,coeffs,out_ptr,&delayptr,16,1);</p><p

75、>  data=out_buffer[0];</p><p>  /*數(shù)據(jù)處理結(jié)束*/</p><p>  /* Write sample back to handset codec */</p><p>  *(volatile u16*)DXR1_ADDR(HANDSET_CODEC) =data ;</p><p><b&g

76、t;  }</b></p><p>  調(diào)用GEL函數(shù),實現(xiàn)調(diào)試窗口的變聲變聲增益控制</p><p>  使用slider關(guān)鍵字向GEL添加GEL函數(shù)。當(dāng)從GEL菜單中選擇GEL函數(shù)后,就會出現(xiàn)一個滑動條來控制箱GEL函數(shù)傳遞的參數(shù)值。每移動一次滑動條的位置,就會使用滑動條對應(yīng)的新參數(shù)值調(diào)用一次GEL函數(shù)。</p><p>  sliderGEL函數(shù)的

77、格式如下:</p><p>  Slider param_definition(minVal,maxVal,increment,pageIncrement,paramName)</p><p><b>  {</b></p><p>  Statements</p><p><b>  }</b>&

78、lt;/p><p>  其中,各參數(shù)含義如下</p><p>  param_definition:出現(xiàn)在滑動條對象中的參數(shù)說明</p><p>  minVal:當(dāng)滑動條的位置在最低點時傳遞給函數(shù)的整形常數(shù)值</p><p>  maxVal:當(dāng)滑動條的位置在最低點時傳遞給函數(shù)的整形常數(shù)值</p><p>  Incre

79、ment:每次滑動條移動一個位置是增加的整形常數(shù)值</p><p>  pageIncrement:每次滑動條移動一頁位置是增加的整形常數(shù)值</p><p>  paramName:函數(shù)內(nèi)部使用的參數(shù)定義</p><p>  設(shè)計方案、算法原理說明</p><p><b>  a=8,b=6</b>&

80、lt;/p><p><b>  算法一、</b></p><p>  if(mode0==0) /*女變男-----------------------*/</p><p>  { for (i=0;i<q;i++)</p><p>  { m=b*i/a;</p><p>  *(

81、p_out+i)=*(p_inp+m);</p><p><b>  }</b></p><p>  for (i=q;i<256;i++)</p><p>  { *(p_out+i)=*(p_out+i-q);} </p><p>  //{ *(p_out+i)=0;}</p><p>

82、;<b>  }</b></p><p>  女聲變男聲,過采樣,采樣點會增加,造成恢復(fù)波形周期變大(因為采樣間隔是固定的),頻率變低。多余的采樣點被舍棄。</p><p>  else if(mode0==1)</p><p>  /*男變女-----------------------*/</p><p>  {

83、for (i=0;i<q;i++)</p><p>  { m=a*i/b;</p><p>  *(p_out+i)=*(p_inp+m);}</p><p>  for (i=q;i<256;i++)</p><p>  { *(p_out+i)=0;}</p><p>  //{ *(p_out+i

84、)=*(p_out+i-q);} </p><p><b>  }</b></p><p>  for(i=0;i<256;i++)</p><p><b>  {</b></p><p>  *(p_out+i)=amp*(*(p_out+i));</p><p>&

85、lt;b>  } </b></p><p>  男聲變女聲,欠采樣,由于采樣點的減少,造成恢復(fù)波形周期變?。ㄒ驗椴蓸娱g隔是固定的),頻率變高。缺少的點會由之前的采樣點重復(fù)來替補或插入0點。</p><p>  算法2、調(diào)用一個GEL函數(shù),實現(xiàn)元件窗口調(diào)節(jié)音量</p><p>  menuitem "Modulation Charact

86、eristics" /*在GEL菜單項添加一級菜單 “Modulation Characteristics”*/</p><p>  slider Amplitude(0,10,1,1,index) /*incr by 1,up to 10*/ //加二級菜單“Amplitude”</p>&l

87、t;p><b>  {</b></p><p>  amp = index; /*vary amplitude*/ //向目標(biāo)變量傳遞參數(shù)</p><p><b>  }</b></p><p><b>  算法3、</b></p><p>  自動

88、增益控制(AGC)采用峰值增益控制算法,流程圖如下圖所示:</p><p>  從串口讀入的音頻數(shù)據(jù)是16位的整型數(shù),一般來說,這些數(shù)都是比較小的,通過上面的AGC將輸入的音頻數(shù)據(jù)投影在[-15000,15000]區(qū)間內(nèi),從而使得不論輸入的數(shù)據(jù)點數(shù)值大小都會等比例的向這個空間映射。從上圖可以看出,增益系數(shù)是相對穩(wěn)定的,當(dāng)音量加大時,增益系數(shù)下降;當(dāng)音量減小時,新的峰值會減小并取代原來的峰值,從而使得峰值下降,使增

89、益系數(shù)上升。最后輸出的數(shù)據(jù)為輸入的數(shù)據(jù)乘以這個增益系數(shù)映射到區(qū)間[-15000,15000]內(nèi)。從而實現(xiàn)了音頻系統(tǒng)自動增益控制。</p><p>  int AGC_audio(int AGC_in)//自動增益子函數(shù) </p><p><b>  {</b></p><p>  int AGC_out;</p><p>

90、;  static int d=0;</p><p>  static float AGC_Coff=1.0; //增益系數(shù) </p><p>  static int maxArrIn=0; //現(xiàn)在增益峰值</p><p>  static int maxAGC_in=0; //上組增益峰值 </p><p>  if(ab

91、s(AGC_in)>maxArrIn)</p><p>  maxArrIn=abs(AGC_in);</p><p>  if(d>=4096)</p><p><b>  {</b></p><p>  d=0;maxAGC_in=maxArrIn;maxArrIn=0;</p><p

92、><b>  }</b></p><p><b>  d++;</b></p><p>  if(maxAGC_in>=1)</p><p>  AGC_Coff=15000.0/maxAGC_in;</p><p>  AGC_out=AGC_in*AGC_Coff; //計算輸出數(shù)

93、據(jù) </p><p>  //AGC_out=AGC_in*AGC_Coff*AGC_Coff; //計算輸出數(shù)據(jù) ,實現(xiàn)大小聲音轉(zhuǎn)換</p><p>  return AGC_out;</p><p><b>  }</b></p><p>  AGC子程序中將所輸入的變量進(jìn)行分段處理,每段為長度為4096的子序列,

94、在每個子序列過程中聲音的大小保持不變,每過一段為長度進(jìn)行一次增益系數(shù)的調(diào)整,因此在聲音大小突然改變的時候會造成1秒鐘左右的延時。</p><p>  程序中的maxArrIn變量用于保存每個序列中的最大幅值,maxAGC_in變量用于保存上個序列的最大幅值,在每個序列輸入的幅值都與上個序列的幅值進(jìn)行比較。</p><p>  程序設(shè)計、調(diào)試與結(jié)果分析</p><p>

95、;<b> ?。?)程序代碼:</b></p><p><b>  FIRlab.c</b></p><p>  /********************************************************************/</p><p>  /* FIRlab.C AIC,McBSP,D

96、MA initialization for FIR lab Filter */ </p><p>  /* Goal: This code performs the following functions: */</p><p>  /*- toggle the three LEDs on the DSK

97、 */</p><p>  /*- setup AIC (CODEC) parameters */</p><p>  /* - initialize DMA Channel (CH2-input) */</p><p>  /*- turn on interrupts

98、 */</p><p>  /*- run forever (waiting for DMA interrupts to transfer data) */</p><p>  /* */</p><p>  /* Author: Scott Bland Date: 03/20/2000

99、 */</p><p>  /********************************************************************/</p><p>  /********************************************************************/</p><p>  /* Inclu

100、de Files */</p><p>  /********************************************************************/</p><p>  #include <type.h></p><

101、p>  #include <board.h></p><p>  #include <codec.h></p><p>  #include <string.h></p><p>  #include <dma54xx.h></p><p>  #include <regs54xx.

102、h></p><p>  #include <intr.h></p><p>  #include "timer.h"</p><p>  #include "dsplib.h"</p><p>  #include <math.h></p><p>

103、;  #include "tms320.h"</p><p>  /********************************************************************/</p><p>  /* Function Prototypes *

104、/</p><p>  /********************************************************************/</p><p>  void delay(s16 period);</p><p>  extern void DMAC2ISR();</p><p>  /**********

105、**********************************************************/</p><p>  /* Global Variables */</p><p>  /******************************************

106、**************************/</p><p>  HANDLE hHandset;</p><p>  unsigned int dmsefc, dmmcr, dmctr, src_addr, dst_addr;</p><p>  unsigned int dmpre, dmsrcp, dmdstp, dmidx0, dmidx1, dm

107、fri0, dmfri1, dmgsa, dmgda, dmgcr, dmgfr;</p><p>  /* Create specific data section for buffer (symbol, section_name) */</p><p>  #pragma DATA_SECTION(inp_buffer,"audio_buffer");</p&

108、gt;<p>  int inp_buffer[0x200];</p><p>  /* Create specific data section for buffer (symbol, section_name) */</p><p>  #pragma DATA_SECTION(out_buffer,"outt_buffer");</p>

109、<p>  int out_buffer[0x200];</p><p>  /* Create specific data section for coeffiecients */</p><p>  #pragma DATA_SECTION(coeffs,"coefficients");</p><p>  /* Low Pas

110、s Filter fs=16000 fc=4000Hz*/ </p><p>  int coeffs[16]={ -2, -30,127,372,-891, -1925, 4228, 14507,14507,4228,-1925,-891,372,127, -30,-2};</p><p>  /* High Pass Filter */ </p><p>

111、;  // int coeffs[16]={-120,5245,-3421,2451,-11216,40,-24657,29610,29610,-24657,40,-11216,2451,-3421,5245,-120}; </p><p>  /* Band Pass Filter */ </p><p>  /* int coeffs[16]={921,-2494,137,-3654,

112、-2485,-2063,-9015,16165,16165,-9015,-2063,-2485,-3654,137,-2494,921}; */</p><p>  /* Band Stop Filter */</p><p>  /* int coeffs[16]={491,165,-2159,772,-6697,10044,648,12297,12297,648,10044,-669

113、7,772,-2159,165,491}; */ </p><p>  /* All Pass Filter */</p><p>  /* int coeffs[16] ={32767,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; */</p><p>  /* Create specific data section for delay b

114、uffer */</p><p>  #pragma DATA_SECTION(delaybuff,"delayb");</p><p>  int delaybuff[16]={0}; int delaybuff1[16]={0};</p><p>  /* declare and initialize two variables for D

115、MAC ISRs */</p><p>  int frame=0; </p><p>  int flag=0;</p><p>  int temp; </p><p>  int currbuff = 0;</p><p><b>  int a,b;</b></p>&l

116、t;p>  int bf1[0x3000]={0};</p><p>  /* delayptr holds the address of the start of the delay buffer */</p><p>  int *delayptr1 = &(delaybuff[0]); </p><p>  int *delayptr2 = &a

117、mp;(delaybuff1[0]); </p><p>  interrupt void DMAC2ISR();</p><p>  /********************************************************************/</p><p>  /* MAIN

118、 */</p><p>  /*******************************************************************/</p><p>  void main()</p><p><b>  { </b></p><

119、;p>  s16 cnt=2;</p><p><b>  a=8;</b></p><p><b>  b=6;</b></p><p>  /* These are the items that BIOS will set when we use it */</p><p>  BSCR

120、= 0x8806;</p><p><b>  XPC = 0;</b></p><p>  PMST = 0xA0;</p><p>  brd_set_cpu_freq(100);</p><p>  TIMER_HALT(0); </p><p>  brd_set_wait_states(

121、7, 7, 9);</p><p>  TIMER_RESET(0); </p><p>  IMR=0;//禁止所有中斷</p><p>  /* ----------------------------------------------------- */</p><p>  if(brd_init_bios()) <

122、;/p><p><b>  return;</b></p><p>  while(cnt--)</p><p><b>  {</b></p><p>  brd_led_toggle(BRD_LED0);//切換LED指示燈0的顯示狀態(tài)</p><p>  delay(1

123、000);</p><p>  brd_led_toggle(BRD_LED1);//切換LED指示燈1的顯示狀態(tài)</p><p>  delay(1000);</p><p>  brd_led_toggle(BRD_LED2);//切換LED指示燈2的顯示狀態(tài)</p><p>  delay(1000);</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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論