【问题标题】:Pattern recognition (muscular activity)模式识别(肌肉活动)
【发布时间】:2019-10-12 22:58:17
【问题描述】:

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

【问题讨论】:

  • 如果与长期平均值相差太大,可能是绝对值的平均值和某个阈值?

标签: math arduino signal-processing


【解决方案1】:

使用滑动窗口...

  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 的幂也是一个好主意,这样您就可以在循环缓冲区实现中使用位运算而不是除法和取模。

【讨论】:

  • 哇,谢谢你的回答。我会尽量在明天或周一完成,然后通知你结果。
猜你喜欢
  • 2013-11-07
  • 1970-01-01
  • 2018-01-16
  • 1970-01-01
  • 1970-01-01
  • 2014-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多