如何解决消除传感器测量中的峰值
我正在测量pwm信号。有两种状态。测量结果非常接近1000或2000。 我不想取平均值来消除测量噪声。我只是摆脱一个或两个非常不精确的值。
举一个例子,这是预期的(准确的)数据图:
这是真实的测量数据图:
我想消除仅由3或4次测量引起的中间峰值。我想忽略那些度量。
我实际上以为我会创建一个包含10个元素的队列并将其推入其中。如果新的度量值比队列中的平均值平均少500或更多,则它将不会添加到实际数据数组中。每当队列平均值与新度量值之间的差小于500(在10个元素的队列中为5个度量值)时,我就会开始添加到实际数据数组中并重置队列。
但这似乎不是一种有效的方法。我是数学新手。因此,我不知道如何更有效地编写它,并且我需要效率,因为代码将在Arduino上运行。
谢谢
编辑:
我尝试按照建议使用中值过滤
这是应用了中值过滤器的图形:
如您所见,它运行良好。但是,我必须使用长度为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 举报,一经查实,本站将立刻删除。