搜索
bottom↓
回复: 59

测试了下论坛网友的【活动平均滤波函数】,效果不错,...

  [复制链接]

出0入0汤圆

发表于 2017-8-16 14:25:55 | 显示全部楼层 |阅读模式
论坛网友qq490455545 的帖子里提到的一个代码,我测试了下,滤波效果好,占用资源少,效果如图(绿色AD值,蓝色滤波值)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出5入42汤圆

发表于 2017-8-16 14:52:06 | 显示全部楼层
不错,down下来用用

出0入22汤圆

发表于 2017-8-16 15:00:41 | 显示全部楼层
恩,看起来确实不错的说,好久试试看。

出0入10汤圆

发表于 2017-8-16 15:04:44 | 显示全部楼层
看起来不错!

出0入0汤圆

发表于 2017-8-16 15:09:14 | 显示全部楼层
滑动平均是怎么滤掉 瞬间峰值很大的值呢

出0入0汤圆

发表于 2017-8-16 15:18:43 | 显示全部楼层
本帖最后由 lcw_swust 于 2017-8-16 15:20 编辑

大概看了下,是FIFO的逻辑,每次都重新计算队列中所有数据之和,计算量略大。
可以优化就是将“和”定义为一个全局变量,每次加这一头的值减另一头的值。(这样改要注意初始值)

另外,我觉得没必要用两个指针

出0入0汤圆

发表于 2017-8-16 15:20:44 | 显示全部楼层
只建议高人使用,或者全是高人组成的公司使用,无注释,运算复杂,典型的烂代码!

出0入0汤圆

发表于 2017-8-16 15:24:51 | 显示全部楼层
ccitlad 发表于 2017-8-16 15:09
滑动平均是怎么滤掉 瞬间峰值很大的值呢

我猜是size比较大...

出0入0汤圆

发表于 2017-8-16 15:27:20 | 显示全部楼层
下载下来,参考一下,谢谢

出0入0汤圆

发表于 2017-8-16 15:37:02 | 显示全部楼层
可以,很不错的样子,收藏了

出10入284汤圆

发表于 2017-8-16 15:41:45 来自手机 | 显示全部楼层
代码风格良好,不用注释也一目了然,楼上的优化也不错

出0入0汤圆

发表于 2017-8-16 15:59:19 | 显示全部楼层
lcw_swust 发表于 2017-8-16 15:18
大概看了下,是FIFO的逻辑,每次都重新计算队列中所有数据之和,计算量略大。
可以优化就是将“和”定义为 ...

作者是挺懒

出4375入62汤圆

发表于 2017-8-16 16:27:57 | 显示全部楼层
很有实用和理论参考价值,感谢

出0入618汤圆

发表于 2017-8-16 16:43:19 | 显示全部楼层
移动平均滤波器就是系数全为1的FIR滤波器,只有加法没有乘法,比较适合没有乘加指令的MCU。

出0入0汤圆

发表于 2017-8-16 17:19:17 | 显示全部楼层
我以前做的滑动平均。还排序。把最大最小一两个值去掉。这样偶尔出的几个脉冲值根本不怕。

出0入0汤圆

发表于 2017-8-16 17:29:28 | 显示全部楼层
去掉偶尔的峰值可以用中值滤波

出0入76汤圆

发表于 2017-8-16 19:07:19 | 显示全部楼层
这个有些费内存, 以前有分享更加简化的,并且基于结构体指针,支持多路滤波

出0入0汤圆

发表于 2017-8-16 21:33:24 | 显示全部楼层
不错收藏了

出0入10汤圆

发表于 2017-8-16 21:35:55 | 显示全部楼层
一个滑动平均滤波把各位激动成这样子。

出0入76汤圆

发表于 2017-8-16 23:00:21 | 显示全部楼层
本帖最后由 foxpro2005 于 2017-8-16 23:02 编辑

我再来分享一个吧,楼主有空测测,对比一下
声明: 这个是基于坛友zouzhichao 版随手修改的,原帖:https://www.amobbs.com/thread-5649434-1-1.html

  1. int filter(int dat)
  2. {
  3.     #define filter_len 10                                       // 滤波缓存数据长度
  4.     static int buffer[filter_len] = {0};                        // 历史数据缓冲区
  5.     static int *ptr = (int*)buffer + (filter_len - 1);          // 初始指针指向缓冲区最后
  6.     static int sum = 0;
  7.     static int cnt = 0;
  8.    
  9.     sum -= *ptr;                                                // 移出最前面的一个历史值
  10.     sum += dat;                                                 // 前面(N-1)的数据加上新值求和
  11.     *ptr = dat;                                                 // 将新值存入缓冲区(从后向前存数据)
  12.     if (--ptr < buffer) ptr += filter_len;                      // 缓冲区指针重(指向缓冲区尾元素)
  13.     if (cnt < filter_len) cnt++;                                // 滤波计数
  14.    
  15.     return (sum + (cnt >> 1)) / cnt;                            // 返回平均值(四舍五入)
  16. }
