地震资料处理中的NMO动校正:从双曲线时距到速度谱实战
2026/9/23 18:49:22 网站建设 项目流程

简介:动校正(NMO)是地震数据处理中消除正常时差、使同一反射界面信号对齐的关键步骤,直接影响叠后剖面的分辨率与解释精度。这套压缩包面向地震勘探相关专业的初学者与处理工程师,基于Matlab实现,完整覆盖了从速度模型估算、道间时差计算到时间域校正的动校正流程。压缩包共4个文件:3个m脚本和1个README说明文档。m脚本分别承担主程序入口、辅助信号分离与尺度处理等功能,方便读者对照算法公式理解每一步运算逻辑;README则简要说明了文件结构与使用方法,便于快速上手和二次开发。整个资源包仅2KB,体量极小,适合用于课堂演示、算法验证或嵌入自研处理模块。目前已有450人学习下载,对刚接触地震处理的学生和需要快速验证算法的工程师都颇具参考价值。通过研读代码,读者不仅能掌握NMO校正的编程实现,还能理解其与多普勒校正、叠前深度偏移的衔接,为后续复杂地质条件下的地震资料解释打下扎实基础。

1. 拿到 NMO.rar 先别急着解压跑:动校正到底在解决什么问题

在网盘、论坛或老师的课程包里看到 NMO.rar 这种命名,基本可以断定它和地震勘探处理的一个核心操作绑定了——NMO,即正常时差(Normal Moveout)动校正。动校正要解决的问题非常具体:CMP 道集内,同一反射点在不同炮检距下的反射波走时不一样,近道先到、远道后到,如果不校正就把所有道叠在一起,同相轴会变成一条带弧度的“眉毛”,信噪比反而被叠没了。动校正就是把这条双曲线轨迹拉平,让各道之间不再有时差,叠加才能得到近似零炮检距的剖面。

我最早接触这类资料包时也以为解压运行就能出漂亮剖面,结果速度参数给偏,整片剖面糊成一团。后来把原理和参数链路搞清楚才发现,NMO 的难点不在“跑一个命令”,而在速度怎么拾取、拉伸怎么切除、道集怎么验证。这里把 NMO 的地震处理逻辑、最小可复现代码、速度谱参数和常见坑一次讲透,适合正在学地震资料处理、做课程设计或刚接手实际工区资料的同学。

2. 先立住原理:反射波为什么走一条双曲线,NMO 公式的工程含义

地震资料处理里,NMO 不是孤立的一步。它是叠加和叠前偏移之前必须完成的时差补偿,补偿对象是 CMP 道集里不同炮检距之间的反射波走时差异。要把这一步做对,先得理解反射波走时曲线为什么呈双曲线形态。

2.1 双曲线时距关系:CMP 道集里的反射波走时公式

在水平层状介质中,取一个共反射点道集(CMP gather),各道的炮检距 x 不同,反射点位置相同。单层反射界面情况下,反射波从炮点经过界面反射到达检波器的总路径,等价于炮点关于反射界面的镜像点到检波点的直线距离。若反射界面深度为 h,介质速度为 V,双程垂直反射时间为 t0 = 2h/V,则任意炮检距 x 的反射波走时满足:

t(x) = sqrt(t0^2 + x^2 / V^2)

这个方程在 t-x 坐标系里是一条以 t0 为顶点的双曲线。炮检距越大,走时越长,双曲线越陡。多层介质的情况,只要把 V 换成从地表到反射界面的均方根速度 Vrms,短排列范围内仍然可以用双曲线近似描述。

工程上更常用的表达是平方形式:t² = t0² + x² / V²。这形式的优势在于,如果介质是均匀的,t² 与 x² 呈严格的线性关系,斜率就是 1/V²。NMO 动校正就是要把每条道的波形沿时间轴往前搬动一个量,让它在 t0 时刻对齐。

2.2 NMO 校正量与两个工程直觉:偏移距二次方和浅层速度敏感

NMO 校正量是同一反射点在炮检距 x 处的走时与零炮检距走时之差:

Δt = t(x) - t0 = sqrt(t0^2 + x^2 / V^2) - t0

