4. 时域波动分析:滑动窗口均值、滑动窗口方差、均方根(RMS)的计算方法与波动表征

时域波动分析是PSI(压力波动指数)监测中最直观、最基础的分析手段。它通过滑动窗口在时间轴上连续截取数据片段,计算窗口内的统计特征量,从而揭示信号在不同时间段的波动强度、离散程度和能量水平。本节将详细阐述滑动窗口均值、滑动窗口方差以及均方根(RMS)的计算原理、实现步骤及其在波动表征中的物理意义。

4.1 滑动窗口均值(Moving Average)

滑动窗口均值是最简单的时域平滑与趋势提取方法。它通过计算窗口内所有采样点的算术平均值,消除高频噪声,突出信号的长期趋势或基线漂移。

4.1.1 计算方法

给定一个长度为N的离散信号序列 x[n],定义窗口长度为 L(L为奇数或偶数,通常取奇数以保证对称性),则第 i 个滑动窗口的均值 MA[i] 计算公式为:

MA[i] = (1 / L) * Σ_{k=0}^{L-1} x[i + k]

其中,i 从0到 N-L。实际工程中,常采用“中心对齐”方式,即窗口中心点对应输出时刻,公式调整为:

MA_center[i] = (1 / L) * Σ_{k=-⌊L/2⌋}^{⌊L/2⌋} x[i + k]

4.1.2 波动表征作用

  • 趋势提取:滤除高频脉动,保留压力信号的缓慢变化趋势,用于判断系统是否存在整体漂移。
  • 基线校正:将原始信号减去滑动均值,可获得零均值的波动分量,便于后续方差或RMS分析。
  • 异常检测:当滑动均值突然偏离历史基线时,提示可能存在传感器故障或工艺状态突变。
工程经验:窗口长度L的选择至关重要。L过小,平滑效果差,噪声残留多;L过大,会过度平滑真实波动,掩盖短时异常。一般建议L取信号主周期长度的1~2倍,或根据采样频率设定为0.5~2秒对应的采样点数。

4.2 滑动窗口方差(Moving Variance)

滑动窗口方差衡量信号在窗口内的离散程度,即波动幅度的大小。方差越大,说明信号在该时间段内偏离均值的程度越高,波动越剧烈。

4.2.1 计算方法

基于滑动窗口均值 MA[i],第 i 个窗口的方差 Var[i] 计算公式为:

Var[i] = (1 / L) * Σ_{k=0}^{L-1} (x[i + k] - MA[i])²

在实际编程中,为避免重复计算均值,可采用递推算法(Welford算法)提高计算效率:

初始化:M₁ = x₁, S₁ = 0
对于 k = 2 到 L:
  M_k = M_{k-1} + (x_k - M_{k-1}) / k
  S_k = S_{k-1} + (x_k - M_{k-1}) * (x_k - M_k)
窗口方差 = S_L / L

4.2.2 波动表征作用

  • 波动强度量化:方差直接反映压力波动的能量分散程度,是PSI计算的核心输入之一。
  • 稳态/瞬态判别:方差持续低值表示系统处于稳态;方差突然增大表示进入瞬态或扰动状态。
  • 阈值漂移预警:当方差在较长时间内缓慢增大,即使均值未变,也提示系统可能存在间歇性扰动或传感器性能退化。

4.3 均方根(RMS)

均方根(Root Mean Square)是信号在窗口内的有效值,它同时包含了信号的幅度信息和能量信息,对波动中的大幅值成分更为敏感。

4.3.1 计算方法

第 i 个滑动窗口的RMS值 RMS[i] 计算公式为:

RMS[i] = sqrt( (1 / L) * Σ_{k=0}^{L-1} (x[i + k])² )

若信号已进行零均值化处理(减去滑动均值),则RMS等价于标准差(Standard Deviation),即:

RMS_zero_mean[i] = sqrt( Var[i] )

4.3.2 波动表征作用

  • 能量度量:RMS直接反映窗口内信号的平均能量水平,适用于评估压力脉动的剧烈程度。
  • 与PSI关联:许多PSI算法直接采用RMS作为波动特征量,或将其与均值结合构造波动指数。
  • 抗噪性:相比方差,RMS对小幅噪声的敏感度略低,更适合在信噪比较低的环境中使用。

