当用户在桌子/地板上击中设备时,我需要检测加速计事件。
设备正在使用8 MHz的STM32低功耗微控制器和LIS3DH加速度计。
加速度计在+ - 2G范围内运行。样本编号是带符号的16位整数。
我已经通过从50 Hz的加速度计读取来收集此类事件的加速度计数据。我附上了x,y和z样本的图表。 “命中”事件在图表中清晰可见,时间轴上的红点表示事件发生时的点。但我不知道如何在代码中检测这样的事件。
根据设备的方向,3个轴的DC偏移会发生变化。
再次以100 Hz采样,该图仅用于X轴并显示2个命中事件。这种尖峰将在所有3个轴上同时发生,但幅度和方向可能不同。与其他图表相比,时间刻度被放大。在实际应用代码中无法以100 Hz进行采样。
用户手中的设备方向变化和移动会导致很多信号变化。下面是Y轴的图表,包括手部移动,方向变化和命中事件。这种变化将发生在所有轴上。
答案 0 :(得分:1)
正如Martin James所说,你应该测量当前和最后一次滴答之间加速度的差异。您需要在每个轴上执行此操作,因为根据您的数据,某些命中不会影响每个轴。有人可能会假设您可以使用平方和来使用总加速度,但我认为这不会起作用。
要测量差异,您需要将最后一个读数保留在变量中。您可能需要前两个读数,具体取决于采样率的速度;如果费率太高,那么差异可能总是很小。你应该保留自上次击中以来的滴答数。
然后,在获取当前读数时,将当前读数与之前的读数进行比较。如果差异高于任何轴上的阈值,请将其标记为命中并重置time_since_hit_count - 除非最近发生了命中。您希望避免在单次击中期间加速度变化多次计算相同的击中次数。您的数据表明阈值大约为5000。
如果差值不高于任何轴上的阈值,则递增time_since_hit_count并将存储的读数替换为当前读数。
(如果您要存储前两个匹配,请与每个匹配进行比较,并相应地移动存储的值。)
根据您的数据,一些点击会发生3个滴答,因此如果time_since_hit_count小于5,您可以打折。这是每次击中100毫秒。根据应用程序,这可能没问题。鼓棒可以比这更快地弹跳,但手指可能不会。
在收集数据时,您可能需要尝试使用acc阈值和命中次数阈值。