4. 等间距重采样与采样率统一

为什么必须先统一空间采样间隔

轨道不平顺检测车在通过曲线、道岔或低速区段时,采样触发往往由里程轮脉冲或GPS触发,导致原始序列的空间间隔并不恒定;不同检测设备、不同检测遍次之间也可能采用不同的空间采样率。PSD估计要求输入序列是等空间间隔的,否则频率轴会失真、幅值归一化失效,高频段尤其容易出现虚假能量或能量丢失。本案例的任务是:把非等间距/变采样率序列重采样到统一的空间间隔 Δx,并定量评估插值方法对幅值谱高频段的影响。

重采样流程与关键判据

核心思路是:先由原始里程坐标与不平顺幅值构造“里程—幅值”离散点对,再在目标等间距里程网格上做插值。目标间隔 Δx 的选择需同时满足两个条件:其一,Δx 不大于原始数据中最小的有效空间间隔(避免上采样引入虚假高频);其二,目标空间采样率 1/Δx 对应的 Nyquist 空间频率要覆盖分析关心的最高空间频率。轨道高低不平顺PSD分析通常关心 0.01~0.5 1/m 甚至更高,若关心到 0.5 1/m,则 Δx 应不大于 1 m(Nyquist=0.5 1/m),工程上常取 0.25 m 或 0.5 m。

原始非等间距序列 里程 x 幅值 间隔不均:Δx 随速度/触发变化 插值 重采样 目标等间距网格 Δx 里程 x = k·Δx 等间隔:满足 PSD 输入要求 插值方法选择 线性插值:平滑、高频衰减 三次样条:保形好、可能过冲 最近邻:保幅值、阶梯失真 高频段差异最显著 插值方法对幅值谱高频段的影响(示意) 空间频率 (1/m) 幅值谱 0 0.1 0.2 0.3 0.4 高频段:插值差异放大区 参考谱 线性插值 三次样条 最近邻

实现:构造里程—幅值点对并重采样

下面给出一个可直接运行的 Python 实现。输入为原始里程数组 x_raw(单位 m,非等间距)与对应高低不平顺幅值 y_raw(单位 mm)。目标间隔取 dx_target = 0.25 m。代码同时计算三种插值结果,并用 FFT 幅值谱对比高频段(0.2~0.4 1/m)的能量差异,作为插值方法选择的定量依据。

import numpy as np
from scipy.interpolate import interp1d, CubicSpline

# ---- 1. 构造示例:非等间距原始序列(模拟里程轮触发不均)----
rng = np.random.default_rng(42)
x_raw = np.cumsum(rng.uniform(0.15, 0.60, size=400))   # 间隔 0.15~0.60 m 不等
x_raw = x_raw - x_raw[0]
# 合成含多频成分的高低不平顺(单位 mm)
y_raw = (1.2*np.sin(2*np.pi*0.05*x_raw)
         + 0.6*np.sin(2*np.pi*0.20*x_raw)
         + 0.25*np.sin(2*np.pi*0.35*x_raw)
         + 0.08*rng.normal(size=x_raw.size))

# ---- 2. 目标等间距网格 ----
dx_target = 0.25
x_uni = np.arange(x_raw[0], x_raw[-1], dx_target)

# ---- 3. 三种插值 ----
f_lin = interp1d(x_raw, y_raw, kind='linear')
f_near = interp1d(x_raw, y_raw, kind='nearest')
f_spl = CubicSpline(x_raw, y_raw)

y_lin = f_lin(x_uni)
y_near = f_near(x_uni)
y_spl = f_spl(x_uni)

# ---- 4. 幅值谱对比(去均值后 FFT)----
def amp_spectrum(y, dx):
    y = y - y.mean()
    n = y.size
    Y = np.fft.rfft(y)
    f = np.fft.rfftfreq(n, d=dx)          # 空间频率 1/m
    return f, np.abs(Y) * 2.0 / n

f, A_lin = amp_spectrum(y_lin, dx_target)
_, A_near = amp_spectrum(y_near, dx_target)
_, A_spl = amp_spectrum(y_spl, dx_target)

# ---- 5. 高频段能量占比(0.2~0.4 1/m)----
band = (f >= 0.2) & (f <= 0.4)
for name, A in [('线性', A_lin), ('最近邻', A_near), ('三次样条', A_spl)]:
    ratio = A[band].sum() / A.sum()
    print(f'{name:6s} 高频段能量占比 = {ratio:.3f}')

print('等间距序列长度:', x_uni.size, ' 间隔:', dx_target, 'm')
print('Nyquist 空间频率:', 0.5/dx_target, '1/m')

结果判读与选择依据

运行上述代码后,可观察到以下规律(示例数据下的预期现象,非实测):线性插值在高频段能量占比通常最低,因为线性插值相当于低通平滑,会系统性压低 0.2 1/m 以上的幅值;最近邻插值保留原始幅值但引入阶梯状不连续,高频段能量偏高且谱形毛刺明显;三次样条在低频与中频段最接近参考谱,高频段可能因过冲略高于真实值。因此,若后续 PSD 分析关心到 0.3 1/m 以上,建议优先采用三次样条,并在报告中注明插值方法;若只关心 0.1 1/m 以下的长波成分,线性插值即可满足且更稳健。

目标间隔 Δx 的选取要与分析关心的最高空间频率 f_max 匹配:Δx ≤ 1/(2·f_max)。例如关心到 0.4 1/m,则 Δx ≤ 1.25 m;工程上取 0.25 m 可留出足够裕量,同时避免过度上采样带来的计算浪费。
重采样前必须确认原始里程坐标单调递增且无重复点,否则插值函数会报错或产生错误结果。若原始数据存在里程回退(如往返检测拼接),应先分段处理再统一网格。

重采样质量检查清单

检查项判据不通过时的处理
里程单调性diff(x_raw) > 0 全部成立剔除重复点或分段重采样
目标间隔与 Nyquist1/(2Δx) ≥ 关心的最高空间频率减小 Δx 或降低分析频带上限
幅值量级保持重采样前后 RMS 偏差 < 5%检查插值方法或原始数据异常
高频段能量合理性高频段能量占比不出现异常尖峰改用三次样条或检查原始采样率
序列长度满足后续 FFT/Welch 分段要求调整 Δx 或截取有效区段

完成上述检查后,输出的 x_uni 与 y_spl(或所选方法的结果)即为满足 PSD 计算要求的等间距序列,可直接进入后续谱估计环节。