这个公式有三个直接可用的工程结论。第一,Δt 随炮检距 x 的增长近似呈二次方增长,远道需要的校正量远大于近道;第二,Δt 与速度 V 的平方成反比,速度给错 10%,校正量的误差可能超过 20%;第三,Δt 在 t0 较小时更大,浅层反射的动校正量显著大于深层。

拿一组数值看一下量级。假设 t0 = 1.0 s,V = 2500 m/s:

炮检距 x (m)反射走时 t (s)动校正量 Δt (ms)
01.0000
5001.019819.8
10001.077077.0
20001.2806280.6

2000 m 偏移距的道需要往前搬动 280 ms,而 500 m 道只搬 20 ms。这直接解释了为什么浅层远偏移距数据在 NMO 之后最容易出现拉伸畸变——相对校正量太大,波形被重采样拉宽。

另一个直接推论是速度误差的方向性。如果用的速度偏大,算出的校正量偏小,道集校正后同相轴会呈现残余下弯;如果速度偏小,校正量偏大,同相轴会上弯。这是后面排查所有 NMO 问题的基本判据。

2.3 Vrms 到底是什么:NMO 速度不是地层速度的直接测量

多层介质里,NMO 公式中的速度是均方根速度,定义式为:

Vrms^2 = (Σ Vi^2 * Δti) / (Σ Δti)

其中 Vi 是第 i 层的层速度,Δti 是波在该层内的双程垂直旅行时。Vrms 对浅层速度的权重更大,深层速度即便很高,对 Vrms 的贡献也受其旅行时占比限制。所以从速度谱上拾取的所谓“NMO 速度”,本质上是等效速度,既包含地层真实速度的信息,也包含薄层调谐、各向异性、构造倾角等因素的影响。

这就是为什么速度拾取在业内被戏称为“玄学”:同一份道集,两个人拾取的速度谱可能差 5%~10%,叠加剖面却看不出明显差别。NMO 速度不直接等价于测井层速度,做时深转换时不能拿 NMO 速度直接换算。理解这一点,才能分清后续工区里速度谱上的能量团是真实反射响应,还是多次波、绕射波或静校正残差造成的假象。

NMO 校正的物理意义是把 CMP 道集从双曲线状态拉平到 t0 时间轴。认识清楚了,下面进入动手环节——用一段能跑的代码,把动校正从公式变成真实可操作的处理步骤。

3. 自己动手实现 NMO:一个能跑的 Python 最小流程

下载来的资料包里无论装的是脚本、讲义还是程序,最终都要落到“对实际道集做校正”这一步。与其依赖看不懂的黑匣子,不如先用 Python 把一个最小流程跑通,再用它去对照成熟软件的结果。

3.1 合成 CMP 道集与 NMO 校正代码

先造一个合成 CMP 道集,再用映射方式做动校正。映射思路是:给定输出时间 t0,反推它在原始记录上对应的时间位置 t_orig,再把原始道在该位置的振幅搬到 t0 处。这种方式比“逐样点计算校正量然后搬运”更稳,因为速度随深度变化时重采样关系是非线性的,正推容易出现空点,反推天然是一个插值问题。

import numpy as np def ricker(f, t, t_center): """雷克子波:f 为主频,t_center 为子波到达时间""" t_shift = t - t_center return (1.0 - 2.0 * (np.pi * f * t_shift) ** 2) * np.exp(-(np.pi * f * t_shift) ** 2) def nmo_correction(data, t_axis, offsets, vrms_from_t0): """ 对 CMP 道集做正常时差(NMO)校正 data: 2D 数组 (nt, nx),每一列是一道 t_axis: 时间轴,单位 s offsets: 每道对应的炮检距,单位 m vrms_from_t0: 速度函数,输入 t0 数组,输出对应均方根速度(m/s) """ nt, nx = data.shape out = np.zeros_like(data) for j in range(nx): x = offsets[j] # 关键映射:输出时间 t0 反推原始记录时间 # t_orig = sqrt(t0^2 + (x / Vrms(t0))^2) vrms = vrms_from_t0(t_axis) t_orig = np.sqrt(t_axis**2 + (x / vrms)**2) # 原始记录是有长度的,超过记录末端的时间点置零,不能外推 valid = t_orig < t_axis[-1] # 在原始道等间隔采样上插值,得到 t_orig 处振幅 out[valid, j] = np.interp(t_orig[valid], t_axis, data[:, j]) return out # 构造合成数据:2 秒记录,2 ms 采样率,10 道,最大偏移距 3000 m dt = 0.002 t_axis = np.arange(0, 2.0, dt) offsets = np.linspace(0, 3000, 10) # 速度函数:在 t0=0.8 s 附近接近 2200 m/s def vrms_model(t0): return 1800.0 + 500.0 * t0 nt = len(t_axis) rng = np.random.default_rng(42) data = np.zeros((nt, len(offsets))) for j, x in enumerate(offsets): # 反射同相轴的真实双曲线走时:t0=0.8 s,等效速度 2200 m/s t_wave = np.sqrt(0.8**2 + (x / 2200.0)**2) data[:, j] = ricker(30, t_axis, t_wave) + 0.02 * rng.standard_normal(nt) nmo = nmo_correction(data, t_axis, offsets, vrms_model)

