最近用stm32单片机检测外部8路电压。STM32内部包含12位的ADC,一次检测一路AD最快只要1us。为了防止偶尔外对AD采样的干扰,单片机对采集数据进行中值平均滤波。
中值平均滤波就是在采集的N个数据中去掉一个最大值和一个最小值,然后对剩下的数据求平均值。所以这个算法不需要对数据排序,关键是计算最大值,最小值,求和,然后计算平均值。算法实现如下:
/**
* 中位值平均滤波
* @param pData:没有滤波的数据
* @param nSize:数据大小
* @return:滤波数值
*/
unsigned short MedianFilter(unsigned short* pData,int nSize)
{
unsigned short max,min;
int sum;
if(nSize>2)
{
max = pData[0];
min = max;
sum = 0;
for(int i=0;i<nSize;i++)
{
sum += pData[i];
if(pData[i]>max)
{
max = pData[i]; //一个循环之后max就是最大的值
}
if(pData[i]<min)
{
min = pData[i]; //一个循环之后min就是最小的值
}
}
sum = sum-max-min; //去掉最大的值和最小的值
return sum/(nSize-2); //对N-2个数求平均值
}
return 0;
}