我有一个肌电数据信号,根据科学论文的明确建议,我应该使用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
。但是我不知道如何使用它们来完成我想要的操作。
此外,我不再关心边界问题,因为我最终会得到大数组和相对较小的滑动窗口。
谢谢阅读。