DSP期末考试实验报告.docx

上传人:b****5 文档编号:5696009 上传时间:2022-12-31 格式:DOCX 页数:16 大小:299.47KB
下载 相关 举报
DSP期末考试实验报告.docx_第1页
第1页 / 共16页
DSP期末考试实验报告.docx_第2页
第2页 / 共16页
DSP期末考试实验报告.docx_第3页
第3页 / 共16页
DSP期末考试实验报告.docx_第4页
第4页 / 共16页
DSP期末考试实验报告.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

DSP期末考试实验报告.docx

《DSP期末考试实验报告.docx》由会员分享,可在线阅读,更多相关《DSP期末考试实验报告.docx(16页珍藏版)》请在冰豆网上搜索。

DSP期末考试实验报告.docx

DSP期末考试实验报告

 

重庆邮电大学

 

学生实验报告

 

 

课程名称:

DSP应用与设计专业班级:

通信与信息系统1班

 

学生学号:

学生姓名:

 

所属院部:

通信工程学院指导教师:

代少升

 

实验项目名称:

语音信号采集、放送与FIR滤波实验学时4学时

实验地点:

逸夫楼315实验开始日期:

2010-11-24

一、实验目的和要求

(一)、实验目的

(1)熟悉CCS平台设计开发流程并会调试程序;

(2)掌握语音信号采集与放送的原理以及FIR滤波原理;

(3)掌握程序设计流程图以及用到各个模块的作用和定义;

(二)、实验要求

(1)注意掌握CCS开发DSP应用程序的步骤;

(2)完成语言信号的采集;

(3)完成语言信号噪声的加入;

(4)完成FIR滤波,使语音清晰;

(5)左声道输出带噪声语音效果,右声道输出FIR语音效果;

(6)调试程序要记录调试过程中出现的问题及解决办法;

(7)编写程序要规范、正确,上机调试过程和结果要有记录,并注意调试程序集成环境的掌握及应用,不断积累编程及调试经验;

(8)提交实验报告,具体包括:

实验内容,实验原理和程序设计流程,实验原代码,实验测试结果(附波形图)。

二、实验仪器和设备

计算机一台,装有ccs3.3运行环境、DSP实验箱(包括仿真器)、麦克风输入设备、耳机输出设备

三、实验过程

(一)设计前了解和准备:

(1)此次实验主要用到了三个模块,第一个是AIC23的立体声语音解码芯片,第二个是MCBSP0的多通道缓冲串口,第三个是I2C总线模块。

另外还用到了DSP的FIR滤波实现。

(2)三个模块的基本介绍和FIR基础知识:

AIC23芯片:

AIC23是可编程芯片,内部有11个16位寄存器,编程设置这些寄存器可得到所需的采样频率、输入输出增益和传输数据格式等。

该控制接口有SPI和I2C两种工作模式,由芯片上的MODE引脚进行选择:

MODE=0为I2C模式,MODE=1为SPI模式。

AIC23的I2C接口地址由引脚的状态决定,=0时地址为0011010,=1时地址为0011011。

