十大滤波算法程序大全(精心整理版)

十大滤波算法程序大全(精心整理版)

1、限幅滤波法***************************************************
*函数名称:AmplitudeLimiterFilter()-限幅滤波法
*优点:能有效克服因偶然因素引起的脉冲干扰
*缺点:无法抑制那种周期性的干扰,且平滑度差
*说明:
1、调用函数
GetAD(),该函数用来取得当前值
2、变量说明
Value:最近一次有效采样的值,该变量为全局变量
NewValue:当前采样的值
ReturnValue:返回值
3、常量说明
A:两次采样的最大误差值,该值需要使用者根据实际情况设置
*入口:Value,上一次有效的采样值,在主程序里赋值
*出口:ReturnValue,返回值,本次滤波结果
****************************************************/
#define A 10
unsigned char Value
unsigned char AmplitudeLimiterFilter()
{
unsigned char NewValue;
unsigned char ReturnValue;
NewValue=GatAD();
if(((NewValue-Value)>A))||((Value-NewValue)>A)))
ReturnValue=Value;
else ReturnValue=NewValue;
return(ReturnValue);
}
2、中位值滤波法

/****************************************************
*函数名称:MiddlevalueFilter()-中位值滤波法
*优点:能有效克服因偶然因素引起的波动干扰;对温度、液
位等变化缓慢的被测参数有良好的滤波效果
*缺点:对流量,速度等快速变化的参数不宜
*说明:
1、调用函数
GetAD(),该函数用来取得当前值
Delay(),基本延时函数
2、变量说明
ArrDataBuffer[N]:用来存放一次性采集的N组数据
Temp:完成冒泡法试用的临时寄存器
i,j,k:循环试用的参数值
3、常量说明
N:数组长度
*入口:
*出口:value_buf[(N-1)/2],返回值,本次滤波结果
*****************************************************/

#define N 11

unsigned char MiddlevalueFilter()

{
unsigned char value_buf[N];
unsigned char i,j,k,temp;
for(i=0;i<N;i++)
{
value_buf[i] = get_ad();
delay();
}
for (j=0;j<N-1;j++)
{
for (k=0;k<N-j;k++)
{
if(value_buf[k]>value_buf[k+1])
{
temp = value_buf[k];
value_buf[k] = value_buf[k+1];
value_buf[k+1] = temp;
}
}
}
return value_buf[(N-1)/2];
}


3、算术平均滤波法

/*********************************************************
说明:连续取N个采样值进行算术平均运算
优点:试用于对一般具有随机干扰的信号进行滤波。这种信号的特点是
有一个平均值,信号在某一数值范围附近上下波动。
缺点:对于测量速度较慢或要求数据计算较快的实时控制不适用。
**********************************************************/

#define N 12

char filter()
{
unsigned int sum = 0;
unsigned char i;

for (i=0;i<N;i++)
{
sum + = get_ad();
delay();
}
return(char)(sum/N);
}

4、递推平均滤波法(又称滑动平均滤波法)

/***************************************************
说明:把连续N个采样值看成一个队列,队列长度固定为N。
每次采样到一个新数据放入队尾,并扔掉队首的一
次数据。把队列中的N各数据进行平均运算,既获得
新的滤波结果。
优点:对周期性干扰有良好的抑制作用,平滑度高;试用于高频振荡的系统
缺点:灵敏度低;对偶然出现的脉冲性干扰的抑制作用较差,不适于脉冲干
扰较严重的场合
****************************************************/

#define N 12

unsigned char value_buf[N];

unsigned char filter()
{
unsigned char i;
unsigned char value;
int sum=0;

value_buf[i++] = get_ad(); //采集到的数据放入最高位
for(i=0;i<N;i++)
{
value_buf[i]=value_buf[i+1]; //所有数据左移,低位扔掉
sum += value_buf[i];
}
value = sum/N;
return(value);
}

5、中位值平均滤波法(又称防脉冲干扰平均滤波法)

/********************************************
说明:采一组队列去掉最大值和最小值
优点:融合了两种滤波的优点。对于偶然出现的脉冲性干扰,可消
除有其引起的采样值偏差。对周期干扰有良好的抑制作用,
平滑度高,适于高频振荡的系统。
缺点:测量速度慢
*********************************************/

#define N 12

uchar filter()

