【发布时间】:2019-10-12 22:58:17
【问题描述】:
我需要你的推荐。我目前正在使用 Arduino 上的 EMG(肌肉)传感器,我的目标是识别和测量肌肉活动的时间。在下图中,您可以找到原始数据。 如您所见,在肌肉活动期间,模拟输出的范围要高得多。但我不知道哪种数学方法适合这项任务。
【问题讨论】:
-
如果与长期平均值相差太大,可能是绝对值的平均值和某个阈值?
标签: math arduino signal-processing
我需要你的推荐。我目前正在使用 Arduino 上的 EMG(肌肉)传感器,我的目标是识别和测量肌肉活动的时间。在下图中,您可以找到原始数据。 如您所见,在肌肉活动期间,模拟输出的范围要高得多。但我不知道哪种数学方法适合这项任务。
【问题讨论】:
标签: math arduino signal-processing
使用滑动窗口...
选择窗口大小
现在是您分析信号属性的时候了。它应该足够长以保持至少一个周期的信号,但最好是 2-3 个周期。
现在通过大小等于窗口大小的 FIFO 传递您的信号
在您的 FIFO 在每个新输入值处已满后,从中删除第一个并计算 FIFO 内容的最小值和最大值。这种 FIFO 最好以固定长度的循环缓冲区的形式实现。 max-min 的区别在于窗口的动态范围,它会告诉您传感器是否检测到活动。
阈值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 的幂也是一个好主意,这样您就可以在循环缓冲区实现中使用位运算而不是除法和取模。
【讨论】: