1.引言
在嵌入式系统开发中,信号滤波是非常重要的一个方面。嵌入式设备需要对从传感器中接收的信号进行处理,以获取结果或反馈,但这些信号通常受到各种噪声和干扰的影响。因此,开发者需要使用一些信号滤波算法来消除噪声和干扰,准确地提取所需的信号。本文将介绍嵌入式常见的10种滤波方法,并介绍其滤波方式和意义。
一般在系统中可选用硬件滤波和软件滤波,滤波技术的目的在于去除或减少噪声和干扰,以便更准确地提取所需的信号。使用这些方法可以有效地提高系统的可靠性和准确性,并减少误差和能耗,嵌入式设备的开发人员可以根据系统的特点和需求选择合适的滤波算法。
2.滤波方式
- 硬件上:RC 滤波器、LC 滤波器等模拟滤波器进行滤波。
- 软件上:限幅滤波法、中位值滤波法、算术平均滤波法、递推平均滤波法、中位值平均滤波法、限幅平均滤波法、一阶滞后滤波法、加权递推平均滤波法、消抖滤波法、限幅消抖滤波法。
3. 10种经典的软件滤波方法介绍
3.1限幅滤波
限幅滤波基本思路是根据被测对象确定相邻两次采样所允许的最大差值△Y, 然后在每次采样后和上次有效采样值进行比较,如果变化幅度不超过△Y,则本次采样有效;否则,则这次采样值被视为干扰而放弃,而以上次采样值为准。
1、方法:
根据经验判断两次采样允许的最大偏差值A,每次采新值时判断:若本次值与上次值之差<=A,则本次有效;若本次值与上次值之差>A,本次无效,用上次值代替本次。
|yn-yn-1|≤△Y :yn 有效,如果本次值与上次值之差<=DEVIATION_MAX,则本次值有效;
|yn-yn-1|>△Y :yn-1 有效,如果本次值与上次值之差>DEVIATION_MAX,则本次值无效,放弃本次值,用上次值代替本次值。(yn为第 n 次采样值, yn-1 为第(n-1)次采样值)
△Y一般根据经验来设定,确定两次采样允许的最大偏差值(设为DEVIATION_MAX)。
2、优缺点:
优点:能有效克服因偶然因素引起的脉冲干扰。
缺点:无法抑制那种周期性的干扰、平滑度差。
3、代码:
(注:本文假定从16位AD中读取数据(若采用更高位的AD可定义数据类型为int;子程序为get_ad(),用于获取AD采样数值;)
#define DEVIATION_MAX 10
int16_t Value;
int16_t filter(void)
{
int16_t new_Value;
new_Value = get_ad(); //获取采样值
if( abs(new_Value - Value) > DEVIATION_MAX) //abs()取绝对值函数
return Value;
else
return new_Value;
}
3.2中位值滤波
1、方法:
连续采样N次,按大小排列,取中间值为本次有效值。
2、优缺点:
优点:能够克服波动干扰,对温度、液位等变化缓慢的被测参数有良好的滤波效果。
缺点:对速度等快速变化的参数不宜。
3、代码:
#define N 11
char filter()
{
char value_buf[N];
char count,i,j,temp;
for(count = 0;count < N;count++) //获取采样值
{
value_buf[count] = 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;
}
return value_buf[(N-1)/2];
}
3.3算术平均滤波
1、方法:
连续采样N次,取平均
N较大时平滑度高,灵敏度低;
N较小时平滑度低,灵敏度高;
N值的选取:一般流量,N=12;压力:N=4。一般N=12。
2、优缺点:
优点:适用于对一般具有随机干扰的信号进行滤波;这种信号的特点是有一个平均值,信号在某一数值范围附近上下波动。
缺点:对于测量速度较慢或要求数据计算速度较快的实时控制不适用;占用RAM多,速度慢。
3、代码:
#define N 12
char filter()
{
int sum = 0;
for(count = 0; count<N; count++)
sum += get_ad();
return (char)(sum/N);
}
3.4递推平均滤波
1、方法:
取N个采样值形成队列,队列的长度固定为N,每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据(先进先出原则),把队列中的N个数据进行算术平均运算,获得新的滤波结果。
N值的选取:流量,N=12;压力,N=4;液面,N=4-12;温度,N=1-4。
2、优缺点:
优点:对周期性干扰抑制性好,平滑度高,适用于高频振动系统。
缺点:灵敏度低,对偶然出现的脉冲性干扰的抑制作用较差;不易消除由于脉冲干扰所引起的采样值偏差;不适用于脉冲干扰比较严重的场合;比较浪费RAM。
3、代码:
# define FILTER_N 12
int filter_buf[FILTER_N + 1];
int Filter()
{
int i;
int filter_sum = 0;
filter_buf[FILTER_N] = Get_AD();
for(i = 0; i < FILTER_N; i++) {
filter_buf = filter_buf[i + 1]; //所有数据左移,低位仍掉
filter_sum += filter_buf;
}
return (int)(filter_sum / FILTER_N);
}
3.5中位值平均滤波法
1、方法:
采样N个值,去掉最大最小,计算N-2的平均值,N= 3~14
2、优缺点:
融合了中位值,平均值的有点
消除脉冲干扰
计算速度慢,RAM占用大
3、代码:
#define N 12
char filter()
{
char count,i,j;
char Vlaue_buf[N];
int sum=0;
for(count=0;count<N;count++)
Value_buf[count]= get_ad();
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(count =1;count<N-1;count++)
sum += Value_buf[count];
return (char)(sum/(N-2));
}
3.6限幅平均滤波法
1、方法:
相当于“限幅滤波法”+“递推平均滤波法”,每次采样到的新数据先进行限幅处理,再送入队列进行递推平均滤波处理。
2、优缺点:
优点:融合限幅、均值、队列的优点,对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差。
缺点:消除脉冲干扰,占RAM较多。
3、代码:
#define A 10
#define N 12
char value,i=0;
char value_buf[N];
char filter()
{
char new_value,sum=0;
new_value=get_ad();
if(Abs(new_value-value)<A)
value_buf[i++]=new_value;
if(i==N)i=0;
for(count =0 ;count<N;count++)
sum+=value_buf[count];
return (char)(sum/N);
}
3.7一阶滞后滤波法
1、方法:
取a=0~1,本次滤波结果 = (1-a)*本次采样值 + a*上次滤波结果。
2、优缺点:
优点:对周期性干扰具有良好的抑制作用,适用波动频率较高场合。
缺点:灵敏度低,相位滞后,滞后程度取决于a值大小;不能消除滤波频率高于采样频率1/2的干扰信号。
3、代码:
/*为加快程序处理速度,取a=0~100*/
#define a 30
char value;
char filter()
{
char new_value;
new_value=get_ad();
return ((100-a)*value + a*new_value);
}
3.8加权递推平均滤波法
1、方法:
对递推平均滤波的改进,不同时刻的数据加以不同权重,通常越新的数据权重越大,这样灵敏度高,但平滑度低。
2、优缺点:
适用有较大滞后时间常数和采样周期短的系统,对滞后时间常数小,采样周期长、变化慢的信号不能迅速反应其所受干扰。
3、代码:
/* coe数组为加权系数表 */
#define N 12
char code coe[N]={1,2,3,4,5,6,7,8,9,10,11,12};
char code sum_coe={1+2+3+4+5+6+7+8+9+10+11+12};
char filter()
{
char count;
char value_buf[N];
int sum=0;
for(count=0;count<N;count++)
{
value_buf[count]=get_ad();
}
for(count=0;count<N;count++)
sum+=value_buf[count]*coe[count];
return (char)(sum/sum_coe);
}
3.9消抖滤波法
1、方法:
设置一个滤波计数器,将采样值与当前有效值比较,
若采样值=当前有效值,则计数器清0;
若采样值不等于当前有效值,则计数器+1;
若计数器溢出,则采样值替换当前有效值,计数器清0;
2、优缺点:
对变化慢的信号滤波效果好,变化快的不好。
避免临界值附近的跳动,计数器溢出时若采到干扰值则无法滤波。
3、代码:
#define N 12
char filter()
{
char count=0,new_value;
new_value=get_ad();
while(value!=new_value)
{
count++;
if(count>=N) return new_value;
new_value=get_ad();
}
return value;
}
3.10限幅消抖滤波法
1、方法:
先限幅,后消抖。
2、优缺点:
融合了限幅、消抖的优点。
避免引入干扰值,对快速变化的信号不宜。
3、代码:
#define A 10
#define N 12
char value;
char filter()
{
char new_value,count=0;
new_value=get_ad();
while(value!=new_value)
{
if(Abs(value-new_value)<A)
{
count++;
if(count>=N) return new_value;
new_value=get_ad();
}
return value;
}
}
4.意义
这些滤波方法都有一些共同的作用,包括:
1.去除或降低噪声和干扰。
2.提高信号质量和准确性。
3.提高系统的鲁棒性和可靠性。
4.降低滤波器的延迟和功耗。
信号处理在嵌入式系统中是非常关键的,滤波技术可以帮助我们提高系统的准确性和可靠性。因此,嵌入式常见的10种滤波方法尤为重要,这些方法可以帮助开发人员处理和优化从传感器、外设和其他来源收集的数据。
5.结论
信号滤波是嵌入式系统开发过程中不可或缺的一部分,它可以提高系统的鲁棒性和可靠性。本文介绍了嵌入式常见的10种滤波方法,并讨论了它们的作用、意义和目的。在选择信号滤波算法时,我们应该基于系统特点和使用环境的需求来选择最合适的滤波方法。
引用大佬文章并增加其内容。