处理探地雷达(GPR)数据,拿来第一步基本都先做 dewow。刚接触的时候光看名字不知道它在去什么,后来弄明白了,记一下。

先说两个词。雷达每次发射接收,得到的是一条沿时间方向的采样序列,叫一道(A-scan);把很多道沿测线方向排开,就成了二维的剖面图(B-scan)。dewow 处理的是「一道」内部的事。

一道信号本来该围绕 0,实际常常整体漂

理论上,去掉直达波以后,一道雷达信号应该围绕 0 这条基线上下抖动——有反射的地方抖一下,没反射的地方贴着 0。实际拿到的数据不是这样,整条信号会慢慢往上拱一段、又往下沉一段,整体不贴着 0,像是在一个缓慢起伏的包络上叠加了高频反射。这个慢漂就叫 wow。

wow 这个词是早期音响那边的行话,本来指唱片转速不稳导致的声音低频飘忽,借过来形容信号的低频基线漂移。它的来源一般是天线跟地面的耦合、仪器本底、线缆感应这些,跟真正的地下反射没关系,但它占着基线、带着整道信号跑偏。

为什么要先去掉它——基线不归零,后面一堆处理都受拖累。算能量、判反射强度的时候,慢漂会垫一层虚假的底;显示的时候,整道压在直流偏置上,弱反射更看不清。

沿时间方向算个滑动平均,再减掉

做法很直白:沿时间方向(每道内部)做一个滑动平均,得到那条慢漂的包络线,然后从原信号里把它减掉:

def dewow(data, window=101):
trend = boxcar_mean(data, window, axis=0) # 沿时间轴(axis=0)的滑动平均
return data - trend

滑动平均是个低通,原信号减掉低通剩下的就是高频——所以 dewow 本质上是个高通滤波,把低频漂移滤掉,留下相对高频的反射。这一步的代码其实就一行减法,真正要拿捏的是那个 window(窗长)。

窗长就是截止频率,太小会把真信号也削了

窗长直接决定去多「低」的频。窗越长,滑动平均越平滑、跟得上的漂移越慢,等于截止频率越低,只去更低的频;窗越短,截止频率越高,连稍微低一点的有用反射都当漂移给减了。

这是个要小心的地方:窗太小,会把真实的低频目标(比如深部的大块反射)当成 wow 削掉,深部信息受损;低频天线、探测深部大目标的数据,dewow 不能开太狠。默认一百出头个样点是个常用起点,具体得看数据的时间窗和天线主频调。

这一步是沿时间轴,跟背景去除别搞混

有个特别容易混的点:dewow 是沿时间轴(每道内部,axis=0)去每道自己的低频漂移。而后面要做的「背景去除」是沿空间轴(道与道之间,axis=1)去横向的共模背景。两个方向正交,处理的东西完全不同——一个是道内的慢漂,一个是跨道的条带。光看「都是减一个平均」容易以为是一回事,实际上轴不一样,减出来的效果差很远。

位置在最前面

dewow 在整条处理流水线里是第一步,在带通、背景去除、增益之前。先把每道拉回 0 基线,后面才有干净的数据接着处理。顺带一个坑:dewow 减完会出负值,写回文件的时候有符号、无符号格式要分开 clamp,这个之前单独写过,不展开了。

dewow 说穿了就一件事:沿每道时间方向,减掉那条不贴 0 的慢漂,让信号回到围绕 0 的状态。它不解决反射弱、背景条带那些问题,但作为流水线的第一道清洗,基线不归零后面啥都谈不上。