标题:
简易的触摸屏滤波
[打印本页]
作者:
jialinx
时间:
2015-9-14 18:41
标题:
简易的触摸屏滤波
本帖最后由 jialinx 于 2015-9-14 18:42 编辑
使用电阻的触摸屏时,ADC采集的信号往往有误差,这个时候就需要点击触摸屏一次 ADC就采集多次 (比如 采集10次) 然而 一般来说就是取 这10个数的平均值 作为信号的值 但是 经过试验 这是非常不可靠的.例如 某次采集的 信号是 53 52 54 53 52 51 55 4095 0 1105 3321 4095 对于这样的结果如果直接把这些数取平均值 那样的话太不可靠了 我们观察数据 显然ADC采样的正确的值 应该是 52 左右 . 为什么呢? 因为观察发现 53 52 54 53 52 51 这5个数差异不大 ,后面的5个数 显然差异太大了... 对的信号往往是在某个范围内变化的(范围越大 精度越小 可信度不高) 显然前面的5个AD值的变化范围是 可信的.
然而 怎么样让计算机 知道正确的信号呢?
对于这10个信号 我假设 正确的 值为 X 我定义一个可以接受的范围 N 假如说着10个数中 落在 X-N 到X+N 的范围内的数 最多那么 此时的X的值 就是正确的信号 ( 也就落在是 落在X的N领域中的数最多 )
typedef unsigned char uint8_t;
#define N 3 //定于可以接受的范围
uint8_t LB(uint8_t *arr , uint8_t Length)
{
uint8_t Max = 0 , Number = 0 ;//保存最多出现的次数 和 该值
uint8_t i , j ;
uint8_t cc;// 差
uint8_t Count=0;// 计数器
for( i = 0 ; i < Length ; i++ )
{
for(j=0;j<Length;j++)
{
if( i == j )
continue;
/* 求两个数的差的绝对值 */
if( arr[i] > arr[j] )
cc = arr[i] - arr[j] ;
else
cc = arr[j] - arr[i] ;
/* 如果差在范围内 */
if( cc<= N )
Count++;
}
if( Count > Max )
{
Max = Count;
Number = arr[i];
}
Count=0;
}
printf("Num=%d\tMax=%d\n",Number,Max);
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1