基于TMS320F2812-DSP处理器的FIR滤波器的设计与实现.doc
《基于TMS320F2812-DSP处理器的FIR滤波器的设计与实现.doc》由会员分享,可在线阅读,更多相关《基于TMS320F2812-DSP处理器的FIR滤波器的设计与实现.doc(15页珍藏版)》请在冰点文库上搜索。
![基于TMS320F2812-DSP处理器的FIR滤波器的设计与实现.doc](https://file1.bingdoc.com/fileroot1/2023-4/29/5563a449-8f63-47d8-9e9b-85221f023352/5563a449-8f63-47d8-9e9b-85221f0233521.gif)
郑州航空工业管理学院
电子通信工程系
DSP原理及应用课程设计报告
设计题目:
基于TMS320F2812DSP处理器的FIR滤波器的设计与实现
学号:
姓名:
专业:
物联网工程
设计日期:
指导老师:
赵成刘亚王超梁
目录
一、引言
在当今信息时代数字信号处理已成为一门极其重要的学科。
数字信号处理在通信、语音、图像等众多相关领域得到了广泛的应用。
数字信号处理(DSP)包括两重含义:
数字信号处理技术(Digital Signal Processing)和数字信号处理器(Digital Signal Processor)。
数字信号处理(DSP)是利用计算机或专用处理设备,以数值计算的方法、对信号进行采集、滤波、增强、压缩、估值和识别等加工处理,借以达到提取信息和便于应用的目的,其应用范围涉及几乎所有的工程技术领域。
二、在数字信号处理的应用中,数字滤波器很重要而且得到了广泛的应用。
按照数字滤波器的特性,它可以被分为线性与非线性、因果与非因果、无限长冲击响应(IIR)与有限长冲击响应(FIR)等等。
其中,线性时不变的数字滤波器是最基本的类型;IIR 滤波器的特征是具有无限持续时间冲激响应,而FIR滤波器的冲激响应只能延续一定时间,在工程实际中可以采用递归的方式实现也可以采用非递归的方式实现。
三、目前FIR滤波器的实现方法大致可分为三种:
利用单片通用数字滤波器集成电路、DSP器件或者可编程逻辑器件实现。
其中以使用通用DSP芯片实现方式较为简单,是一种实时、快速、特别适合于实现各种数字信号处理运算的微处理器,借助于通用数字计算机按滤波器的设计算法编出程序进行数字滤波计算。
由于它具有丰富的硬件资源、改进的哈佛结构、高速数据处理能力和强大的指令系统而在通信、航空、航天、雷达、工业控制、网络及家用电器等各个领域得到广泛应用 。
二、设计目的
(1)掌握用窗函数法设计FIR滤波器的原理及方法,熟悉线性纤维FIR滤波器的 幅频特性和相频特性,熟悉不同的窗函数对滤波器性能的影响。
(2)掌握使用matlab编程的基本方法,学会利用fdatool 工具来快速设计满足需要的滤波器。
(3)掌握TMS320F2812 DSP处理器开发的程序框架结构,学习驱动TMS320F2812 DSP处理器程序编写并能使其正常工作。
实习驱动ADC模块实现信号的实时采集与模数转换。
(4)掌握使用TMS320F2812 DSP处理器实现FIR数字低通滤波器的设计方法,并能够实时采集输入信号并滤除高频信号再通过SCI串口传输到计算机显示。
三、设计要求
1、利用Matlab软件的FDATool工具设计FIR滤波器,并提取滤波器参数;
2、在CCS集成开发环境下,利用第1步得到的滤波器参数,利用窗函数法设计FIR滤波器程序,观察输入信号及滤波后得到的输出信号的时域波形及FFT Magnitude波形;
3、利用TMS320F2812的ADC片内外设的外围电路实时采集的混频信号数据,使用1个51阶的FIR低通滤波器,在CCS中设计FIR滤波器程序实现滤波,观察相关波形及滤波效果,通过SCI接口将数据传送到计算机上;
4、(选做)利用TI公司的TLV320AIC23高性能立体声音频Codec芯片,通过MIC或音频接口采样音频信号,对采样的音频信号做滤波运算,进行低音加重处理,再将运算过的音频数据通过扬声器播放出来
四、总体设计
4.1利用Matlab软件的FDATool工具设计FIR滤波器
4.1.1有限冲击响应数字滤波器的基础理论
滤波器就是在时间域或频域内,对已知激励产生规定响应的网络,使其能够从信号中提取有用的信号,抑制并衰减不需要的信号。
滤波器的设计实质上就是对提出的要求给出相应的性能指标,再通过计算,使物理可实现的实际滤波器频率响应特性逼近给出的频率响应特性。
FIR 数字滤波器系统的传递函数为:
å-=-==1
0
)()()(H(z)NnnznbzXzY
(1)
由此得到系统的差分方程:
))1(()1()1()1()()0()(-*-+××××××+-*+*=NnxNbnxbnxbny
(2) 若FIR 数字滤波器的单位冲激响应序列为h(n),它就是滤波器系数向量b(n)。
传统的滤波器分析与设计均使用繁琐的公式计算,改变参数后需要重新运算,从而在分析与设计滤波器尤其是高阶滤波器时工作量特别大。
这里应用MATLAB 设计FIR滤波器,根据给定的性能指标设计一个H(z),使其逼近这一指标,进而计算并确定滤波器的系数b(n),再将所设计滤波器的幅频响应、相频响应曲线作为输出,与设计要求进行比较,对设计的滤波器进行优化。
设计完成之后将得到FIR滤波器的单位冲激响应序列h(n)的各个参数值。
4.1.2利用Matlab软件的FDATool设计FIR滤波器
(1) 首先在命令窗口键入FDAtool命令,启动滤波器设计分析器,调出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(为采样频率)、fc (为通带截止
频率)中分别键入30000 Hz和9600 Hz。
(5) 点击“Design Filter”按钮,完成滤波器的设计。
具体参数及设计成功后的结
果如下图所示。
FIR低通滤波器设计(6) 通过菜单选项Analysis 来分析滤波器的幅频响应和相频响应特性。
点击
Analysis 中的Magnitude Response和Phase Response 对幅频和相频响应进行分析。
如下图所示
幅频和相频响应进行分析
(7) 在FDATool 中,选择Targets -> Generate C Header...,单击Generate按钮,
选择路径,即可输出前一步设计出的 FIR滤波器的系数表。
(默认的系数表文件为fdacoefs.h。
如下图所示。
导出滤波器系数
(8) 在Matlab中打开得到的fdacoefs.h的文件,如下图所示
从Matlab中打开的fdacoefs.h文件
4.1.3提取滤波器参数
取系数表中的数据小数点后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.2CCS环境下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工程,打开的CCS集成开发环境如下图所示。
在CCS集成开发环境中打开工程
4.2.3观察滤波前后的信号的时域波形及FFTMagnitude波形
(1)编译工程文件生成fir.out文件,并通过File->Load Program„装载该文件。
(2)设置波形时域观察窗口。
选择菜单View→Graph→Time/Frequency„ ,分别进行如下图所示进行设置以便观
察输入/输出时域波形。
输入数据频域波形观察 输出数据频域波形观察 (3)设置断点。
在程序fir.c中,有注释断点的语句上设置软件断点。
(4)运行并观察结果。
选择Debug菜单的Run项,或按F5键运行程序。
观察到的图形如下图所示。
滤波前后的数据波形及FFT分析的对比图
4.2.4程序清单
fir.c 程序
//#include "DSP281x_Device.h" // DSP281x Headerfile Include File //#include "DSP281x_Examples.h" // DSP281x Examples Include File //#include "f2812a.h" #include"math.h" #define FIRNUMBER 25 //#define SIGNAL1F 1000 //#define SIGNAL2F 4500 //#define SAMPLEF 10000 #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{
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 fSum+=(fXn[i]*fHn[i]); }
return(fSum); }
fir.cmd 程序
-l rts2800_ml.lib-stack 400h -heap 100 MEMORY {
PAGE 0 :
PROG(R) :
origin = 0x80000, length = 0x10000 PAGE 0 :
BOOT(R) :
origin = 0x3FF000, length = 0xFC0 PAGE 0 :
RESET(R) :
origin = 0x3FFFC0, length = 0x2 /*PAGE 0 :
VECTORS(R) :
origin = 0x3FFFC2, length = 0x3E*/ PAGE 1 :
M0RAM(RW) :
origin = 0x000000, length = 0x400 PAGE 1 :
M1RAM(RW) :
origin = 0x000400, length = 0x400 PAGE 1 :
L0L1RAM(RW) :
origin = 0x008000, length = 0x2000 PAGE 1 :
H0RAM(RW) :
origin = 0x3F8000, length = 0x2000 }
SECTIONS {
/* 22-bit program sections */ .reset :
> RESET, PAGE = 0 /*vectors :
> VECTORS, PAGE = 0*/ .pinit :
> PROG, PAGE = 0 .cinit :
> PROG, PAGE = 0 .text :
> PROG, PAGE = 0 /* 16-Bit data sections */ .const :
> L0L1RAM, PAGE = 1 .bss :
> L0L1RAM, PAGE = 1 .stack :
> M1RAM, PAGE = 1 .sysmem :
> M0RAM, PAGE = 1 /* 32-bit data sections */ .ebss :
> H0RAM, PAGE = 1 .econst :
> H0RAM, PAGE = 1 .esysmem :
> H0RAM, PAGE = 1
}
4.3对实时采样信号进行滤波的FIR滤波器的实现
4.3.1程序清单
#include "DSP281x_Device.h" // DSP281x Headerfile Include File #include "DSP281x_Examples.h" // DSP281x Examples Include File #include #define pi 3.1415927 int px[256]; int py[256];
double npass,h[51], x, y, xmid[51]; int m=50; int n=256;
// Prototype statements for functions found within this file. interrupt void adc_isr(void);
// Global variables used in this example:
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;
// PLL, WatchDog, enable Peripheral Clocks
// This example function is found in the DSP281x_SysCtrl.c file. InitSysCtrl();
// For this example, set HSPCLK to SYSCLKOUT / 6 (25Mhz assuming 150Mhz SYSCLKOUT)
EALLOW;
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;
// PLL, WatchDog, enable Peripheral Clocks
// This example function is found in the DSP281x_SysCtrl.c file. InitSysCtrl();
// For this example, set HSPCLK to SYSCLKOUT / 6 (25Mhz assuming 150Mhz SYSCLKOUT)
EALLOW;
4.3.2测试效果
如上图所示,可以发现使用DSP芯片实现的的FIR滤波器已经成功的将设定的混合频率信号中的高频部分
五、总结
DSP技术一般指将DSP 处理器用于完成数字信号处理的方法与技术。
目前的DSP芯片以其强大的数据处理功能在通信和其他信号处理领域得到广泛注意并已成为开发应用的热点技术。
许多领域对于数字信号处理器的应用都是围绕美国TI公司所开发的DSP处理器进行的。
DSP芯片是一种特别适合于进行数字信号处理运算的微处理器。
主要应用是实时快速的实现各种数字信号处理算法,如卷积及各种变换等。
这次我们所做的利用DSP芯片来实现数字滤波器就是一项很重要的应用,这一次的课程设计主要讨论基于TI公司TMS320F2812 DSP芯片的滤波器系统软件实现方法,用Blackman窗函数设计实现FIR滤波器,利用MATLAB中的FDAtool滤波器设计分析器设计符合要求的FIR滤波器并生成fdacoefs.h文件提取相关参数。
并在以TI TMS320F2812为微处理器的EXPIV型实验箱上实现,实验仿真结果、实时数据采集及ADC转换滤波滤波均表明滤波后能够得到比较光滑时域/频域波形,滤波结果效果良好达到了预期的性能指标要求。
六、参考文献
1. 《DSP原理与应用技术》 王忠勇 陈恩庆 编著 电子工业出版社
2. 《基于DSP的FIR滤波器的设计与实现》 长沙理工大学
3. 《数字信号处理教程》 程佩清 编著 清华大学出版社
4. 《Matlab/Simulink通信系统建模与仿真实例分析》 清华大学出版社