4.4 三种指标的对比与选择

指标 物理含义 对大幅值敏感度 对趋势漂移敏感度 典型应用场景
滑动均值 信号中心趋势 低 高 基线校正、趋势提取
滑动方差 信号离散程度 中 低(零均值后) 波动强度量化、稳态判别
均方根(RMS) 信号有效能量 高 中(受均值影响) 能量评估、PSI计算
关键结论:在实际PSI波动分析中,通常将滑动均值与滑动方差(或RMS)联合使用。先通过滑动均值去除趋势,再对残差计算方差或RMS,从而获得纯净的波动分量。这种“去趋势+波动度量”的组合是阈值漂移排查的标准流程。

4.5 滑动窗口计算流程与SVG图示

下图展示了滑动窗口在时间轴上移动计算均值、方差和RMS的完整流程。窗口每次向右滑动一个步长(通常为1个采样点),依次计算每个窗口内的统计量,最终生成三条波动特征曲线。

滑动窗口时域波动分析流程图 滑动窗口时域波动分析流程图 原始压力信号 x[n] 设置窗口长度 L 与步长 计算窗口均值 MA[i] 计算窗口方差 Var[i] 计算窗口 RMS[i] 均值曲线 MA[n] 方差曲线 Var[n] RMS曲线 RMS[n] 波动表征:趋势、离散度、能量水平 说明:窗口每次向右滑动1个采样点,重复计算上述三个统计量,直至覆盖整个信号序列。

4.6 代码实现示例(Python)

以下代码展示了使用Python实现滑动窗口均值、方差和RMS计算的核心逻辑。该实现采用向量化操作,兼顾可读性与计算效率。

import numpy as np

def sliding_window_stats(signal, window_size):
    """
    计算滑动窗口均值、方差和RMS
    
    参数:
        signal (np.array): 一维输入信号
        window_size (int): 窗口长度(奇数)
    
    返回:
        ma (np.array): 滑动均值序列
        var (np.array): 滑动方差序列
        rms (np.array): 滑动RMS序列
    """
    # 使用np.convolve实现快速滑动均值
    kernel = np.ones(window_size) / window_size
    ma = np.convolve(signal, kernel, mode='valid')
    
    # 计算零均值信号
    zero_mean = signal[:len(ma)] - ma
    
    # 滑动方差(使用卷积加速)
    var_kernel = np.ones(window_size) / window_size
    var = np.convolve(zero_mean**2, var_kernel, mode='valid')
    
    # RMS = sqrt(方差) 或直接计算
    rms = np.sqrt(var)
    
    return ma, var, rms

# 示例用法
if __name__ == "__main__":
    # 生成模拟压力信号
    t = np.linspace(0, 10, 1000)
    signal = np.sin(2 * np.pi * 2 * t) + 0.5 * np.random.randn(1000)
    
    window = 51  # 窗口长度
    ma, var, rms = sliding_window_stats(signal, window)
    
    print(f"信号长度: {len(signal)}")
    print(f"窗口长度: {window}")
    print(f"均值序列长度: {len(ma)}")
    print(f"方差序列长度: {len(var)}")
    print(f"RMS序列长度: {len(rms)}")
注意事项:
  • 滑动窗口的边界效应:使用 mode='valid' 时,输出序列长度会减少 window_size - 1 个点。若需保持与输入等长,可使用 mode='same' 并配合边界填充。
  • 窗口长度必须小于信号总长度,否则无法计算有效窗口。
  • 对于实时系统,建议采用递推算法(如CIC滤波器)以降低计算延迟。

4.7 波动表征的综合应用

在实际PSI监测系统中,上述三个指标通常不是孤立使用的,而是构成一个联合特征向量,用于全面描述窗口内的波动状态:

  • 均值 + 方差:判断是否存在“均值漂移伴随方差增大”的复合异常模式,典型场景如阀门卡涩导致的压力阶梯变化。
  • 均值 + RMS:评估信号的总能量水平是否超过安全阈值,适用于泵体振动监测。
  • 方差 / 均值²:构造变异系数(Coefficient of Variation),用于归一化波动强度,消除量纲影响。

通过联合分析这三个时域特征,可以构建多维度的波动表征体系,为后续的阈值漂移排查提供可靠的数据基础。