赞
踩
此文章是我最近两天查阅常用算法收集资料的一次总结,包括常见算法的
介绍 + 优缺点 + 适用 + 对比 + C的应用code。
欢迎大家指正错误跟进行补充,这个肯定是还不够完善的,不过我目前算是够用了吧~ —。—
滤波分为软件跟硬件滤波:
硬件滤波:一定规格的电容、电阻组成的RC滤波器或采用电感、电容组成的LC滤波器灯模拟滤波器进行滤波。
软件滤波:也成为数字滤波
a.对当前值范围进行最大限幅
b.对相邻值之间的偏差进行最大限幅
根据经验判断,确定两次采用允许的最大偏差值(设为A),每次检测到新值时判断:
l 优点:是可以有效的克服因偶然因素而引起的脉冲干扰;
l 缺点:是不能抑制周期性的干扰;平滑度较差。
把连续N个采样值看成一个队列,队列的长度固定为N,每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据(先进先出原则)把队列中的N个数据进行算术平均运算,就可以获得新的滤波结果。
|优点: 对周期性干扰有良好的抑制作用,平滑度高,适用于高频振荡的系统
|缺点: 不易于消除干扰所引起的采样值偏差,不适用于脉冲干扰比较严重的场合;
涉及到队列,比较浪费RAM,ROM(它和限幅滤波器的优缺点正好相反)。不适用于对要求数据计算速度较快或测量速度较慢的实时控制。
连续采样n次(一般取奇数),把n次采样值按大小排列,形成有序数据,取中间值为本次有效值。
l 优点:它能有效克服因偶然因素引起的波动干扰,对温度、液位等变化缓慢的被测参数有良好的滤波效果
l 缺点:但是对流量、速度等快速变化的参数滤波效果较差。
算术平均值法对每次感知给出相同的加权系数,即1/N,实际上有些场合需要使用加权递推平均法,即下式:
式中各个系数满足:(给予新采样值的权系数越大,灵敏度越高,信号平滑度越低。)
各个系数选取通常采用加权系数法,即:
l 优点:加权递推平均法适用于系统纯滞后时间常数τ较大、采样周期较短的过程。
l 缺点:对于纯滞后时间常数τ较小,采样周期较长,变化缓慢的信号,不能迅速反应系统当前所受干扰的严重程度,滤波效果差
连续取N个采样值进行算术平均运算。
l N值较大时,信号平滑度较高,但是灵敏度较低;N大平滑不灵敏
l N值较小时,信号平滑度低,但灵敏度高。N小不滑但灵敏
l 优点:适用于对一般具有随机干扰的信号进行滤波
l 缺点:因涉及到除法运算,在一些没有除法指令的MCU下,运算会比较慢。存在滞后
模拟量输入通道中,常用一阶低通RC滤波器来削弱干扰,但是这种方法 于对低频干扰的滤波,因为时间常熟越大,R值越大,漏电流增加。惯性滤波很好的克服了上述的缺点,采用数字形式实现的低通滤波的动态滤波方法,在滤波常数要求大的场合,这种方法尤其管用。
惯性滤波法适用于波动频繁的被测量滤波,能很好地消除周期性干扰,但是也带来了相位滞后,且灵敏度不高,滞后角大小选取有关。
动态测试信号处理中,滤波器常用于抗混滤波,避免傅里叶变换时产生混叠,或从具有多种频率成分的复杂信号中,将感兴趣的频率成分提取出来,将不感兴趣的频率成分衰减掉。
卡尔曼滤波是一种利用线性系统状态方程,通过系统输入输出观测矩阵,对系统状态进行最优估算的算法,由于观测数据中包含系统中的噪声和干扰的影响,所以最优估计也可看作是滤波过程。
Kalman滤波在测量方差已知的情况下能够从一系列存在测量噪声的数据中,估计动态系统的状态。由于它便于计算机编程实现,并能够对现场采集的数据进行实时的更新和处理,Kalman滤波是目前应用最为广泛的滤波方法,在通信,导航,制导与控制等多领域得到了较好的应用(便于编程、实时性好)
推荐:有点牛逼,一点就透
【卡尔曼滤波器】1_递归算法_Recursive Processing
粒子滤波,通过寻找一组在状态空间中传播的随机样本来近似的表示概率密度函数,用样本均值代替积分运算,进而获得系统状态的最小方差估计的过程,这些样本被称为“粒子”故叫粒子滤波。
利用粒子集来表示概率,可以用在任何形式的状态空间模型上。
核心思想是通过从后验概率中抽取的随机状态粒子来表达其分布,是一种顺序重要性采样法(Sequential Importance Sampling)。
简单来说,粒子滤波法是指通过寻找一组在状态空间传播的随机样本对概率密度函数进行近似,以样本均值代替积分运算,从而获得状态最小方差分布的过程。这里的样本即指粒子,当样本数量N→∝时可以逼近任何形式的概率密度分布。
应用范围
l 粒子滤波在非线性、非高斯系统表现出来的优越性,决定了它的应用范围的广泛性。
l 粒子滤波器的多模态处理能力,也是它应用广泛的原因之一
国际上,粒子滤波已被应用于各个领域。
u 经济学领域:它被应用在经济数据预测;
u 军事领域:已经被应用于雷达跟踪空中飞行物,空对空、空对地的被动式跟踪;
u 交通管制领域:它被应用在对车或人视频监控;它还用于机器人的全局定位。
中位值平均滤波法相当于“中位值滤波法”+“算术平均滤波法”。
方法:连续采样N个数据,去掉一个最大值和一个最小值然后计算N-2个数据的算术平均值N值的选取:3~14
优点:融合了两种滤波法的优点这种方法既能抑制随机干扰,又能滤除明显的脉冲干扰。
缺点:测量速度较慢,和算术平均滤波法一样比较浪费RAM
限幅滤波法”+“递推平均滤波法”
方法:每次采样到的新数据先进行限幅处理,再送入队列进行递推平均滤波处理
优点:融合了两种滤波法的优点,对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差
缺点:比较浪费RAM
适用范围:缓变信号
说明算术平均滤波,加权平均滤波和滑动平均滤波之间的区别以及各自的用途
|算术平均滤波每次采样值所占的比例均相等,可用于任何场合:如压力、流量等。
|加权平均滤波则每次采样值所占的比例不等,可以突出某些部分,使其所占的比例增大,但各次采样的系数总和为∑Ci=1;这种滤波主要用于那些想突出采样的某些部分的场合。
|滑动平均滤波则是每次只更新一个采样值,因而采样速度快。此滤波主要用于实时性要求比较快的场合。
滤波算法 | 优点 | 缺点 | 使用场景 |
---|---|---|---|
限值滤波 | 能有效克服因偶然因素引起的随机干扰 | 无法抑制那种周期性的干扰,平滑度差 | 随机干扰严重,单次采样 |
中值滤波 | 能有效克服因偶然因素引起的脉冲干扰和随机干扰 | 不宜使用于快速变化的参数 | 变化比较缓慢的被测量值,多次采样,采样频率高 |
滑动平均滤波 | 对周期性干扰有良好的抑制作用,平滑度高 | 灵敏度低,不易消除脉冲干扰引起的误差 | 适用于高频振荡的系统,多次采样,采样频率较低 |
一阶滤波 | 对周期性干扰有一定的抑制作用 | 相位滞后,灵敏度低,滞后程度取决于F的值 | 适用于高频振荡的系统,单次采样 |
a.对当前值范围进行限幅
对于输入得input判断是否大于最大值,若大于,这使用lastValue替代
float maxFilter(float input,float MAX)
{
static float lastValue = 0;
if ( ( input > MAX ) || (input < -MAX ))
{
return lastValue;
}
lastValue = input;
return input;
}
b.对相邻值之间的偏差进行限幅
#define DELAT_MAX 10
// 定义滤波数据类型
typedef int filter_type;
filter_type filter(filter_type effective_value, filter_type new_value, filter_type delat_max)
{
if ( ( new_value - effective_value > delat_max ) || ( effective_value - new_value > delat_max ))
return effective_value;
return new_value;
}
设定大小为windows的数组Data,sum计算去掉最大最小值的和值,算剩下数的平均值输出
float GildeAverageValueFilter(float NewValue,float *Data,unsigned short int windows) { float max,min; float sum; unsigned char i; Data[0]=NewValue; max=Data[0]; min=Data[0]; sum=Data[0]; for(i=windows-1;i!=0;i--) //循环四次,从后往前 { if(Data[i]>max) max=Data[i]; else if(Data[i]<min) min=Data[i]; sum+=Data[i]; Data[i]=Data[i-1]; //数据右移 } i=windows-2; sum=sum-max-min; sum=sum/i; return(sum); }
//1. 结构体类型定义 typedef struct { float LastP;//上次估算协方差 初始化值为0.02 --e(ESTk-1) 上次协方差 float Now_P;//当前估算协方差 初始化值为0 --预测e(ESTk) 当前估算协方差 float out;//卡尔曼滤波器输出 初始化值为0 float Kg;//卡尔曼增益 初始化值为0 --Kk float Q;//过程噪声协方差 初始化值为0.001 float R;//观测噪声协方差 初始化值为0.543 --e(MEAk) 测量误差 }KFP;//Kalman Filter parameter //2. 以高度为例 定义卡尔曼结构体并初始化参数 KFP KFP_height={0.02,0,0,0,0.001,0.543}; /** *卡尔曼滤波器 *@param KFP *kfp 卡尔曼结构体参数 * float input 需要滤波的参数的测量值(即传感器的采集值) *@return 滤波后的参数(最优值) */ float kalmanFilter(KFP *kfp,float input) { //预测协方差方程:k时刻系统估算协方差 = k-1时刻的系统协方差 + 过程噪声协方差 kfp->Now_P = kfp->LastP + kfp->Q; //卡尔曼增益方程:卡尔曼增益 = k1-1时刻系统估算协方差 / (k时刻系统估算协方差 + 观测噪声协方差) kfp->Kg = kfp->Now_P / (kfp->Now_P + kfp->R); //更新最优值方程:k时刻状态变量的最优值 = 状态变量的预测值 + 卡尔曼增益 * (测量值 - 状态变量的预测值) kfp->out = kfp->out + kfp->Kg * (input -kfp->out);//因为这一次的预测值就是上一次的输出值 //更新协方差方程: 本次的系统协方差付给 kfp->LastP 威下一次运算准备。 kfp->LastP = (1-kfp->Kg) * kfp->Now_P; return kfp->out; } /** *调用卡尔曼滤波器 实践 */ int height; int kalman_height=0; kalman_height = kalmanFilter(&KFP_height,(float)height);
常见的数字滤波算法
C语言面向对象实现滑动均值滤波与平均值滤波
卡尔曼(Kalman)滤波算法原理、C语言实现及实际应用
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。