我有一个数据集,有时它是恒定的,噪音很小。它可以在顶部,也可以在中间。我想删除信号的所有恒定部分,以便将其压缩为更小的长度。
假设如果 200 个连续值相同(或在阈值限制内被视为常数),则将该部分视为常数。
任何解决方案代码或逻辑建议都将被采纳。 感谢您的宝贵时间。
我已附上 .npy 格式的样本数据谷歌驱动器链接。
在下面的示例图像中,我已指示(红色)我想要删除的部分作为示例:
这不是最优雅的解决方案,但这只是在信号上滑动 200 长度的窗口,查看方差,并且超过特定幅度的任何方差都被认为是非常量。可能有一些方法可以对此进行修改,但只需很少的努力,我就能够删除很多常量。
import numpy as np
import matplotlib.pyplot as plt
x = np.load(r"C:\Users\ryansenne\Downloads\sample.npy")
# Detects constant sections and removes them
def remove_constant_sections(signal, window_size=200, threshold=0.01):
filtered_signal = []
i = 0
while i < len(signal) - window_size:
window = signal[i:i+window_size]
if np.var(window) > threshold:
filtered_signal.extend(window)
i += window_size
else:
i += 1
# Add the remaining values that may not fit into a full window
filtered_signal.extend(signal[i:])
return np.array(filtered_signal)
filtered_signal = remove_constant_sections(x)