对于角度传感器的输出值进行均值滤波时,在角度的循环点处因数据值的非连续性,如果不对原始数据进行处理做会出现错误数据,如(354 + 5)/2= 179.5,正常值应为359.5。采用把角度值转化为三角函数值滤波后再通过反函数(结合象限)求值的方法较多,此外对于两个数据值的滤波可通过差值判断的方法也可以解决,对于多数据的滤波有什么更高效的方法呢?
对落入阈值范围(360度情况下如:330-360;0-30)的数据采取标记的方法,在要平均的数据中只有在两种数据都存在的情况下对数据进行处理就可以了。
int num = 5; //滤波值数量
int i = 0;//输入值放入数组循环
int m = 0;//标记
int n = 0;//标记
double[] data = new double[5];//将滤波值置入数组
double temp, output;
void Filter(double input)
{
data[i] = input;
if (m > 0)
m--;
if (n > 0)
n--;
if (input > 330)
m = num;
if (input < 30)
n = num;
temp = 0;
if (m > 0 && n > 0)
{
for (int j = 0; j < num; j++)
if (data[j] < 30)
temp += 360;
output = (data.Sum() + temp) % 360;
}
else
output = data.Average();
i++;
if (i == num)
i = 0;
}