You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Numpy/Scipy以向量化方式平滑离散/阶跃信号?

基于Numpy/Scipy的阶跃信号去噪向量化实现

我有一个仅能取整数值的信号,该信号存在噪声,在即将切换到新稳态时,会在不同电平间波动。我需要消除这种波动,得到滤波后的信号:只有当连续3个样本跳变到新阶跃时,才触发状态转换。

手动遍历每个样本并通过状态变量跟踪连续跳变次数的方法容易实现,但速度较慢,希望找到用Numpy实现的向量化方法。

非向量化实现示例

up_count = 0
dn_count = 0
out = x.copy()
for i in range(len(out)-1):
    if out[i+1] > out[i]:
        up_count += 1
        dn_count = 0

        if up_count == 3:
            up_count = 0
            out[i+1] = out[i+1]
        else:
            out[i+1] = out[i]
    elif out[i+1] < out[i]:
        up_count = 0
        dn_count += 1

        if dn_count == 3:
            dn_count = 0
            out[i+1] = out[i+1]
        else:
            out[i+1] = out[i]
    else:
        dn_count = 0
        up_count = 0

Numpy/Scipy向量化实现版本

感谢@Bogdan Shevchenko提供的解决方案,基于其方案改写了无需Pandas的Numpy/Scipy版本:

def ffill(arr, mask):
    idx = np.where(~mask, np.arange(mask.shape[0])[:, None], 0)
    np.maximum.accumulate(idx, axis=0, out=idx)
    return arr[idx, np.arange(idx.shape[1])]

x_max = scipy.ndimage.maximum_filter1d(x, 3, axis=0, origin=1, mode="nearest")
x_min = scipy.ndimage.minimum_filter1d(x, 3, axis=0, origin=1, mode="nearest")
x_smooth = ffill(x, x_max!=x_min)

内容的提问来源于stack exchange,提问作者Rob Allsopp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 17:42:44