dsp课设报告姚晗.docx
《dsp课设报告姚晗.docx》由会员分享,可在线阅读,更多相关《dsp课设报告姚晗.docx(21页珍藏版)》请在冰豆网上搜索。
dsp课设报告姚晗
课程设计报告
名称DSP原理与应用课程设计
题目信号采集和滤波DSP程序设计
指导教师潘建军/沈冰夏
设计起止日期2015-11-16至2015-12-18
学院信息与通信工程学院
专业电子信息工程
学生姓名姚晗
班级/学号电信1303/2013011053
成绩
目录
第一章概述………………………………………………………………………………3
1.1课程设计目的和要求……………………………………………………………3
1.2课程设计所用设备………………………………………………………………3
第二章课程设计原理…………………………………………………………………7
2.1A/D原理…………………………………………………………………………7
2.2FIR滤波器设计原理……………………………………………………………8
第三章FIR数字低通滤波器的MATLAB设计……………………………………9
3.1采用MATLAB设计FIR滤波器…………………………………………………9
第四章ADC信号采集和滤波DSP程序设计……………………………………10
4.1基本步骤…………………………………………………………………………10
4.2实验结果…………………………………………………………………………10
结束语………………………………………………………………………………………13
参考文献……………………………………………………………………………………14
附录程序源代码…………………………………………………………………………15
第一章概述
1.1课程设计目的和要求
1.掌握TMS320VC5509A片内模数转换器(ADC)的控制方法
2.掌握TIDSP系统的软件开发
3.设计TMS320VC5509ADSP系统的AD采集程序
4.采用MATLAB设计FIR滤波器
5.对采集的信号进行FIR滤波
6.掌握C语言和汇编语言的混合编程
1.2课程设计所用设备
1.计算机:
安装软件开发工具CCStudiov3.3,完成系统的软件开发,进行硬件仿真调试,MATLAB。
2.ICETEK–VC5509-AG-EDU实验箱:
包括
a)信号源
b)实现硬件仿真调试时与硬件系统的通信、控制和读取硬件系统状态和数据的开发系统(ICETEK5100-USB仿真器模块)
c)提供软件运行和调试的平台和用户系统开发的参照的评估模块(ICETEKVC5509-A)
第二章课程设计原理
(一)A/D原理
1.模数转换器结构和时序
在数字信号处理器的具体应用中往往需要采集一些模拟信号量,如电池电压、面板旋钮输入值等,模数转换器就是用来将这些模拟量转化为数字量来供DSP使用。
TMS320VC5507/5509片内模拟-数字转换器(ADC)方框图如图1所示。
TMS320VC5509A有三种封装,本次课程设计所用瑞泰创新公司生产的TMS320VC5509ADSP系统的评估板上焊接了144管脚薄型四方扁平封装的TMS320VC5509A(PGE后缀)。
本课程设计所使用的TMS320VC5509ADSP只能同时支持两路的信号采集。
TMS320VC5509APGE的片内模数转换器支持两路输入,管脚分别为AIN0和AIN1。
片内ADC具有如下特性:
●带内置采样和保持的10位模数转换模块ADC
●最小转换时间为500ns(最大ADC转换时钟为2MHz)
●最大采样率为21.5kHz(最小采样周期:
1000000/(21.5k)=46.51163μs)
图1ADC方框图
模数转换器采用连续逼近式结构,在模数转换器内部用了三个可编程分频器来灵活地产生用户需要的采样率。
整个模数转换过程分为两个周期——采样/保持周期及转换周期,如图2所示。
(1)采样/保持周期是采样/保持电路采集模拟信号的时间,这个周期大于或等于40μs;
(2)转换周期是RC比较网络在一次采样中完成逼近处理并输出A/D转换结果的时间,这需要13个转换时钟周期。
ADC转换时钟的最大频率为2MHz。
图2转换时序图
●模数转换模块接到启动转换信号后,按照设置开始进行相应通道的数据采样转换。
●经过一个采样时间的延迟后,将采样结果放入AD数据寄存器中保存。
●转换结束,设置标志。
●等待下一个启动信号。
由于TMS320VC5509ADSP片内的A/D转换精度是10位的,ADC数据寄存器(16位)的最高位(第15位)表示转换值是否有效(0有效),第14-12位表示转换的通道号,第11-10位为保留字段,低10位为转换数值,所以在保留时应注意取出结果的低10位,再根据高4位进行相应保存。
2.模数转换器的寄存器
模数转换器的寄存器包括ADC控制寄存器(ADCCTL)、ADC数据寄存器(ADCDATA)、ADC时钟分频寄存器(ADCCLKDIV)和ADC时钟控制寄存器(ADCCLKCTL)。
表1模数转换器(ADC)的寄存器
WORD
ADDRESS
REGISTERNAME
DESCRIPTIONRESET
VALUE†
0x6800
ADCCTL[15:
12]
ADCControlRegister
0111000000000000
0x6801
ADCDATA[15:
0]
ADCDataRegister
0111000000000000
0x6802
ADCCLKDIV[15:
0]
ADCFunctionClockDividerRegister
0000000000001111
0x6803
ADCCLKCTL[8:
0]
ADCClockControlRegister
0000000000000111
†Hardwarereset;xdenotesa“don’tcare.”
●ADC控制寄存器(ADCCTL):
发送转换通道号和启动命令,然后循环等待转换结果,最后将结果保存。
表2ADC控制寄存器ADCCTL
位
字段
数值
说明
15
ADCSTART
0
1
转换开始位
无效
转换开始。
在转换结束后,如果ADCSTART位不为高,模数转换器自动进入关电模式
14-12
CHSELECT
000
001
010
011
100-111
选择模拟输入通道
选择AIN0通道
选择AIN1通道
选择AIN2通道(BGA封装)
选择AIN3通道(BGA封装)
所有通道关闭
11-0
Reserved
保留,读时总为0
●ADC数据寄存器(ADCDATA):
只读寄存器,显示AD转换是否正在进行中以及通道号,存放采样数据。
表3ADC数据寄存器ADCDATA
位
字段
数值
说明
15
ADCBUSY
0
1
模数转换标志位:
采样数据已存在
正在转换之中,在ADCSTART置为1后,ADCBUSY变为1,直到转换结束
14-12
CHSELECT
000
001
010
011
100-111
标志采集数据的通道
AIN0通道
AIN1通道
AIN2通道(BGA封装)
AIN3通道(BGA封装)
保留
11-10
Reserved
保留,读时总为0
9-0
ADCDATA
模数转换数据字段。
存放模拟信号的10位转换结果
●ADC时钟分频寄存器(ADCCLKDIV):
显示转换时钟的分频值和采样保持时间。
表4ADC时钟分频寄存器ADCCLKDIV
位
字段
数值
说明
15-8
SAMPTIMEDIV
0-255
采样和保持时间分频字段。
该字段同CONRATEDIV字段一起决定采样和保持周期
ADCSampleandHoldPeriod=
(ADCClockPeriod)×(2×(CONVRATEDIV+1+SAMPTIMEDIV))
7-4
Reserved
保留
3-0
CONRATEDIV
0000-1111
转换时钟分频字段,该字段同SAMPTIMEDIV字段一起决定采样和保持周期
ADCConversionClock=(ADCClock)/(2×(CONVRATEDIV+1))
●ADC时钟控制寄存器(ADCCLKCTL):
存放CPU时钟分频数,并确定是否将ADC置于低功耗状态。
表5ADC时钟控制寄存器ADCCLKCTL
位
字段
数值
说明
15-9
Reserved
保留
8
IDLEEN
0
1
模数转换器时钟使能位
时钟使能
在运行休眠指令时时钟停止
7-0
CPUCLKDIV
0-255
系统时钟分频字段
ADCClock=(CPUClock)/(CPUCLKDIV+1)
(二)FIR滤波器设计原理
本设计要求设计FIR低通或高通滤波器。
低通滤波器的幅度响应和性能如图3所示。
图3低通滤波器的幅度响应和性能
ωp为通带截止频率,ωs为阻带截止频率,ωc为截止频率。
δp峰值通带波纹。
δs为最小阻带衰减。
有限冲激响应数字滤波器设计详细的基础理论参考相关书籍。
(三)FIR滤波的DSP程序设计
FIR滤波器输出y(n)是输入数据和系数的卷积和。
任何时候进行计算,都需要把数据和相对应的系数相乘,再累加到输出结果中。
FIR滤波器中,输入信号在每个采样时间T过后都发生改变。
也就是说,x(n)将在T时候过后,成为x(n-1),然后是x(n-2),……,直到该数据被抛弃。
利用公式计算本次实验AD采样频率
DSP的CPU周期选择为135MHz,采样/保持周期为45μs
ADCClock=(CPUClock)/(CPUCLKDIV+1)=135MHz/36=3.75MHz,则CPUCLKDIV=35
ADCConversionClock=(ADCClock)/(2×(CONVRATEDIV+1))=3.75MHz/2=1.875MHz
ADC转换时间=13×(1/ADCConversionClock)=13×(1/(1.875MHz))=6.933μs
ADC整个转换时间=45μs+6.933μs=51.933μs
采样率=1000000/51.933=19.255kHz<21.5kHz满足设计要求
第三章FIR数字低通滤波器的MATLAB设计
1.采用MATLAB设计FIR滤波器
采用MATLAB设计FIR低通或高通滤波器并导出滤波器系数。
技术指标按照1中的设计要求自行确定,应确定的设计指标包括:
通带截止频率、阻带截止频率、峰值通带波纹、最小阻带衰减和采样频率。
得到32位单精度浮点和Q15格式的FIR滤波器系数。
显示FIR滤波器的幅频响应,要求幅频响应满足设计指标。
利用滤波器设计与分析工具设计滤波器,可以方便的得到所需的滤波器。
该方法按照如下步骤来实现:
⏹在MATLAB的CommandWindow下键入fdatool,打开MATLAB的滤波器设计与分析工具。
⏹在滤波器对话框中设置滤波器参数,Fs=19255Hz,Fpass=1000Hz,Fstop=2000Hz。
⏹幅度规格分贝单位缺省Astop为80,相当于线性单位阻带波纹Dstop为0.0001,减小Astop可以减小滤波器的长度。
⏹单击“DesignFilter”按钮,显示出滤波器的幅度响应。
⏹在“Targets”菜单,选择“GenerateCHeader…”子菜单,在“GenerateCHeader”对话框中设置变量名和数据类型,单击“Generate”按钮即可将滤波器参数输出到指定的文件中。
⏹32位单精度浮点输出选择Single-precisionfloat。
⏹Q15定点格式输出选择Signed16-bitinterger。
图4MATLAB设计出的低通滤波器的幅度响应
第四章ADC信号采集和滤波DSP程序设计
1.基本步骤
将4中设计的32位单精度浮点FIR滤波器系数导入DSP程序。
编写和调试DSPFIR滤波的浮点实现C函数,对输入信号进行移位,通过卷积对输入的信号。
利用设计的滤波器系数,调用DSPFIR滤波的浮点实现C函数,实现对输入的两路信号的滤波。
加载程序,设置断点,选择菜单View→Graph→Time/Frequency显示采集信号和滤波后信号的时域和频域图形。
将TI的DSPLIBfir2函数的汇编源代码文件fir2.asm添加到工程中。
该函数为利用双MAC手工优化、Q15定点汇编实现FIR滤波,效率大大提高。
该函数输入信号、滤波器的系数均为Q15的定点,故需将4中设计的Q15定点格式FIR滤波器系数导入DSP程序。
C语言程序调用fir2函数,实现对输入的两路信号的滤波。
加载、调试程序,显示滤波结果。
重新加载程序,选择菜单命令Profile→Setup,开始新的剖析会话。
鼠标点击“Enable/DisableProfiling”按钮使能剖析,鼠标点击“Enable/DisableAllFunctions”按钮使能所有函数。
选择菜单Profile→Viewer,按F5运行程序,显示剖析结果,比较C语言的浮点实现。
2.实验结果
图5AD信号采集两路正弦信号
图6两路信号混叠时域图及32位单精度浮点输出频域图
图7两路信号混叠时域图及Q15定点格式输出频域图
图8混叠信号低通滤波后时域图及Q15定点格式频域图
图9混叠信号低通滤波后时域图及32位单精度浮点频域图
图9nADC0,nADC1时域图显示参数设置
图10混叠信号Q15定点格式输出频域时域图显示参数设置
结束语
通过本次实验我掌握了TMS320VC5509A片内模数转换器(ADC)的控制方法,也初步掌握了TIDSP系统的软件开发,本次实验成功采用MATLAB设计出了FIR数字低通滤波器,并且成功对采集的信号进行了FIR滤波。
本次实验运用了C语言和汇编语言的混合编程,也复习了c语言中的相关知识。
本次实验也暴露出了我在学习上的一些问题,首先是数字信号处理这门课程的学习不够到位,有许多知识点还未学到位,有很多地方只是似懂非懂,在实验的过程中很多时候需要问老师同学得到解决。
同时c语言掌握的也不好,以后的学习过程需要脚踏实地一步一个脚印。
参考文献
[1]汪春梅,孙洪波.TMS320C55xDSP原理及应用(第3版).北京:
电子工业出版社,2011.
[2]TexasInstrumentsIncorporated.TMS320VC5507/5509DSPAnalog-to-DigitalConverter(ADC)ReferenceGuide[OL].TexasInstrumentsIncorporated,SPRU586B,2004..
[3]TexasInstrumentsIncorporated.TMS320VC5509AFixed-PointDigitalSignalProcessor.TexasInstrumentsIncorporated,SPRS205K,2008..
[4]DSP原理与应用课程讲义.
[5]瑞泰创新公司.ICETEK–VC5509-A评估板硬件使用指导V3.1.北京:
瑞泰创新公司,2013.
[6]瑞泰创新公司.ICETEK-VC5509-A-USB-EDU教学实验系统使用指导V3.1.北京:
瑞泰创新公司,2013.
[7]瑞泰创新公司.ICETEK–VC5509-A-USB-EDU教学实验系统软件实验指导V3.1.北京:
瑞泰创新公司,2013.
[8]谭浩强.C程序设计(第三版)[M].北京:
清华大学出版社,2005.
[9]TexasInstrumentsIncorporated.CodeComposerStudioHelp.
[10]TexasInstrumentsIncorporated.TMS320C55xDSPProgrammer’sGuide[OL].TexasInstrumentsIncorporated,SPRU376A,2001..
[11]TexasInstrumentsIncorporated.TMS320C55xOptimizingC/C++CompilerUser’sGuide[OL].TexasInstrumentsIncorporated,SPRU281F,2003..
[12]TexasInstrumentsIncorporated.TMS320C55xDSPPeripheralsOverviewReferenceGuide.TexasInstrumentsIncorporated.SPRU317K,2011..
[13]TexasInstrumentsIncorporated.TMS320C55xDSPLibraryProgrammer’sReference[OL].TexasInstruments,SPRU422J,2000,Revised2013..
[14]SenM.Kuo,BobH.Lee.Real-TimeDigitalSignalProcessingImplementations,ApplicationsandExperimentsWiththeTMS320C55x[M].北京:
清华大学出版社,2003.
[15]焦瑞莉等编著.数字信号处理[M].北京:
机械工业出版社.2011.
附录程序源代码
Main.c
#include"myapp.h"
#include"ICETEK-VC5509-EDU.h"
#include"scancode.h"
voidInitADC();
voidwait(unsignedintcycles);
voidEnableAPLL();
intnADC0[256],nADC1[256];
intmixQ15[256];
floatmixfloat[256];
intFIROUTQ15[256];
intDBBufferQ15[50];
floatBufferfloat[50];
floatFIROUTfloat[256];
constintBhQ15[50]={
9,22,42,69,96,115,116,85,13,
-107,-268,-456,-640,-781,-833,-752,-505,-77,
524,1258,2064,2862,3561,4082,4360,4360,4082,
3561,2862,2064,1258,524,-77,-505,-752,-833,
-781,-640,-456,-268,-107,13,85,116,115,
96,69,42,22,9
};
constfloatBhfloat[50]={
0.000287458417,0.0006711401511,0.001296777162,0.002095081378,0.002920241794,
0.003516058903,0.00353578967,0.002599096159,0.000384017796,-0.003258500714,
-0.008192501962,-0.01391467359,-0.01953443512,-0.02383529581,-0.02542546391,
-0.02296281047,-0.0154193975,-0.002337040845,0.01598187536,0.03839777783,
0.06300126761,0.08732704073,0.1086880341,0.124574326,0.133045882,
0.133045882,0.124574326,0.1086880341,0.08732704073,0.06300126761,
0.03839777783,0.01598187536,-0.002337040845,-0.0154193975,-0.02296281047,
-0.02542546391,-0.02383529581,-0.01953443512,-0.01391467359,-0.008192501962,
-0.003258500714,0.000384017796,0.002599096159,0.00353578967,0.003516058903,
0.002920241794,0.002095081378,0.001296777162,0.0006711401511,0.000287458417
};
main()
{
inti;
unsignedintuWork;
EnableAPLL();
SDRAM_init();
InitADC();
PLL_Init(135);
for(i=0;i<51;i++)
DBBufferQ15[i]=0;
for(i=0;i<51;i++)
Bufferfloat[i]=0;
while
(1)
{
for(i=0;i<256;i++)
{
ADCCTL=0x8000;//启动AD转换,通道0
do
{
uWork=ADCDATA;
}while(uWork&0x8000);
nADC0[i]=uWork&0x0fff;
ADCCTL=0x9000;//启动AD转换,通道1
do
{
uWork=ADCDATA;
}while(uWork&0x8000);
nADC1[i]=uWork&0x0fff;
mixQ15[i]=(nADC0[i]+nADC1[i]-1024)*32;
mixfloat[i]=(float)(nADC0[i]+nADC1[i]-1024)/1024;