复制代码

出0入0汤圆

发表于 2017-8-16 23:10:48 | 显示全部楼层
foxpro2005 发表于 2017-8-16 23:00
我再来分享一个吧,楼主有空测测,对比一下
声明: 这个是基于坛友zouzhichao 版随手修改的,原帖 ...

收藏了

出0入0汤圆

发表于 2017-8-17 00:47:46 | 显示全部楼层
这个滤波效果还是有点问题啊。。。把上面的一些脉冲值去掉吧。

出0入137汤圆

发表于 2017-8-17 10:50:47 | 显示全部楼层
LZ,我用SerialChart为何总出现未响应的情况呢,感觉非常卡啊

出0入0汤圆

发表于 2017-8-17 11:01:46 | 显示全部楼层
对尖峰滤波效果很好,看来开关电源的尖峰可用它来滤除呀。谢谢提供。

出0入137汤圆

发表于 2017-8-17 11:14:19 | 显示全部楼层
我用20楼的代码做心电滤波,也不错。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入4汤圆

发表于 2017-8-17 14:34:29 来自手机 | 显示全部楼层
mark谢谢分享

出20入118汤圆

发表于 2017-8-18 07:12:16 来自手机 | 显示全部楼层
mark谢谢分享

出0入0汤圆

发表于 2017-8-18 09:04:37 | 显示全部楼层
我一般都不这样用的,是先滑动,后排序,去掉干扰值,再取中值。


出0入0汤圆

发表于 2017-8-18 09:07:41 | 显示全部楼层
谢谢楼主分享。。。

出0入0汤圆

发表于 2017-8-18 11:13:54 | 显示全部楼层
简单看了下,觉得buffer_size应该设置为2^N,当buffer满后,计算average,可以累加后直接使用移位进行计算:
avg = sum << 5;       /* buffer size == 32 */

出0入0汤圆

发表于 2017-8-18 11:58:06 来自手机 | 显示全部楼层
不错,收藏了

出0入0汤圆

发表于 2017-8-18 12:58:31 | 显示全部楼层
不错,下载下来试试。

出0入0汤圆

发表于 2017-8-18 16:24:56 | 显示全部楼层
不错,学习下。

出0入0汤圆

发表于 2017-8-18 17:28:24 | 显示全部楼层
我通常是按顺序排列后,头尾各去掉2个最大值,去掉2个最小值,然后求平均,或者去中间值
做个记号。

出0入17汤圆

发表于 2017-8-18 20:14:53 来自手机 | 显示全部楼层
不错的算法,收藏

出0入0汤圆

发表于 2017-8-19 00:00:46 | 显示全部楼层
收藏,谢谢分享

出870入263汤圆

发表于 2017-8-19 11:40:27 | 显示全部楼层
wzd5230 发表于 2017-8-18 11:13
简单看了下,觉得buffer_size应该设置为2^N,当buffer满后,计算average,可以累加后直接使用移位进行计算 ...

错了,是>>

出0入0汤圆

发表于 2017-8-19 12:00:09 | 显示全部楼层
顶,实践出真知

出0入0汤圆

发表于 2017-8-19 13:14:25 | 显示全部楼层
活动平均滤波函数 看图片,,感觉不错。

出10入95汤圆

发表于 2017-8-19 22:54:56 来自手机 | 显示全部楼层
上pc下载看看

出0入0汤圆

发表于 2017-8-21 16:42:23 | 显示全部楼层

出0入0汤圆

发表于 2017-10-27 19:32:05 | 显示全部楼层
不错。。。。。。。。。

出0入8汤圆

发表于 2017-10-27 22:18:04 来自手机 | 显示全部楼层
不错。。。

出0入0汤圆

发表于 2017-10-27 23:08:28 | 显示全部楼层
谢谢分享!

出0入0汤圆

发表于 2017-10-27 23:13:55 | 显示全部楼层
foxpro2005 发表于 2017-8-16 23:00
我再来分享一个吧,楼主有空测测,对比一下
声明: 这个是基于坛友zouzhichao 版随手修改的,原帖 ...

