一次按下可能在采样记录里出现短暂反复。消抖过滤关注的是新状态连续出现了多久,而不是把一小段时间内的按下次数累加起来。它能减少跳变,也会推迟确认。
先固定规则和输入
确认状态从零开始。新样本等于确认状态时清空候选计数;不等于确认状态时计数加一,只有连续达到门槛才切换确认状态并把计数归零。这里信号只有零和一。
门槛5个连续样本;索引从零开始 [0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0]
把结果按步骤记下来
样本0输入0,确认值0,待确认连续数0,未切换。
样本1输入0,确认值0,待确认连续数0,未切换。
样本2输入0,确认值0,待确认连续数0,未切换。
样本3输入1,确认值0,待确认连续数1,未切换。
样本4输入1,确认值0,待确认连续数2,未切换。
样本5输入1,确认值0,待确认连续数3,未切换。
样本6输入1,确认值0,待确认连续数4,未切换。
样本7输入0,确认值0,待确认连续数0,未切换。
样本8输入1,确认值0,待确认连续数1,未切换。
样本9输入1,确认值0,待确认连续数2,未切换。
样本10输入1,确认值0,待确认连续数3,未切换。
样本11输入1,确认值0,待确认连续数4,未切换。
样本12输入1,确认值1,待确认连续数0,本次切换。
样本13输入1,确认值1,待确认连续数0,未切换。
样本14输入1,确认值1,待确认连续数0,未切换。
样本15输入0,确认值1,待确认连续数1,未切换。
样本16输入0,确认值1,待确认连续数2,未切换。
样本17输入0,确认值1,待确认连续数3,未切换。
样本18输入0,确认值1,待确认连续数4,未切换。
样本19输入1,确认值1,待确认连续数0,未切换。
样本20输入1,确认值1,待确认连续数0,未切换。
样本21输入0,确认值1,待确认连续数1,未切换。
样本22输入0,确认值1,待确认连续数2,未切换。
样本23输入0,确认值1,待确认连续数3,未切换。
样本24输入0,确认值1,待确认连续数4,未切换。
样本25输入0,确认值0,待确认连续数0,本次切换。
样本26输入0,确认值0,待确认连续数0,未切换。
样本27输入0,确认值0,待确认连续数0,未切换。
样本28输入0,确认值0,待确认连续数0,未切换。
样本29输入0,确认值0,待确认连续数0,未切换。
样本30输入0,确认值0,待确认连续数0,未切换。
样本31输入1,确认值0,待确认连续数1,未切换。
样本32输入1,确认值0,待确认连续数2,未切换。
样本33输入1,确认值0,待确认连续数3,未切换。
样本34输入1,确认值0,待确认连续数4,未切换。
样本35输入0,确认值0,待确认连续数0,未切换。
样本36输入0,确认值0,待确认连续数0,未切换。
样本37输入0,确认值0,待确认连续数0,未切换。
样本38输入1,确认值0,待确认连续数1,未切换。
样本39输入1,确认值0,待确认连续数2,未切换。
样本40输入1,确认值0,待确认连续数3,未切换。
样本41输入1,确认值0,待确认连续数4,未切换。
样本42输入1,确认值1,待确认连续数0,本次切换。
样本43输入1,确认值1,待确认连续数0,未切换。
样本44输入1,确认值1,待确认连续数0,未切换。
样本45输入1,确认值1,待确认连续数0,未切换。
样本46输入1,确认值1,待确认连续数0,未切换。
样本47输入0,确认值1,待确认连续数1,未切换。
样本48输入0,确认值1,待确认连续数2,未切换。
样本49输入0,确认值1,待确认连续数3,未切换。
样本50输入0,确认值1,待确认连续数4,未切换。
确认跳变发生在索引[12, 25, 42]。原始信号反复不等于游戏应该立即反复响应,输出状态改变时才形成相应边沿。
自己复核的办法
逐段观察原始信号的连续运行长度,短于门槛的反向片段不应改变输出。已确认的长按不需要每隔几个样本再触发一次;确认状态与按下事件应分开记录。
建议先遮住结果,用本例原始输入独立完成一遍,再逐项对照。若出现差异,先找最早不一致的位置,检查索引从零还是从一开始、边界是否包含,以及比较或更新发生的先后。只比较最后一个数,往往无法分辨规则理解与计算步骤分别出了什么问题。
使用这个练习的边界
本例只演示按样本数消抖,不能给所有设备推荐同一门槛。采样间隔若不固定,应按时间衡量稳定区间。把门槛调大可以过滤更长的反复,但也会带来更明显的操作延迟。
