地震资料处理中的NMO动校正:从双曲线时距到速度谱实战
简介动校正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 sV 2500 m/s炮检距 x (m)反射走时 t (s)动校正量 Δt (ms)01.00005001.019819.810001.077077.020001.2806280.62000 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) # 速度函数在 t00.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): # 反射同相轴的真实双曲线走时t00.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 对应的速度数组。实际资料里这个函数来自速度谱拾取是离散点需要用线性插值转成连续函数。合成数据里用的速度曲线在 t00.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/SUSeismic Un*x。这类资料包里如果装了可执行程序大概率也是基于 SU 的封装。SU 的优势是模块化每一步处理都对应一个独立命令方便做流程管理和参数迭代不会有“一键处理”的黑匣子感。4.1 从 segy 到 SU道头检查和速度文件准备NMO 校正需要两个输入道集数据和速度曲线。道集数据在 SU 里以 .su 格式存在第一步是用 segyread 读入原始 segy再用 suwind 按 CMP 号抽道集# 读入 segy 并转成 su 格式 segyread taperaw.sgy raw.su # 抽取 CMP 号 101 到 150 的道集 suwind raw.su keycdp min101 max150 cdp.su # 检查道头里的偏移距和 CMP 号确认这两个字段有值 sugethw cdp.su keycdp,offset,ns | moresugethw 这一步看似多余其实非常关键。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 s2.0 s 以下的深层数据会全部用 1.6 s 处速度的端点值做校正深层同相轴会明显校正不足。这是初学时很常见的低级错误。4.2 速度谱扫描NMO 速度不是拍脑袋吹出来的速度曲线不能凭空写必须从速度谱上拾取。SU 的 suvspan 模块对 CMP 道集做速度扫描输出速度-时间-相干能量图。调用方式# 速度扫描速度范围 1500-4000 m/s步长 50 m/s suvspan cdp.su vmin1500 vmax4000 vstep50 | suximage titleVelocity Spectrum suvspan 的输出是一张二维谱横轴是扫描速度纵轴是双程时间能量团越亮代表该速度在该时间点对道集的相干性越强。扫描范围要根据工区实际情况设置平原沉积区填 15004000 m/s 是安全区间碳酸盐岩区因为高速层发育顶界要放到 55006000 m/s海底电缆和海底节点资料深水区速度低底界可以收到 2500 m/s 左右。步长设置有个经验浅层用 25 m/s 的细步长因为浅层速度低、校正量对速度敏感深层用 50100 m/s 粗步长深层双曲线较平缓速度分辨能力本来就弱。如果速度谱上能量团拉成了竖直长条说明该深度位置对速度不敏感——可能是层状构造倾角太大也可能是道集内静校正残差过大。速度拾取不要只看单根能量团要看相邻 CMP 的速度变化是否连续。速度谱拾取完成后把“时间-速度”对按 4.1 里的两列格式存成 vel.dat就可以交给 sunmo 做动校正# 读取速度文件对 CMP 道集做动校正 sunmo cdp.su vfilevel.dat nmo.su # 叠加查看校正效果 sustack nmo.su stack.su suximage stack.su titleStack after NMO sunmo 的 vfile 参数指向速度文件它会在每个时间样点从速度文件插值出对应速度再按双曲线公式做校正。SU 里每个模块都支持 help 参数查看完整参数列表换电脑、换版本之后第一件事永远是先看帮助不要凭记忆写参数——这是我在多个 SU 版本之间切换后养成的习惯。4.3 从 NMO 到叠加一条完整命令流的节奏控制把上面的命令连起来就是一个完整的最小处理流程segyread taperaw.sgy raw.su suwind raw.su keycdp min101 max150 cdp.su sugethw cdp.su keycdp,offset | more suvspan cdp.su vmin1500 vmax4000 vstep50 | suximage # ... 速度拾取输出 vel.dat ... sunmo cdp.su vfilevel.dat nmo.su sustack nmo.su stack.su suximage stack.su 流程节奏上我习惯先做一次低频带通滤波再做速度分析滤掉高频干扰后速度谱能量团更干净。但要注意滤波参数必须保持一致速度分析用 8~60 HzNMO 之后直到叠加都用同一组参数中途不要换否则速度谱上拾取的相干性和叠加道集的处理状态不一致速度点就得重新拾取一遍。还有一个容易忽略的细节suvspan 和 sunmo 输出结果的极性、道头顺序必须完全一致。如果中间插了一个排序模块改变了道顺序速度文件本身不受影响但道集对应的 CMP 号已经变了速度曲线就套到了错位置。处理流程越短可控性越强流程一旦拉长每加一个模块都要盯一次道头。5. 动校正避坑指南速度谱上的玄学与道集上的翻车现场NMO 的参数没有“一套打天下”的万能模板。工区不同、采集参数不同、处理目标不同速度曲线的拾取和切除策略都会变。下面几条踩坑记录是我在陆上常规纵波和海上拖缆资料上都见过的典型问题按“现象 → 原因 → 解决”写清楚。5.1 速度取大一号同相轴就趴下去速度偏差的两种病现象NMO 后的道集上浅层远偏移距同相轴仍然向下弯明显没拉平或者反过来近中偏移距波形向上拱起像一个倒扣的锅。原因速度偏大会导致校正量偏小远道残余时差使同相轴下弯速度偏小导致校正量偏大中近道被“过拉”。速度偏大在速度谱上表现为能量团下方拖一条暗色残余偏小则上方有残余。浅层尤其明显因为浅层 t0 小同样的速度误差产生的动校正量偏差更大。解决回到速度谱在目标时间窗内重新扫描收缩扫描步长到 2025 m/s。借用相邻 CMP 的速度点做参考时注意构造变化带——背斜翼部和断层附近的速度倾向变化是正常的不要为了“光滑”而强行抹平。如果重新扫描后两条道的速度谱都显示同一能量团但能量团在横向不连续先检查该 CMP 的道集本身是不是有坏道。5.2 远偏移距波形拉成扁平的胖子拉伸畸变和切除现象NMO 后的道集远道上反射波形明显变宽主频变低叠加到剖面上同相轴“发糊”。浅层比深层严重大偏移距比小偏移距严重。原因NMO 校正本质是对时间轴做动态重采样。远偏移距、浅层反射的校正量可能达到数百毫秒原始的一 30 Hz 子波被拉伸成低频宽波。这个拉伸畸变不是真实地下信号自然叠加不进同相轴。解决做拉伸切除。最常用的是百分比切除法切除标准是 NMO 校正量 Δt 与 t0 的比值我一般把阈值设在 0.2~0.3 之间即校正量超过 t0 的 2030% 的样点直接置零。低于 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 是地震处理里最容易被跳过细节的一步但也是后面叠加、反演、叠前偏移的底座这块做不扎实后面多少花活都补不回来。希望帮到你。本文还有配套的精品资源点击获取