——一键捕捉台风和中小尺度扰动
现在非常流行降噪耳机,笔者坐飞机时经常戴着。那么在大气领域怎么降噪呢
!pip install pybarnes -i https://pypi.mirrors.ustc.edu.cn/simple/
WRF 输出的海平面气压(SLP)场往往既有大尺度天气背景,也叠加了大量中小尺度噪音:
在做台风定位、中尺度涡旋追踪、能量谱分析时,我们往往只想保留其中某一段空间尺度的信号——滤波成了必不可少的一步。
Barnes 滤波就是一种简单且物理意义明确的方案: – 高斯权重 + 截断波长 → 可低通、可高通、可带通。 – 仅需经纬度与二维场,完全离线完成
给定响应函数
from netCDF4 import Dataset
import wrf
ncfile = Dataset(r"/home/mw/input/typhoon9537/wrfout_d01_2019-08-08_22_00_00")
slp = wrf.getvar(ncfile, "slp") # xarray.DataArray [Time, south_north, west_east]
# Define target lat/lon bounds
lat_min, lat_max = 25.0, 30.0
lon_min, lon_max = 122.0, 127.0
# Convert to grid coordinates
ll_x, ll_y = wrf.ll_to_xy(ncfile, lat_min, lon_min)
ur_x, ur_y = wrf.ll_to_xy(ncfile, lat_max, lon_max)
# Ensure proper ordering and crop to ~200x200 grid
x_start, x_end = sorted([int(ll_x), int(ur_x)])
y_start, y_end = sorted([int(ll_y), int(ur_y)])
# Crop SLP data
slp_cropped = slp[y_start:y_end, x_start:x_end]
slp_cropped.shape
(185, 159)
from pybarnes import BarnesFilter
f = BarnesFilter(slp_cropped.data,
lon = slp_cropped.XLONG.data, # 二维数组
lat = slp_cropped.XLAT.data
)
# 30–150 km 带通
z_band = f.bandpass(g1=0.3, c1=30000, # 30 km 高通
g2=0.3, c2=150000) # 150 km 低通
Caculating the first twice revision...
Caculating the second twice revision...
仅需两行,就能得到保留中尺度涡旋、滤掉大尺度背景和小尺度噪音的新场。
import matplotlib.pyplot as plt
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16, 6))
ax1.imshow(slp_cropped, cmap='jet')
ax1.set_title("Original SLP")
ax2.imshow(z_band, cmap='jet')
ax2.set_title("Bandpass 30–150 km")
plt.show()

左图:原场混杂着大尺度高压和小尺度噪点。 右图:台风结构更为清晰(可能范围太小比较少可以说的地方)
以上截取的范围为5 x 5°,再大就会炸内存了,本次调用的是32g的。
滤波类型 | 参数示例 | 推荐场景 |
|---|---|---|
低通 | g=0.3, c=200 km | 提取天气尺度槽脊 |
高通 | g=0.4, c=50 km | 研究β中尺度涡 |
带通 | g1=0.3, c1=30, g2=0.3, c2=150 km | 台风、中尺度低压 |
小技巧
c 不要低于 3–4 倍格距,避免数值色散混入。安装依赖
pip install xarray netcdf4 pybarnes wrf-python
修改脚本第一行的 WRF_FILE 为你的 wrfout_d0x_... 路径。
python barnes_slp.py
欢迎留言交换调参心得~
此前在深雨露公众号询问计算时间太长的问题,意外得到了pybarnes库的作者雨落森林回复
你好,我是pybarnes库的作者,我来解释一下,如果1000*1000大小的数组要实现滤波,原理上因为每个点要计算与其它所有点的距离,也需要大约4000G的内存。这对于个人电脑和一般中小型超算和服务器来说都是无能为力的。因此,在计算滤波的时候不再一次性计算完整的距离矩阵,而是分批计算每一批格点的距离,得到滤波结果后释放中间的距离矩阵,然后重新计算下一批。根据用户的内存大小智能决定批次大小。这样做的话,比起一次性全部计算完整会稍微慢一点。 总而言之,barnes方法滤波主要的计算和存储的开销都在于过高的分辨率和过大的数组上。个人建议的合理尺寸在200*200左右。原则上过大的尺寸不建议滤波,但它允许计算,只是计算需要的时间花销需要用户自行承担。
对此大家有什么好的解决方案吗