基于TMS320VC5509芯片的语音采集系统.docx
《基于TMS320VC5509芯片的语音采集系统.docx》由会员分享,可在线阅读,更多相关《基于TMS320VC5509芯片的语音采集系统.docx(20页珍藏版)》请在冰豆网上搜索。
基于TMS320VC5509芯片的语音采集系统
DSP作业
基于TMS320VC5509的语音处理系统
姓
系统简要介绍:
语音信号的采集和播放是语音信号处理的基础, DSP是各种语音信号处理的平台。
TMS320VC55x DSP是德州仪器(TI)C5000 DSP系列里新的一代产品。
TMS320VC55x DSP系列主要特点是低功耗,非常适合在音频处理方面的应用。
TLV320AIC23(以下简称AIC23)是TI公司生产的一种高性能立体声音频编解码器, 该器件的数字传输字长可以是16、20、24、32bit,它支持8~96 kHz的采样率。
在数模转换器中的二阶多比特结构还可在采样率为96 kHz的情况下使信躁比达到100dB, 从而使得高质量的数字音频回放成为可能。
该芯片在回放中的功率消耗<23 mW。
因此,对于可移动的数字音频播放和录音使用中的模拟输入输出等应用系统,AIC23无疑是十分理想的选择。
综上所述,选择TMS320VC5509(以下简称VC5509)作为系统的核心处理器和控制器,利用A IC23采集语音信号,然后传送给VC5509。
系统硬件设计:
下图是系统的硬件结构框图, 系统主要包括VC5509和AIC23 两个模块。
系统硬件结构框图
利用VC5509的片上外设I2C(Inter-IntegratedCircuit,内部集成电路)模块配置AIC23的内部寄存器;通过VC5509的McBSP(Multichannel Buffered SerialPorts,多通道缓存串口)接收和发送采样的音频数据。
控制通道只在配置AIC23的内部寄存器时工作,而当传输音频数据时则处于闲置状态。
AIC23通过麦克风输入或者立体声音频输入采集模拟信号,并把模拟信号转化为数字信号,存储到DSP的内部RAM中,以便DSP处理。
当DSP完成对音频数据的处理以后,AIC23再把数字信号转化为模拟信号,这样就能够在立体声输出端或者耳机输出端听到声音。
AIC23能够实现与VC5509DSP的McBSP端口的无缝连接,使系统设计更加简单。
接口的原理框图, 如下图所示。
AIC23与VC5509接口原理图
系统中AIC23的主时钟12MHz直接由外部的晶振提供。
MODE接数字地,表示利用I2C控制接口对AIC23传输控制数据。
CS接数字地, 定义了I2C总线上AIC23的外设地址,通过将CS接到高电平或低电平,可以选择A IC23作为从设备在I2C总线上的地址。
SCLK和SDIN是AIC23控制端口的移位时钟和数据输入端,分别与VC5509的I2C模块端口SCL和SDA相连。
收发时钟信号CLKX1和CLKR1由AIC23的串行数据输入时钟BCLK提供,并由A IC23的帧同步信号LRCIN、LRCOUT启动串口数据传输。
DX1和DR1分别与AIC23 的DIN和DOUT相连,从而完成VC5509与AIC23间的数字信号通信。
系统软件设计
语音信号在基于DSP的语音处理系统上处理过程的软件流程图如下:
程序流程图
要正确配置DSP的时钟发生器, 产生DSP工作的正常时钟频率,这一个步骤的关键就是数字琐相环PLL的应用。
I2C模块是TMS320VC55xx新增的片内集成外设, 通过I2C对TLV320AIC23进行编程控制,可以使DSP与I2C兼容设备通过该接口进行数据通信。
通过硬件和软件调试,最终成功采集到语音信号并播放出来, 可以在CCS软件中观察到采集到的语音信号的波形。
改变程序中的延迟参数,可以明显改变混响效果。
硬件电路设计
2.1总输入电路(自行总结设计)
从左到右各部分电路为:
话筒,开关,语音输入电路,UA741高增益放大电路,有源二阶带通滤波器。
2.2总输出电路(自行总结设计)
从左到右各部分电路为:
LM386高频功率放大器及其外围器件连接电路,语音输出电路,开关,扬声器。
2.3语音输入与语音输出电路
语音输入电路
语音输出电路
语音信号通道包括模拟输入和模拟输出两个部分。
模拟信号的输入输出电路如图所示。
上图中MICBIAS 为提供的麦克风偏压,通常是3/4AVDD,MICIN为麦克风输入,可以根据需要调整输入增益。
下图中LLINEOUT 为左声道输出,RLINEOUT为右声道输出。
用户可以根据电阻阻值调节增益的大小,使语音输入输出达到最佳效果。
从而实现良好的模拟语音信号输入与模拟信号的输出。
一.程序设计
语音采集与回放:
externvoidInitC5402(void);
externvoidOpenMcBSP(void);
externvoidCloseMcBSP(void);
extern voidREADAD50(void);
externvoidWRITEAD50(void);
/***********************************************************************
**MainFunctionProgram
***********************************************************************/
#include"stdio.h"
#include "math.h"
#definepi3.1415926
void main(void)
{
int k=0;
ﻩintx_ad,y_da;
ﻩﻩint*px= (int*)0x3000;
int *py= (int*)0x3100;
ﻩ
//ﻩfor(; ;)
{ﻩﻩ
InitC5402();
ﻩOpenMcBSP();
ﻩ
for(;;)
{
// for(j=0;j<=4; j++)
ﻩ {
READAD50();
ﻩﻩ
ﻩﻩpx=(int*)(0x3000);
ﻩﻩﻩx_ad =*px;
ﻩﻩﻩ
ﻩﻩy_da=x_ad;
py=(int*)(0x3100);
ﻩﻩ*py = y_da;
ﻩﻩ
ﻩﻩWRITEAD50();
ﻩ
ﻩﻩk++;
ﻩﻩ }
ﻩ}
ﻩﻩ
ﻩ}
ﻩ
Asm文件:
.global_InitC5402
.global_OpenMcBSP
.global _CloseMcBSP
.global_READAD50
ﻩ.global_WRITEAD50
ﻩ.includeMMRegs.h
_InitC5402:
ﻩNOP
ﻩLD #0, DP;resetdata–page pointer
ﻩSTM#0,CLKMD ;softwaresettingofDSPclock
STM#0,CLKMD ;(todividermodebeforesetting)
TstStatu1:
LDMCLKMD, A
AND#01b, A ;pollSTATUS bit
BCTstStatu1,ANEQﻩ
STM#0xF7ff, CLKMD;set C5402DSPclockto10MHzﻩ
*STM#0x4007, CLKMD; setC5402DSPclock to 100MHz
; (basedonDSK crystalat20MHz)
******* ConfigureC5402SystemRegisters*******
STM#0x2000, SWWSR ;2waitcycle forIOspace&
; 0 waitcyclefordata&prog spaces
ﻩSTM#0x0000,BSCR ;setwait statesforbankswitch:
; 64k membank,extra0cyclebetween
;consecutiveprog/data read
;STM#0x1800,ST0; ST0 at defaultsetting
;ﻩSTM#0x2900,ST1 ; ST1atdefaultsetting(note:
INTX=1)
;STM#0x00A0,PMST;MCmode&OVLY=1,vectorsat0080h
*******SetupTimerControlRegisters*******
ﻩSTM#0x0010,TCR; stop on–chip timer0
ﻩSTM#0x0010,TCR1; stopon–chiptimer1
;Timer0 isusedasmain looptimer
;ﻩSTM #2499,PRD; timer0 rate=CPUCLK/1/(PRD+1)
; =40M/2500=16KHz
*STM#6249,PRD;ifCPUat100M/6250=16KHz
ﻩ
*******InitializeMcBSP1 Registers*******
ﻩSTM SPCR1, McBSP1_SPSA; registersubaddrofSPCR1
STM#0000h,McBSP1_SPSD;McBSP1recv=left–justify
;RINT generatedby frame sync
ﻩSTMSPCR2,McBSP1_SPSA;registersubaddr for SPCR2
;XINTgeneratedbyframesync
ﻩSTM #0000h,McBSP1_SPSD;McBSP1 Tx=FREE(clock stops
;to runafterSWbreakpoint
ﻩSTM RCR1,McBSP1_SPSA ;registersubaddrofRCR1
ﻩSTM#0040h,McBSP1_SPSD;recvframe1 Dlength=16bits
STMRCR2,McBSP1_SPSA ;register subaddrof RCR2
STM#0040h,McBSP1_SPSD; recvPhase=1
;retframe2 Dlength=16bits
STMXCR1,McBSP1_SPSA; registersubaddr of XCR1
ﻩSTM#0040h,McBSP1_SPSD ; set thesameasrecv
STMXCR2, McBSP1_SPSA;registersubaddrofXCR2
STM#0040h,McBSP1_SPSD;setthesameasrecv
ﻩSTMPCR, McBSP1_SPSA;registersubaddress of PCR
ﻩSTM#000eh,McBSP1_SPSD; clkandframe fromexternal(slave)
;FSatpulse–mode(00)
******* FinishDSPInitialization*******
STM#0x0000,IMR ;disableperipheral interrupts
ﻩSTM#0xFFFF, IFR;cleartheintrupts’flags
RET;return to main
NOP
NOP
******* WaitingforMcBSP0RXFinished*******
IfRxRDY1:
NOP
STMSPCR1,McBSP1_SPSA;enableMcBSP1Rx
ﻩLDMMcBSP1_SPSD,A
ﻩAND#0002h, A;maskRRDYbit
BCIfRxRDY1,AEQ; keep checking
ﻩNOP
ﻩNOP
RET; return
NOP
NOP
*******WaitingforMcBSP0TXFinished*******
IfTxRDY1:
ﻩNOP
STMSPCR2,McBSP1_SPSA;enable McBSP1Tx
LDMMcBSP1_SPSD, A
ﻩAND#0002h, A ;maskTRDYbit
BC IfTxRDY1, AEQ; keepchecking
ﻩNOP
NOP
RET ;return
ﻩNOP
NOP
******************************************
******************************************
_OpenMcBSP:
rsbxxf
ﻩcallwait
NOP
ﻩ
STMSPCR1,McBSP1_SPSA; enableMcBSP0RX for ADCdata in
LDMMcBSP1_SPSD,A
OR#0x0001, A
STLMA, McBSP1_SPSD
ﻩSTMSPCR2,McBSP1_SPSA;enableMcBSP0TXforDTMFout
LDMMcBSP1_SPSD,A
OR#0x0001, A
STLM A,McBSP1_SPSD
ﻩLD #0h,DP ;loaddatapage0
ﻩrpt#23
ﻩNOP
ssbxxf
ﻩ
NOP
NOP
ﻩ
;ﻩCALLIfTxRDY1
;STM#0x0101, McBSP1_DXR1
ﻩ
;ﻩCALLIfTxRDY1
;ﻩSTM#0x0208,McBSP1_DXR1
;;ﻩrsbxxf
;;NOP
;;NOP
CALLIfTxRDY1
STM#0x0001,McBSP1_DXR1;requestsecondarycommunication
NOP
ﻩCALLIfTxRDY1
ﻩSTM#0100h,McBSP1_DXR1;write00hto register1
ﻩCALLIfTxRDY1
STM#0000h,McBSP1_DXR1
ﻩ
NOP
NOP
rpt#20h
ﻩnop
ﻩCALLIfTxRDY1
STM#0x0001,McBSP1_DXR1;requestsecondary communication
CALLIfTxRDY1
ﻩSTM#0200h,McBSP1_DXR1;write00htoregister2
CALLIfTxRDY1
ﻩSTM#0000h,McBSP1_DXR1ﻩ
ﻩCALLIfTxRDY1
ﻩSTM #0x0001,McBSP1_DXR1;requestsecondarycommunication
CALL IfTxRDY1
ﻩSTM #0300h,McBSP1_DXR1;write00h toregister3
CALLIfTxRDY1
STM#0000h,McBSP1_DXR1
CALLIfTxRDY1
STM #0x0001,McBSP1_DXR1;requestsecondarycommunication
CALL IfTxRDY1
STM#0490h,McBSP1_DXR1;write00hto register4
ﻩﻩﻩﻩ;bypassinternalDPLL
ﻩﻩﻩﻩﻩﻩ;andselect theSampleFrequency
ﻩCALLIfTxRDY1
STM#0000h, McBSP1_DXR1
ﻩ
;ﻩCALLIfTxRDY1
;STM#0x0001,McBSP1_DXR1
;ﻩCALL IfTxRDY1
;STM#0102h,McBSP1_DXR1;enabledigitalloopback
ﻩﻩ
;ﻩCALL IfTxRDY1
;ﻩSTM#0x0001, McBSP1_DXR1
;CALLIfTxRDY1
;ﻩSTM#0208h,McBSP1_DXR1;enable analog loopback
ﻩRET
NOP
ﻩNOP
*********************
_CloseMcBSP:
ﻩSTMSPCR1, McBSP1_SPSA;disableMcBSP0 RX
LDMMcBSP1_SPSD,A
ﻩAND#0xFFFE, A
STLMA,McBSP1_SPSD
STMSPCR2,McBSP1_SPSA;disableMcBSP0 TX
ﻩLDMMcBSP1_SPSD,A
AND#0xFFFE,A
ﻩSTLMA,McBSP1_SPSD
RPT #5
RET
NOP
ﻩNOP
_READAD50:
stmﻩ0x00ff,ar3
ﻩstmﻩ0x3000,ar2
ﻩ
loopa:
ﻩCALLIfRxRDY1
ldm McBSP1_DRR1,b
ﻩstlﻩb,*ar2+
; banzloopa,*ar3-
ﻩnop
nop
ret
nop
nop
ﻩ
_WRITEAD50:
stm0x00ff,ar3
ﻩstmﻩ0x3100,ar2
loopb:
CALLIfTxRDY1
ﻩldu*ar2+,B
ﻩand #0fffeh,b;masktheLSB
stlm B,McBSP1_DXR1
;ﻩbanzloopb,*ar3-
nop
nop
ﻩret
nop
nop
wait:
ﻩstm 20h,ar3
loop1:
ﻩstm020h,ar4
loop2:
banzﻩloop2,*ar4-
ﻩbanz loop1,*ar3-
ret
ﻩnop
nop
ﻩnop
ﻩnop
.end
A/D模块:
xternvoidInitC5402(void);
externvoidOpenMcBSP(void);
externvoid CloseMcBSP(void);
externvoidREADAD50(void);
/***********************************************************************
**Main FunctionProgram
***********************************************************************/
voidmain(void)
{
InitC5402();
OpenMcBSP(); 初始化串口和AD50C
while
(1)
{
READAD50();
}
}
D/A模块:
extern voidInitC5402(void);
externvoidOpenMcBSP(void);
extern void CloseMcBSP(void);
externvoid WRITEAD50(void);
/***********************************************************************
**MainFunction Program
***********************************************************************/
voidmain(void)
{
InitC5402();
OpenMcBSP();
while (1)
{
WRITEAD50();
}
}