查看:
1933
|
回复:
0
|
IIR与FIR滤波器
|
|
发表于2018-10-25 15:15:17
|
只看该作者
1#
电梯直达
IIR滤波器,FIR滤波器和窗口滑动滤波 通常,信号的频谱处于有限的频率范围内,而噪声的频谱则散布在很广的频率范围内,为了消除噪声,可以把FIR滤波器或者IIR滤波器设计成合适的频带滤波器,进行频域滤波。 一般滤波器可以分为经典滤波器和数字滤波器。 经典滤波器:假定输入信号中的有用成分和希望去除的成分各自占有不同的频带。如果信号和噪声的频谱相互重迭,经典滤波器无能为力。比如 FIR 和 IIR 滤波器等。 现代滤波器:从含有噪声的时间序列中估计出信号的某些特征或信号本身。现代滤波器将信号和噪声都视为随机信号。包括 Wiener Filter、Kalman Filter、线性预测器、自适应滤波器等 一、IIR滤波器 IIR滤波器又叫IIR数字滤波器,“递归滤波器”。递归滤波器,也就是IIR数字滤波器,顾名思义,具有反馈。IIR数字滤波器是一类递归型的线性时不变因果系统 特点: lIR数字滤波器的系统函数可以写成封闭函数的形式,具有反馈回路; IIR数字滤波器的相位非线性,相位特性不好控制,随截止频率变化而变化,对相位要求较高时,需加相位校准网络; IIR滤波器有历史的输出参与反馈,同FIR相比在相同阶数时取得更好的滤波效果; IIR数字滤波器采用递归型结构,由于运算中的舍入处理,使误差不断累积,有时会产生微弱的寄生振荡。
#define Pi 3.1415927f /************************************************************************** 函数原型:void Calculate_FilteringCoefficient(float Time, float Cut_Off) 功 能:iir低通滤波参数计算 **************************************************************************/ void Calculate_FilteringCoefficient(float Time, float Cut_Off) { ACC_IIR_FACTOR = Time /( Time + 1/(2.0f*Pi*Cut_Off) ); // ACC_IIR_FACTOR为IIR滤波器因数 } /************************************************************************** 函数原型: void ACC_IIR_Filter(struct _acc *Acc_in,struct _acc *Acc_out) 功 能: iir低通滤波 **************************************************************************/ void ACC_IIR_Filter(struct _acc *Acc_in,struct _acc *Acc_out) { Acc_out->x = Acc_out->x + ACC_IIR_FACTOR*(Acc_in->x - Acc_out->x); Acc_out->y = Acc_out->y + ACC_IIR_FACTOR*(Acc_in->y - Acc_out->y); Acc_out->z = Acc_out->z + ACC_IIR_FACTOR*(Acc_in->z - Acc_out->z); } 二、FIR滤波器 FIR(Finite Impulse Response)滤波器:有限长单位冲激响应滤波器,又称为非递归型滤波器,是数字信号处理系统中最基本的元件,它可以在保证任意幅频特性的同时具有严格的线性相频特性,同时其单位抽样响应是有限长的,因而滤波器是稳定的系统。因此,FIR滤波器在通信、图像处理、模式识别等领域都有着广泛的应用。 特点: FIR滤波器的最主要的特点是没有反馈回路,稳定性强,故不存在不稳定的问题; FIR具有严格的线性相位,幅度特性随意设置的同时,保证精确的线性相位; FIR设计方式是线性的,硬件容易实现; FIR相对IIR滤波器而言,相同性能指标时,阶次较高,对CPU的性能要去较高。
三、滑动窗口滤波 滑动平均滤波算法只采样一次,将一次采样值和过去的若干次采样值一起求平均,得到的有效采样值即可投入使用。如果取N个采样值求平均,存储区中必须开辟N个数据的暂存区。每新采集一个数据便存入暂存区中,同时去掉一个最老数据,保存这N个数据始终是最新更新的数据。采用环型队列结构可以方便地实现这种数据存放方式。 #define Filter_Num 2 /************************************************************************** 函数原型: void Gyro_Filter(struct _gyro *Gyro_in,struct _gyro *Gyro_out) 功 能: gyro窗口滑动滤波 **************************************************************************/ void Gyro_Filter(struct _gyro *Gyro_in,struct _gyro *Gyro_out) { static int16_t Filter_x[Filter_Num],Filter_y[Filter_Num],Filter_z[Filter_Num]; static uint8_t Filter_count; int32_t Filter_sum_x=0,Filter_sum_y=0,Filter_sum_z=0; uint8_t i=0; Filter_x[Filter_count] = Gyro_in->x; Filter_y[Filter_count] = Gyro_in->y; Filter_z[Filter_count] = Gyro_in->z;
for(i=0;i<Filter_Num;i++) { Filter_sum_x += Filter_x[i]; Filter_sum_y += Filter_y[i]; Filter_sum_z += Filter_z[i]; } Gyro_out->x = Filter_sum_x / Filter_Num; Gyro_out->y = Filter_sum_y / Filter_Num; Gyro_out->z = Filter_sum_z / Filter_Num; Filter_count++; if(Filter_count == Filter_Num) Filter_count=0; } |
|