DSP原理与应用实验报告4.docx
《DSP原理与应用实验报告4.docx》由会员分享,可在线阅读,更多相关《DSP原理与应用实验报告4.docx(23页珍藏版)》请在冰豆网上搜索。
DSP原理与应用实验报告4
实验报告
课程名称DSP原理与应用
实验项目音频信号的FIR滤波
学院光电信息与通信工程__
专业电子信息工程
班级/学号__电信0904/2009010***
学生姓名______***_________
实验日期_2011年12月22日___
成绩______________________
一、实验要求
1.熟悉音频编解码芯片TLV320AIC23的控制原理。
2.熟悉TMS32055xI2C模块驱动。
3.熟悉音频信号实时采集、FIR滤波、实时输出程序设计流程及编程。
4.利用MATLAB设计FIR滤波器。
5.学习使用TI的DSPLIB提高程序运行效率。
6.学习使用CCS图形显示窗口观察和分析音频波形及其频谱。
二、实验仪器及工具
计算机,安装WindowsXP操作系统、MATLAB7.0.1、TI的TMS320C5000DSP的开发软件CCS2.21;ICETEK-VC5509教学实验箱,耳机和麦克风(耳麦)。
三、实验内容
1.利用MATLAB设计FIR滤波器,以Q15格式导出滤波器系数。
2.创建项目,实现音频信号的实时采集、FIR滤波、实时输出。
音频信号的抽样率为44.1KHz。
将程序下载到实验板上运行,观察程序运行结果。
程序通过调用TI的DSPLIB数字信号处理算法库中的fir2函数实现FIR滤波。
调用规则可以参看文档c:
\ti\docs\pdf\spru422.pdf。
这是一个可以利用DSP中有双MAC硬件的滤波程序,而TMS320VC5509DSP片内具有双MAC,可以用此程序完成运算。
程序流程图如上图所示。
四、实验步骤
1.编写MATLAB程序,利用MATLAB设计FIR低通滤波器,以Q15格式导出滤波器系数。
例如设计一个阶数为63,采用汉明窗(HammingWindow)函数,采样频率为44100Hz,截止频率为2205Hz低通FIR线性相位滤波器。
可根据信号的频率更改滤波器的频率。
2.设置CCS为“C55xCycleAccurateSimulator”软件仿真模式,启动CCS,创建项目,新建项目文件audioFirFiltering.pjt。
将所提供的*.c、*.h和audio.cmd拷入到当前目录中,编写TMS3205509I2C模块驱动C程序文件i2c.c,以驱动TMS3205509对音频编解码芯片TLV320AIC23的控制。
将MATLAB设计的滤波器系数导入到audio.h的滤波器系数数组h中。
aic23.c中的AIC23_Mixer子程序调用DSPLIB中FIR2函数实现对采集到的音频信号滤波,并回放到右声道中,左声道直接回放到采集的到音频信号。
添加C文件、audio.cmd及55xdspx.lib到audioFirFiltering.pjt项目中。
编译、调试程序,直至没有编译错误。
2.连接实验设备,准备音频输入、输出设备。
a)将耳麦上麦克风插头插到ICETEK-VC5509-A板的J5插座。
b)将耳麦上的耳机音频输入插头插到ICETEK-VC5509-A板的J7插座。
c)调节耳麦上音量旋钮到适中位置。
3.设置CCS2.21在硬件仿真(Emulator)方式下运行,启动CCS软件。
编译、调试、加载、运行程序。
6.用麦克风输入语音信号,可以从耳机中听到:
左声道存在一些高频噪声,而右声道则较为干净。
7.在麦克风上吹气,造成“呼呼”声音输入,同时在程序aic23.c的有“breakpoint”注释的语句上加注软件断点(双击此行前的灰色控制条),程序会停止在此行上。
8.设置断点,观察滤波效果显示:
-分3次选择菜单View->Graph->Time/Frequency,分别使用以下参数打开3个观察窗口:
观察窗口中各波形的时域波形,再将各观察窗口参数中“DisplayType”项分别改成“FFTMagnitude”,观察窗口中各波形的频域波形。
9.使用计算机提供的声源:
⑴测试计算机语音输出:
用“我的电脑”帮助启动播放语音文件LineIn.mp3,并选择播放器参数为循环播放;将耳机上音频输入插头插入计算机上耳机插座;仔细听耳机中是否有输出。
⑵拔下耳机音频输入插头,用实验箱附带的音频连接线(两端均为双声道音频插头)连接计算机耳机输出插座和ICETEK-VC5509-A板上J5插座,即上图中“麦克风输入”。
⑶运行程序,听效果。
五、实验代码
aic23.c
#include"5509.h"
#include"util.h"
#include"audio.h"
//AIC23ControlRegisteraddresses
#defineAIC23_LT_LINE_CTL0x00//0
#defineAIC23_RT_LINE_CTL0x02//1
#defineAIC23_LT_HP_CTL0x04//2
#defineAIC23_RT_HP_CTL0x06//3
#defineAIC23_ANALOG_AUDIO_CTL0x08//4
#defineAIC23_DIGITAL_AUDIO_CTL0x0A//5
#defineAIC23_POWER_DOWN_CTL0x0C//6
#defineAIC23_DIGITAL_IF_FORMAT0x0E//7
#defineAIC23_SAMPLE_RATE_CTL0x10//8
#defineAIC23_DIG_IF_ACTIVATE0x12//9
#defineAIC23_RESET_REG0x1E//F-Writing0tothisregtriggersreset
//AIC23ControlRegistersettings
#definelt_ch_vol_ctrl0x0017/*0*/
#definert_ch_vol_ctrl0x0017/*1*/
#definelt_ch_headph_ctrl0x0079/*2*/
#definert_ch_headph_ctrl0x0079/*3*/
#definealog_au_path_ctrl0x0000/*4*/
#definedigi_au_path_ctrl0x0000/*5*/
#definepow_mgt_ctrl_ctrl0x0002/*6*/
#definedigi_au_intf_ctrl0x000D/*7*/
#defineau_FS_TIM_ctrl0x0000/*8MCLK=12MHz,SampleRatesetting*/
#definedigi_intf1_ctrl0x0001/*9*/
#definedigi_intf2_ctrl0x00FF/*10*/
#defineDIGIF_FMT_MS0x40
#defineDIGIF_FMT_LRSWAP0x20
#defineDIGIF_FMT_LRP0x10
#defineDIGIF_FMT_IWL0x0c
#defineDIGIF_FMT_FOR0x03
#defineDIGIF_FMT_IWL_160x00
#defineDIGIF_FMT_IWL_200x04
#defineDIGIF_FMT_IWL_240x08
#defineDIGIF_FMT_IWL_320xc0
#defineDIGIF_FMT_FOR_MSBRIGHT0x00
#defineDIGIF_FMT_FOR_MSLEFT0x01
#defineDIGIF_FMT_FOR_I2S0x02
#defineDIGIF_FMT_FOR_DSP0x03
#definePOWER_DEV0x80
#definePOWER_CLK0x40
#definePOWER_OSC0x20
#definePOWER_OUT0x10
#definePOWER_DAC0x08
#definePOWER_ADC0x04
#definePOWER_MIC0x02
#definePOWER_LINE0x01
#defineSRC_CLKOUT0x80
#defineSRC_CLKIN0x40
#defineSRC_SR0x3c
#defineSRC_BOSR0x02
#defineSRC_MO0x01
#defineSRC_SR_440x20
#defineSRC_SR_320x18
#defineSRC_SR_80x0c
#defineANAPCTL_STA0xc0
#defineANAPCTL_STE0x20
#defineANAPCTL_DAC0x10
#defineANAPCTL_BYP0x08
#defineANAPCTL_INSEL0x04
#defineANAPCTL_MICM0x02
#defineANAPCTL_MICB0x01
#defineDIGPCTL_DACM0x08
#defineDIGPCTL_DEEMP0x06
#defineDIGPCTL_ADCHP0x01
#defineDIGPCTL_DEEMP_DIS0x00
#defineDIGPCTL_DEEMP_320x02
#defineDIGPCTL_DEEMP_440x04
#defineDIGPCRL_DEEMP_480x06
#defineDIGIFACT_ACT0x01
#defineLT_HP_CTL_LZC0x80
#defineRT_HP_CTL_RZC0x80
voidAIC23_Write(unsignedshortregaddr,unsignedshortdata)
{
unsignedcharbuf[2];
buf[0]=regaddr;
buf[1]=data;
I2C_Write(I2C_AIC23,2,buf);
}
voidMcBSP0_InitSlave()
{
PC55XX_MCSPpMCBSP0=(PC55XX_MCSP)C55XX_MSP0_ADDR;
//PuttheMCBSPinreset
Write(pMCBSP0->spcr1,0);
Write(pMCBSP0->spcr2,0);
//Configframeparameters(32bit,singlephase,nodelay)
Write(pMCBSP0->xcr1,XWDLEN1_32);
Write(pMCBSP0->xcr2,XPHASE_SINGLE|XDATDLY_0);
Write(pMCBSP0->rcr1,RWDLEN1_32);
Write(pMCBSP0->rcr2,RPHASE_SINGLE|RDATDLY_0);
//Disableintframegenerationandenableslavew/extframesignalsonFSX
//Framesyncisactivehigh,dataclockedonrisingedgeofclkx
Write(pMCBSP0->pcr,PCR_CLKXP);
//Bringtransmitterandreceiveroutofreset
SetMask(pMCBSP0->spcr2,SPCR2_XRST);
SetMask(pMCBSP0->spcr1,SPCR1_RRST);
}
voidAIC23_Init()
{
I2C_Init();
//ResettheAIC23andturnonallpower
AIC23_Write(AIC23_RESET_REG,0);
AIC23_Write(AIC23_POWER_DOWN_CTL,0);
AIC23_Write(AIC23_ANALOG_AUDIO_CTL,ANAPCTL_DAC|ANAPCTL_INSEL);//使用麦克风音源
AIC23_Write(AIC23_DIGITAL_AUDIO_CTL,0);
//Turnonvolumeforlineinputs
AIC23_Write(AIC23_LT_LINE_CTL,0x000);
AIC23_Write(AIC23_RT_LINE_CTL,0x000);
//ConfiguretheAIC23formastermode,44.1KHzstereo,16bitsamples
//Use12MHzUSBclock
AIC23_Write(AIC23_DIGITAL_IF_FORMAT,DIGIF_FMT_MS|DIGIF_FMT_IWL_16|DIGIF_FMT_FOR_DSP);
AIC23_Write(AIC23_SAMPLE_RATE_CTL,SRC_SR_44|SRC_BOSR|SRC_MO);
//Turnonheadphonevolumeanddigitalinterface
AIC23_Write(AIC23_LT_HP_CTL,0x07f);//0x79forspeakers
AIC23_Write(AIC23_RT_HP_CTL,0x07f);
AIC23_Write(AIC23_DIG_IF_ACTIVATE,DIGIFACT_ACT);
//SetMcBSP0tobetransmitslave
McBSP0_InitSlave();
}
voidAIC23_Disable()
{
PC55XX_MCSPpMCBSP0=(PC55XX_MCSP)C55XX_MSP0_ADDR;
I2C_Disable();
//PuttheMCBSPinreset
Write(pMCBSP0->spcr1,0);
Write(pMCBSP0->spcr2,0);
}
#defineAUTIODATALEFT0x0d000
#defineAUTIODATARIGHT0x17000
int*pAudioLeft,*pAudioRight;
intwww=0;
voidAIC23_Mixer()
{
PC55XX_MCSPpMCBSP0=(PC55XX_MCSP)C55XX_MSP0_ADDR;
intleft,right;
int*pl,*pr,nAudioCount;
inti;
pAudioLeft=pl=(int*)AUTIODATALEFT;
pAudioRight=pr=(int*)AUTIODATARIGHT;
nAudioCount=0;
for(i=0;ifor(i=0;iwhile
(1)
{
while(!
ReadMask(pMCBSP0->spcr2,SPCR2_XRDY));//等待数据传输完成
(*pl)=left=Read(pMCBSP0->ddr1);//读入左声道数据
right=Read(pMCBSP0->ddr2);//读入右声道数据
x[NX-1]=left/16;//防止滤波时数据溢出
fir2(x,h,r,db,NX,NH);//调用滤波程序计算当前输出
(*pr)=r[NX-1];//数组r的最后一个单元为当前输出
Write(pMCBSP0->dxr1,left);//将原始数据送左声道输出
//Write(pMCBSP0->dxr1,r[NX-1]);//将原始数据送左声道输出
Write(pMCBSP0->dxr2,r[NX-1]);//将经过滤波后的数据送右声道输出
nAudioCount++;pl++;pr++;//循环使用缓冲区
if(nAudioCount>=1024)
{
nAudioCount=0;//breakpoint
pl=pAudioLeft;
pr=pAudioRight;
}
for(i=0;i{
x[i]=x[i+1];
}
}
}
audio.c
//测试时音频插孔J5接音源,J7接扬声器。
#include"5509.h"
#include"util.h"
#include"lcd.h"
#include"ICETEK-VC5509-EDU.h"
voidwait(unsignedintcycles);
voidEnableAPLL();
#defineCREG(*(unsignedshortint*)0x400004)
unsignedintnScreenBuffer[1024];
voidmain()
{
SDRAM_init();
EnableAPLL();
PLL_Init(144);
AIC23_Init();
InitCTR();
CREG=1;
LCDSetScreenBuffer(nScreenBuffer);
LCDSetDelay
(1);
LCDTurnOn();//打开显示
LCDCLS();//清除显示内存
for(;;)
{
AIC23_Mixer();
}
}
voidwait(unsignedintcycles)
{
inti;
for(i=0;i}
voidEnableAPLL()
{
/*EnusreDPLLisrunning*/
*(ioportvolatileunsignedshort*)0x1f00=4;
wait(25);
*(ioportvolatileunsignedshort*)0x1f00=0;
//MULITPLY
*(ioportvolatileunsignedshort*)0x1f00=0x3000;
//COUNT
*(ioportvolatileunsignedshort*)0x1f00|=0x4F8;
wait(25);
//*(ioportvolatileunsignedshort*)0x1f00|=0x800
//MODE
*(ioportvolatileunsignedshort*)0x1f00|=2;
wait(30000);
//APLLSelect
*(ioportvolatileunsignedshort*)0x1e80=1;
//DELAY
wait(60000);
}
i2c.c
#include"5509.h"
#include"util.h"
externDSPCLKdspclk;
I2C_Init()
{
PC55XX_I2CpI2C=(PC55XX_I2C)C55XX_I2C_ADDR;
//PutI2Ccontrollerinreset(badifclockderivativeschangeoutofreset)
ClearMask(pI2C->icmdr,ICMDR_IRS);
//Setprescalertogenerate12MHzclock
pI2C->icpsc=dspclk.pllmult;
//Setupclockcontrolregisters(100KHzclockout)
Write(pI2C->icclkl,10);//For400KHz,use47for100KHz
Write(pI2C->icclkh,10);
//Setupmasterandslaveaddresses
WriteMask(pI2C->icoar,ICOAR_OADDR,ICOAR_MASK_7);
//TakeI2Ccontrolleroutofreset,putinmastermode
SetMask(pI2C->icmdr,ICMDR_IRS|ICMDR_MST);
}
I2C_Disable()
{
PC55XX_I2CpI2C=(PC55XX_I2C)C55XX_I2C_ADDR;
//PutI2Ccontrollerinreset(badifclockderivativeschangeoutofreset)
ClearMask(pI2C->icmdr,ICMDR_IRS);
}
voidI2C_Write(unsignedshortintdevice,intcount,unsignedchar*bytedata)
{
PC55XX_I2CpI2C=(PC55XX_I2C)C55XX_I2C_ADDR;
inti;
//SettheI2Ccontrollertowriteastreamofcountbytes
Write(pI2C->iccnt,count);
WriteMask(pI2C->icsar,device,ICSAR_MASK_7);
WriteMask(pI2C->icmdr,
ICMDR_STT|ICMDR_STP|ICMDR_TRX,
ICMDR_STT|ICMDR_STP|ICMDR_TRX);
//Transmitdata
for(i=0;iWrite(pI2C->icdxr,bytedata[i]);
while(!
(pI2C->icstr&ICSTR_ICXRDY));
}
}
voidI2C_Read(unsignedshortintdevice,