DSP课程设计报告

郑州航空工业管理学院

电子通信工程系

DSP原理及应用课程设计报告

设计题目:基于TMS320F2812 DSP处理器的FIR滤波器的设计与实现

学 号: ...

姓 名: ....

专 业: 电 子 信 息 工 程

设计日期: 20XX年6月13日

指导老师: ......

目 录

一、引言

二、设计目的

三、设计要求

四、总体设计

4.1利用Matlab软件的FDATool工具设计FIR滤波器

4.1.1有限冲击响应数字滤波器的基础理论

4.1.2 利用Matlab软件的FDATool设计FIR滤波器

4.1.3提取滤波器参数

4.2 CCS环境下FIR滤波器的设计及软件仿真

4.2.1 程序流程图

4.2.2 在CCS集成开发环境下新建FIR滤波器工程

4.2.3观察滤波前后的信号的时域波形及FFT Magnitude波形

4.2.4 程序清单

4.3 对实时采样信号进行滤波的FIR滤波器的实现

4.3.1 程序清单

4.3.2 测试效果

4.3.3 SCI串行数据传输

五、总结

六、参考文献

基于TMS320F2812 DSP处理器的FIR滤波器的设计与实现

一、引言

数字信号处理(DSP)包括两重含义:数字信号处理技术(Digital Signal Processing )和数字信号处理器( Digital Signal Processor )。在数字信号处理的基本方法中,滤波是应用非常广泛的一个环节,数字滤波器的理论与相关设计也一直都是人们研究的重点之一。数字滤波器根据其单位冲击响应函数的时域特性可分为两类:无限冲击响应(Infinite Impulse Response,IIR)滤波器和有限冲击响应(Finite Impulse Response,FIR)滤波器。与 IIR滤波器相比,FIR的实现是非递归的。

使用通用DSP芯片实现滤波方式较为简单,是一种实时的,快速的,特别适合于实现各种数字信号处理运算的微处理器,借助于通用数字计算机按滤波器的设计算法编出程序进行数字滤波计算。由于它具有丰富的硬件资源,改进哈弗结构,高速数据处理能力和强大的指令系统而在很多领域得到广泛应用。

二、设计目的

1、掌握用窗函数法设计FIR滤波器的原理及方法,掌握使用matlab编程的基本方法。

2、掌握TMS320F2812 DSP处理器开发的程序框架结构,学习驱动TMS320F2812 DSP处理器程序编写并能使其正常工作。实习驱动ADC模块实现信号的实时采集与模数转换。

3、掌握使用TMS320F2812 DSP处理器实现FIR数字低通滤波器的设计方法,并能够实时采集输入信号并滤除高频信号再通过SCI串口传输到计算机显示。

三、设计要求

1、利用Matlab软件的FDATool工具设计FIR滤波器,并提取滤波器参数;

2、在CCS集成开发环境下,利用第1步得到的滤波器参数,利用窗函数法设计FIR滤波器程序,观察输入信号及滤波后得到的输出信号的时域波形及FFT Magnitude波形;

3、利用TMS320F2812的ADC片内外设的外围电路实时采集的混频信号数据,使用1个51阶的FIR低通滤波器,在CCS中设计FIR滤波器程序实现滤波,观察相关波形及滤波效果,通过SCI接口将数据传送到计算机上。

四、总体设计

4.1利用Matlab软件的FDATool工具设计FIR滤波器

4.1.1有限冲击响应数字滤波器的基础理论

滤波器就是在时间域或频域内,对已知激励产生规定响应的网络,使其能够从信号中提取有用的信号,抑制并衰减不需要的信号。滤波器的设计实质上就是对提出的要求给出相应的性能指标,再通过计算,使物理可实现的实际滤波器频率响应特性逼近给出的频率响应特性。FIR 数字滤波器系统的传递函数为:

(1)

由此得到系统的差分方程:

(2)

若FIR 数字滤波器的单位冲激响应序列为h(n),它就是滤波器系数向量b(n)。传统的滤波器分析与设计均使用繁琐的公式计算,改变参数后需要重新运算,从而在分析与设计滤波器尤其是高阶滤波器时工作量特别大。这里应用MATLAB 设计FIR滤波器,根据给定的性能指标设计一个H(z),使其逼近这一指标,进而计算并确定滤波器的系数b(n),再将所设计滤波器的幅频响应、相频响应曲线作为输出,与设计要求进行比较,对设计的滤波器进行优化。设计完成之后将得到FIR滤波器的单位冲激响应序列h(n)的各个参数值。

4.1.2 利用Matlab软件的FDATool设计FIR滤波器