这段代码的核心逻辑在第 13 到第 16 行。t_orig数组与t_axis等长,对每个输出时间样点都计算了它在原始道上的对应时间位置。valid掩码把越界时间点过滤掉,深部样点在输出道里保持为零,避免插值函数用端点值硬凑出假振幅。np.interp是线性插值,速度横向无剧烈变化时精度完全够用;如果后面要做 AVO 分析,建议换成样条插值,波形保真度更高。

速度函数vrms_model直接返回与 t0 对应的速度数组。实际资料里这个函数来自速度谱拾取,是离散点,需要用线性插值转成连续函数。合成数据里用的速度曲线在 t0=0.8 s 时恰好为 2200 m/s,与生成反射的子波到达时间一致,因此 NMO 后同相轴能被拉平;浅层和深层因为速度不完全匹配,会留下少量剩余时差,这正好模拟了真实资料的情况。

3.2 参数怎么设:采样间隔、速度函数插值和边界处理

跑通代码只是第一步,上面这段代码里藏着三个实际资料中必须认真对待的参数细节。

第一个是采样间隔 dt。NMO 校正本质是对时间轴做重采样,如果数据是 4 ms 采样,而速度曲线给到 1 ms 的精度,纯属浪费;反过来,如果数据是 1 ms 采样而插值只做线性,相邻样点之间的波形细节也会丢失。实际工区常用做法是保持原始采样率不变,速度曲线先用样条插值到与数据相同的时间网格,再做映射。

第二个是速度函数的插值方式。速度谱上拾取的速度点一般只有几十个,而道集时间样点有上千个。速度在层之间是渐变的,线性插值是最安全的落点,不会在层界面处产生突变的人为校正量。样条插值会让速度曲线更光滑,但要注意过冲问题——在高速薄层附近样条可能冲出上下界,出现速度为负的荒唐结果。

第三个是边界处理。NMO 校正对大偏移距、深层道的校正量可能超过原始记录长度,在资料包自带的旧程序里,这些位置通常会被补零或直接截断。建议的做法是先用切除参数评估一下,信噪比高的区域保留,拉伸量超过阈值的道坚决置零。一句话,深部大偏移距的“校正后记录”里本来就没什么可信信息,硬留着只会污染叠加。

做完校正后怎么判断代码有没有写对?有一个土办法:分别对 NMO 前后的道集沿偏移距方向叠加,看主峰位置和波形宽度。校正前叠加的波形因为存在时差会被展宽,主峰能量分散;校正后叠加波形更集中,主峰幅度更高。这个现象在合成数据上非常明显,在实际资料里也适用——NMO 做得好,叠加剖面信噪比一定提升,否则就是速度或切除有问题。

4. 用 CWP/SU 跑动校正:从 segy 到叠加剖面的命令流

Python 实现适合理解原理和教学验证,但真正处理实际工区资料,业界最常见、最开放的工具链是 CWP/SU(Seismic Un*x)。这类资料包里如果装了可执行程序,大概率也是基于 SU 的封装。SU 的优势是模块化,每一步处理都对应一个独立命令,方便做流程管理和参数迭代,不会有“一键处理”的黑匣子感。