这个比较牛,我自己写的还用了两个指针,哈哈

出0入0汤圆

发表于 2017-10-27 23:26:07 来自手机 | 显示全部楼层
不错,感谢分享

出0入0汤圆

发表于 2017-10-28 00:25:49 | 显示全部楼层
foxpro2005 发表于 2017-8-16 23:00
我再来分享一个吧,楼主有空测测,对比一下
声明: 这个是基于坛友zouzhichao 版随手修改的,原帖 ...

如果我有N 路需要滤波怎么办?代码复制N分?名字改下?求指点

出0入0汤圆

发表于 2017-10-28 01:17:52 | 显示全部楼层
采样并显示,我喜欢低通滤波:计算量小,节省内存
输入 X,输出 Y,余数 Z,滤波系数 K ,临时变量 S
S=Y*(K-1)+X+Z;
Y=S/K;   Z=S&(K-1);
K取2^N次方时,除法计算最快(相当于移位).

出0入14汤圆

发表于 2017-10-28 02:57:41 来自手机 | 显示全部楼层
看了下20楼的,结果就是一个加和算平均值的东西,只能说你们的专业术语太好了

出10入23汤圆

发表于 2017-10-28 03:46:14 来自手机 | 显示全部楼层
isakura 发表于 2017-10-28 02:57
看了下20楼的,结果就是一个加和算平均值的东西,只能说你们的专业术语太好了 ...

你看下楼上的,他那个就是大名鼎鼎的iir滤波

出0入17汤圆

发表于 2017-10-28 06:37:08 来自手机 | 显示全部楼层
谢谢分享,收了

出0入14汤圆

发表于 2017-10-28 10:37:41 来自手机 | 显示全部楼层
zouzhichao 发表于 2017-10-28 03:46
你看下楼上的,他那个就是大名鼎鼎的iir滤波

这个有点高深,还没看懂,要是有实际例程就好了,感觉这个和pid调节一样,不知道要怎么调参数,靠经验???

出0入14汤圆

发表于 2017-10-28 10:40:53 来自手机 | 显示全部楼层
vjcmain 发表于 2017-10-28 00:25
如果我有N 路需要滤波怎么办?代码复制N分?名字改下?求指点

算法可以共用一个,存储的可以单独定义啊,参数放到全局变量就可以了

出10入23汤圆

发表于 2017-10-28 10:47:10 来自手机 | 显示全部楼层
isakura 发表于 2017-10-28 10:37
这个有点高深,还没看懂,要是有实际例程就好了,感觉这个和pid调节一样,不知道要怎么调参数,靠经验? ...

经验+理论计算,这个滤波是有迹可循的,不管是iir还是fir,都是可以得到确定的幅频特性和相频特性的,根据需求用fdatool直接设计出来的啦

出0入0汤圆

发表于 2017-10-28 11:11:23 来自手机 | 显示全部楼层
感谢楼主分享

出10入23汤圆

发表于 2017-10-28 11:20:13 | 显示全部楼层
isakura 发表于 2017-10-28 10:37
这个有点高深,还没看懂,要是有实际例程就好了,感觉这个和pid调节一样,不知道要怎么调参数,靠经验? ...

2017作品系列(六):fdatool iir滤波器设计超级傻瓜教程

出0入76汤圆

发表于 2017-10-28 20:04:07 | 显示全部楼层
vjcmain 发表于 2017-10-28 00:25
如果我有N 路需要滤波怎么办?代码复制N分?名字改下?求指点

当然是使用 结构体指针了哈, 查一下,我有分享的

出0入0汤圆

发表于 2017-10-28 23:28:44 | 显示全部楼层
foxpro2005 发表于 2017-10-28 20:04
当然是使用 结构体指针了哈, 查一下,我有分享的


找到了,谢谢你。果然是用结构体实现的 666

出0入0汤圆

发表于 2017-11-14 15:09:08 | 显示全部楼层
vjcmain 发表于 2017-10-28 23:28
找到了,谢谢你。果然是用结构体实现的 666

没找到那个结构体的,能给个链接吗

出0入0汤圆

发表于 2017-11-15 11:12:08 | 显示全部楼层
four_zhg 发表于 2017-11-14 15:09
没找到那个结构体的,能给个链接吗

https://www.amobbs.com/thread-5670005-1-1.html?_dsign=1527c12b
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 03:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表