我已经尝试对时间序列信号使用以下python中值过滤,以找到最快,更有效的函数。
[sig
是大小为numpy
的80×188
数组,其中包含由80个传感器测量的188个样本。
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)
可以尝试使用here代码。
过滤器的结果是另一个大小为80×188
的时间序列数组,其中每个传感器的时间点都经过平滑处理。
MATLABmedfilt1
medfilt1
对相同数据执行过滤的速度是(sig, 181, [], 2)
的10倍,这是其他功能中最快的。在我的机器上,MATLAB = 2ms与Python = 20ms。我认为MATLAB执行多线程处理,而python不执行。
是否有任何方法可以执行多线程中值滤波以加快处理速度并将传感器分配给不同的线程? python中是否有更有效的中值过滤?我能否达到MATLAB win python的性能,或者至少接近它?
我想知道为什么您对数据长度188使用181点的中值过滤器?过滤器是如此之长,以至于您实际上只是丢掉了所有数据,而是将其替换为传感器输出的全局中值。典型的中值滤波器长度为几个样本,具体取决于您要滤除哪种瞬态。
过滤器长度也解释了为什么它这么慢。在我的机器上,您的scipy.signal.medfilt2d
示例花费46毫秒。使用3个样本的更正常的过滤器大小运行需要0.7毫秒。