(1) 打开Matlab软件,首先在命令窗口键入FDAtool命令,启动滤波器设计分析器,调出FDAtool界面.

(2) 在Filter Type选项中选Lowpass,在Design Method中选择FIR滤波器,接着在FIR中选择Window (窗函数) 法。

(3) 然后在Filter Order 中选择Specify Order (为指定阶数),输入数值为“24”;在Opitions框中选中“Scale Passband”;在窗类型(Window:)下拉框选择“Blackman”。

(4) 在Frenquency Specification选项中,将fs(为采样频率)、fact (为通带截止频率)中分别键入30000 Hz和9600 Hz。

(5) 点击“Design Filter”按钮,完成滤波器的设计。具体参数及设计成功后的结果如图所示。

设计完成后,可以通过菜单选项Analysis 来分析滤波器的幅频响应和相频响应特性。点击Analysis 中的Magnitude Response和Phase Response 对幅频和相频响应进行分析。

4.1.3提取滤波器参数

(6) 在FDATool 中,选择Targets -> Generate C Header..., 如图设置后,点击Generate按钮,选择路径,即可输出前一步设计出的FIR滤波器的系数表。默认的系数表文件为fdacoefs.h。

(7) 在Matlab中打开得到的fdacoefs.h的文件,系数表如图

(8) 取系数表中的数据小数点后3位有效值,得到如下内容:

const float B[25]= { 0.0,0.0,0.001,-0.002,-0.002,0.01,-0.009,

-0.018,0.049,-0.02,-0.11,0.28,0.64,0.28,

-0.11,-0.02,0.049,-0.018,-0.009,0.01,

-0.002,-0.002,0.001,0.0,0.0 };

4.2 CCS环境下FIR滤波器的设计及软件仿真

4.2.1 程序流程图如下

4.2.2 在CCS集成开发环境下新建FIR滤波器工程

(1)设置软件仿真模式,启动CCS。

(2)建立一个文件夹,存放在D:\FIR,将D:\课程设计\FIR滤波器\Fir源程序文件夹下的工程全部复制到D:\FIR,在CCS中打开D:\FIR\fir\fir.pjt工程,打开fir.c文件,编译生成fir.out文件,通过File->Load Program…装载该文件。

(3)设置波形时域观察窗口,选择菜单View→Graph→Time/Frequency… ,如图设置

输入数据时域波形观察

滤波后输出波形观察

(4)设置频域观察窗口,选择菜单View→Graph→Time/Frequency… ,分别进行如图设置

输入数据FFT分析图形观察

滤波后输出数据的FFT图形观察

4.2.3观察滤波前后的信号的时域波形及FFT Magnitude波形

(1)设置断点。在程序fir.c中,有注释断点的语句上设置软件断点。

(2)运行并观察结果。选择Debug菜单的Run项,或按F5键运行程序。观察到的图形如下图所示。

4.2.4 程序清单

#include"math.h"

#define FIRNUMBER 25

#define PI 3.1415926

float InputWave();

float FIR();

float fHn[FIRNUMBER]={ 0.0,0.0,0.001,-0.002,-0.002,0.01,-0.009,

-0.018,0.049,-0.02,-0.11,0.28,0.64,0.28,

-0.11,-0.02,0.049,-0.018,-0.009,0.01,

-0.002,-0.002,0.001,0.0,0.0

};

float fXn[FIRNUMBER]={ 0.0 };

float fInput,fOutput;

float fSignal1,fSignal2;

float fStepSignal1,fStepSignal2;

float f2PI;

int i;

float fIn[256],fOut[256];

int nIn,nOut;

main(void)

{

nIn=0; nOut=0;

f2PI=2*PI;

fSignal1=0.0;

fSignal2=PI*0.1;

fStepSignal1=2*PI/30;

fStepSignal2=2*PI*1.4;

while ( 1 )

{

fInput=InputWave();

fIn[nIn]=fInput;

nIn++; nIn%=256;

fOutput=FIR();

fOut[nOut]=fOutput;

nOut++;

if ( nOut>=256 )

{

nOut=0; /* 请在此句上设置软件断点 */

}

}

}

float InputWave()

{

for ( i=FIRNUMBER-1;i>0;i-- )

fXn[i]=fXn[i-1];

fXn[0]=sin(fSignal1)+cos(fSignal2)/6.0;

fSignal1+=fStepSignal1;

if ( fSignal1>=f2PI ) fSignal1-=f2PI;

fSignal2+=fStepSignal2;

if ( fSignal2>=f2PI ) fSignal2-=f2PI;

return(fXn[0]);

}

float FIR()

