2、数据采集与格式:原始数据采集流程、标准数据格式(NetCDF、HDF5)、时间序列与径向风速

2.1 原始数据采集流程

激光测风LiDAR的数据采集并非简单的“开机即测”,而是一个涉及光学、机械与信号处理的精密流程。理解这一流程有助于诊断数据质量问题,并为后续处理奠定基础。

典型采集流程如下:

  1. 系统初始化与自检:激光器预热、扫描头归零、内部参考光路校准。此阶段会生成系统状态日志。
  2. 发射激光脉冲:通过光纤放大器发射特定波长(如1.5μm或1.6μm)的窄脉冲激光。
  3. 大气散射与回波接收:激光与大气中的气溶胶粒子相互作用,产生后向散射信号。望远镜接收微弱回波。
  4. 外差探测与混频:回波光与本振光在探测器上混频,产生包含多普勒频移的中频信号。
  5. 信号采集与数字化:高速模数转换器(ADC)将模拟中频信号转换为数字信号,通常采样率在百MHz至GHz级别。
  6. 频谱分析与风速反演:对每个距离门的数字信号进行FFT(快速傅里叶变换),提取功率谱峰值对应的频移,通过公式 \( v = \frac{\lambda \cdot f_d}{2} \) 计算径向风速。
  7. 数据打包与存储:将原始频谱数据、反演后的风速、信噪比(SNR)、时间戳、扫描角度等打包为原始二进制文件或直接写入标准格式。

注意:不同厂商(如Leosphere、Halo Photonics、Vaisala)的原始数据格式各异,通常为专有二进制格式(如 .lda、.hpl、.raw)。在实战中,第一步往往是使用厂商SDK或开源工具(如 lidar_processing 库)将其转换为通用格式。

2.2 标准数据格式:NetCDF 与 HDF5

为了促进数据共享与长期存档,激光雷达社区普遍采用自描述的、跨平台的数据格式。其中 NetCDFHDF5 是两大主流标准。

2.2.1 NetCDF(Network Common Data Form)

NetCDF 是气象与海洋领域的经典格式,也是欧洲风能协会(EAWE)推荐的LiDAR数据交换格式。其核心特点包括:

  • 自描述:文件内部包含维度(dimensions)、变量(variables)和属性(attributes),无需外部说明文件即可理解数据结构。
  • 多维数组:天然支持时间、高度、方位角等多维数据。
  • 标准命名约定:CF(Climate and Forecast)元数据标准定义了风速、风向、时间等变量的标准名称和单位。

典型NetCDF结构示例(使用ncdump查看):

netcdf lidar_example {
dimensions:
    time = 86400 ;  // 一天内的秒数
    range = 100 ;   // 距离门数
variables:
    double time(time) ;
        time:units = "seconds since 2024-01-01 00:00:00" ;
    float range(range) ;
        range:units = "m" ;
    float radial_wind_speed(time, range) ;
        radial_wind_speed:units = "m s-1" ;
        radial_wind_speed:long_name = "Radial wind speed" ;
    float azimuth(time) ;
        azimuth:units = "degrees" ;
    float elevation(time) ;
        elevation:units = "degrees" ;
    float snr(time, range) ;
        snr:units = "dB" ;
}

2.2.2 HDF5(Hierarchical Data Format version 5)

HDF5 由美国国家超级计算应用中心(NCSA)开发,更适合存储大规模、复杂结构的LiDAR数据(如原始IQ数据、全波形数据)。其优势在于:

  • 树状结构:类似文件系统,可包含多个组(group)和数据集(dataset),便于组织不同扫描模式的数据。
  • 高效压缩:内置zlib、szip等压缩滤镜,可大幅减小原始频谱数据的体积。
  • 并行I/O:支持MPI并行读写,适合处理多台LiDAR组网数据。

HDF5与NetCDF的选择建议:

对比维度 NetCDF-4(基于HDF5) 纯HDF5
元数据标准 强(CF约定) 弱(需自定义)
社区支持 气象/海洋领域广泛 工业/遥感领域广泛
存储效率 良好 优秀(支持复杂压缩)
典型应用 风廓线、风场反演产品 原始IQ数据、全波形

实战提示:多数商业LiDAR厂商(如Leosphere的WindCube)提供NetCDF输出选项。若需处理原始频谱,建议使用HDF5并配合 h5py(Python)或 h5(R)库。

2.3 时间序列与径向风速

时间序列是LiDAR数据最基本的组织维度,而径向风速(Radial Wind Speed, RWS)是核心物理量。

2.3.1 时间序列结构

在标准格式中,时间维度通常为无限增长或固定长度。每个时间戳对应一组扫描数据。典型的时间序列变量包括:

  • 时间戳:通常以Unix时间戳或自参考时间起算的秒数表示。
  • 扫描角度:方位角(Azimuth)和仰角(Elevation),决定了激光束指向。
  • 径向风速:沿激光束方向的风速分量,正值表示远离LiDAR,负值表示朝向LiDAR。
  • 信噪比(SNR):用于数据质量控制,通常低于-20 dB的数据应被标记为无效。

2.3.2 径向风速的物理意义

径向风速 \( v_r \) 与真实三维风速矢量 \( (u, v, w) \) 的关系为:

\[ v_r = u \sin\theta \sin\phi + v \cos\theta \sin\phi + w \cos\phi \]

其中:

  • \( \theta \) 为方位角(从北顺时针)
  • \( \phi \) 为仰角(水平为0°)

当扫描方式为PPI(平面位置指示,固定仰角、变化方位角)时,径向风速随方位角呈余弦变化,这是后续VAD(速度方位显示)反演水平风场的基础。

2.3.3 数据质量控制与时间序列可视化

在实战中,原始时间序列常包含噪声和异常值。建议的处理流程:

  1. SNR滤波:剔除SNR低于阈值的径向风速数据。
  2. 一致性检查:相邻时间或相邻距离门的径向风速突变超过阈值(如10 m/s)时,标记为可疑。
  3. 插值填补:对于短时缺失数据,可使用线性插值或中值滤波。

Python代码示例(读取NetCDF并绘制时间-高度径向风速图):

import netCDF4 as nc
import matplotlib.pyplot as plt
import numpy as np

# 读取数据
ds = nc.Dataset('lidar_data.nc')
time = ds.variables['time'][:]
range_gates = ds.variables['range'][:]
rws = ds.variables['radial_wind_speed'][:]  # shape: (time, range)
snr = ds.variables['snr'][:]

# 质量控制:将低SNR数据设为NaN
rws_masked = np.where(snr < -20, np.nan, rws)

# 绘制时间-高度图
plt.figure(figsize=(10, 6))
plt.pcolormesh(time, range_gates, rws_masked.T, shading='auto', cmap='RdBu_r', vmin=-15, vmax=15)
plt.colorbar(label='Radial Wind Speed (m/s)')
plt.xlabel('Time (s)')
plt.ylabel('Range (m)')
plt.title('Radial Wind Speed Time-Height Cross Section')
plt.show()

关键提醒:径向风速是矢量,其正负号取决于激光束指向。在分析前,务必确认数据中是否已根据扫描角度进行了符号约定(通常朝向LiDAR为正,或远离为正,不同厂商约定可能相反)。