打印

寻找一数字脉冲滤波程序.

[复制链接]
3591|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qianlong30|  楼主 | 2007-8-12 08:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用PIC12F675,模拟采集数据,想加一滤波程序,AD四次后,去掉最大和最小值,中间两个数再取平均值,我的模数转换是10位的.
在内存中连续存放着4个10位的AD数值,滤波后把结果放在另一寄存器中.(用汇编不能用C)
我用汇编试了一下,感觉算法很乱,不清晰.
拜托谁能给个子程序或算法.    
惭愧!  (^_^)
         
沙发
xieyuanbin| | 2007-8-12 12:13 | 只看该作者

滤波的建议

1.将AD结果设置为左对齐,比较时先比较高8位,这样在运行中可更快一点.
2.在取AD结果出来时就进行排序,排序方法,由于数据少,使用插入法即可.

使用特权

评论回复
板凳
hotpower| | 2007-8-12 13:22 | 只看该作者

没必要排序~~~

用4个变量即可.
1.求和寄存器,初值设置为0
2.最大值寄存器,初值设置为0
3.最小值寄存器,初值设置为0xffff.
4.滤波结果寄存器.

滤波结果寄存器=(求和寄存器-最大值寄存器-最小值寄存器)/(N-2)

其中:N为求和次数.

使用特权

评论回复
地板
yewuyi| | 2007-8-12 20:32 | 只看该作者

俺写一个……

https://bbs.21ic.com/club/bbs/showEssence.asp?id=5817

你自己看看了……

使用特权

评论回复
5
hotpower| | 2007-8-12 20:41 | 只看该作者

哈哈~~~再灌一次---排序太累~~~

使用特权

评论回复
6
yewuyi| | 2007-8-12 21:09 | 只看该作者

确实太累,但他喜欢这个搞,怎么办?

排序太浪费宝贵的CPU资源了……

使用特权

评论回复
7
xieyuanbin| | 2007-8-13 08:12 | 只看该作者

又见非典.

菜农,他只有4个数据,还是排序比较简单吧?
你的非典方法,偶也想过,不过对于4个数据来讲,未免有点牛刀的感觉.愿闻其详.

使用特权

评论回复
8
hotpower| | 2007-8-13 21:07 | 只看该作者

这种算法的优点是点数无限~~~(附"跳水算法")

当然N>=3.而且最好N>3为好.在N很大时就见其优点了.
例如: 3中取1,4中取2,5中取3...10中取8...252中取"二百五"~~~
全部只用这4个寄存器~~~,当然要考虑累加越界类型选择的问题.
注意: N最好取4, 6, 10, 34, 66, 130等等~~~!!!!!!!!!!!!!!


/*-----------------------------------------------------------
取ADC转换电压
------------------------------------------------------------*/
AdcResult = ADC & 0x3ff;//取ADC转换电压结果
/*-----------------------------------------------------------
  求累加和
------------------------------------------------------------*/
AdcSum += AdcResult;//存累加和
/*-----------------------------------------------------------
  求最大值
------------------------------------------------------------*/
if (AdcResult > AdcMax)
{
  AdcMax = AdcResult;//最大值
}
/*-----------------------------------------------------------
  求最小值
------------------------------------------------------------*/
if (AdcResult < AdcMin)//注意:千万不敢写成else if ()...
{
  AdcMin = AdcResult;//存最小值
}
AdcCount ++;//计数1次
/*-----------------------------------------------------------
  10中取8("跳水评分算法---去掉一个最高分,去掉...最后得分...")
------------------------------------------------------------*/
if (AdcCount >= 10)//每次滤波10点
{
/*-----------------------------------------------------------
  求平均值
------------------------------------------------------------*/
  val = AdcSum - AdcMax - AdcMin;//自然做到了N-2,以下除法变移位
  val *= AdcGain;//乘增益(一定要先乘后除!!!否则精度丢失!!!)
  val >>= 13;//10中取8后除以1024.(直接得到10进制的mV值)
  AdcVal = val;//得到跳水队员分数~~~
/*-----------------------------------------------------------
  下一轮初始化(也是ADC的初始化,这里原本是调用函数的~~~)
------------------------------------------------------------*/
  AdcSum = 0;//一定清0
  AdcMax = 0;//一定取最小值
  AdcMin = 0x3ff;//10位ADC,一定取最大值
  AdcCount = 0;//重新开始
}

哈哈~~~有时间再灌灌它与排序的不同和优缺点~~~

滤波曲线见下图~~~

相关链接:http://www.**/blog/hotpower/41054/message.aspx

使用特权

评论回复
9
2008WQZ| | 2007-8-14 08:11 | 只看该作者

有道理!!

使用特权

评论回复
10
hotpower| | 2007-8-14 12:15 | 只看该作者

什么道理???

使用特权

评论回复
11
xieyuanbin| | 2007-8-14 13:18 | 只看该作者

显然3个数据的确不好这样用.

3个数据去其2,就没平均的意义了.

使用特权

评论回复
12
hotpower| | 2007-8-18 01:39 | 只看该作者

哈哈~~~这里太凉快了~~~张教主走后更是如此~~~学学匠人吧~~~

张教主走后更是如此~~~

使用特权

评论回复
13
yewuyi| | 2007-8-18 10:29 | 只看该作者

凉快也未必不是什么坏事……

PIC的BBS到处都是,资料也都处都是,会用的人也都处都是,当然了,解密好象也到处都是,快有点像当年的89C51了……


太普及了,所以凉快点也正常……

使用特权

评论回复
14
dcp| | 2007-8-24 12:56 | 只看该作者

都忙着赚钱去了...

能不凉快吗?

使用特权

评论回复
15
xy_k8299| | 2011-3-13 16:09 | 只看该作者
东西便宜又实用,估计台面上凉快,下面热啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

149

主题

349

帖子

2

粉丝