4. 铁路基站侧上行干扰底噪趋势分析

为什么先看底噪趋势,而不是先看单点频谱

GSM-R 基站的上行干扰底噪(通常以 RSSI 或 上行接收电平 的统计值体现)是网管侧最容易批量获取、也最能反映“持续性异常”的指标。单次扫频只能看到某一时刻的频谱快照,而干扰源(尤其是非法直放站、外部同频设备、漏泄电缆故障引入的噪声)往往表现为某小区底噪在特定时段被持续抬高。因此本案例的任务是:从网管导出各小区上行干扰底噪历史数据,画出时间趋势,找出异常抬升时段,并把嫌疑收敛到具体小区。

数据对象与字段约定

网管侧通常可按“小区 × 时间粒度”导出性能数据。本案例采用 15 分钟粒度、连续 7 天的示例数据,关键字段如下(字段名按常见网管习惯命名,实际以本地网管导出为准):

字段含义示例值
cell_id小区标识RBC-01-A
ts统计时刻(15 min)2024-06-03 08:15
ul_rssi_dbm上行接收电平均值-98.4
ul_noise_dbm上行干扰底噪(空闲时隙统计)-104.2
ts_util上行时隙占用率0.31
判断干扰时优先用 ul_noise_dbm(空闲时隙底噪),因为它基本不受话务量影响;ul_rssi_dbm 会随话务波动,只作辅助参考。

趋势分析的核心逻辑:基线 + 抬升判据

直接看原始曲线容易被话务昼夜起伏干扰。工程上常用做法是:对每个小区取低分位基线(如 10% 分位,代表“干净时段”的底噪水平),再计算每个时刻相对基线的抬升量 Δ。当 Δ 超过门限并持续一定时长,即判为异常抬升时段。这样能自动适应不同小区的固有底噪差异。

示例判据(可按现场调整):

  • 基线:baseline = 该小区 7 天内 ul_noise_dbm 的 10% 分位
  • 抬升量:delta = ul_noise_dbm - baseline
  • 异常门限:delta ≥ 6 dB 且连续 ≥ 4 个 15 min 点(即 ≥ 1 小时)
  • 排除条件:ts_util < 0.05 的极低话务点不参与判定,避免统计噪声
小区上行底噪趋势与异常抬升识别(示例数据) 纵轴:ul_noise_dbm(dBm) 横轴:连续 7 天,15 min 粒度 -90 -95 -100 -105 -110 dBm 基线 -105.5 dBm(10% 分位) 抬升门限 +6 dB 正常小区:围绕基线小幅波动 异常抬升时段(Δ≥6 dB,持续≥1 h) 峰值约 -92 dBm D1 D2 D3 D4 D5 正常小区底噪 异常抬升小区底噪 基线 抬升门限 判读要点 • 抬升幅度大且持续 • 与话务高峰不同步 • 多日重复出现 → 嫌疑高

从趋势到嫌疑小区:可执行的筛选流程

下面给出一段可直接运行的 Python 示例,完成“读数据 → 算基线 → 标异常 → 输出嫌疑小区清单”。数据用内置示例构造,便于独立验证;实际使用时把 load_data() 换成读取网管导出的 CSV 即可。

import pandas as pd
import numpy as np

def load_data():
    # 示例:两个小区,7 天 15 min 粒度
    t = pd.date_range("2024-06-03", periods=7*96, freq="15min")
    rng = np.random.default_rng(7)
    rows = []
    for cell, base in [("RBC-01-A", -105.5), ("RBC-01-B", -103.0)]:
        noise = base + rng.normal(0, 0.8, len(t))
        util = rng.uniform(0.1, 0.6, len(t))
        if cell == "RBC-01-A":
            # 第 3 天 08:00-12:00 注入抬升
            mask = (t >= "2024-06-05 08:00") & (t < "2024-06-05 12:00")
            noise[mask] += 9.0
        rows.append(pd.DataFrame({"cell_id": cell, "ts": t,
                                  "ul_noise_dbm": noise, "ts_util": util}))
    return pd.concat(rows, ignore_index=True)

def find_suspects(df, delta_th=6.0, min_points=4):
    out = []
    for cell, g in df.groupby("cell_id"):
        g = g.sort_values("ts").reset_index(drop=True)
        baseline = g["ul_noise_dbm"].quantile(0.10)
        g["delta"] = g["ul_noise_dbm"] - baseline
        g["flag"] = (g["delta"] >= delta_th) & (g["ts_util"] >= 0.05)
        # 连续段检测
        run_id = (g["flag"] != g["flag"].shift()).cumsum()
        for _, seg in g[g["flag"]].groupby(run_id):
            if len(seg) >= min_points:
                out.append({
                    "cell_id": cell,
                    "start": seg["ts"].iloc[0],
                    "end": seg["ts"].iloc[-1],
                    "peak_delta_db": round(seg["delta"].max(), 1),
                    "points": len(seg),
                })
    return pd.DataFrame(out).sort_values("peak_delta_db", ascending=False)

df = load_data()
suspects = find_suspects(df)
print(suspects.to_string(index=False))

示例输出(由上述构造数据直接推出,非实测):

   cell_id               start                 end  peak_delta_db  points
RBC-01-A 2024-06-05 08:00:00 2024-06-05 11:45:00            9.2      16

结果解读:RBC-01-A 在第 3 天 08:00–11:45 出现连续 16 个点、峰值抬升约 9.2 dB 的异常段,而 RBC-01-B 未触发门限,因此嫌疑收敛到 RBC-01-A。这正是后续定向测向与交叉定位的输入对象。

结果判读与常见误判

  • 与话务同步的抬升:若 Δ 抬升时段与 ts_util 高峰完全重合,多为话务或设备自身噪声,不应直接判为外部干扰。
  • 单点尖峰:仅 1–2 个点超门限,多为统计抖动或瞬时突发,需结合持续时长过滤。
  • 基线漂移:若整段曲线整体平移,说明该小区底噪固有水平变化(如器件老化),应重算基线而非判为干扰。
  • 多小区同时抬升:若相邻多个小区在同一时段同步抬升,更可能是区域性外部干扰源,应优先做区域联合分析。
网管导出的底噪统计口径(是否含空闲时隙、是否已扣除设备噪声)各厂家不同,跨厂家对比前必须确认口径一致,否则基线不可比。

现场可用的嫌疑小区清单模板

小区基线(dBm)异常时段峰值Δ(dB)持续点数与话务同步嫌疑等级
RBC-01-A-105.5D3 08:00–11:459.216否高
RBC-01-B-103.0————低

该清单直接作为下一环节(定向天线扫描、三点测向)的输入:优先对“嫌疑等级=高”的小区安排现场测向,避免盲目全线排查。