安安富富莱莱UUMM440033DDSSPP教教程程SSTTMM3322--VV55开开发发板板系系统统篇篇手手册册22001155年年0011月月1155日日版版本本::11..00第第11页页共共3355页页第第3377章章FFIIRR滤滤波波器器的的实实现现本章节讲解FIR滤波器的低通,高通,带通和带阻滤波器的实现。37.1FIR滤波器介绍37.2Matlab工具箱生成C头文件37.3FIR低通滤波器设计37.4FIR高通滤波器设计37.5FIR带通滤波器设计37.6FIR带阻滤波器设计37.7切比雪夫窗口设计带通滤波器37.8FIR滤波后的群延迟37.9总结3377..11FFIIRR滤滤波波器器介介绍绍ARM官方提供的FIR库支持Q7,Q15,Q31和浮点四种数据类型。其中Q15和Q31提供了快速算法版本。FIR滤波器的基本算法是一种乘法-累加(MAC)运行,输出表达式如下:y[n]=b[0]*x[n]+b[1]*x[n-1]+b[2]*x[n-2]+...+b[numTaps-1]*x[n-numTaps+1]结构图如下:安安富富莱莱UUMM440033DDSSPP教教程程SSTTMM3322--VV55开开发发板板系系统统篇篇手手册册22001155年年0011月月1155日日版版本本::11..00第第22页页共共3355页页这种网络结构就是在35.2.1小节所讲的直接型结构。3377..22MMaattllaabb工工具具箱箱ffddaattooooll生生成成CC头头文文件件下面我们讲解下如何通过fdatool工具生成C头文件,也就是生成滤波器系数。首先在matlab的命窗口输入fadtool就能打开这个工具箱:fadtool界面打开效果如下:安安富富莱莱UUMM440033DDSSPP教教程程SSTTMM3322--VV55开开发发板板系系统统篇篇手手册册22001155年年0011月月1155日日版版本本::11..00第第33页页共共3355页页FIR滤波器的低通,高通,带通,带阻滤波的设置会在下面一一讲解,这里说一下设置后相应参数后如何生成滤波器系数。参数设置好以后点击如下按钮:点击DesignFilter按钮以后就生成了所需的滤波器系数,生成滤波器系数以后点击fadtool界面上的菜单Targets-GenerateCheader,打开后显示如下界面:安安富富莱莱UUMM440033DDSSPP教教程程SSTTMM3322--VV55开开发发板板系系统统篇篇手手册册22001155年年0011月月1155日日版版本本::11..00第第44页页共共3355页页然后点击Generate,生成如下界面:再点击保存,并打开fdatool.h文件,可以看到生成的系数:/**FilterCoefficients(CSource)generatedbytheFilterDesignandAnalysisTool**GeneratedbyMATLAB(R)7.14andtheSignalProcessingToolbox6.17.**Generatedon:22-Dec-201421:34:29**/安安富富莱莱UUMM440033DDSSPP教教程程SSTTMM3322--VV55开开发发板板系系统统篇篇手手册册22001155年年0011月月1155日日版版本本::11..00第第55页页共共3355页页/**Discrete-TimeFIRFilter(real)*-------------------------------*FilterStructure:Direct-FormFIR*FilterLength:51*Stable:Yes*LinearPhase:Yes(Type1)*//*GeneraltypeconversionforMATLABgeneratedC-code*/#includetmwtypes.h/**Expectedpathtotmwtypes.h*C:\ProgramFiles\MATLAB\R2012a\extern\include\tmwtypes.h*//**Warning-Filtercoefficientsweretruncatedtofitspecifieddatatype.*Theresultingresponsemaynotmatchgeneratedtheoreticalresponse.*UsetheFilterDesign&AnalysisTooltodesignaccurate*single-precisionfiltercoefficients.*/constintBL=51;constreal32_TB[51]={-0.0009190982091,-0.00271769613,-0.002486952813,0.003661438357,0.0136509249,0.01735116541,0.00766530633,-0.006554719061,-0.007696784101,0.006105459295,0.01387391612,0.0003508617228,-0.01690892503,-0.008905642666,0.01744112931,0.02074504457,-0.0122964941,-0.03424086422,-0.001034529647,0.04779030383,0.02736303769,-0.05937951803,-0.08230702579,0.06718690693,0.3100151718,0.4300478697,0.3100151718,0.06718690693,-0.08230702579,-0.05937951803,0.02736303769,0.04779030383,-0.001034529647,-0.03424086422,-0.0122964941,0.02074504457,0.01744112931,-0.008905642666,-0.01690892503,0.0003508617228,0.01387391612,0.006105459295,-0.007696784101,-0.006554719061,0.00766530633,0.01735116541,0.0136509249,0.003661438357,-0.002486952813,-0.00271769613,-0.0009190982091};上面数组B[51]中的数据就是滤波器系数。下面小节讲解如何使用fdatool配置FIR低通,高通,带通和带阻滤波。关于fdatool的其它用法,大家可以在matlab命令窗口中输入helpfadtool打开帮助文档进行学习。3377..33FFIIRR低低通通滤滤波波器器设设计计本章使用的FIR滤波器函数是arm_fir_f32。下面使用此函数设计FIR低通,高通,带通和带阻滤波器。3377..33..11函函数数aarrmm__ffiirr__ff3322说说明明函数定义如下:voidarm_fir_f32(constarm_fir_instance_f32*S,float32_t*pSrc,float32_t*pDst,uint32_tblockSize)参数定义:安安富富莱莱UUMM440033DDSSPP教教程程SSTTMM3322--VV55开开发发板板系系统统篇篇手手册册22001155年年0011月月1155日日版版本本::11..00第第66页页共共3355页页[in]*Spointstoaninstanceofthefloating-pointFIRfilterstructure.[in]*pSrcpointstotheblockofinputdata.[out]*pDstpointstotheblockofoutputdata.[in]blockSizenumberofsamplestoprocesspercall.returnnone.注意事项:结构arm_fir_instance_f32的定义如下(在文件arm_math.h文件):typedefstruct{uint16_tnumTaps;/**numberoffiltercoefficientsinthefilter.*/float32_t*pState;/**pointstothestatevariablearray.ThearrayisoflengthnumTaps+blockSize-1.*/float32_t*pCoeffs;/**pointstothecoefficientarray.ThearrayisoflengthnumTaps.*/}arm_fir_instance_f32;1.参数pCoeffs指向滤波因数,滤波因数数组长度为numTaps。但要注意pCoeffs指向的滤波因数应该按照如下的逆序进行排列:{b[numTaps-1],b[numTaps-2],b[N-2],...,b[1],b[0]}但满足线性相位特性的FIR滤波器具有奇对称或者偶对称的系数,偶对称时逆序排列还是他本身。2.pState指向状态变量数组,这个数组用于函数内部计算数据的缓存。3.blockSize这个参数的大小没有特殊要求,用户只需保证大于1小于等于采样点个数即可。3377..33..22ffddaattooooll获获取取低低通通滤滤波波器器系系数数设计一个如下的例子:信号由50Hz正弦波和200Hz正弦波组成,采样率1Kbps,现设计一个低通滤波器,截止频率125Hz,采样320个数据,采用函数fir1进行设计(注意这个函数是基于窗口的方法设计FIR滤波,默认是hamming窗),滤波器阶数设置为28。fadtool的配置如下:安安富富莱莱UUMM440033DDSSPP教教程程SSTTMM3322--VV55开开发发板板系系统统篇篇手手册册22001155年年0011月月1155日日版版本本::11..00第第77页页共共3355页页配置好低通滤波器后,具体滤波器系数的生成大家参考本章第二小节的方法即可。3377..33..33低低通通滤滤波波器器实实现现通过工具箱fdatool获得低通滤波器系数后在开发板上运行函数arm_fir_f32来测试低通滤波器的效果。#defineTEST_LENGTH_SAMPLES320/*采样点数*/#defineBLOCK_SIZE32/*调用一次arm_fir_f32处理的采样点个数*/#defineNUM_TAPS29/*滤波器系数个数*/uint32_tblockSize=BLOCK_SIZE;uint32_tnumBlocks=TEST_LENGTH_SAMPLES/BLOCK_SIZE;/*需要调用arm_fir_f32的次数*/staticfloat32_ttestInput_f32_50Hz_200Hz[TEST_LENGTH_SAMPLES];/*采样点*/staticfloat32_ttestOutput[TEST_LENGTH_SAMPLES];/*滤波后的输出*/staticfloat32_tfirStateF32[BLOCK_SIZE+NUM_TAPS-1];/*状态缓存,大小numTaps+blockSize-1*//*低通滤波器系数通过fadtool获取*/constfloat32_tfirCoeffs32LP[NUM_TAPS]={-0.001822523074f,-0.001587929321f,1.226008847e-18f,0.003697750857f,0.008075430058f,0.008530221879f,-4.273456581e-18f,-0.01739769801f,-0.03414586186f,-0.03335915506f,8.073562366e-18f,0