版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 超寬帶自動(dòng)增益控制芯片設(shè)計(jì).pdf
- 自動(dòng)增益電路課程設(shè)計(jì)
- EDFA全光自動(dòng)增益控制研究.pdf
- 自動(dòng)增益控制器放大器
- 自動(dòng)增益控制放大器設(shè)計(jì)(畢業(yè)論文)
- 自動(dòng)增益控制放大器設(shè)計(jì)畢業(yè)論文
- Ka波段自動(dòng)增益控制電路設(shè)計(jì).pdf
- 數(shù)字自動(dòng)增益控制與靈敏度時(shí)間控制的實(shí)現(xiàn).pdf
- WiFi接收機(jī)自動(dòng)增益控制環(huán)路的設(shè)計(jì).pdf
- 基于FPGA的自動(dòng)增益控制視頻放大器設(shè)計(jì).pdf
- 射頻接收機(jī)的自動(dòng)增益控制研究與設(shè)計(jì).pdf
- 可編程增益放大器與自動(dòng)增益控制的研究.pdf
- 北斗導(dǎo)航系統(tǒng)接收機(jī)中自動(dòng)增益控制的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 微波寬帶自動(dòng)增益控制技術(shù)研究.pdf
- 基于憶阻器的自動(dòng)增益控制電路設(shè)計(jì).pdf
- 數(shù)字式自動(dòng)增益控制放大器的設(shè)計(jì).pdf
- dsp課程設(shè)計(jì)---基于dsp的bios模塊設(shè)計(jì)實(shí)現(xiàn)
- 數(shù)字下變頻器中自動(dòng)增益控制電路的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 數(shù)字助聽(tīng)器聽(tīng)覺(jué)場(chǎng)景識(shí)別和自動(dòng)增益控制算法研究及實(shí)現(xiàn).pdf
- 通信系統(tǒng)中自動(dòng)增益控制的非線性研究.pdf
評(píng)論
0/150
提交評(píng)論