DSP原理与应用实验报告4.docx
- 文档编号:10259331
- 上传时间:2023-02-09
- 格式:DOCX
- 页数:23
- 大小:220.37KB
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;i for(i=0;i while (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;i Write(pI2C->icdxr,bytedata[i]); while(! (pI2C->icstr&ICSTR_ICXRDY)); } } voidI2C_Read(unsignedshortintdevice,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DSP 原理 应用 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)