{
unsigned char i,j,k,l;
unsigned char temp,sum=0,value;
unsigned char value_buf[N],;

for(i=0;i<N;i++)
{
value_buf[i] = get_ad();
delay();
}
//采样值从小到大排列(冒泡法)
for(j=0;j<N-1;j++)
{
for(i=0;i<N-j;i++)
{
if(value_buf[i]>value_buf[i+1])
{
temp = value_buf[i];
value_buf[i] = value_buf[i+1];
value_buf[i+1] = temp;
}
}
}

for(i=1;i<N-1;i++)
sum += value_buf[i];

value = sum/(N-2);
return(value);
}

6、递推中位值滤波法
/************************************************
优点:对于偶然出现的脉冲性干扰,可消除由其引起的采样值偏差。
对周期性干扰有良好的抑制作用,平滑度高;试用于高频振荡
的系统
缺点:测量速度慢
*************************************************/

char filter(char new_data,char queue[],char n)
{
char max,min;
char sum;
char i;

queue[0]=new_data;
max=queue[0];
min=queue[0];
sum=queue[0];

for(i=n-1;i>0;i--)
{
if(queue[i]>max)
max=queue[i];
else if (queue[i]<min)
min=queue[i];
sum=sum+queue[i];
queue[i]=queue[i-1];
}

i=n-2;
sum=sum-max-min+i/2; //说明:+i/2的目的是为了四舍五入
sum=sum/i;

return(sum);
}

7、限幅平均滤波法

/************************************************
优点:对于偶然出现的脉冲性干扰,可消除有其引起的采样值偏差。
*************************************************/
#define A 10
#define N 12

unsigned char data[];
unsigned char filter(data[])
{
unsigned char i;
unsigned char value,sum;

data[N]=GetAD();
if(((data[N]-data[N-1])>A||((data[N-1]-data[N])>A))
data[N]=data[N-1];
//else data[N]=NewValue;
for(i=0;i<N;i++)
{
data[i]=data[i+1];
sum+=data[i];
}
value=sum/N;
return(value);
}


8、一阶滞后滤波法

/****************************************************
*函数名称:filter()-一阶滞后滤波法
*说明:
1、调用函数
GetAD(),该函数用来取得当前值
Delay(),基本延时函数
2、变量说明
Or_data[N]:采集的数据
Dr0_flag、Dr1_flag:前一次比较与当前比较的方向位
coeff:滤波系数
F_count:滤波计数器
3、常量说明
N:数组长度
Thre_value:比较门槛值
*入口:
*出口:
*****************************************************/

#define Thre_value 10
#define N 50

float Or_data[N];
unsigned char Dr0_flag=0,Dr1_flag=0;

void abs(float first,float second)
{
float abs;
if(first>second)
{
abs=first-second;
Dr1_flag=0;
}
else
{
abs=second-first;
Dr1_flag=1;
}
return(abs);
}

void filter(void)
{
uchar i=0,F_count=0,coeff=0;
float Abs=0.00;

//确定一阶滤波系数
for(i=1;i<N;i++)
{
Abs=abs(Or_data[i-1],Or_data[i]);
if(!(Dr1_flag^Dr0_flag)) //前后数据变化方向一致

F_count++;
if(Abs>=Thre_value) 
{
F_count++;
F_count++;
}
if(F_count>=12)
F_count=12;
coeff=20*F_count; 
}
else //去抖动
coeff=5;
//一阶滤波算法
if(Dr1_flag==0) //当前值小于前一个值
Or_data[i]=Or_data[i-1]-coeff*(Or_data[i-1]-Or_data[i])/256;
else
Or_data[i]=Or_data[i-1]+coeff*(Or_data[i]-Or_data[i-1])/256; 

F_count=0; //滤波计数器清零
Dr0_flag=Dr1_flag;
}
}

9、加权递推平均滤波法

/************************************************************
coe:数组为加权系数表,存在程序存储区。
sum_coe:加权系数和
************************************************************/

#define N 12

const char code coe[N] = {1,2,3,4,5,6,7,8,9,10,11,12};
const char code sum_coe = 1+2+3+4+5+6+7+8+9+10+11+12;

unsigned char filter()
{
unsigned char i;
unsigned char value_buf[N];
int sum=0;

for (i=0;i<N;i++)
{
value_buf[i] = get_ad();
delay();
}

for (i=0,i<N;i++)
{
value_buf[i]=value_buf[i+1];
sum += value_buf[i]*coe[i];
}

sum/=sum_coe;
value=sum/N;
return(value);
}

10、消抖滤波法

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

*************************************************/
#define N 12

