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

上传人:文库蛋蛋多 文档编号:4141599 上传时间:2023-04-07 格式:DOC 页数:22 大小:959KB
返回 下载 相关 举报
基于TMS320F2812 DSP处理器的FIR滤波器的设计与实现.doc_第1页
第1页 / 共22页
基于TMS320F2812 DSP处理器的FIR滤波器的设计与实现.doc_第2页
第2页 / 共22页
基于TMS320F2812 DSP处理器的FIR滤波器的设计与实现.doc_第3页
第3页 / 共22页
基于TMS320F2812 DSP处理器的FIR滤波器的设计与实现.doc_第4页
第4页 / 共22页
基于TMS320F2812 DSP处理器的FIR滤波器的设计与实现.doc_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《基于TMS320F2812 DSP处理器的FIR滤波器的设计与实现.doc》由会员分享,可在线阅读,更多相关《基于TMS320F2812 DSP处理器的FIR滤波器的设计与实现.doc(22页珍藏版)》请在三一办公上搜索。

1、目 录一、引言- 2 -二、设计目的- 2 -三、设计要求- 2 -四、总体设计- 3 -4.1利用Matlab软件的FDATool工具设计FIR滤波器- 3 -4.1.1有限冲击响应数字滤波器的基础理论- 3 -4.1.2 利用Matlab软件的FDATool设计FIR滤波器- 3 -4.1.3提取滤波器参数- 7 -4.2 CCS环境下FIR滤波器的设计及软件仿真- 8 -4.2.1 程序流程图- 8 -4.2.2 在CCS集成开发环境下新建FIR滤波器工程- 8 -4.2.3观察滤波前后的信号的时域波形及FFT Magnitude波形- 9 -4.2.4 程序清单- 11 -4.3 对实

2、时采样信号进行滤波的FIR滤波器的实现- 14 -4.3.1 程序清单- 14 -4.3.2 测试效果- 17 -4.3.3 SCI串行数据传输- 17 -五、总结- 21 -六、参考文献- 22 -基于TMS320F2812 DSP处理器的FIR滤波器的设计与实现一、引言在当今信息时代数字信号处理已成为一门极其重要的学科。数字信号处理在通信、语音、图像等众多相关领域得到了广泛的应用。数字信号处理(DSP)包括两重含义:数字信号处理技术(Digital Signal Processing)和数字信号处理器(Digital Signal Processor)。数字信号处理(DSP)是利用计算机或

3、专用处理设备,以数值计算的方法、对信号进行采集、滤波、增强、压缩、估值和识别等加工处理,借以达到提取信息和便于应用的目的,其应用范围涉及几乎所有的工程技术领域。在数字信号处理的应用中,数字滤波器很重要而且得到了广泛的应用。按照数字滤波器的特性,它可以被分为线性与非线性、因果与非因果、无限长冲击响应(IIR)与有限长冲击响应(FIR)等等。其中,线性时不变的数字滤波器是最基本的类型;IIR 滤波器的特征是具有无限持续时间冲激响应,而FIR滤波器的冲激响应只能延续一定时间,在工程实际中可以采用递归的方式实现也可以采用非递归的方式实现。目前FIR滤波器的实现方法大致可分为三种:利用单片通用数字滤波器

4、集成电路、DSP器件或者可编程逻辑器件实现。其中以使用通用DSP芯片实现方式较为简单,是一种实时、快速、特别适合于实现各种数字信号处理运算的微处理器,借助于通用数字计算机按滤波器的设计算法编出程序进行数字滤波计算。由于它具有丰富的硬件资源、改进的哈佛结构、高速数据处理能力和强大的指令系统而在通信、航空、航天、雷达、工业控制、网络及家用电器等各个领域得到广泛应用 。二、设计目的(1)掌握用窗函数法设计FIR滤波器的原理及方法,熟悉线性纤维FIR滤波器的幅频特性和相频特性,熟悉不同的窗函数对滤波器性能的影响。(2) 掌握使用matlab编程的基本方法,学会利用fdatool 工具来快速设计满足需要

5、的滤波器。(3) 掌握TMS320F2812 DSP处理器开发的程序框架结构,学习驱动TMS320F2812 DSP处理器程序编写并能使其正常工作。实习驱动ADC模块实现信号的实时采集与模数转换。(4) 掌握使用TMS320F2812 DSP处理器实现FIR数字低通滤波器的设计方法,并能够实时采集输入信号并滤除高频信号再通过SCI串口传输到计算机显示。三、设计要求1、利用Matlab软件的FDATool工具设计FIR滤波器,并提取滤波器参数;2、在CCS集成开发环境下,利用第1步得到的滤波器参数,利用窗函数法设计FIR滤波器程序,观察输入信号及滤波后得到的输出信号的时域波形及FFT Magni

