查看: 1934  |  回复: 0
IIR与FIR滤波器

主题

回复
发表于2018-10-25 15:15:17 | 显示全部楼层
1# 电梯直达

IIR滤波器,FIR滤波器和窗口滑动滤波

通常,信号的频谱处于有限的频率范围内,而噪声的频谱则散布在很广的频率范围内,为了消除噪声,可以把FIR滤波器或者IIR滤波器设计成合适的频带滤波器,进行频域滤波。

一般滤波器可以分为经典滤波器和数字滤波器。

经典滤波器:假定输入信号中的有用成分和希望去除的成分各自占有不同的频带。如果信号和噪声的频谱相互重迭,经典滤波器无能为力。比如 FIR IIR 滤波器等。

现代滤波器:从含有噪声的时间序列中估计出信号的某些特征或信号本身。现代滤波器将信号和噪声都视为随机信号。包括 Wiener FilterKalman 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_FACTORIIR滤波器因数

}

/**************************************************************************

函数原型: 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滤波器

FIRFinite 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;

}


主题

回复
  • 温馨提示: 标题不合格、重复发帖、发布广告贴,将会被删除帖子或禁止发言。 详情请参考: 社区发帖规则
  • 您当前输入了 0 个文字。还可以输入 8000 个文字。 已添加复制上传图片功能,该功能目前仅支持chrome和火狐

禁言/删除

X
请选择禁言时长:
是否清除头像:
禁言/删除备注:
昵 称:
 
温馨提示:昵称只能设置一次,设置后无法修改。
只支持中文、英文和数字。

举报

X
请选择举报类型:
请输入详细内容:

顶部