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的极低话务点不参与判定,避免统计噪声
从趋势到嫌疑小区:可执行的筛选流程
下面给出一段可直接运行的 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.5 | D3 08:00–11:45 | 9.2 | 16 | 否 | 高 |
| RBC-01-B | -103.0 | — | — | — | — | 低 |
该清单直接作为下一环节(定向天线扫描、三点测向)的输入:优先对“嫌疑等级=高”的小区安排现场测向,避免盲目全线排查。