文章目录
1. 限幅滤波法
(1)原理
通过给定的最大偏差值A来实现,如果本次值与上次差值<=A,则本次有效;否则无效,使用上次值代替。
(2)特点
- 优点:能有效克服偶然因素导致的脉冲干扰
- 缺点:无法抑制周期性干扰,平滑性差
(3)例程
int Filter_Value;
int Value;
// 限幅滤波法(又称程序判断滤波法)
#define FILTER_A 1
int Filter() {
int NewValue;
NewValue = Get_AD();
if(((NewValue - Value) > FILTER_A) || ((Value - NewValue) > FILTER_A))
return Value;
else
return NewValue;
}
2. 中位值滤波法
(1)原理
连续采集N次值(N为奇数),将采样值按大小排列,取中间值为本次有效值
(2)特点
- 优点:能有效克服偶然因素导致的波动干扰,对温度等变换缓慢的被测参数有良好滤波效果
- 缺点:不适合待测量快速变换的场合,如流量、速度等
(3)例程
int Filter_Value;
// 中位值滤波法
#define FILTER_N 101
int Filter() {
int filter_buf[FILTER_N];
int i, j;
int filter_temp;
for(i = 0; i < FILTER_N; i++) {
filter_buf[i] = Get_AD();
delay(1);
}
// 采样值从小到大排列(冒泡法)
for(j = 0; j < FILTER_N - 1; j++) {
for(i = 0; i < FILTER_N - 1 - j; i++) {
if(filter_buf[i] > filter_buf[i + 1]) {
filter_temp = filter_buf[i];
filter_buf[i] = filter_buf[i + 1];
filter_buf[i + 1] = filter_temp;
}
}
}
return filter_buf[(FILTER_N - 1) / 2];
}
3. 算术平均滤波法
(1)原理
连续采用N个值进行算数平均运算
(2)说明
-
N值较大时:信号平滑度较高,但灵敏度较低;
-
N值较小时:信号平滑度较低,但灵敏度较高;
-
N值的选取:一般流量,N=12;压力:N=4
(3)特点
- 优点:适合对一般具有随机干扰的信号(即信号在某一数据范围附近上下波动)进行滤波
- 缺点:不适合待测量变换较快或要求数据计算速度较快的实时控制,较浪费RAM
(4)例程
int Filter_Value;
// 算术平均滤波法
#define FILTER_N 12
int Filter() {
int i;
int filter_sum = 0;
for(i = 0; i < FILTER_N; i++) {
filter_sum += Get_AD();
delay(1);
}
return (int)(filter_sum / FILTER_N);
}
4. 递推平均滤波法
(1)原理
把连续N个采样值看成一个队列,队列长度固定为N,每次采样把新数据放入队尾,并扔掉队首的一次数据,把队列中的N个数据进行平均计算,即获得新的滤波值
(2)特点
- 优点:对周期性干扰具有良好的抑制作用,平滑度高,适合高频振荡系统;
- 缺点:对偶然出现的脉冲性干扰的抑制作用较差,不适于脉冲干扰较严重的场合,不适于开关电源电路。
(3)例程
#define N 12
char value_buf[N];
char i = 0;
char filter(void) {
char count = 0;
int sum = 0;
value_buf[i++] = get_ad();
if(i == N) {
i = 0; //先进先出
}
for(count = 0; count < N; count++) {
sum += value_buf[count];
}
return (char)(sum / N);
}
5. 中位值平均滤波法
(1)原理
采一组队列去掉最大值和最小值
(2)特点
- 优点:融合了两种滤波的优点。对于偶然出现的脉冲性干扰,可消除有其引起的采样值偏差,对周期干扰有良好的抑制作用,平滑度高,适于高频振荡的系统;
- 缺点:测量速度慢;
(3)例程
#define N 12
char filter(void) {
char i = 0, j = 0, temp = 0;
char value_buf[N];
int sum = 0;
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];
}
return (char)(sum / (N - 2));
}
6. 限幅平均滤波法
(1)原理
限幅+平均
(2)特点
- 优点:融合了两种滤波法的优点,对于偶然出现的脉冲性干扰,可消除有其引起的采样值偏差;
- 缺点:较浪费RAM
(3)例程
略
7. 加权递推平均滤波法
(1)原理
对递推平均滤波法的改进,即不同时刻的数据加以不同权值;通常是越接近现时刻的数据,权值越大,新采样值的权重越大,则灵敏度越高,但信号平滑度越低。
(2)特点
- 优点:适用于有较大纯滞后时间常数的对象,和采样周期较短的系统;
- 缺点:对于纯滞后时间常数较小、采样周期较长、变化缓慢的信号;不能迅速反应系统当前所受干扰的严重程度,滤波效果差。
(3)例程
/* coe数组为加权系数表 */
#define N 12
char coe[N] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
char sum_coe = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12;
char filter(void) {
char i = 0;
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++) {
sum += value_buf[i] * coe[i];
}
return (char)(sum / sum_coe);
}
8. 消抖滤波法
(1)原理
- 设置一个滤波计数器,将每次采样值与当前有效值比较;
- 如果采样值=当前有效值,计数器清零;
- 如果不相等,则计数器+1,并判断计数器是否溢出;
- 如果计数器溢出,则将本次值替换当前有效值,并清零计数器;
(2)特点
- 优点:对待测量缓慢变化的参数有较好滤波效果,可避免在临界值附近控制器的反复开关跳动或者显示器上数字抖动;
- 缺点:不适于快速变化的参数测量,如果计数器溢出的采样恰好是干扰值,则会将干扰值当做有效值引入系统;
(3)例程
#define N 12
char filter(void) {
char i = 0;
char new_value = 0, value = 0;
new_value = get_ad();
while(value != new_value) {
i++;
if(i > N) {
return new_value;
}
delay();
new_value = get_ad();
}
return value;
}
9. 限幅消抖滤波法
(1)原理
相当于“限幅滤波法”+“消抖滤波法”;
先限幅,后消抖。
(2)特点
- 优点:继承了“限幅”和“消抖”的优点,改进了“消抖滤波法”中的某些缺陷,避免将干扰值导入系统;
- 缺点:不适合待测量变换快速的场合
(3)例程
int Filter_Value;
int Value;
// 限幅消抖滤波法
#define FILTER_A 1
#define FILTER_N 5
int i = 0;
int Filter() {
int NewValue;
int new_value;
NewValue = Get_AD();
if(((NewValue - Value) > FILTER_A) || ((Value - NewValue) > FILTER_A))
new_value = Value;
else
new_value = NewValue;
if(Value != new_value) {
i++;
if(i > FILTER_N) {
i = 0;
Value = new_value;
}
}
else
i = 0;
return Value;
}
10. 一阶滞后滤波法
(1)原理
取 α = ( 0 , 1 ) α=(0,1) α=(0,1), f i l t e r d a t a = ( 1 − α ) 本 次 采 样 值 + α 上 次 滤 波 结 果 filter_{data} = (1-\alpha)本次采样值+\alpha 上次滤波结果 filterdata=(1−α)本次采样值+α上次滤波结果
(2)特点
- 优点:对周期性干扰具有良好的抑制作用,适合波动频率较高的场合;
- 缺点:有相位滞后,灵敏度低,滞后程度取决于α的值,不能消除滤波频率高于采样频率1/2的干扰信号
(3)例程
int Filter_Value;
int Value;
// 一阶滞后滤波法
#define FILTER_A 0.01
int Filter() {
int NewValue;
NewValue = Get_AD();
Value = (int)((float)NewValue * FILTER_A + (1.0 - FILTER_A) * (float)Value);
return Value;
}
本文转自临远科技-熊冰乎文五大滤波算法原理、场景及实践及嵌入式基地乎文常见的滤波算法(C语言),侵权请联系