6、tude波形;3、利用TMS320F2812的ADC片内外设的外围电路实时采集的混频信号数据,使用1个51阶的FIR低通滤波器,在CCS中设计FIR滤波器程序实现滤波,观察相关波形及滤波效果,通过SCI接口将数据传送到计算机上;4、(选做)利用TI公司的TLV320AIC23高性能立体声音频Codec芯片,通过MIC或音频接口采样音频信号,对采样的音频信号做滤波运算,进行低音加重处理,再将运算过的音频数据通过扬声器播放出来。四、总体设计4.1利用Matlab软件的FDATool工具设计FIR滤波器4.1.1有限冲击响应数字滤波器的基础理论滤波器就是在时间域或频域内,对已知激励产生规定响应的网络

7、,使其能够从信号中提取有用的信号,抑制并衰减不需要的信号。滤波器的设计实质上就是对提出的要求给出相应的性能指标,再通过计算,使物理可实现的实际滤波器频率响应特性逼近给出的频率响应特性。FIR 数字滤波器系统的传递函数为: (1)由此得到系统的差分方程: (2)若FIR 数字滤波器的单位冲激响应序列为h(n),它就是滤波器系数向量b(n)。传统的滤波器分析与设计均使用繁琐的公式计算,改变参数后需要重新运算,从而在分析与设计滤波器尤其是高阶滤波器时工作量特别大。这里应用MATLAB 设计FIR滤波器,根据给定的性能指标设计一个H(z),使其逼近这一指标,进而计算并确定滤波器的系数b(n),再将所设

8、计滤波器的幅频响应、相频响应曲线作为输出,与设计要求进行比较,对设计的滤波器进行优化。设计完成之后将得到FIR滤波器的单位冲激响应序列h(n)的各个参数值。4.1.2 利用Matlab软件的FDATool设计FIR滤波器() 首先在命令窗口键入FDAtool命令,启动滤波器设计分析器,调出FDAtool界面,如下图所示。 FDATool界面() 在Filter Type选项中选Lowpass,在Design Method中选择FIR滤波器,接着在FIR中选择Window (窗函数) 法。() 然后在Filter Order 中选择Specify Order (为指定阶数),输入数值为“24”;

9、在Opitions框中选中“Scale Passband”;在窗类型(Window:)下拉框选择“Blackman”。() 在Frenquency Specification选项中,将fs(为采样频率)、fc (为通带截止频率)中分别键入30000 Hz和9600 Hz。() 点击“Design Filter”按钮,完成滤波器的设计。具体参数及设计成功后的结果如下图所示。 FIR低通滤波器设计() 通过菜单选项Analysis 来分析滤波器的幅频响应和相频响应特性。点击Analysis 中的Magnitude Response和Phase Response 对幅频和相频响应进行分析。如下图所示

