以 10 为基数的数字显示算法 - 每次刷新的最小更改

标签 algorithm signal-processing signal-handling

快速总结:

我正在寻找一种算法来显示四位数的速度信号,每次显示更新时,最小(十进制)位数都会发生变化。

例如:

Filtered
 Signal      Display
--------------------
  0000        0000
  2345        2000
  2345        2300
  2345        2340
  0190        0340
  0190        0190
  0190        0190

详细信息:

我正在开展一个项目,我需要在四位 LCD 显示屏上显示速度信号(介于 0 到 3000 RPM 之间)。理想的显示解决方案是模拟仪表,但我坚持使用数字显示。显示器将由机器运算符(operator)读取,我希望它读起来尽可能愉快。

运算符(operator)并不真正关心信号的确切值。他会想知道这个值是多少(精确到 10 RPM),他会想看到它随着机器运行的变化而上下波动。他将希望看到它到处乱跳。

这是我到目前为止所做的:

  • 将数字四舍五入到最接近的 10 RPM,以便最后一位数字始终为 0
  • 过滤信号,使电噪声和正常的传感器波动不会导致读数一次跳跃超过 10 RPM。
  • 为信号添加了 +/-10 RPM 滞后,以避免信号在相同值上摆动的情况(例如:990 - 1000)

当信号稳定时(大约 75% 的时间),这已经很好地解决了问题,但是当信号从一种稳定状态移动到另一种稳定状态时,我仍然看到信号中有很多不必要的变化.当信号从 100 RPM 变为 1000 RPM(例如)时,它会沿途传递很多数字。由于实际阅读和理解数字需要一些时间,因此达到所有这些中间状态似乎没有什么意义。我尝试简单地降低显示器的更新率,但这并没有产生令人满意的结果。它同时让显示器“感觉”迟缓和跳动。在数字发生变化之前会有一个明显的延迟,然后它们会大跃进(100、340、620、980、1000)。


提案:

我希望显示的行为如示例所示:

  1. 显示每秒更新两次
  2. 从一种稳定状态到另一种稳定状态的转变时间不应超过 2 秒。
  3. 如果输入信号高于当前显示值,则显示信号应增加,但绝不能高于输入信号值。
  4. 如果输入信号低于当前显示值,则显示信号应减小,但绝不能低于输入信号值。
  5. 每次更新应更改的最少位数(最好只有一位)
  6. 应先改变高位数字,使显示信号与输入信号的差异尽快减小

你能想出,或者你知道一种算法,可以根据上述规则输出“正确的”4 位十进制数吗?

伪代码中的函数原型(prototype)看起来像这样:

int GetDisplayValue(int currentDisplayValue, int inputSignal)
{
    //..
}

抱歉文字墙。我想记录下我迄今为止的进展,这样任何回答问题的人都可以避免涉及我已经经历过的问题。

最佳答案

如果不需要第4位表示的数据,又严格绑定(bind)4位显示,有没有考虑过用第4位作为增减指标?零的顶部或底部的某些部分以 2Hz* 闪烁,表示仪表的下一次变化将是增加或减少。

我认为您也可以为您的设备(无论它是什么)对调整的响应制作一个好的模型,并使用该模型根据两秒稳定过程的前半秒推断目标数字.

*这假设您每秒更新两次。大多数 4 位数字显示器都是多路复用的,因此您可以通过稍微调整驱动程序以更高的频率闪烁它。

关于以 10 为基数的数字显示算法 - 每次刷新的最小更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/859270/

相关文章:

algorithm - 如何最好地在 R 中创建定时器函数

java - 如何在 Jython 中拦截键盘中断 (CTRL-C)?

linux - Linux中如何处理errno和signal handler?

algorithm - 为什么在排序数组中较大搜索值的实际运行时间小于较低搜索值?

algorithm - 从 Active Directory 应用程序模式中随机选择一条记录

java - 我如何使用正则表达式来实现包含功能?

c - 如何确定环绕声音频信号的 channel 映射( channel 到轨道分配)

c - 使用不同的值增加音频的音高

algorithm - 为语音生成添加口音

perl - 守护进程关闭和清理