Я попробовал следующую python медианную фильтрацию сигналов временных рядов , чтобы найти самую быструю и эффективную функцию.
sig
- это массив размером numpy
80×188
, который содержит 188 образцов, измеренных 80 датчиками.
import numpy as np
from scipy.ndimage import median_filter
from scipy.signal import medfilt
from scipy.signal import medfilt2d
import time
sig = np.random.rand(80,188).astype('f')
print(type(sig))
print(type(sig[0][0]))
window_length = 181
t = time.time()
sigFiltered = medfilt2d(sig, (1,window_length))
elapsed = time.time() - t
print('scipy.signal.medfilt2d: %g seconds' % elapsed)
t = time.time()
sigFiltered = median_filter(sig, (1,window_length))
elapsed = time.time() - t
print('scipy.ndimage.median_filter: %g seconds' % elapsed)
t = time.time()
sigFiltered = medfilt(sig, (1,window_length))
elapsed = time.time() - t
print('scipy.signal.medfilt: %g seconds' % elapsed)
Код можно попробовать здесь .
Результатом фильтра является другой массив временных рядов размером 80×188
с сглаженными временными точками для каждого датчика.
MATLAB medfilt1
(sig, 181, [], 2)
выполняет фильтрацию тех же данных в 10 раз быстрее по сравнению с scipy.signal.medfilt2d
, который был самым быстрым среди других функций. На моей машине MATLAB = 2 мс против Python = 20 мс. Я думаю, что MATLAB выполняет многопоточную обработку, а python - нет.
Есть ли способ выполнить многопоточную медианную фильтрацию, чтобы ускорить процесс и назначить датчики различным потокам? Существует ли более эффективная медианная фильтрация в python? Могу ли я достичь производительности MATLAB win python или хотя бы приблизиться к ней?