10、 幅频和相频响应进行分析() 在FDATool 中,选择Targets - Generate C Header.,单击Generate按钮,选择路径,即可输出前一步设计出的 FIR滤波器的系数表。(默认的系数表文件为fdacoefs.h。如下图所示。 导出滤波器系数() 在Matlab中打开得到的fdacoefs.h的文件,如下图所示 从Matlab中打开的fdacoefs.h文件4.1.3提取滤波器参数取系数表中的数据小数点后3位有效值,得到如下内容:Const float B25= 0.0,0.0,0.001,-0.002,-0.002,0.01,-0.009,-0.018,0.049,-

11、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滤波器工程()实验准备设置软件仿真模式,启动CCS。()建立工程建立一个文件夹,存放在D:FIR,将D:课程设计FIR滤波器Fir源程序文件夹下的

12、工程全部复制到D:FIR,在CCS中打开D:FIRfirfir.pjt工程,打开的CCS集成开发环境如下图所示。 在CCS集成开发环境中打开工程4.2.3观察滤波前后的信号的时域波形及FFT Magnitude波形(1)编译工程文件生成fir.out文件,并通过File-Load Program装载该文件。(2)设置波形时域观察窗口。选择菜单ViewGraphTime/Frequency ,分别进行如下图所示进行设置以便观察输入/输出时域波形。 输入数据时域波形观察 输出数据时域波形观察选择菜单ViewGraphTime/Frequency ,分别进行如下图所示进行设置以便观察输入/输出频域波

13、形。输入数据频域波形观察 输出数据频域波形观察(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#includemath.h#defin

14、e FIRNUMBER 25/#define SIGNAL1F 1000/#define SIGNAL2F 4500/#define SAMPLEF 10000#define PI 3.1415926float InputWave();float FIR();float fHnFIRNUMBER= 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 ;floa

15、t fXnFIRNUMBER= 0.0 ;float fInput,fOutput;float fSignal1,fSignal2;float fStepSignal1,fStepSignal2;float f2PI;int i;float fIn256,fOut256;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();fInnIn=fInput;

16、nIn+; nIn%=256;fOutput=FIR();fOutnOut=fOutput;nOut+;if ( nOut=256 )nOut=0;/* 请在此句上设置软件断点 */ float InputWave()for ( i=FIRNUMBER-1;i0;i- )fXni=fXni-1;fXn0=sin(fSignal1)+cos(fSignal2)/6.0;fSignal1+=fStepSignal1; if ( fSignal1=f2PI )fSignal1-=f2PI;fSignal2+=fStepSignal2;if ( fSignal2=f2PI )fSignal2-=f2P

17、I;return(fXn0);float FIR()float fSum;fSum=0;for ( i=0;i 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

18、 = 1 /* 32-bit data sections */ .ebss : H0RAM, PAGE = 1 .econst : H0RAM, PAGE = 1 .esysmem : H0RAM, PAGE = 14.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.1415927int px256;

19、int py256;double npass,h51, x, y, xmid51;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+) ht = sin(t-m

20、/2.0)*npass*pi)/(pi*(t-m/2.0); if (t=m/2) ht=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 150M

21、hz 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 vect

22、or 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

23、 needed to disable write to EALLOW protected registersInitAdc(); / 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; Convers

24、ionCount = 0; / Configure ADC AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; AdcRegs.ADCMAXCONV.all = 0x0000; / Setup 2 convs 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;

25、/ 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 tim

26、er 1 compare (upcount mode)/ Wait for ADC interrupt k=0; fs = 250000; fstop = 20000; npass = fstop/fs; for (i=0; i=m; i+) xmidi=0; for(;) firdes(m, npass);for (i=0; i=n-1; i+) xm = pxi; x = xm/1023.0; for (p=0; p=m; p+) xmidm-p = xmidm-p-1; xmid0 = x; r = 0; rm= 0; for (j=0; j4; if(ConversionCount =

27、 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;4.3.2 测试效果如上图所示,可以发现使用DSP芯片实现的的F

28、IR滤波器已经成功的将设定的混合频率信号中的高频部分滤除。4.3.3 SCI串行数据传输对实时采样信号进行滤波并通过SCI串口数据传输到计算机的程序如下:#include DSP281x_Device.h / DSP281x Headerfile Include File#include DSP281x_Examples.h / DSP281x Examples Include File#include #define pi 3.1415927int px256;int py256;double npass,h51, x, y, xmid51;int m=50;int n=256;long i

29、nt delays; / Prototype statements for functions found within this file.interrupt void adc_isr(void);void scia_init(void);void scia_xmit(char a);/ Global variables used in this example:Uint16 LoopCount;Uint16 ConversionCount;void firdes(int m, double npass) int t; for (t=0; t=m; t+) ht = sin(t-m/2.0)

30、*npass*pi)/(pi*(t-m/2.0); if (t=m/2) ht=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 SY

31、SCLKOUT) 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 ta

32、ble 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 need

33、ed to disable write to EALLOW protected registers InitAdc(); / For this example, init the ADC scia_init(); EALLOW; GpioMuxRegs.GPFMUX.all = 0x0030; /配置IO口为专用引脚 EDIS;/ Enable ADCINT in PIE PieCtrlRegs.PIEIER1.bit.INTx6 = 1; IER |= M_INT1; / Enable CPU Interrupt 1 EINT; / Enable Global interrupt INTM

34、ERTM; / Enable Global realtime interrupt DBGM LoopCount = 0; ConversionCount = 0;/ Configure ADC AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; AdcRegs.ADCMAXCONV.all = 0x0000; / Setup 2 convs on SEQ1 AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x4; / Setup ADCINA0 as 1st SEQ1 conv. AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1 = 1; /

35、 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 =

36、 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+) xmidi=0; for(;) SciaRegs.SCITXBUF=0x55; SciaRegs.SCITXBUF=0x55; SciaRegs.SCITXBUF=0x55; SciaRegs.SCITXBUF=0x55;

37、 SciaRegs.SCITXBUF=0x55; SciaRegs.SCITXBUF=0x55; SciaRegs.SCITXBUF=0x55; SciaRegs.SCITXBUF=0x55;/帧首分隔符 firdes(m, npass);for (i=0; i=n-1; i+) xm = pxi; x = xm/1023.0; for (p=0; p=m; p+) xmidm-p = xmidm-p-1; xmid0 = x; r = 0; rm= 0; for (j=0; j=m; j+) r = xmidj * hj;rm = rm + r; y = rm; ym = (int)(102

38、3.0 * y); pyi = ym; for(i=0;i256;i+) SciaRegs.SCITXBUF=pyi; for(delays=0;delays4; 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; / Clear INT SEQ1 bit PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; / Acknowledge interrupt to PIE return;void scia_init() SciaRegs.SCIFFTX.all=0xE040; SciaRegs.SCIFFRX.all=0x20

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号