標(biāo)題:
簡易的觸摸屏濾波
[打印本頁]
作者:
jialinx
時間:
2015-9-14 18:41
標(biāo)題:
簡易的觸摸屏濾波
本帖最后由 jialinx 于 2015-9-14 18:42 編輯
使用電阻的觸摸屏?xí)r,ADC采集的信號往往有誤差,這個時候就需要點(diǎn)擊觸摸屏一次 ADC就采集多次 (比如 采集10次) 然而 一般來說就是取 這10個數(shù)的平均值 作為信號的值 但是 經(jīng)過試驗(yàn) 這是非常不可靠的.例如 某次采集的 信號是 53 52 54 53 52 51 55 4095 0 1105 3321 4095 對于這樣的結(jié)果如果直接把這些數(shù)取平均值 那樣的話太不可靠了 我們觀察數(shù)據(jù) 顯然ADC采樣的正確的值 應(yīng)該是 52 左右 . 為什么呢? 因?yàn)橛^察發(fā)現(xiàn) 53 52 54 53 52 51 這5個數(shù)差異不大 ,后面的5個數(shù) 顯然差異太大了... 對的信號往往是在某個范圍內(nèi)變化的(范圍越大 精度越小 可信度不高) 顯然前面的5個AD值的變化范圍是 可信的.
然而 怎么樣讓計算機(jī) 知道正確的信號呢?
對于這10個信號 我假設(shè) 正確的 值為 X 我定義一個可以接受的范圍 N 假如說著10個數(shù)中 落在 X-N 到X+N 的范圍內(nèi)的數(shù) 最多那么 此時的X的值 就是正確的信號 ( 也就落在是 落在X的N領(lǐng)域中的數(shù)最多 )
typedef unsigned char uint8_t;
#define N 3 //定于可以接受的范圍
uint8_t LB(uint8_t *arr , uint8_t Length)
{
uint8_t Max = 0 , Number = 0 ;//保存最多出現(xiàn)的次數(shù) 和 該值
uint8_t i , j ;
uint8_t cc;// 差
uint8_t Count=0;// 計數(shù)器
for( i = 0 ; i < Length ; i++ )
{
for(j=0;j<Length;j++)
{
if( i == j )
continue;
/* 求兩個數(shù)的差的絕對值 */
if( arr[i] > arr[j] )
cc = arr[i] - arr[j] ;
else
cc = arr[j] - arr[i] ;
/* 如果差在范圍內(nèi) */
if( cc<= N )
Count++;
}
if( Count > Max )
{
Max = Count;
Number = arr[i];
}
Count=0;
}
printf("Num=%d\tMax=%d\n",Number,Max);
}
復(fù)制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1