【发布时间】:2012-01-04 22:50:12
【问题描述】:
我有一个肌电数据信号,我应该(科学论文的明确建议)使用 RMS 进行平滑处理。
我有以下工作代码,产生所需的输出,但它比我想象的要慢。
#!/usr/bin/python
import numpy
def rms(interval, halfwindow):
""" performs the moving-window smoothing of a signal using RMS """
n = len(interval)
rms_signal = numpy.zeros(n)
for i in range(n):
small_index = max(0, i - halfwindow) # intended to avoid boundary effect
big_index = min(n, i + halfwindow) # intended to avoid boundary effect
window_samples = interval[small_index:big_index]
# here is the RMS of the window, being attributed to rms_signal 'i'th sample:
rms_signal[i] = sqrt(sum([s**2 for s in window_samples])/len(window_samples))
return rms_signal
我看到了一些关于优化移动窗口循环的 deque 和 itertools 建议,以及来自 numpy 的 convolve,但我无法弄清楚如何使用它们来完成我想要的。
另外,我不再关心避免边界问题,因为我最终得到了大数组和相对较小的滑动窗口。
感谢阅读
【问题讨论】:
-
你能链接到论文吗?我从未听说过通过计算移动窗口上的点的 RMS 来平滑信号。一般来说,这看起来不像原始信号的平滑版本。
-
建议以这种方式平滑,因为它与信号功率(能量)相关,这可用于推断肌肉努力。链接:isek-online.org/standards_emg.html“另一种可接受的提供幅度信息的方法是“均方根”或 RMS。就像移动平均值一样,这个量是为特定时间间隔(移动窗口)定义的,必须指明。”根据Noraxon小册子(封闭源,我公司拥有),它是平滑的首选,时间窗口或多或少在50到100ms之间。
-
移动窗口的 RMS 也是音频电平表背后的理念。
标签: numpy iteration scipy smoothing moving-average