首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >用 Barnes 低通/带通滤波器给 WRF 海平面气压“降噪”

用 Barnes 低通/带通滤波器给 WRF 海平面气压“降噪”

作者头像
用户11172986
发布2026-04-24 18:53:34
发布2026-04-24 18:53:34
860
举报
文章被收录于专栏:气python风雨气python风雨

用 Barnes 低通/带通滤波器给 WRF 海平面气压“降噪”

——一键捕捉台风和中小尺度扰动

现在非常流行降噪耳机,笔者坐飞机时经常戴着。那么在大气领域怎么降噪呢

环境设置

安装依赖

代码语言:javascript
复制
!pip install pybarnes -i https://pypi.mirrors.ustc.edu.cn/simple/

1. 为什么一定要滤波?

WRF 输出的海平面气压(SLP)场往往既有大尺度天气背景,也叠加了大量中小尺度噪音:

  • 大尺度:副热带高压、长波槽脊。
  • 中尺度:台风、低压涡旋、海风锋。
  • 小尺度:1–10 km 的数值噪音、地形重力波等。

在做台风定位、中尺度涡旋追踪、能量谱分析时,我们往往只想保留其中某一段空间尺度的信号——滤波成了必不可少的一步。

Barnes 滤波就是一种简单且物理意义明确的方案: – 高斯权重 + 截断波长 → 可低通、可高通、可带通。 – 仅需经纬度与二维场,完全离线完成


2. Barnes 滤波原理速读

给定响应函数

  • 为波数, 为截断波长。
  • 为抑噪参数(通常 0.2–0.5)。
  • 低通:仅留 。
  • 带通:如上式两项相减即可。

3. 三步入门:代码走读

3.1 读数据 & 局部裁剪

代码语言:javascript
复制

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
代码语言:javascript
复制
(185, 159)

3.2 调用 pybarnes

代码语言:javascript
复制

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 低通

代码语言:javascript
复制
Caculating the first twice revision...
Caculating the second twice revision...

仅需两行,就能得到保留中尺度涡旋、滤掉大尺度背景和小尺度噪音的新场。

3.3 可视化对比

代码语言:javascript
复制
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的。

4. 实测效果 & 调参建议

滤波类型

参数示例

推荐场景

低通

g=0.3, c=200 km

提取天气尺度槽脊

高通

g=0.4, c=50 km

研究β中尺度涡

带通

g1=0.3, c1=30, g2=0.3, c2=150 km

台风、中尺度低压

小技巧

  • c1/c2 先粗后细,用功率谱验证是否落在目标波段。
  • g 越小,衰减越弱,保留更多信号。
  • 分辨率 3 km 时,c 不要低于 3–4 倍格距,避免数值色散混入。

5. 一键运行

安装依赖

代码语言:javascript
复制
pip install xarray netcdf4 pybarnes wrf-python  

修改脚本第一行的 WRF_FILE 为你的 wrfout_d0x_... 路径。

代码语言:javascript
复制
python barnes_slp.py  

6. 扩展玩法

  • 四维滤波:给不同时间层循环,做时-空联合谱分析。
  • 多变量:对 U、V 滤波后再做涡度诊断,台风环流更清晰。
  • 动画:把连续时次滤波结果叠加 basemap,做成 MP4 观察系统演变。

欢迎留言交换调参心得~

番外

此前在深雨露公众号询问计算时间太长的问题,意外得到了pybarnes库的作者雨落森林回复

你好,我是pybarnes库的作者,我来解释一下,如果1000*1000大小的数组要实现滤波,原理上因为每个点要计算与其它所有点的距离,也需要大约4000G的内存。这对于个人电脑和一般中小型超算和服务器来说都是无能为力的。因此,在计算滤波的时候不再一次性计算完整的距离矩阵,而是分批计算每一批格点的距离,得到滤波结果后释放中间的距离矩阵,然后重新计算下一批。根据用户的内存大小智能决定批次大小。这样做的话,比起一次性全部计算完整会稍微慢一点。 总而言之,barnes方法滤波主要的计算和存储的开销都在于过高的分辨率和过大的数组上。个人建议的合理尺寸在200*200左右。原则上过大的尺寸不建议滤波,但它允许计算,只是计算需要的时间花销需要用户自行承担。

对此大家有什么好的解决方案吗

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-07-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 气python风雨 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 用 Barnes 低通/带通滤波器给 WRF 海平面气压“降噪”
    • 环境设置
      • 安装依赖
    • 1. 为什么一定要滤波?
    • 2. Barnes 滤波原理速读
    • 3. 三步入门:代码走读
      • 3.1 读数据 & 局部裁剪
      • 3.2 调用 pybarnes
      • 3.3 可视化对比
    • 4. 实测效果 & 调参建议
    • 5. 一键运行
    • 6. 扩展玩法
    • 番外
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档