(注意:

在该开发板上我们已经直接将MODE接口接地,即低电平0,此时则只

运行于I2C模式。

MCBSP模块:

MCBSP为多通道缓冲串口,用于实现DSP芯片与AIC23芯片之间的数据传输,在实验中我们用到了MCBSP0的模块进行数据接收和发送。

I2C模块:

I2C总线定义:

I2C(Inter-IntegratedCircuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备

I2C总线特点:

I2C总线最主要的优点是其简单性和有效性。

由于接口直接在组件之上,因此I2C总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本,I2C要求从器件有一个地址。

FIR滤波:

FIR:

有限脉冲响应滤波器。

特点:

线性相位,非递归结构。

既具有严格的线性相位(就是不同频率分量的信号经过fir滤波器后他们的时间差不变)。

图像处理以及数据传输,都要求信道具有线性相位特性。

FIR滤波器的单位抽样响应是有限长的,因而滤波器性能稳定。

(3)程序需要配置的模块:

初始化DSP的时钟和寄存器。

MCBSP寄存器配置。

I2C寄存器配置。

AIC23寄存器配置。

实现程序代码,包括FIR滤波实现。

初始化配置:

DSP通过I2C总线将配置命令发送到AIC23,配置完成后AIC23开始工作。

(4)大致实验原理和步骤:

第一步:

通过麦克风利用芯片AIC23进行带噪声的语音信号采集,由于AIC本身自带A/D转化,采集得到的数据传输保存于MCBSP数据接收寄存器DDR。

第二步:

DSP对MCBSP中的数据进行FIR滤波,并送给MCBSP中的数据发送寄存器DXR。

第三步:

DXR中数据回传给AIC23,并利用它带的D/A转换进行输出,从而能听到滤波后的信号。

(二)实验流程图设计:

设计流程图如下:

 

(三)三大模块初始化代码:

(1)AIC23的初始化代码(附注解):

//AIC23的11个控制寄存器各基地址定义

#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–让寄存器复位

//部分控制寄存器各个位的初值设置

//数字音频控制接口寄存器各位定义

#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

//模拟音频通道控制寄存器各位定义

#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_Init()//音频芯片AIC23初始化模块

{

I2C_Init();//调用I2C初始化程序用来打开AIC23

//初始化AIC23并打开各个模块

AIC23_Write(AIC23_RESET_REG,0);//AIC23寄存器复位

AIC23_Write(AIC23_POWER_DOWN_CTL,0);/*节电模式设置,所有部分都为工作状态*/

AIC23_Write(AIC23_ANALOG_AUDIO_CTL,ANAPCTL_DAC|ANAPCTL_INSEL);

//模拟音频通道控制,打开DAC,ADC输入选择方式为麦克风输入方式

AIC23_Write(AIC23_DIGITAL_AUDIO_CTL,0);//数字音频通道控制

//line输入的音频方式调节

AIC23_Write(AIC23_LT_LINE_CTL,0x000);//左通路音频方式调节

AIC23_Write(AIC23_RT_LINE_CTL,0x000);//右通路音频方式调节

AIC23_Write(AIC23_DIGITAL_IF_FORMAT,DIGIF_FMT_MS|

DIGIF_FMT_IWL_16|DIGIF_FMT_FOR_DSP);/*选定AIC23为主模式,

数据长为16bit,DSP格式*/

AIC23_Write(AIC23_SAMPLE_RATE_CTL,SRC_SR_44|SRC_BOSR|SRC_MO);

//选定USB模式采样率为44.1KHZ,

//打开耳机通路调节

AIC23_Write(AIC23_LT_HP_CTL,0x07f);//耳机左通路控制调节音量增益为+6db

AIC23_Write(AIC23_RT_HP_CTL,0x07f);//耳机右通路控制调节音量增益为+6db

AIC23_Write(AIC23_DIG_IF_ACTIVATE,DIGIFACT_ACT);//数字接口激活

McBSP0_InitSlave();//设置McBSP0用来控制发送来的数据

}

//AIC23控制口写入,利用I2C激活AIC23

voidAIC23_Write(unsignedshortregaddr,unsignedshortdata)

{

unsignedcharbuf[2];

buf[0]=regaddr;

buf[1]=data;

I2C_Write(I2C_AIC23,2,buf);//用I2C激活AIC23

}

(2)MCBSP0的初始化代码(附注解):

voidMcBSP0_InitSlave()//MCBSP初始化模块

{

PC55XX_MCSPpMCBSP0=(PC55XX_MCSP)C55XX_MSP0_ADDR;/*使用库函

PC55XX_MCSP*/

//初始化MCBSP0的SPCR1和SPCR2这两个控制寄存器

Write(pMCBSP0->spcr1,0);

Write(pMCBSP0->spcr2,0);

//设置接收和传输的大小,并设置接收和传输时不需要延迟

Write(pMCBSP0->xcr1,XWDLEN1_32);/*设置输出控制寄存器xcr1来传输字节长度*/

Write(pMCBSP0->xcr2,XPHASE_SINGLE|XDATDLY_0);/*设置输出控制寄存器

cxcr1在传输数据时,不需要延迟一个时钟输出*/

Write(pMCBSP0->rcr1,RWDLEN1_32);/*设置输入控制寄存器rcr1的读入字节长度*/

Write(pMCBSP0->rcr2,RPHASE_SINGLE|RDATDLY_0);/*设置输入控制寄存器rcr1在接收数据时,不需要延迟一个时钟接收*/

/*设置PCR时钟信号控制寄存器,确定时钟信号的极性,当CLKXP为

0的时候为正极性,时钟以上升沿开始;反之,时钟以下降沿开始*/

Write(pMCBSP0->pcr,PCR_CLKXP);

//对发送和接收进行复位

SetMask(pMCBSP0->spcr2,SPCR2_XRST);//复位SPCR2中的XRST寄存器

SetMask(pMCBSP0->spcr1,SPCR1_RRST);//复位SPCR1中RRST寄存器

}

(3)I2C的初始化代码(附注解):

I2C_Init()//I2C的初始化模块

{

PC55XX_I2CpI2C=(PC55XX_I2C)C55XX_I2C_ADDR;/*利用到库文件中的PC55XX_I2C*/

ClearMask(pI2C->icmdr,ICMDR_IRS);/*重置I2C寄存器ICMDR,发送一个信号激活I2C总线*/

pI2C->icpsc=dspclk.pllmult;/*配置I2C总线的时钟信号,AIC23使用的是晶振输入,所以I2C时钟寄存器ICPSC直接用时钟信号dspclk.pllmult*/

//配置I2C信号的时钟信号(SCL)频率

Write(pI2C->icclkl,10);

Write(pI2C->icclkh,10);

WriteMask(pI2C->icoar,ICOAR_OADDR,ICOAR_MASK_7);//设置I2C主从地址。

SetMask(pI2C->icmdr,ICMDR_IRS|ICMDR_MST);/*第二次对ICMDR赋值,表示I2C寄存器配置完成,I2C总线准备工作;*/

}

I2C_Disable()//I2C关闭模块

{

PC55XX_I2CpI2C=(PC55XX_I2C)C55XX_I2C_ADDR;

//让I2C控制寄存器重启(如果没重启寄存器的情况下时钟改变了)

ClearMask(pI2C->icmdr,ICMDR_IRS);

}

//I2C的写模块

voidI2C_Write(unsignedshortintdevice,intcount,unsignedchar*bytedata)

{

PC55XX_I2CpI2C=(PC55XX_I2C)C55XX_I2C_ADDR;//调用库函数PC55XX_I2C

intI;

//设置I2C的控制寄存器用来写大小为count的数据

Write(pI2C->iccnt,count);/*设置需要通过I2C来传输的数据大小,大小为count*/

WriteMask(pI2C->icsar,device,ICSAR_MASK_7);/*设置DSP想要读写的从地址*/

//激活ICMDR模式寄存器中的相应位,从而定义控制方式

WriteMask(pI2C->icmdr,

ICMDR_STT|ICMDR_STP|ICMDR_TRX,

ICMDR_STT|ICMDR_STP|ICMDR_TRX);

//STT代表的开始位,STP代表的结束位,TRX代表的传输模式

//传输数据

for(i=0;i

{

Write(pI2C->icdxr,bytedata[i]);/*DSP通过ICDXR这个寄存器发送数据bytedata[i]*/

while(!

(pI2C->icstr&ICSTR_ICXRDY));/*检测DSP发送寄存器ICSTR是否发送完毕*/

}

}

//I2C的读模块

voidI2C_Read(unsignedshortintdevice,intcount,unsignedchar*bytedata)

{

PC55XX_I2CpI2C=(PC55XX_I2C)C55XX_I2C_ADDR;//使用库函数PC55XX_I2C

inti;

//设置I2C的控制寄存器用来读大小为count的数据

Write(pI2C->iccnt,count);/*设置需要通过I2C来传输的数据大小,大小为count*/

WriteMask(pI2C->icsar,device,ICSAR_MASK_7);/*设置DSP想要读写的从地址*/

//激活ICMDR模式寄存器中的相应位,从而定义控制方式

WriteMask(pI2C->icmdr,

ICMDR_STT|ICMDR_STP,//这里的ICMDR_TRX没写即代表为默认1,读模式

ICMDR_STT|ICMDR_STP|ICMDR_TRX);

//接收count大小的数据

for(i=0;i

{

while(!

(pI2C->icstr&ICSTR_ICRRDY));/*检测DSP接收寄存器ICRRX是否接收完毕*/

bytedata[i]=pI2C->icdrr;//拷贝数据到bytedata[i]数组进行保存。

}

}

 

(四)主函数和关键程序代码:

(1)main()函数代码(附注释):

voidmain()

{

SDRAM_init();//初始化EMIF外部扩展接口

EnableAPLL();//打开时钟锁相环

PLL_Init(40);//初始化时钟

AIC23_Init();//调用AIC23初始化模块

PLL_Init(120);//初始化时钟

for(;;)

{

AIC23_Mixer();//调用关键实现程序

}

}

(2)关键实现函数AIC23_Mixer()代码(附注释):

#defineAUTIODATALEFT0x0d000

#defineAUTIODATARIGHT0x17000

int*pAudioLeft,*pAudioRight;

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->dxr2,r[NX-1]);//将滤波后的数据送右声道输出

nAudioCount++;pl++;pr++;//循环使用缓冲区

if(nAudioCount>=1024)

{

nAudioCount=0;//断点位置

pl=pAudioLeft;

pr=pAudioRight;

}

for(i=0;i

{

x[i]=x[i+1];

}

}

}

注意:

其中这些定义中还包含了很多头文件以及系统库函数的引用,这些大部分为CCS软件提供,具体的设置略,以上仅为核心模块初始化以及主程序实现部分代码。

四、实验运行结果

实验运行结果:

在设置断点处设置断点,下载进实验板后点一直运行,麦克风输入声音,由于原

来数据保存于AUTIODATALEFT,滤波后数据保存于AUTIODATARIGHT,所以可以在CCS

软件中打开图形观察窗口监视动态变化,开两个窗口,观察基地址分别对应

AUTIODATALEFT(0x0d000),AUTIODATARIGHT(0x17000),取一个输入点停止运行

截得各个部分的频域图和时域图分别如下:

图1带噪声声波时域图

图2滤波后声波时域图

图3带噪声声波频域图

图4滤波后声波频域图

五、实验心得

虽然本科是学习过这门课程但是由于一些原因学的很粗糙,这学期通过学习DSP这门课程,让我加深了对DSP的了解,让我进一步熟悉了CCS开发环境以及设计运行调试过程,认识到AIC23语音芯片和I2C协议以及MCBSP模块的各个工作原理以及三者之间的关系,学会对模块的初始化怎么定义和编写的流程。

使我对DSP产生了浓厚的兴趣,激发了我学习DSP的积极性,从这次实验结果上来说,清晰的结果使我对书本上的知识应用到了实验中,很满足。

该实验通过FIR滤波器滤波后把噪声滤除掉了,从时域图来看,原来的带有毛刺的音频波形滤波后变得平滑,从频域图来看,噪声所在的频域段基本上被滤除掉。

实验的成功离不开老师、师兄、师姐的耐心指导!

在这里谢谢老师、师兄、师姐的教导!

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

当前位置:首页 > 医药卫生 > 基础医学

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

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