unsigned char filter()
{
unsigned char i=0;
unsigned char new_value;
new_value = get_ad();
if(value !=new_value);
{
i++;
if (i>N)
{
i=0;
value=new_value;
}
}
else i=0;
return(value);

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 平方根无迹卡尔曼滤波(Square Root Unscented Kalman Filter)是一种用于估计系统状态的滤波算法。相较于传统的卡尔曼滤波算法,平方根无迹卡尔曼滤波具有更好的数值稳定性和精度。 平方根无迹卡尔曼滤波通过选取一组特定的采样点(称为sigma点)来近似系统状态的不确定性。与传统的卡尔曼滤波不同,它使用了一种基于"无迹变换"的技术,从而避免了对系统状态的线性化。 平方根无迹卡尔曼滤波算法的实现可以在CSDN上找到相应的程序。在这个程序中,首先需要定义系统的动态方程和观测方程,这些方程描述了系统状态的演变和观测值的生成过程。然后,通过对观测数据进行预处理,得到初始的状态估计值和协方差矩阵。接下来,利用无迹变换的方,通过sigma点生成采样点,并根据其生成预测状态和协方差矩阵。然后,将观测值与预测值进行比较,得到观测变量的残差。根据残差和预测状态的协方差矩阵,利用卡尔曼增益修正预测状态和协方差矩阵,得到最终的状态估计值。 平方根无迹卡尔曼滤波算法程序可以在CSDN上查找相关资料,了解详细的实现过程。通过该程序可以理解平方根无迹卡尔曼滤波算法的原理和实际应用,以及如何进行状态估计。这对于在实际问题中应用平方根无迹卡尔曼滤波算法具有指导作用。 ### 回答2: 平方根无迹卡尔曼滤波算法(SRUKF)是一种扩展了传统无迹卡尔曼滤波算法(UKF)的滤波算法。相比于UKF,SRUKF可以更准确地估计系统的状态变量。 SRUKF的程序可以在CSDN上找到。CSDN是一个知名的IT技术社区,其中有很多技术专家和爱好者分享他们的开发经验和代码。 在CSDN上搜索"平方根无迹卡尔曼滤波算法程序",可以找到许多相关的博文和代码示例。这些博文通常会介绍SRUKF算法的基本原理,并提供相应的代码实现。可以通过这些代码示例,按照自己的需求进行修改和应用。 SRUKF算法的主要步骤包括初始化系统状态、预测状态、计算卡尔曼增益、更新状态估计以及更新状态协方差矩阵。在CSDN上找到的程序会具体展示这些步骤的实现细节。 可以通过参考这些程序,了解SRUKF算法的具体实现细节,并根据自己的实际需求进行代码的修改和应用。在实际使用过程中,还可以基于这些代码进行性能优化和功能扩展。 总之,CSDN上可以找到关于平方根无迹卡尔曼滤波算法程序的相关博文和代码示例,通过搜索和参考这些资源,可以更好地理解和应用SRUKF算法。 ### 回答3: 平方根无迹卡尔曼滤波算法(Square Root Unscented Kalman Filter, SRUKF)是一种用于状态估计的滤波算法。它是基于卡尔曼滤波器的一种扩展,可以有效地处理非线性系统和非高斯噪声的问题。 SRUKF通过一种非线性函数变换(无迹变换)将非线性系统转化为线性系统进行处理。该算法采用模拟发散技术,通过从状态估计的正态分布中采样一组称为“无迹点”的状态向量,并通过非线性函数变换来估计非线性系统的均值和方差。 SRUKF主要包含以下几个步骤: 1. 选择一组称为“无迹点”的状态向量。根据当前状态的均值和协方差矩阵,通过一定的规则生成一组无迹点,对于每个无迹点,通过非线性函数变换得到相应的预测值。 2. 通过测量模型将预测值映射到测量空间,得到预测测量值。 3. 计算无迹点的协方差矩阵,并通过测量模型得到相应的测量协方差矩阵。 4. 利用与预测测量值和测量协方差矩阵进行卡尔曼增益的计算。 5. 更新状态估计值和协方差矩阵。利用测量值和卡尔曼增益对预测值进行修正,得到更准确的估计值和协方差矩阵。 SRUKF具有较好的非线性系统估计性能、一致性和鲁棒性,在一些应用领域如目标跟踪、导航和机器人等领域得到了广泛应用。在实际应用中,可以通过调整一些参数和权重矩阵,进一步优化滤波器性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值