当前位置: 移动技术网 > IT编程>开发语言>.net > 单片机常用简单滤波

单片机常用简单滤波

2020年07月13日  | 移动技术网IT编程  | 我要评论
/*
A、名称:一阶滞后滤波法
B、方法:
    取a=0-1,本次滤波结果=(1-a)*本次采样值+a*上次滤波结果。
C、优点:
    对周期性干扰具有良好的抑制作用;
    适用于波动频率较高的场合。
D、缺点:
    相位滞后,灵敏度低;
    滞后程度取决于a值大小;
    不能消除滤波频率高于采样频率1/2的干扰信号。

    滤波系数越小,滤波结果越平稳,但是灵敏度越低;
         滤波系数越大,灵敏度越高,但是滤波结果越不稳定。
        一阶滤波无法完美地兼顾灵敏度和平稳度。有时,我们只能寻找一个平衡,在可接受的灵敏度范围内取得尽可能好的平稳度。而在一些场合,我们希望拥有这样一种接近理想状态的滤波算法。即:
        当数据快速变化时,滤波结果能及时跟进(灵敏度优先);
        当数据趋于稳定,在一个固定的点上下振荡时,滤波结果能趋于平稳(平稳度优先)。
*/
#define FILTER_A 0.01
s32 low_pass_filter(int new_value,unsigned char flag_times) {
  static int s_old_value = 0;
  if (flag_times){
    s_old_value = (int)((float)new_value * FILTER_A + (1.0 - FILTER_A) * (float)s_old_value); 
  }else{
    s_old_value = new_value;   
  }
  return s_old_value;
}
/*
A、名称:加权递推平均滤波法
B、方法:
    是对递推平均滤波法的改进,即不同时刻的数据加以不同的权;
    通常是,越接近现时刻的数据,权取得越大。
    给予新采样值的权系数越大,则灵敏度越高,但信号平滑度越低。
C、优点:
    适用于有较大纯滞后时间常数的对象,和采样周期较短的系统。
D、缺点:
    对于纯滞后时间常数较小、采样周期较长、变化缓慢的信号;
    不能迅速反应系统当前所受干扰的严重程度,滤波效果差。

*/
#define FILTER_N 12
const u8 coe[FILTER_N] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};    // 加权系数表
const u8 sum_coe = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12; // 加权系数和
s32 weight_recursive_filter(u16* filter_buf) 
{
  u8 i = 0;
  u8 filter_sum = 0;
  for(i = 0; i < FILTER_N; i++) {
    filter_sum += filter_buf[i] * coe[i];
  }
  filter_sum /= sum_coe;
  return filter_sum;
}
/* 冒泡排序从小到大排列 */
void bubble_sort(u16* _buff,u8 _len)
{
	u8 i = 0;
    u8 j = 0;
	u16 temp = 0;
    for(i = 0;i < _len - 1; i++){
        for( j = 0;j < _len -1-i; j++) {
            if(_buff[j+1] < _buff[j]){
                temp = _buff[j];
                _buff[j] = _buff[j+1];
                _buff[j+1] = temp;
            }
        }
    }
}
/*
A、名称:平均值滤波法
B、方法:
	算术平均值
C、优点:
    能较好的抑制偶然误差。
D、缺点:
    浪费ram,计算量大。
*/
u16 filter_average(u16* _buff,u16 _len)
{
	u8 i = 0;
    u16 temp = 0;
    u32 sum = 0;
    for(i = 0;i < _len; i++){
		sum += _buff[i];
    }
	temp = sum / _len;
	return temp;
}
/*
A、名称:中位值滤波法
B、方法:
	中位值
C、优点:
    能较好的抑制偶然误差。
D、缺点:
    浪费ram,计算量大。
*/
u16 filter_median(u16* _buff,u16 _len)
{
	u16 temp = 0;
    bubble_sort(_buff, _len);
    if (1 == (_len % 2)){
        _len /= 2;
        temp = _buff[_len];
    }else{
        _len /= 2;
        temp = (_buff[_len - 1] + _buff[_len])/2;
    }
	return temp;
}
/*
A、名称:平均值滤波法
B、方法:
	算术平均值
C、优点:
    能较好的抑制偶然误差,两种方法的集合。
D、缺点:
    浪费ram,计算量大。
*/
u16 filter_median_average(u16* _buff,u16 _len)
{
	u8 i = 0;
    u16 temp = 0;
    u32 sum = 0;
    bubble_sort(_buff, _len);
    for(i = 1;i < _len - 1; i++){
		sum += _buff[i];
    }
	temp = sum / (_len - 2);
	return temp;
}

本文地址:https://blog.csdn.net/lala0903/article/details/106485307

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网