{

float fSum;

fSum=0;

for ( i=0;i<FIRNUMBER;i++ )

{

fSum+=(fXn[i]*fHn[i]);

}

return(fSum);

}

4.3 对实时采样信号进行滤波的FIR滤波器的实现

4.3.1 程序清单

#include "DSP281x_Device.h"

#include "DSP281x_Examples.h"

#include <math.h>

#define pi 3.1415927

int px[256];

int py[256];

double npass,h[51], x, y, xmid[51];

int m=50;

int n=256;

interrupt void adc_isr(void);

Uint16 LoopCount;

Uint16 ConversionCount;

void firdes(int m, double npass)

{

int t;

for (t=0; t<=m; t++)

{

h[t] = sin((t-m/2.0)*npass*pi)/(pi*(t-m/2.0));

}

if (t=m/2) h[t]=npass;

}

void main(void)

{

int xm,ym;

double fs,fstop,r,rm;

int i,j,p,k;

InitSysCtrl();

EALLOW;

SysCtrlRegs.HISPCP.all = 0x3; // HSPCLK = SYSCLKOUT/6

EDIS;

DINT;

InitPieCtrl();

IER = 0x0000;

IFR = 0x0000;

InitPieVectTable();

EALLOW;

PieVectTable.ADCINT = &adc_isr;

EDIS;

InitAdc();

PieCtrlRegs.PIEIER1.bit.INTx6 = 1;

IER |= M_INT1;

EINT;

ERTM;

LoopCount = 0;

ConversionCount = 0;

AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;

AdcRegs.ADCMAXCONV.all=0x0000; AdcRegs.ADCCHSELSEQ1.bit.CONV00=0x4; AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=1; AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;

EvaRegs.T1CMPR=0x0380;

EvaRegs.T1PR=0x07FF;

EvaRegs.GPTCONA.bit.T1TOADC = 1;

EvaRegs.T1CON.all = 0x1042;

k=0;

fs = 250000;

fstop = 20000;

npass = fstop/fs;

for (i=0; i<=m; i++)

{

xmid[i]=0;

}

for(;;)

{

firdes(m, npass);

for (i=0; i<=n-1; i++)

{

xm = px[i];

x = xm/1023.0;

for (p=0; p<=m; p++)

{

xmid[m-p] = xmid[m-p-1];

}

xmid[0] = x;

r = 0;

rm= 0;

for (j=0; j<=m; j++)

{

r = xmid[j] * h[j];

rm = rm + r;

}

y = rm;

ym = (int)(1023.0 * y);

py[i] = ym;

}

k++; //加断点,观察波形

}

}

interrupt void adc_isr(void)

{

px[ConversionCount] = AdcRegs.ADCRESULT0 >>4;

if(ConversionCount == 256)

{

ConversionCount = 0;

}

else ConversionCount++;

AdcRegs.ADCTRL2.bit.RST_SEQ1=1; AdcRegs.ADCST.bit.INT_SEQ1_CLR=1; PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;

return;

}

4.3.2 测试效果

如图所示

靠上的是滤波前时域波形,下面的是滤波后时域波形

分别为滤波前和滤波后的FFT分析图形

4.3.3 SCI串行数据传输

1、pc机采用串口调试工具软件,将PC机键盘的输入发送给DSP,DSP收到PC机发来的数据后,回送同一数据给PC机。

2、实验板使用串口通信电缆,启动串口调试助手.exe,设置数据格式为1位停止位,无奇偶校验,8位数据输出,串口波特率为9600bit/s。

支持ASCII码和十六进制数据格式的发送和接收。

五、总结

通过这次课程设计,我学到了很多知识并且巩固了以前所学的很多软件和课程。DSP不同于以前的单片机,它采用了多组总线技术实现并行运行机制,从而极大地提高了运算速度,也提供了非常灵活的指令系统。通过这次课程设计使我对dsp有了更深入的了解,我不仅对以前所学的知识有了较深刻的理解,而且动手能力、独立解决问题的能力有所提高。熟练地运用Matlab工具设计滤波参数,很好的加深了我对课程的理解,方便我的思维。这次设计使我了解了MATLAB的使用方法,学会分析滤波器的优劣和性能,提高了分析和动手能力。

我也非常感谢老师的悉心指导,对报告的书写格式及内容,老师多次帮助分析思路,开拓视角。为以后的学习和就业奠定一定基础。

六、参考文献

[1] 赵成 DSP原理与应用

[2] 《数字信号处理教程》 程佩清 编著 清华大学出版社

[3] 《基于DSP的FIR滤波器的设计与实现》 长沙理工大学

相关推荐