

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