DSP原理与应用实验报告4.docx

上传人:b****7 文档编号:10259331 上传时间:2023-02-09 格式:DOCX 页数:23 大小:220.37KB
下载 相关 举报
DSP原理与应用实验报告4.docx_第1页
第1页 / 共23页
DSP原理与应用实验报告4.docx_第2页
第2页 / 共23页
DSP原理与应用实验报告4.docx_第3页
第3页 / 共23页
DSP原理与应用实验报告4.docx_第4页
第4页 / 共23页
DSP原理与应用实验报告4.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

DSP原理与应用实验报告4.docx

《DSP原理与应用实验报告4.docx》由会员分享,可在线阅读,更多相关《DSP原理与应用实验报告4.docx(23页珍藏版)》请在冰豆网上搜索。

DSP原理与应用实验报告4.docx

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,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 艺术

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1