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

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

程序员文章站 2024-03-25 22:07:10
...
#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);
	}
}

运行结果:
限幅中位值平均滤波算法 源码 函数