根据构成滤波器的电路性质,滤波器可分为有源滤波器和无源滤波器;根据滤波器所处理的信号性质,可分为模拟滤波器和数字滤波器等等。
1.3DSP芯片的发展及应用
从80年代至今的十多年中,DSP芯片在运算速度、运算精度、制造工艺、芯片成本、体积、工作电压、重量和功耗方面取得了划时代的发展,开发工具和手段不断完善。
DSP芯片有着非常快的运算速度,使许多基于DSP芯片的实时数字信号处理系统得以实现。
目前,DSP芯片已应用在通信、自动控制、航天航空及医疗领域,取得了相当的成果。
在载人航天领域,基于DSP芯片的技术具有广阔的应用前景。
2方案选择
2.1FIR滤波器
数字滤波器用于改变输入信号X(n)的频谱特性以满足某种特定的设计要求。
一个因果的数字滤波器可以用它的单位冲激响应h(n)、传输函数H(z)或者差分方程来表达。
其中单位冲激响应和传输函数描述了系统的时域和频域性质,差分方程则反映了实现该滤波器所需的运算。
一个线性时不变因果滤波器可以用式
(1)的差分方程描述:
如果1≤k≤N时,ak=0,则:
这就是一个M阶的FIR滤波器,是非递归运算。
2.2基于DSP实现FIR的优点
本设计所采用的TMS320C5000采用改进的哈佛结构,具有以下优点:
具有高度并行性和专用硬件逻辑的CPU设计,芯片性能大大提高;哈佛结构不同于传统的冯·诺依曼(VonNeuman)结构的并行体系结构,其程序存储器和数据存储器是相互独立的存储器,每个存储器独立编址,独立访问。
系统中设置了1组程序总线和3组数据总线及4组地址总线,从而使数据的吞吐率大大提高。
基于此,本设计设计了FIR数字滤波器,着重介绍FIR滤波器设计及DSP中FIR滤波器的实现原理及方法。
基于DSP芯片TMS320C5000的FIR滤波器设计方法,利用MATLAB仿真与DSP实现相结合的方式可以方便、快捷地设计具有严格线性相位的FIR系统,而且参数的修改十分方便。
用DSP实现FIR数字滤波,具有准确度高、可移植性好、灵活性强等优点。
该研究对其它类型滤波器的设计也有一定的参考价值。
3滤波器原理与MATLAB工具的设计
3.1滤波器的原理
数字滤波器根据其冲激响应函数的时域特性,可分为两种,即无限长冲激响应(IIR)滤波器和有限长冲激响应(FIR)滤波器。
IIR滤波器的特征是,具有无限持续时间冲激响应。
种滤波器一般需要用递归模型来实现,因而有时也称之为递归滤波器。
FIR滤波器的冲激响应只能延续一定时间,在工程实际中可以采用递归的方式实现,也可以采用非递归的方式实现。
数字滤波器的设计方法有多种,如双线性变换法、窗函数设计法、插值逼近法和Chebyshev逼近法等等。
随着MATLAB软件尤其是MATLAB的信号处理工作箱的不断完善,不仅数字滤波器的计算机辅助设计有了可能,而且还可以使设计达到最优化。
3.2滤波器的设计步骤:
数字滤波器设计的基本步骤如下:
(1)确定指标;
(2)逼近;
(3)性能分析和计算机仿真。
3.3滤波器的MATLAB设计
3.3.1关于MATLAB
MATLAB是一套用于科学计算的可视化高性能语言与软件环境。
它集数值分析、矩阵运算、信号处理和图形显示于一体,构成了一个界面友好的用户环境。
它的信号处理工具箱包含了各种经典的和现代的数字信号处理技术,是一个非常优秀的算法研究与辅助设计的工具。
在设计数字滤波器时,通常采用MATLAB来进行辅助设计和仿真。
3.3.2FIR滤波器的MATLAB设计
下面以设计线性相位FIR滤波器为例介绍具体的设计方法。
线性相位FIR滤波器通常采用窗函数法设计。
窗函数法设计FIR滤波器的基本思想是:
根据给定的滤波器技术指标,选择滤波器长度N和窗函数ω(n),使其具有最窄宽度的主瓣和最小的旁瓣。
其核心是从给定的频率特性,通过加窗确定有限长单位脉冲响应序列h(n)。
工程中常用的窗函数共有6种,即矩形窗、巴特利特(Bartlett)窗、汉宁(Hanning)窗、汉明(Hamming)窗、布莱克曼(Blackman)窗和凯塞(Kaiser)窗。
下面以Kaiser为例,设计一个低通滤波器:
fp=2500;
fc=6000;
as=100;
ap=1;
fs=60000;
wp=2*fp/fs;
wc=2*fc/fs;
N=ceil((as-7.95)/(14.36*(wc-wp)/2))+1;
beta=0.1102*(as-8.7);
window=Kaiser(N+1,beta);
b=fir1(N,wc,window);
freqz(b,1,512,fs);
结果如下:
生产系数如下:
-0.00000.00000.00000.00000.00000.0000
-0.0000-0.0000-0.0001-0.0001-0.00000.0001
0.00020.00030.00030.0001-0.0001-0.0005
-0.0007-0.0007-0.00030.00040.00110.0016
0.00150.0007-0.0008-0.0023-0.0033-0.0031
-0.00130.00150.00450.00620.00570.0024
-0.0027-0.0081-0.0112-0.0101-0.00430.0049
0.01430.01990.01820.0079-0.0090-0.027
-0.0389-0.0371-0.01710.02120.07220.1261
0.17110.19660.19660.17110.12610.0722
0.0212-0.0171-0.0371-0.0389-0.0271-0.0090
0.00790.01820.01990.01430.0049-0.0043
-0.0101-0.0112-0.0081-0.00270.00240.0057
0.00620.00450.0015-0.0013-0.0031-0.0033
-0.0023-0.00080.00070.00150.00160.0011
0.0004-0.0003-0.0007-0.0007-0.0005-0.0001
0.00010.00030.00030.00020.0001-0.0000
-0.0001-0.0001-0.0000-0.00000.00000.0000
0.00000.00000.0000-0.0000
3.3.4数字滤波器的实现方法
数字滤波器的实现方法一般有以下几种。
①采用加法器、乘法器、延时器设计专用的滤波电路。
②在通用计算机系统中加上专用的加速处理机设计实现。
③用通用的可编程DSP芯片实现。
④用专用的DSP芯片实现。
在一些特殊的场合,要求的信号处理速度极高,用通用DSP芯片很难实现。
这种芯片将相应的滤波算法在芯片内部用硬件实现,无需进行编程。
⑤采用FPGA/CPLD设计实现。
4软件的设计
4.1程序的流程设计
4.1.1在CCS中编写处理程序
在CCSIDE中建立fir.pjt工程,用C语言编写处理主程序fir.c,利用汇编语言文件,来定义中断服务程序。
另外根据板上的存储器配置方式,编写存储器配置文件(.cmd文件),编译、链接,生成可执行文件(fir.out文件),加载到目标DSP程序存储器中,流程图如下:
4.1.2程序程序图
4.2源程序编写
#include"DSP28_Device.h"
#include"filter.h"
#include"ext_inf.h"
unsignedintDataLong=1024;//采样点数1024
unsignedinti,j;
unsignedintk=0;
unsignedshortAd_data[2048];
shortAd_data_signed[2048];
shortfilter_result[1024];
unsignedintconvcount=0;
volatileunsignedintadconvover=0;
interruptvoidISRTimer2(void);
interruptvoidad(void);
voidmain(void)
{/*初始化系统*/
InitSysCtrl();
/*关中断*/
DINT;
IER=0x0000;
IFR=0x0000;
/*初始化PIE中断*/
InitPieCtrl();
/*初始化PIE中断矢量表*/
InitPieVectTable();
//初始化cputimer
InitCpuTimers();
/*设置中断服务程序入口地址*/
EALLOW;//ThisisneededtowritetoEALLOWprotectedregisters
PieVectTable.TINT2=&ISRTimer2;
PieVectTable.ADCINT=&ad;
EDIS;//ThisisneededtodisablewritetoEALLOWprotectedregisters
/*开中断*/
IER|=M_INT1;//ADC中断
EINT;//EnableGlobalinterruptINTM
ERTM;//EnableGlobalrealtimeinterruptDBGM
/*设置CPU*/
DINT;
ConfigCpuTimer(&CpuTimer2,150,22);
StartCpuTimer2();
/*开中断*/
IER|=M_INT14;EINT;
InitAdc();
for(;;){
if(adconvover==1){
/*fir滤波处理*/
for(i=0;iAd_data_signed[i]=(short)(Ad_data[i]-0x5300);
fir_filter(Ad_data_signed,hfir,filter_result,ORDER_FIR,DataLong,ROUND_FIR);
adconvover=0;}}}
interruptvoidad(void)
{IFR=0x0000;
PieCtrl.PIEACK.all=0xffff;
if(adconvover==0){
Ad_data[convcount]=AdcRegs.RESULT0;
convcount++;}
if(convcount==DataLong){
convcount=0;adconvover=1;//接满标志}}
interruptvoidISRTimer2(void)
{AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR=1;
AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;
}
4.3FIR滤波器的设计结果
4.3.1设置参数
(1)fir_filter(Ad_data_signed,hfir,filter_result,ORDER_FIR,DataLong,ROUND_FIR)和adconvover=0处设置断点;
(2)在GraphPropertyDialog中设置StartAddress和DisplayType如图A、图B、图C、图D。
其中A,B图分别为滤波前的波形和频谱,C,D图分别为滤波后的波形和频谱图:
图A
图B
图C
图D
4.3.2输入信号源的波形(频率为1000Hz,振幅为800mV):
标准三角波的波形
标准三角波的频谱
标准方波的波形
标准方波的频谱
噪声三角波
噪声三角波的频谱
4.3.3输出信号的波形
标准三角波滤波后波形
标准三角波滤波后的频谱
滤波后的方波波形
滤波后的标准方波频谱
滤波后噪声三角波的波形
滤波后噪声三角波的频谱
5结束语
数字滤波器是语音、图象处理、模式识别以及谱分析中的基本运算的处理运算。
DSP由于其本身具有并行的硬件乘法器、流水结构以及快速的片内存储器等资源,其技术已广泛地应用于噪声及振动的各个领域。
采用MATLAB语言可方便、快捷地设计具有严格线性相位的FIR系统,且参数的修改也十分方便。
用DSP芯片实现低通FIR数字滤波,除具有准确度高、不受环境影响等优点外,由于DSP芯片具有可编程特性,程序的可移植性好,灵活性强。
实际应用时只需按要求修改滤波器参数,并对程序作较少的改动,即可实现不同截止频率的低通FIR滤波器,实用性较强.在设计FIR数字滤波器时,采用MATLAB来进行辅助设计和仿真,达到了预期的效果。
通过本次的课程设计,我对DSP和数字信号处理有了更深刻的认识,对MATLAB也有了更深的理解。
虽然在本次的设计中遇到了一些挫折,但是在老师和同学的帮助下还是顺利的完成了。
这次设计让我将学到的理论知识与实践相结合,也认识到了学知识光学理论知识是不够的,只有能将理论与实践相结合才是真的知识。
我自己也认识到了,当遇到问题时不能烦躁,不能抱怨,要静下心来解决问题,翻阅书籍,课内的和课外的,必要时可以借助internet,那里有许多有价值的东西,可以借鉴。
本次课程设计能够顺利的完成,我要特别感谢何海浪老师的精心指导,让我能够把理论与实践结合在一起,还要感谢同学们对我的帮助。
谢谢!
参考文献:
[1]乔瑞萍.TMS320C54XDSP原理及应用.西安电子科技大学出版社.2004.
[2]程佩青.数字信号处理教程[M].北京:
清华大学出版社,2001.
[3]陈怀琛.MATLAB及其在理工课程中的应用指南.西安电子科技大学出版社,2007.
[4]赵力.语音信号处理.机械工业出版社,2004.
[5]张雄伟.DSP芯片的原理与开发应用(第三版)[M].北京:
电子工业出版社,2003年