限幅中位值平均滤波算法 源码 函数

#include <stdio.h>

//数据类型别名
typedef	float                       f32;
typedef	double                      f64;

typedef	signed char                 s8;
typedef	signed short                s16;
typedef	signed int                  s32;
typedef signed long long            s64;

typedef	unsigned char               u8;
typedef	unsigned short              u16;
typedef	unsigned int                u32;
typedef unsigned long long          u64;

/**
 *******************************************************************************
 * @brief   限幅中位值平均滤波法 函数
 * @param   [in] *ary           数据指针
 * @param   [in] len            数据长度 范围: 6--254(偶数,最好是2的次方)
 * @param   [in] limitVal       数据限幅大小
 * @param   [in] *pAverageVal   平均值回传指针
 * @return  1--表示超幅; 0--表示成功
 * @note    数组前一半 去掉最大、最小平均值 与 数组后一半 去掉最大、最小平均值
 *          进行比较,满足限副条件,前后平均值再求平均值作为最后滤波值
 *******************************************************************************
 */
u8 LimitMedianAverageFilter(u16 *ary, u8 len, u16 limitVal, u16 *pAverageVal)
{
    u8 i, flen;
    u16 max, min;
    u32 sum, bsum;
//**********************************************************
    flen = len/2;
    max  = ary[0];
    min  = ary[0];
    sum  = ary[0];
    for(i=1; i<flen; i++) //找出最大,最小,并求出数组和
    {
        if(max < ary[i])max = ary[i];
        if(ary[i] < min)min = ary[i];
        sum += ary[i];
    }
    sum = sum - max - min;
//----------------------------------------------------------
    max  = ary[i];
    min  = ary[i];
    bsum = ary[i];
    for(i+=1; i<len; i++) //找出最大,最小,并求出数组和
    {
        if(max < ary[i])max = ary[i];
        if(ary[i] < min)min = ary[i];
        bsum += ary[i];
    }
    bsum = bsum - max - min;
//**********************************************************
    if( ((sum>=bsum) ? (sum-bsum) : (bsum-sum)) >= (limitVal*(flen-2)) )return 1; //中位值超幅
    *pAverageVal = (sum + bsum)/(len - 4); return 0; //求中位均值  
}

/**
 *******************************************************************************
 * @brief   主 函数
 * @param   [in] None
 * @return  None
 * @note    
 *******************************************************************************
 */
int main(void)
{
    u16 buf[8] = {1, 2, 3, 4, 5, 4, 3, 2};
    u16 Value;
    
    if( LimitMedianAverageFilter(buf, 8, 2, &Value) ) //数据滤波失败
    {
    	printf("超幅 \r\n");
	}
	else //数据滤波成功 
	{
    	printf("平均值: %d \r\n", Value);
	}
}

运行结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值