郑州航空工业管理学院 电子通信工程系
DSP原理及应用课程设计报告
设计题目:基于TMS320F2812 DSP处理器的FIR滤波器的设计与
实现
学号: 0913082305 专业: 电子信息工程 设计日期: 2012 . 6 . 14 指导老师: 赵 成 闫利超
一、引言............................................................................................. 3 二、 设计目的 .................................................................................. 3 三、设计要求 .................................................................................... 4 四、 总体设计 .................................................................................. 5
4.1利用Matlab软件的FDATool工具设计FIR滤波器 ........ 5
4.1.1有限冲击响应数字滤波器的基础理论 ................... 5 4.1.2 利用Matlab软件的FDATool设计FIR滤波器 .... 6 4.1.3提取滤波器参数 ..................................................... 11 4.2 CCS环境下FIR滤波器的设计及软件仿真 ................... 12
4.2.1 程序流程图 ............................................................ 12 4.2.2 在CCS集成开发环境下新建FIR滤波器工程 .. 12 4.2.3观察滤波前后的信号的时域波形及FFT Magnitude波形........................................................................................... 13
4.2.4 程序清单 ................................................................ 15 4.3 对实时采样信号进行滤波的FIR滤波器的实现 ........... 17
4.3.1 程序清单 ................................................................ 17 4.3.2 测试效果 ................................................................ 21 4.3.3 SCI串行数据传输 .................................................. 21
五、 总结......................................................................................... 26 六、参考文献 .................................................................................. 27
一、引言
随着信息和数字技术的发展,数字信号处理已成为当今极其重要的学科和技术领域之一。它在通信、语音、图像、雷达、军事、航空航天等众多领域得到了广泛的应用。在数字信号处理的基本方法中,通常会涉及到变换、滤波、频谱分析、调制解调和编码解码等处理。其中,滤波是应用非常广泛的一个环节,数字滤波器的理论与相关设计也一直都是人们研究的重点之一。数字滤波器根据其冲激响应函数的时域特性,可分为无限长冲激响应(I-IR)滤波器和有限长冲激响应(FIR )滤波器。其中FIR滤波器具有严格的相位特性,同时系统函数的极点固定在原点上,因而该类型的滤波器是稳定的。FIR滤波器的设计方法主要有窗函数法、频率取样法和最优线性相位设计法。其中窗函数设计方法由于其运算简便、物理意义直观,已成为工程实际中应用最广泛的方法,本文从FIR数字滤波器的原理与基本设计步骤出发,对FIR数字滤波器在MATLAB中的仿真与设计的基本思路做了阐述,并在定点DSP上实现了满足要求的FIR滤波器。
二、设计目的
(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或音频接口采样音频信号,对采样的音频信号做滤波运算,进行低音加重处理,再将运算过的音频数据通过扬声器播放出来。
四、总体设计
MATLAB是一套用于科学计算的可视化高性能语言与软州环境。它集数值分析、矩阵运算、信号处理和图形显示于一体,构成了一个界面友好的用户坏境。它的信号处理具箱包含了各种经典的和现代的数字信号处理技术,是个非常优秀的算法研究与辅助设备的工具。在设计数字滤波器时,通常采用MATLAB未进行辅助设计和仿真。
利用MATLAB信号处理工具箱进行数字滤波器设计总的来说有三种方法:程序设计法、FDATool设计法和SPTool设计法。程序设计法是由设计者通过编写程序,利用MATLAB信号处理工具箱提供的各种窗函数、滤波器设计函数和滤波器实现函数来完成滤波器的设计,要求设计者熟悉工具箱的各种函数,具有一定的编程能力,对于初学者有一点困难;而FDATool设计法和SPTool设计法相对比较简单,FDATooI工具箱和SPTool工具箱具有交互式的友好设计界面,只要填入设计参数点击按钮,相应的滤波器就设计完成了,使用起来非常方便。下面将使用FDATool设计法的FIR滤波器设计。
4.1利用Matlab软件的FDATool工具设计FIR滤波器
4.1.1有限冲击响应数字滤波器的基础理论
滤波器就是在时间域或频域内,对已知激励产生规定响应的网络,使其能够从信号中提取有用的信号,抑制并衰减不需要的信号。
滤波器的设计实质上就是对提出的要求给出相应的性能指标,再通过计算,使物理可实现的实际滤波器频率响应特性逼近给出的频率响应特性。FIR 数字滤波器系统的传递函数为:
Y(z)N?1 H(z)???b(n)z?n (1)
X(z)n?0由此得到系统的差分方程:
y(n)?b(0)?x(n)?b(1)?x(n?1)????????b(N?1)?x(n(N?1)) (2)
若FIR 数字滤波器的单位冲激响应序列为h(n),它就是滤波器系数向量b(n)。传统的滤波器分析与设计均使用繁琐的公式计算,改变参数后需要重新运算,从而在分析与设计滤波器尤其是高阶滤波器时工作量特别大。这里应用MATLAB 设计FIR滤波器,根据给定的性能指标设计一个H(z),使其逼近这一指标,进而计算并确定滤波器的系数b(n),再将所设计滤波器的幅频响应、相频响应曲线作为输出,与设计要求进行比较,对设计的滤波器进行优化。设计完成之后将得到FIR滤波器的单位冲激响应序列h(n)的各个参数值。
4.1.2 利用Matlab软件的FDATool设计FIR滤波器
使用 Matlab中的 FDAtool设计滤波器(本文以FIR低通滤波器为例)
FDATool ( Filter Design & Analysis Tool)是MATLAB信号处理工具箱里
专用的滤波器设计分析工具,MATLAB 6.0以上的版本还专门增加了滤波器设计工具箱( FilterDesign Toolbox)。FDATool界面为滤波器设计提供
了一个交互式的设计环境,用户可以根据对幅值和零极点图的设置,设计几乎所有的基本的常规滤波器,包括FIR和IIR的各种设计方法,它们都具有标准的频率带宽结构。采用FDATool设计法时其界面的上半部分为特性区,用来显示滤波器的各种特性;下半部分为参数设定区,用来设定滤波器的各种参数。
(1)首先在命令窗口键入FDAtool命令,启动滤波器设计分析器,调出FDAtool界面,如图1所示。
图1 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”按钮,完成滤波器的设计。具体参数及设计成功后的结果如图2所示。
图2 FIR低通滤波器设计
(6)设计完成后,可以通过菜单选项Analysis 来分析滤波器的幅频响应和相频响应特性。点击Analysis 中的Magnitude Response和Phase Response 对幅频和相频响应进行分析(如下图)。
幅频响应
相频响应
(7)在FDATool 中,选择Targets -> Generate C Header...,如图3所示。
图3 导出滤波器系数
(8)点击Generate按钮,选择路径,即可输出前一步设计出的 FIR滤波器的系数表。(默认的系数表文件为fdacoefs.h) (9)在Matlab中打开得到的fdacoefs.h的文件,如图4、图5所示。
图4 查看fdacoefs.h文件
图5 fdacoefs.h文件中的系数表
4.1.3提取滤波器参数
取系数表中的数据小数点后3位有效值,得到如下内容:
constfloatB[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 程序流程图
初始化 输入低通滤波器各频率参数 构建滤波器频域特性波形参数 使用FDATool提取滤波器参数或用FIR滤波器计算程序计算得到滤波器参数 构建FIR滤波器进行滤波 无限循环
4.2.2 在CCS集成开发环境下新建FIR滤波器工程
(1)实验准备
设置软件仿真模式,启动CCS。
(2)建立工程
建立一个文件夹,存放在D:\\FIR,将D:\\课程设计\\FIR滤波器\\Fir源程序文件夹下的工程全部复制到D:\\FIR,在CCS中打开D:\\FIR\\fir\\fir.pjt工程,就会得到如图6所示的工程界面。
图6 FIR工程示例
(3)编译生成fir.out文件,通过File->Load Program…装载该文件。
4.2.3观察滤波前后的信号的时域波形及FFT Magnitude波形
(4)设置时域观察窗口选择菜单View→Graph→Time/Frequency…,进行如图7所示设置。
图7 输入数据时域波形和滤波后输出波形观察
(5)设置频域观察窗口,选择菜View→Graph→Time/Frequency… ,进行如图8所示设置。
图8 输入数据FFT分析图形和滤波后输出数据的FFT图形观察
(6)设置断点。
在程序fir.c中,有注释断点的语句上设置软件断点。
(7)运行并观察结果。
选择Debug菜单的Run项,或按F5键运行程序。观察到的图形如图11所示。
图11 滤波前后的数据波形及FFT分析的对比图
4.2.4 程序清单
fir.c 程序
//#include \ // DSP281x Headerfile Include File
//#include \
//#include \#include\#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 ( 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 fSum+=(fXn[i]*fHn[i]); } return(fSum); } 4.3 对实时采样信号进行滤波的FIR滤波器的实现 4.3.1 程序清单 #include \#include \#include 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; SysCtrlRegs.HISPCP.all = 0x3; // HSPCLK = SYSCLKOUT/6 EDIS; // Disable CPU interrupts DINT; // Initialize the PIE control registers to their default state. InitPieCtrl(); // Disable CPU interrupts and clear all CPU interrupt flags: IER = 0x0000; IFR = 0x0000; // Initialize the PIE vector table with pointers to the shell Interrupt // Service Routines (ISR). InitPieVectTable(); // Interrupts that are used in this example are re-mapped to // ISR functions found within this file. EALLOW; // This is needed to write to EALLOW protected register PieVectTable.ADCINT = &adc_isr; EDIS; // This is needed to disable write to EALLOW protected registers InitAdc(); // For this example, init the ADC // Enable ADCINT in PIE PieCtrlRegs.PIEIER1.bit.INTx6 = 1; IER |= M_INT1; // Enable CPU Interrupt 1 EINT; // Enable Global interrupt INTM ERTM; // Enable Global realtime interrupt DBGM LoopCount = 0; ConversionCount = 0; // Configure ADC AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; AdcRegs.ADCMAXCONV.all = 0x0000; // Setup 2 conv's on SEQ1 AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x4; // Setup ADCINA0 as 1st SEQ1 conv. AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1 = 1; // Enable EVASOC to start SEQ1 AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; // Enable SEQ1 interrupt (every EOS) // Configure EVA // Assumes EVA Clock is already enabled in InitSysCtrl(); EvaRegs.T1CMPR = 0x0380; // Setup T1 compare value EvaRegs.T1PR = 0x07FF; // Setup period register EvaRegs.GPTCONA.bit.T1TOADC = 1; // Enable EVASOC in EVA EvaRegs.T1CON.all = 0x1042; // Enable timer 1 compare (upcount mode) // Wait for ADC interrupt 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++; // Reinitialize for next ADC sequence AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // Reset SEQ1 AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; // ClearINT SEQ1 bit PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // Acknowledge interrupt to PIE return; } 五、总结 数字滤波与模拟滤波相比有很多优点,它除了可避免模拟滤波器固有的电压漂移、温度漂移和噪声等问题外,还能满足滤波器对幅度和相位的严格要求;只要适当改变数字滤波程序有关参数,就能方便的改变滤波特性,因此数字滤波使用时方便灵活。有限冲激响应滤波器(FIR滤波器)有其独特的优点,因为FIR系统只有零点,因此,系统总是稳定的,而且容易实现线性相位和允许实现多通道滤波器。 DSP技术一般指将DSP 处理器用于完成数字信号处理的方法与技术。目前的DSP芯片以其强大的数据处理功能在通信和其他信号处理领域得到广泛注意并已成为开发应用的热点技术。许多领域对于数字信号处理器的应用都是围绕美国TI公司所开发的DSP处理器进行的。DSP芯片是一种特别适合于进行数字信号处理运算的微处理器。主要应用是实时快速的实现各种数字信号处理算法,如卷积及各种变换等。这次我们所做的利用DSP芯片来实现数字滤波器就是一项很重要的应用,这一次的课程设计主要讨论基于TI公司TMS320F2812 DSP芯片的滤波器系统软件实现方法,用Blackman窗函数设计实现FIR滤波器,利用MATLAB中的FDAtool滤波器设计分析器设计符合要求的FIR滤波器并生成fdacoefs.h文件提取相关参数。并在以TI TMS320F2812为微处理器的EXPIV型实验箱上实现,实验仿真结果、实时数据采集及ADC转换滤波滤波均表明滤波后能够得到比较光滑 时域/频域波形,滤波结果效果良好达到了预期的性能指标要求。 六、参考文献 1. 《DSP原理及应用技术--基于TMS320 F2812的仿真与实例设计》 赵成 编著 国防工业出版社 2. 《数字信号处理教程》 程佩清 编著 清华大学出版社 3. 《基于DSP的FIR滤波器的设计与实现》 长沙理工大学 4. 《Matlab/Simulink通信系统建模与仿真实例分析》 清华大学出版社