如何在Python中删除信号的常量部分?

问题描述 投票:0回答:1

我有一个数据集,有时它是恒定的,噪音很小。它可以在顶部,也可以在中间。我想删除信号的所有恒定部分,以便将其压缩为更小的长度。

假设如果 200 个连续值相同(或在阈值限制内被视为常数),则将该部分视为常数。

任何解决方案代码或逻辑建议都将被采纳。 感谢您的宝贵时间。

我已附上 .npy 格式的样本数据谷歌驱动器链接

在下面的示例图像中,我已指示(红色)我想要删除的部分作为示例:

python signals signal-processing
1个回答
0
投票

这不是最优雅的解决方案,但这只是在信号上滑动 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)

© www.soinside.com 2019 - 2024. All rights reserved.