Среднеквадратичное (RMS) сглаживание сигнала

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

Кроме того, я больше не хочу избегать проблем с границами, потому что в итоге получаются большие массивы и относительно маленькие скользящие окна.

Спасибо за чтение

9
задан heltonbiker 23 November 2011 в 21:58
поделиться