У меня есть сигнал электромиографических данных, которые я должен (явная рекомендация научных статей) сгладить с помощью 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, но я не мог этого понять как достичь того, что я хочу, используя их.
Кроме того, я больше не хочу избегать проблем с границами, потому что в итоге получаются большие массивы и относительно маленькие скользящие окна.
Спасибо за чтение