限幅中位值平均滤波算法 源码 函数
程序员文章站
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);
}
}
运行结果:
推荐阅读