2023年全國(guó)碩士研究生考試考研英語(yǔ)一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩28頁(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>  實(shí) 驗(yàn) 報(bào) 告</p><p>  基于DSP實(shí)現(xiàn)音頻變聲與自動(dòng)增益控制</p><p><b>  指導(dǎo)教師簽字: </b></p><p><b>  日期:</b></p>&l

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

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

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

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

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

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

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

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

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

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

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

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

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

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

16、寄存器,與此同時(shí),存儲(chǔ)單元0x0049就映射為發(fā)送控制寄存器2(XCR2_1)。然后,對(duì)存儲(chǔ)單元0x0049的讀寫(xiě)操作,就相當(dāng)于對(duì)發(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>  等待兩個(gè)時(shí)鐘周期,串口的接收與發(fā)送被激活。McBSP準(zhǔn)備好狀態(tài)</p><p>  RRDY和XRDY說(shuō)明McBSP串口接收和發(fā)送是否準(zhǔn)備好,串口讀DDR[1,2] 和DXR[1,2]將會(huì)影響RRDY和XRDY。</p><p>  接收準(zhǔn)備好(RRDY、REVT、RINT): 串口復(fù)位時(shí),RRDY清為0,當(dāng)RBR[1,2] 內(nèi)容復(fù)制到DDR[1,2]時(shí),R

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

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

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

21、t;<p> ?。≧/X)INTM=11:當(dāng)出現(xiàn)楨同步錯(cuò)誤時(shí),產(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)存儲(chǔ)器、片上外設(shè)和片外

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

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

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

25、2的初始化編程:</p><p>  復(fù)位所有的DMA通道</p><p><b>  設(shè)置DMA通道參數(shù)</b></p><p><b>  每幀傳輸256個(gè)字</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)先級(jí)和使能控制寄存器</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中,不同型號(hào)DSP的IMR和IFR寄存器的定義有所不同。其中,TINT0表示定時(shí)器0的中斷位,TINT1表示定時(shí)器1的中斷位。另外,與中斷相關(guān)的還有狀態(tài)寄存器ST1中的INTM位。</p><p>  INTM位是總中斷屏蔽位,INTM=0就開(kāi)放全部可屏蔽中斷。某一個(gè)中斷是否開(kāi)放還取決于IMR寄存器的設(shè)置。</p><p>

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

30、P填充;未使用的向量直接用RETE中斷返回指令返回,這是為了防止意外進(jìn)入未用中斷,其余的空位也用NOP填充。</p><p>  向量表放在匯編語(yǔ)言源文件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說(shuō)明</p><p>  .sect “.vect

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

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

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

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

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

63、程序中,DMA2接收緩沖區(qū)1中的數(shù)據(jù)經(jīng)過(guò)FIR濾波處理后,再完成采樣點(diǎn)由多變少或是由少變多的處理和語(yǔ)音恢復(fù)。放入DMA3的發(fā)送緩沖區(qū)1,同時(shí)啟動(dòng)DMA3進(jìn)行FIR數(shù)據(jù)到串口1的數(shù)據(jù)發(fā)送寄存器的DMA傳輸。FIR輸入數(shù)據(jù)緩沖區(qū)分為3個(gè),buffer、buffer+0x100、buffer+0x200;輸出數(shù)據(jù)緩沖區(qū)分為2個(gè),buffer+0x300、buffer+0x400;每個(gè)緩沖區(qū)的大小為256個(gè)點(diǎn)。輸入輸出緩沖區(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ū)動(dòng)函數(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,用于對(duì)CODEC的訪問(wèn)</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)行輸入信號(hào)的數(shù)字濾波,從而達(dá)到濾除噪聲的目的。</p><p>  FDATOOL是MATLAB下功能強(qiáng)大的濾波器設(shè)計(jì)和分析工具。在FDATOOL 下根據(jù)你所需要的FIR濾波器的參數(shù)及特性選擇不同階數(shù)、通帶、阻帶等不用需要的濾波器系數(shù),導(dǎo)出系數(shù)后用類似如下方式寫(xiě)入程序:</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ù)處理開(kāi)始*/</p><p><b>  //fir計(jì)算</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ù),實(shí)現(xiàn)調(diào)試窗口的變聲變聲增益控制</p><p>  使用slider關(guān)鍵字向GEL添加GEL函數(shù)。當(dāng)從GEL菜單中選擇GEL函數(shù)后,就會(huì)出現(xiàn)一個(gè)滑動(dòng)條來(lái)控制箱GEL函數(shù)傳遞的參數(shù)值。每移動(dòng)一次滑動(dòng)條的位置,就會(huì)使用滑動(dòng)條對(duì)應(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)在滑動(dòng)條對(duì)象中的參數(shù)說(shuō)明</p><p>  minVal:當(dāng)滑動(dòng)條的位置在最低點(diǎn)時(shí)傳遞給函數(shù)的整形常數(shù)值</p><p>  maxVal:當(dāng)滑動(dòng)條的位置在最低點(diǎn)時(shí)傳遞給函數(shù)的整形常數(shù)值</p><p>  Incre

79、ment:每次滑動(dòng)條移動(dòng)一個(gè)位置是增加的整形常數(shù)值</p><p>  pageIncrement:每次滑動(dòng)條移動(dòng)一頁(yè)位置是增加的整形常數(shù)值</p><p>  paramName:函數(shù)內(nèi)部使用的參數(shù)定義</p><p>  設(shè)計(jì)方案、算法原理說(shuō)明</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>  女聲變男聲,過(guò)采樣,采樣點(diǎn)會(huì)增加,造成恢復(fù)波形周期變大(因?yàn)椴蓸娱g隔是固定的),頻率變低。多余的采樣點(diǎn)被舍棄。</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>  男聲變女聲,欠采樣,由于采樣點(diǎn)的減少,造成恢復(fù)波形周期變?。ㄒ?yàn)椴蓸娱g隔是固定的),頻率變高。缺少的點(diǎn)會(huì)由之前的采樣點(diǎn)重復(fù)來(lái)替補(bǔ)或插入0點(diǎn)。</p><p>  算法2、調(diào)用一個(gè)GEL函數(shù),實(shí)現(xiàn)元件窗口調(diào)節(jié)音量</p><p>  menuitem "Modulation Charact

86、eristics" /*在GEL菜單項(xiàng)添加一級(jí)菜單 “Modulation Characteristics”*/</p><p>  slider Amplitude(0,10,1,1,index) /*incr by 1,up to 10*/ //加二級(jí)菜單“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>  自動(dòng)

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

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

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

94、在每個(gè)子序列過(guò)程中聲音的大小保持不變,每過(guò)一段為長(zhǎng)度進(jìn)行一次增益系數(shù)的調(diào)整,因此在聲音大小突然改變的時(shí)候會(huì)造成1秒鐘左右的延時(shí)。</p><p>  程序中的maxArrIn變量用于保存每個(gè)序列中的最大幅值,maxAGC_in變量用于保存上個(gè)序列的最大幅值,在每個(gè)序列輸入的幅值都與上個(gè)序列的幅值進(jìn)行比較。</p><p>  程序設(shè)計(jì)、調(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. 本站所有資源如無(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)論