4.1 从 segy 到 SU:道头检查和速度文件准备

NMO 校正需要两个输入:道集数据和速度曲线。道集数据在 SU 里以 .su 格式存在,第一步是用 segyread 读入原始 segy,再用 suwind 按 CMP 号抽道集:

# 读入 segy 并转成 su 格式 segyread tape=raw.sgy > raw.su # 抽取 CMP 号 101 到 150 的道集 suwind < raw.su key=cdp min=101 max=150 > cdp.su # 检查道头里的偏移距和 CMP 号,确认这两个字段有值 sugethw < cdp.su key=cdp,offset,ns | more

sugethw 这一步看似多余,其实非常关键。NMO 模块计算校正量时必须读道头里的 offset 字段,如果野值或缺失没发现,后面所有校正结果都是错的。偏移距野值最常见的来源是可控震源和炸药震源的接收道距不一致,或者在野外施工记录里写错。如果检查发现 offset 缺失,需要先根据道位置重算偏移距再继续。

速度文件的准备有固定格式。SU 的 NMO 模块读取的是两列文本文件,第一列是双程反射时间 t0(单位秒),第二列是对应的均方根速度(单位 m/s),典型内容如下:

0.000 1500 0.400 1900 0.800 2200 1.200 2600 1.600 3000 2.000 3400

速度文件里的时间点必须覆盖道集的整个记录长度,最好在首尾各多留一个点。SU 在相邻速度点之间做线性插值,超出定义区间后则取端点值。如果速度文件只写到 1.6 s 而道集记录到 3.0 s,2.0 s 以下的深层数据会全部用 1.6 s 处速度的端点值做校正,深层同相轴会明显校正不足。这是初学时很常见的低级错误。

4.2 速度谱扫描:NMO 速度不是拍脑袋吹出来的

速度曲线不能凭空写,必须从速度谱上拾取。SU 的 suvspan 模块对 CMP 道集做速度扫描,输出速度-时间-相干能量图。调用方式:

# 速度扫描:速度范围 1500-4000 m/s,步长 50 m/s suvspan < cdp.su vmin=1500 vmax=4000 vstep=50 | suximage title="Velocity Spectrum" &

suvspan 的输出是一张二维谱,横轴是扫描速度,纵轴是双程时间,能量团越亮代表该速度在该时间点对道集的相干性越强。扫描范围要根据工区实际情况设置,平原沉积区填 1500~4000 m/s 是安全区间,碳酸盐岩区因为高速层发育,顶界要放到 5500~6000 m/s;海底电缆和海底节点资料深水区速度低,底界可以收到 2500 m/s 左右。

步长设置有个经验:浅层用 25 m/s 的细步长,因为浅层速度低、校正量对速度敏感;深层用 50~100 m/s 粗步长,深层双曲线较平缓,速度分辨能力本来就弱。如果速度谱上能量团拉成了竖直长条,说明该深度位置对速度不敏感——可能是层状构造倾角太大,也可能是道集内静校正残差过大。速度拾取不要只看单根能量团,要看相邻 CMP 的速度变化是否连续。

速度谱拾取完成后,把“时间-速度”对按 4.1 里的两列格式存成 vel.dat,就可以交给 sunmo 做动校正:

# 读取速度文件,对 CMP 道集做动校正 sunmo < cdp.su vfile=vel.dat > nmo.su # 叠加,查看校正效果 sustack < nmo.su > stack.su suximage < stack.su title="Stack after NMO" &

sunmo 的 vfile 参数指向速度文件,它会在每个时间样点从速度文件插值出对应速度,再按双曲线公式做校正。SU 里每个模块都支持 help 参数查看完整参数列表,换电脑、换版本之后第一件事永远是先看帮助,不要凭记忆写参数——这是我在多个 SU 版本之间切换后养成的习惯。

4.3 从 NMO 到叠加:一条完整命令流的节奏控制

把上面的命令连起来,就是一个完整的最小处理流程:

segyread tape=raw.sgy > raw.su suwind < raw.su key=cdp min=101 max=150 > cdp.su sugethw < cdp.su key=cdp,offset | more suvspan < cdp.su vmin=1500 vmax=4000 vstep=50 | suximage & # ... 速度拾取,输出 vel.dat ... sunmo < cdp.su vfile=vel.dat > nmo.su sustack < nmo.su > stack.su suximage < stack.su &

