欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

单片机常用简单滤波

程序员文章站 2022-06-16 18:38:40
aa...
/*
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