首页 > 解决方案 > 模式识别(肌肉活动)

问题描述

我需要你的建议。我目前正在使用 Arduino 上的 EMG(肌肉)传感器,我的目标是识别和测量肌肉活动的时间。在下图中,您可以找到原始数据。串行绘图仪 如您所见,在肌肉活动期间,模拟输出的范围要高得多。但我不知道哪种数学方法适合这项任务。

标签: matharduinosignal-processing

解决方案


使用滑动窗口...

  1. 选择窗口大小

    这是您分析信号属性的时间。它应该足够长以保持至少一个信号周期,但 2-3 个周期更好。

  2. 现在通过大小等于您的窗口大小的 FIFO 传递您的信号

    在您的 FIFO 在每个新输入值处已满后,从中删除第一个并计算 FIFO 内容的最小值和最大值。这种 FIFO 最好以固定长度的循环缓冲区的形式实现。区别在于max-min窗口的动态范围,它会告诉您传感器是否检测到活动。

    窗口最小值/最大值

  3. 临界点max(t)-min(t)

    所以对于每个计算的窗口t计算:

    d(t) = max(t) - min(t)
    

    t您的窗口的开始时间在哪里。现在:

    if (d(t)>=threshold) muscle_is_working;
    

    例如,信号中的无源区域有差异,~40因此请将阈值设置为大于但小于信号中的有源区域

    threshold = 50
    

如果您需要更高的速度(因为您知道哪个 MCU ......而且是的,Arduino 不是一个 MCU,它只是一个框架),您可以使用窗口的绝对总和,而不需要处理每张幻灯片中的整个 FIFO 内容窗户。相反,您只需从 sum 中删除第一项并将最后一项添加到其中。所以方程是:

d(t) = sum(i=t,...,t+size-1) of abs(signal(t)-inactive_average)

将窗口大小四舍五入为 2 的幂也是一个好主意,这样您就可以在循环缓冲区实现中使用位运算而不是除法和取模。


推荐阅读