流程节奏上,我习惯先做一次低频带通滤波再做速度分析,滤掉高频干扰后速度谱能量团更干净。但要注意,滤波参数必须保持一致:速度分析用 8~60 Hz,NMO 之后直到叠加都用同一组参数,中途不要换,否则速度谱上拾取的相干性和叠加道集的处理状态不一致,速度点就得重新拾取一遍。

还有一个容易忽略的细节:suvspan 和 sunmo 输出结果的极性、道头顺序必须完全一致。如果中间插了一个排序模块改变了道顺序,速度文件本身不受影响,但道集对应的 CMP 号已经变了,速度曲线就套到了错位置。处理流程越短,可控性越强;流程一旦拉长,每加一个模块都要盯一次道头。

5. 动校正避坑指南:速度谱上的玄学与道集上的翻车现场

NMO 的参数没有“一套打天下”的万能模板。工区不同、采集参数不同、处理目标不同,速度曲线的拾取和切除策略都会变。下面几条踩坑记录,是我在陆上常规纵波和海上拖缆资料上都见过的典型问题,按“现象 → 原因 → 解决”写清楚。

5.1 速度取大一号,同相轴就趴下去:速度偏差的两种病

现象:NMO 后的道集上,浅层远偏移距同相轴仍然向下弯,明显没拉平;或者反过来,近中偏移距波形向上拱起,像一个倒扣的锅。

原因:速度偏大会导致校正量偏小,远道残余时差使同相轴下弯;速度偏小导致校正量偏大,中近道被“过拉”。速度偏大在速度谱上表现为能量团下方拖一条暗色残余,偏小则上方有残余。浅层尤其明显,因为浅层 t0 小,同样的速度误差产生的动校正量偏差更大。

解决:回到速度谱,在目标时间窗内重新扫描,收缩扫描步长到 20~25 m/s。借用相邻 CMP 的速度点做参考时,注意构造变化带——背斜翼部和断层附近的速度倾向变化是正常的,不要为了“光滑”而强行抹平。如果重新扫描后两条道的速度谱都显示同一能量团,但能量团在横向不连续,先检查该 CMP 的道集本身是不是有坏道。

5.2 远偏移距波形拉成扁平的胖子:拉伸畸变和切除

现象:NMO 后的道集远道上,反射波形明显变宽,主频变低,叠加到剖面上同相轴“发糊”。浅层比深层严重,大偏移距比小偏移距严重。

原因:NMO 校正本质是对时间轴做动态重采样。远偏移距、浅层反射的校正量可能达到数百毫秒,原始的一 30 Hz 子波被拉伸成低频宽波。这个拉伸畸变不是真实地下信号,自然叠加不进同相轴。

解决:做拉伸切除。最常用的是百分比切除法,切除标准是 NMO 校正量 Δt 与 t0 的比值,我一般把阈值设在 0.2~0.3 之间,即校正量超过 t0 的 20~30% 的样点直接置零。低于 0.2 会损失太多远偏移距叠加次数,高于 0.5 又保留了大量畸变波形。具体阈值要根据目的层主频和叠加次数的需求权衡,浅层目标层可以放宽到 0.3 保住横向覆盖,深层则收紧到 0.2 保波形。切除道上的做法是正确的,但切除参数一定要写进处理记录,后续叠加偏移都用同一套。

5.3 双曲线拉不直的介质:非双曲时距与各向异性

现象:速度谱上能量团形态不是单峰,而是呈“八字形”分开的两团,或者一个能量团拖出一个斜向尾巴。用了常规双曲 NMO 之后,远偏移距道始终无法与近道对齐,中间对齐、远端过校正,反过来调速度,远端好了、中道又坏了。

原因:常见于 VTI 介质(垂直横向各向同性)。在页岩、薄互层发育区,长偏移距反射走时明显偏离双曲线,用层状介质理论的双曲 NMO 公式强行校,自然拉不平。

