Math 模式识别(肌肉活动)

Math 模式识别(肌肉活动),math,arduino,signal-processing,Math,Arduino,Signal Processing,我需要你方的推荐。我目前正在使用Arduino上的肌电(肌肉)传感器,我的目标是识别和测量肌肉活动的时间。在下图中,您可以找到原始数据。正如您所见,在肌肉活动期间,模拟输出的范围要高得多。但我不知道哪种数学方法适合这个任务 使用滑动窗口 选择窗口大小 这是分析信号特性的时间。它应该足够长,以保持至少一个周期的信号,但2-3个周期更好 现在通过与窗口大小相等的FIFO传递信号 在每个新输入值的FIFO都满后,从中删除第一个输入值,并计算FIFO内容的最小值和最大值。这种FIFO最好以固定长度的循环

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

使用滑动窗口

  • 选择窗口大小

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

  • 现在通过与窗口大小相等的FIFO传递信号

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

  • 阈值
    max(t)-min(t)

    因此,对于每个计算窗口
    t
    compute:

    d(t) = max(t) - min(t)
    
    其中
    t
    是窗口的开始时间。现在:

    if (d(t)>=threshold) muscle_is_working;
    
    例如,信号中的被动区域与do
    ~40
    之间存在差异,因此将阈值设置为大于该值,但小于信号中的主动区域

    threshold = 50
    
  • 如果您需要更高的速度(因为您使用的是上帝知道的MCU…是的,Arduino不是MCU,它只是一个框架),您可以使用abs窗口总和,而不需要在每个窗口幻灯片中处理整个FIFO内容。相反,您只需从总和中删除第一项,然后将最后一项添加到总和中。所以方程是:

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

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

    如果绝对值和阈值与长期平均值相差太大,那么可能是绝对值和阈值的平均值?哇,谢谢您的回答。我会尽量在明天或周一完成,并将结果通知你。