您可以在移动窗口上使用信号的方差.下面是一个示例(参见附图,其中测试信号为红色,窗口方差为绿色,滤波后的信号为蓝色):
:
测试信号生成:
import numpy as np
X = np.arange(200) - 100.
Y = (np.exp(-(X/10)**2) + np.exp(-((np.abs(X)-50.)/2)**2)/3.) * np.cos(X * 10.)
Run Code Online (Sandbox Code Playgroud)
计算移动窗口方差:
window_length = 30 # number of point for the window
variance = np.array([np.var(Y[i-window_length / 2.: i+window_length/2.]) for i in range(200)])
Run Code Online (Sandbox Code Playgroud)
得到方差很高的指数(这里我选择的标准方差优于最大方差的一半......你可以根据你的情况调整它):
idx = np.where(variance > 0.5 * np.max(variance))
X_min = np.min(X[idx])
# -14.0
X_max = np.max(X[idx])
# 15.0
Run Code Online (Sandbox Code Playgroud)
或过滤信号(将方差设为零)
Y_modified = np.where(variance > 0.5 * np.max(variance), Y, 0)
Run Code Online (Sandbox Code Playgroud)