解决:先确认偏移距范围。如果最大偏移距与目标层深度之比超过 1.0,各向异性影响就不能忽略。成熟处理软件里一般都有带非双曲项的 NMO 选项(引入各向异性参数 eta 进行修正),优先用它重新做速度分析;没有这个功能的开源流程,务实做法是对远偏移距做更强的切除,只保留中近道参与叠加,减少非双曲畸变的拖累。别想着用一套双曲速度硬吃全部偏移距,那只会让远近道互相污染。

5.4 道集抖成波浪线:短波长静校正残差在搅局

现象:NMO 校正后的道集上,浅层同相轴不是一条平线,而是呈波浪状抖动,道与道之间错动明显。速度谱能量团发散,拾取不出清晰峰值,叠加剖面上浅层像蒙了一层噪声。

原因:短波长静校正量没有被完全消除。静校正时差独立于炮检距,在 CMP 道集里表现为道间恒定移位,和 NMO 的双曲时差叠加在一起,速度分析时两个因素互相竞争,速度谱能量被拉散。

解决:顺序上必须先做静校正,再做动校正。短波长静校正残差超过半个视周期时,直接返回重新做折射波静校正或层析静校正,不要在 NMO 阶段“硬校”。有人试图缩小速度扫描范围来规避抖动道的影响,那不是解决问题,只是让速度谱更好看。检查静校正质量的方法很简单:看单炮记录上的初至是否平滑,初至抖动大就要先修静校正。

5.5 叠加没有变好反而出现斜条带:多次波与速度谱的恩怨

现象:速度谱在低速度方向出现一串与一次波能量团平行的较强能量团,NMO 后道集上多次波同相轴仍有明显剩余时差,上弯或下弯,叠加剖面出现周期性斜条带。

原因:多次波的 NMO 速度低于同深度一次波,用一次波速度校正后,多次波呈现“过量校正”的上弯形态,叠加时形成可辨识的干扰条带。NMO 本身没有能力区分一次波和多次波,它只会按给定速度把所有同相轴都“尽可能”拉平,多次波没被拉平是速度不匹配的结果。

解决:先在速度谱上识别多次波能量团,再决定去多次波的处理手段。海上资料常用 SRME 做多次波预测与相减,陆上资料常用高精度 Radon 变换在 NMO 后去除剩余时差差异。不要指望简单地把多次波速度当成一次波速度拾取来“躲开”,那样一次波的叠加次数也损失了。去多次波的处理要放在 NMO 之前或之后的关键位置,取决于所选方法的输入要求,但一定不能跳过。

6. 把 NMO 做没做对,看这三个信号就够了

验证 NMO 效果不用急着看整个叠加剖面,盯住一个高信噪比的 CMP 道集,看三个信号就够了。第一个信号是道集波形是否拉平。NMO 后的道集上用波形变面积显示,切除过的同相轴应呈一条近似的水平直线,远道可能有少量拉伸残余,但主能量必须与中近道对齐。第二个信号是叠加剖面的信噪比对比。抽取相邻几个 CMP 做成小叠加,和 NMO 前同一段剖面比,主反射同相轴振幅明显增强、横向连续性变好,说明校正量基本到位。第三个信号是速度场的横向一致性。相邻 CMP 的谱上拾取速度点连成曲线,深度趋势一致、横向渐变的工区是正常的;出现飞点或“锯齿状”突变,多半是某一道集存在坏道或静校正残差。

最后一个技巧是速度迭代。工区速度场不是一次拾取就能定完的。常见做法是第一轮用初始速度扫描后做 NMO、叠加,在叠加剖面上读出一轮同相轴位置,用这些位置作为第二轮速度谱的先验约束,再重新拾取、重新校正。一般迭代两轮就够了,第三轮的改善极小,反而可能把人带进局部最优值里,总想“微调”到每个能量团都对——那是浪费时间。

我的习惯是每到一个新工区,第一件事就是把一个信噪比最高的 CMP 道集处理前后的对比存成一张图,连同速度曲线和叠加剖面钉在一块。后续处理中每调一个参数,都先回到这张图看有没有变好。NMO 是地震处理里最容易被跳过细节的一步,但也是后面叠加、反演、叠前偏移的底座,这块做不扎实,后面多少花活都补不回来。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询