[原创].触摸屏滤波的一点心得
引子
最近在编写Nios II的触摸屏驱动,TFT的驱动器为ILI9325,触摸AD为ADS9325。无论是轮询的方式抑或中断的方式,都会出现令人讨厌的散点。经过在SOPC技术联盟群的讨论,达克斯特兄给我一点启示,让我成功消除了散点。
第1种尝试 中位值平均滤波法
首先移植的是liujun6037的代码,他的代码思路为:对X、Y的坐标连续采样十次;不足十次则认为数据无效,不做任何操作;然后对十次数据进行排序;最后取中间三次的数据进行平均,得到最终的X、Y坐标。不同的是,我把冒泡排序换成我常用的选择排序,其实还是O(n^2)。其效果如图1所示。可以清楚地看到,本次尝试很失败,有很多莫名其妙的散点。
代码1 第一种尝试
void ads_GetXY(void)
{u8 cnt=0;u8 i, j, k, min;u16 temp;u16 tempXY[2][9], XY[2];do{if(ads_ReadXY()){tempXY[0][cnt] = X;tempXY[1][cnt] = Y;cnt++;}}while(cnt<9);if(cnt==9){for(k=0; k<2; k++){ // 降序排列for(i=0; i<cnt-1; i++){min=i;for (j=i+1; j<cnt; j++){if (tempXY[k][min] > tempXY[k][j]) min=j;}temp = tempXY[k][i];tempXY[k][i] = tempXY[k][min];tempXY[k][min] = temp;}// 求中间值的均值XY[k] = (tempXY[k][3]+tempXY[k][4]+tempXY[k][5]+tempXY[k][6]) / 4;}}// 矫正坐标X = ((XY[0]-350)/11);Y = ((XY[1]-400)/14);
}
图1 第一种尝试
第2种尝试 差值平均滤波法
由于第一种尝试比较失败,我就在网上搜到了参考2的算法。尝试了一下,效果极差,线条极其发散,图片就不贴了。代码贴到这里作为反面例程。
代码2 第二种尝试
void ads_GetXY(void)
{u8 cnt=0;u8 i, j, k, min;u16 temp;u16 tempXY[2][9], avgXY[2][3], XY[2];s16 diffXY[2][3];do{if(ads_ReadXY()){tempXY[0][cnt] = X;tempXY[1][cnt] = Y;cnt++;}}while(cnt<9);if(cnt==9){for(k=0; k<2; k++){ // 取平均值avgXY[k][0] = (tempXY[k][0]+tempXY[k][1]+tempXY[k][2])/3;avgXY[k][1] = (tempXY[k][3]+tempXY[k][4]+tempXY[k][5])/3;avgXY[k][2] = (tempXY[k][6]+tempXY[k][7]+tempXY[k][8])/3;// 取差值diffXY[k][0] = avgXY[k][0] - avgXY[k][1];diffXY[k][1] = avgXY[k][1] - avgXY[k][2];diffXY[k][2] = avgXY[k][2] - avgXY[k][0];// 取差值的绝对值diffXY[k][0] = (diffXY[k][0] > 0) ? diffXY[k][0] : -diffXY[k][0];diffXY[k][1] = (diffXY[k][1] > 0) ? diffXY[k][1] : -diffXY[k][1];diffXY[k][2] = (diffXY[k][2] > 0) ? diffXY[k][2] : -diffXY[k][2];// 取最小的数得平均值if(diffXY[k][0] < diffXY[k][1]){if(diffXY[k][2] < diffXY[k][1])XY[k] = (avgXY[k][0]+avgXY[k][2])>>1;elseXY[k] = (avgXY[k][0]+avgXY[k][1])>>1;}else if(diffXY[k][2] < diffXY[k][1])XY[k] = (avgXY[k][0]+avgXY[k][2])>>1;elseXY[k] = (avgXY[k][1]+avgXY[k][2])>>1;}}// 矫正坐标X = ((XY[0]-350)/11);Y = ((XY[1]-400)/14);
}
第3种尝试 中位值平均加阈值滤波法
既然第一种尝试的线条已经比较收敛,那么散点是怎么出来的呢?经过达克斯特兄的一点指导和我的多次实验,终于干掉了这个头疼的散点。原来虽然使用中位值平均滤波法可以稳定获取符合触摸屏范围的数据,但是却无法滤除跳变的散点。对于跳变的散点必须通过加阈值才能消除。下面贴出我的代码。代码思路:采样符合触摸屏范围的数据若干次,将其排序,取中间两位的差值;若差值大于阈值,则丢弃。因为数据已经排序,因此差值肯定是正值或零值,即无需申明为有符号数。同时由于阈值判断的加入,我们可以将数据的采样次数适当调整,此处仅为4次,所得效果已经非常令人满意。需要注意的是采样数据不宜过多,否则连续的线会变成离散的点。
代码3 第3种尝试
#define SAMP_CNT 4
#define SAMP_CNT_DIV2 2
u8 ads_GetXY(void)
{u8 i, j, k, min;u16 temp;u16 tempXY[2][SAMP_CNT], XY[2];// 采样for(i=0; i<SAMP_CNT; i++){if(ads_ReadXY()){tempXY[0][i] = X;tempXY[1][i] = Y;}}// 滤波for(k=0; k<2; k++){ // 降序排列for(i=0; i<SAMP_CNT-1; i++){min=i;for (j=i+1; j<SAMP_CNT; j++){if (tempXY[k][min] > tempXY[k][j]) min=j;}temp = tempXY[k][i];tempXY[k][i] = tempXY[k][min];tempXY[k][min] = temp;}// 设定阈值if((tempXY[k][SAMP_CNT_DIV2]-tempXY[k][SAMP_CNT_DIV2-1]) > 5)return 0;// 求中间值的均值XY[k] = (tempXY[k][SAMP_CNT_DIV2]+tempXY[k][SAMP_CNT_DIV2-1]) / 2;}// 矫正坐标X = ((XY[0]-350)/11);Y = ((XY[1]-400)/14);return 1;
}
图片3 第三种尝试
参考
1. liujun6037.2.4寸TFTLCD触摸屏测试通过!(ADS7846/7843)
2. 鹰之翔.毕业设计第六天(触摸屏在S3C2410上的软件滤波 )
转载于:https://www.cnblogs.com/yuphone/archive/2010/11/28/1890239.html
[原创].触摸屏滤波的一点心得相关推荐
- [原创].关于编写Nios II的延时函数的一点心得
平台 硬件:nios/f 100MHz 软件: 内容 0 一点说明 本文仅讨论所述平台的一点心得,若其他等级的nios或优化,请自行研究. 1 usleep()有多准 参考[笔记].怎样使用Nios ...
- 新手网站推广邮件群发一点心得
关于邮件群发一点心得 请勿见笑,本人新人啊.新人做法还是比较菜的.说一下邮件群发吧.最近本人下软件不下百次.病毒木马电脑已经是满满一箩筐了,幸好是虚拟机里. 首先收集相关邮件地址这里转一篇文章 营销如 ...
- 谈谈选用技术的原则,技术学习方法技巧,阅读代码的技巧及其它 MSF的一点心得...
谈谈技术原则,技术学习方法,代码阅读及其它(正文) 这篇文章是前一阵在水木BBS上和别人讨论中偶自己发言的摘编,是偶这几年开发过程完全经验式的总结.完全个人经验,供批判. 一.选用技术的原则 比较规范 ...
- mysql数据库管理系统模式_MYSQL命令行模式管理MySql的一点心得
MYSQL命令行模式管理MySql的一点心得 MYSQL命令行模式管理MySql的一点心得 MySql数据库是中小型网站后台数据库的首选,因为它对非商业应用是免费的.网站开发者可以搭建一个" ...
- 将asp.net1.1的应用程序升级到asp.net2.0的一点心得
将asp.net1.1的应用程序升级到asp.net2.0的一点心得 费了好一袋烟工夫把CommunityServer升级到了Asp.Net2.0平台,一点心得: vs2005可以很方便的帮我们把vs ...
- 使用Webbrowser的一点心得体会
使用Webbrowser的一点心得体会 原文:使用Webbrowser的一点心得体会 自从用上VS2005后,发现多了个WebBrowser控件(.net 2003中不带),为图方便吧,有好多小工具就 ...
- 关于MySQL存储过程异常处理的一点心得
关于MySQL存储过程异常处理的一点心得 参考文章: (1)关于MySQL存储过程异常处理的一点心得 (2)https://www.cnblogs.com/lrl45/p/6037513.html ( ...
- 做互联网产品运营的一点心得
一个网站运营团队大致粗略地可分成三个部门:产品部.设计部和技术部,产品部为核心,设计部和技术部为支撑,如果网站产品较多比如有资讯内容.论坛.博客.SNS等,那产品部会配备好几个人,每人负责一个产品.在 ...
- 转载tangl_99的Servlet 实现文件上传下载--自己的一点心得
这个周末终于可以好好锻炼一下我的IBM ThinkPad T43了.今天看了一些关于JSP,Servlet方面的资料,写了简单的两个JavaBean.一个是UpLoad,一个是DownLoad.写得很 ...
最新文章
- 一个简单实用的,基于EF的三层架构
- Html Agility Pack基础类介绍及运用
- ASP.NET Core应用的错误处理[2]:DeveloperExceptionPageMiddleware中间件如何呈现“开发者异常页面”...
- tomcat temp 大量 upload 文件_问题:JavaWeb中实现文件上传的方式有哪些?
- cmd mysql 报错_Mysql报错问题汇总
- JavaScript原生对象属性和方法详解——Date对象
- scipy —— 丰富的子包(io、cluster)
- Python学习笔记--6.2 文件读写
- 2021-2024年中国两轮电动车企业经营情况对比
- python创建按钮command怎么用,python按钮调用函数
- react如何请求amr文件流接口-优化版
- DHCP的工作原理及过程
- spark编程基础python版实验报告_Spark编程基础(Python版)
- C++代码:小明存钱
- win11 下beyondcompare 右键菜单中无“比较“
- 微信实名认证是成年的,但游戏是未成年的,怎么改
- .sqlite后缀文件转为sql文件
- 中国高温合金市场规模预测与发展态势研究报告2022版
- 51单片机_7-2 使用内部计时器实现时钟显示
- .NET笔记系列:LAMBDA表达式常用写法