static u8 xdata i=0; //索引
static s16 xdata dat_arr[DATA_CAP];
static s16 xdata data_arr2[DATA_CAP2];
void CS1237_Driver()
{
static u8 xdata tmp[4]; //临时数据
if (CS1237_ReadData((u32 *)tmp) == 0)
{
dat_arr[i] = *(s16 *)&tmp[1]; //精简数据
i++;
if (i >= DATA_CAP)
{
i = 0;
//递推平均滤波
sensor.det = Filter_AveTeam(data_arr2,Filter_Median(dat_arr,DATA_CAP),DATA_CAP2); //二次滤波
//平均值滤波
// sensor.det = Filter_Median(dat_arr,DATA_CAP);
//数据向外发送
// Uart2_Send((u8 *)&sensor.det,2);
sensor.det_compensation = sensor.det+sensor.zero; //进行偏移
}
}
}
/*中位值滤波,适用于滤除干扰数据
优点:
1、能有效克服因偶然因素引起的波动干扰
2、对温度、液位的变化缓慢的被测参数有良好的滤波效果
缺点:
1、对流量、速度等快速变化的参数不宜。
*/
//*dat:数组地址
//n:数据个数
//返回值:返回中位数
s16 Filter_Median(s16 xdata *dat,u8 n)
{
Swap_Sort(dat,n); //从小到大排序
if (n&1)
return dat[n/2];
else
return (dat[n/2]+dat[n/2-1])>>1;
}
/*递推平均滤波
优点:
1、对周期性干扰有良好的抑制作用,平滑度高;
2、适用于高频振荡的系统。
缺点:
1、灵敏度低;
2、对偶然出现的脉冲性干扰的抑制作用较差;
3、不易消除由于脉冲干扰所引起的采样值偏差;
4、不适用于脉冲干扰比较严重的场合;
5、比较浪费RAM
*/
//*dat:数据队列起始地址
//new_val:获得的新数据
//n:数据队列的长度。N值的选取:流量,N=12;压力:N=4;液面,N=4~12;温度,N=1~4
//返回值:递推平均滤波的结果
s16 Filter_AveTeam(s16 xdata *dat,s16 new_val,u8 n)
{
static u8 i=0;
if (i < n)
{
dat[i] = new_val;
i++;
} else {
dat[0] = new_val;
i = 1;
}
return Average(dat,n);
}
/*求平均值*/
//*x:数据起始地址
//n:数据个数
//返回值:返回平均值
s16 Average(s16 *x,u8 n)
{
s32 sum=0; u8 n_tmp;
n_tmp = n;
while (n--)
{
sum += x[n];
}
switch (n)
{
case 1:
return sum;
case 2:
return sum>>1;
case 4:
return sum>>2;
case 8:
return sum>>3;
case 16:
return sum>>4;
case 32:
return sum>>5;
case 64:
return sum>>6;
case 128:
return sum>>7;
default:
return sum/n_tmp;
}
}