消除传感器测量中的峰值

如何解决消除传感器测量中的峰值

我正在测量pwm信号。有两种状态。测量结果非常接近1000或2000。 我不想取平均值来消除测量噪声。我只是摆脱一个或两个非常不精确的值。

举一个例子,这是预期的(准确的)数据图:

enter image description here

这是真实的测量数据图:

enter image description here

我想消除仅由3或4次测量引起的中间峰值。我想忽略那些度量。

我实际上以为我会创建一个包含10个元素的队列并将其推入其中。如果新的度量值比队列中的平均值平均少500或更多,则它将不会添加到实际数据数组中。每当队列平均值与新度量值之间的差小于500(在10个元素的队列中为5个度量值)时,我就会开始添加到实际数据数组中并重置队列。

但这似乎不是一种有效的方法。我是数学新手。因此,我不知道如何更有效地编写它,并且我需要效率,因为代码将在Arduino上运行。

谢谢

编辑:

我尝试按照建议使用中值过滤

这是我的实际测量图:

enter image description here

这是应用了中值过滤器的图形:

enter image description here

如您所见,它运行良好。但是,我必须使用长度为20的过滤器。要缓存并推送到队列的数据很多。特别是在Ardunio,c ++中,其处理能力仅为16兆赫。我的案子有没有更有效的方法?

解决方法

我将假设现在的问题是如何加快Arduino的中值滤波器的速度。我在Arduino上的经验仅限于抱怨它产生的数据不定期采样。显然,当他们改用Raspberry Pi时,这种情况就消失了,因为Raspberry Pi的功能要强大得多,所以这可能是一个选择。

我不知道您是如何计算中值过滤器的,但是网络搜索表明您可以尝试一些实现。如果从C ++ STL开始,则可以使用允许您插入,删除和查找最大或最小项目的数据结构来计算运行中位数。保持中位数以上N / 2个项目的池和中位数以下N / 2个项目的池。当您获得新的数据点时,请删除最旧的值,并将新值与中值进行比较,然后将其放入指向的任何池中。现在,您可能在一侧有N / 2 + 1个项目,而在另一侧有N / 2-1。如果是这样的话,例如,从顶部池中取出最小的物品,并将其插入底部池中。将中间值重新计算为现在顶部最小的项目和底部最大的平均项目(如果N为奇数,则池中的中间项目和记账要复杂一点)。现在,接受新数据点的成本为O(log N)而不是O(N)或更糟,所以这可能有所帮助。

(FWIW,我所认识的最令人印象深刻的程序员也是专家数学家,所以我会保持数学水平。)

可以考虑一下,如果每个值确实是1000或2000,就不需要花哨的数据结构:您需要的只是一个循环缓冲区,以及在缓冲区内运行的数量大于等于2000的数量的计数,您可以在删除最早的值并添加最新的值时进行更新。这将花费您20个整数,但是如果您的值确实是1000或2000,则每个值都可以用一个位表示,因此您可以将整个队列容纳在单个32位字中,并用POPCNT,如果arduino C / C ++提供的话

,

如@mcdowella所建议。我将所有输入都转换为1和0。

我没有使用中值滤波器,因为我将实时使用消除。

我只取伺服器生成的最后10个值的平均值,然后四舍五入以收集最终值。因此,当0在最后10个值中占优势时,我使用0。

此方法存在延迟的缺点。当我的传感器开始测量0个值时,我的算法会在5个测量周期后检测到它。每个25毫秒。有250毫秒的延迟。

我知道这是一个懒惰的解决方案,但它似乎对我有用。但是,@ mcdowella的答案非常有用。我希望未来的读者能从中受益匪浅

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-