2、数据采集与格式:原始数据采集流程、标准数据格式(NetCDF、HDF5)、时间序列与径向风速
2.1 原始数据采集流程
激光测风LiDAR的数据采集并非简单的“开机即测”,而是一个涉及光学、机械与信号处理的精密流程。理解这一流程有助于诊断数据质量问题,并为后续处理奠定基础。
典型采集流程如下:
- 系统初始化与自检:激光器预热、扫描头归零、内部参考光路校准。此阶段会生成系统状态日志。
- 发射激光脉冲:通过光纤放大器发射特定波长(如1.5μm或1.6μm)的窄脉冲激光。
- 大气散射与回波接收:激光与大气中的气溶胶粒子相互作用,产生后向散射信号。望远镜接收微弱回波。
- 外差探测与混频:回波光与本振光在探测器上混频,产生包含多普勒频移的中频信号。
- 信号采集与数字化:高速模数转换器(ADC)将模拟中频信号转换为数字信号,通常采样率在百MHz至GHz级别。
- 频谱分析与风速反演:对每个距离门的数字信号进行FFT(快速傅里叶变换),提取功率谱峰值对应的频移,通过公式 \( v = \frac{\lambda \cdot f_d}{2} \) 计算径向风速。
- 数据打包与存储:将原始频谱数据、反演后的风速、信噪比(SNR)、时间戳、扫描角度等打包为原始二进制文件或直接写入标准格式。
注意:不同厂商(如Leosphere、Halo Photonics、Vaisala)的原始数据格式各异,通常为专有二进制格式(如 .lda、.hpl、.raw)。在实战中,第一步往往是使用厂商SDK或开源工具(如
lidar_processing库)将其转换为通用格式。
2.2 标准数据格式:NetCDF 与 HDF5
为了促进数据共享与长期存档,激光雷达社区普遍采用自描述的、跨平台的数据格式。其中 NetCDF 和 HDF5 是两大主流标准。
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 数据质量控制与时间序列可视化
在实战中,原始时间序列常包含噪声和异常值。建议的处理流程:
- SNR滤波:剔除SNR低于阈值的径向风速数据。
- 一致性检查:相邻时间或相邻距离门的径向风速突变超过阈值(如10 m/s)时,标记为可疑。
- 插值填补:对于短时缺失数据,可使用线性插值或中值滤波。
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为正,或远离为正,不同厂商约定可能相反)。