
简介面波频散是浅层地震勘探中的核心物理现象相速度随频率变化直接反映地层速度结构。传统τ-p变换在道距不均匀时易引入假频散而频率—波数域f-k域方法利用二维傅里叶变换将时空波场映射到f-k平面使基阶与高阶模态能量脊清晰分离频散曲线提取更稳定、更直观。该技术在路基检测、隧道预报和城市地质调查中应用广泛但需要严格满足等间隔空间采样条件并配合合理的峰值拾取策略。文章从频散原理出发梳理了f-k谱计算、能量脊自动追踪、参数权衡与常见问题排查等完整流程并介绍了基于合成数据验证程序可靠性的实用思路适合需要自写代码处理多道面波数据的地球物理工程师参考。1. 频率—波数域频散曲线提取多道面波勘探里比τ-p更稳的这条路做过面波勘探的人都有这种体会野外采集一炮多道数据不算难难的是事后从波场里把频散曲线干净地提出来。路面路基检测、隧道掌子面前方预报、城市地质调查这些场景里你手里往往只有几十道、道间距两米上下的排列信噪比还不怎么理想。传统的τ-p变换在偏移距分布不均匀时会引入假频散而频率—波数域f-k域方法天然要求等间隔空间采样只要道距均匀基阶面波和几个高阶模态的能量脊会在f-k谱上分得清清楚楚拾取曲线时肉眼可见地省力。这套思路从原理到程序实现都不复杂核心就是一次二维傅里叶变换再加一个能量峰脊追踪的算法设计。本文适合要用自写代码完成频散提取的地球物理专业学生以及想把现有商业软件结果复核一遍的一线工程师。2. 从时—空域到频率—波数域频散波在f-k谱上怎样“现形”2.1 相速度与频散的本质不同频率跑得不一样快面波频散说的是相速度随频率变化的现象。在均匀半空间里瑞雷波速度基本不随频率变但真实地层总是成层的波长长频率低的波穿透深感受到的是深部更硬介质的平均速度于是跑得快波长短频率高的波只在上层传播速度偏低。这就形成了频散曲线——一条相速度随频率变化的单调曲线它的形状直接反映了地下速度随深度的变化。反演频散曲线就可以得到剪切波速度结构这也是面波勘探的核心逻辑。正是因为每个频率成分的传播速度不同在时—空域t-x域记录里频散波场看起来是一串逐渐分开的“扫把状”波形很难直接解读。但把它变换到频率—波数域后问题就变得清楚相速度 c 和角频率 ω、波数 k 之间满足关系 ω c·k在频率-波数平面上频散波的能量轨迹是穿过原点的一条条曲线而非一条直线均匀介质才是直线。这些曲线在数学上就是所谓的“频散能量脊”提取频散曲线的本质工作就是把这条脊的坐标f, k读出来再换算成相速度。2.2 二维傅里叶变换f-k谱的计算逻辑对于以时间 t 和空间位置 x 为变量的波场 u(x,t)二维傅里叶正变换的定义是U(k, f) ∫∫ u(x,t) · e^{-i2π(ft - kx)} dx dt数值实现上离散形式就是先在时间方向做一维FFT再在空间方向做一维FFT顺序可以调换但结果一样。对工程数据而言关键是坐标轴的建立。时间采样率 dt、采样点数 Nt 决定频率轴分辨率Δf 1/(Nt·dt)最大频率为奈奎斯特频率 1/(2dt)空间上道间距 dx、道数 Nx 决定波数轴分辨率Δk 1/(Nx·dx)最大波数同样受空间采样定理限制为 1/(2dx)。这里有一个新手很容易绕晕的点频率轴用的是 Hz 而不是角频率波数轴用的是“每米多少周”而不是“每米多少弧度”。在换算相速度时必须使用 c f/kHz·m m/s而不是 ω/k。很多人在这一步用错公式导致最终速度整体偏移。我的习惯是在代码里显式地定义 freq np.fft.fftfreq(Nt, ddt) 和 k np.fft.fftfreq(Nx, ddx)然后用 np.meshgrid 构建二维网格之后所有换算只在这些网格上进行而不是手工用循环去写坐标。2.3 基阶与高阶模态能量脊的分离规律层状介质中面波在传播时会出现多个模态基阶mode 0能量最强高阶模态按阶次依次出现在更高的相速度位置。多道面波数据中存在高阶模态时时—空域里它们互相叠加难以分离但在f-k谱上每个模态的能量脊在不同频率区间各有自己的位置分布通常互不重叠这就是f-k域方法的一大优势——比τ-p变换更直观地把模态分开。实际处理时注意基阶模态在低频段能量最强但在高频段衰减非常快高阶模态通常在中高频段出现。设计拾取算法时不能只看全局最大振幅否则在高频段很可能把第一高阶模态误判成基阶。解决办法是分频段跟踪能量脊低频段比如5~20 Hz强制选全局最大对应的脊高频段30 Hz以上按“最靠近低频段脊趋势的连续性”来选。一句话拾取的依据不只是能量大还要看脊的连续性。变换方法空间采样要求模态分离程度优点典型问题τ-p变换要求偏移距覆盖均匀对缺失道敏感中等倾斜叠加可分离但易引入假轴适合不规则采集近偏移距缺失时假频散严重f-k域变换严格要求等间隔空间采样高模态能量脊清晰分离计算效率高、物理意义直观道距不均匀时结果恶化明显相移法phase shift对道距要求相对宽松中等适合单分量检波器排列需要先验速度扫描范围3. 程序设计实践用Python从零搭起频散曲线提取流程3.1 读入多道数据从SEG-Y到NumPy数组野外采集的面波数据多半以SEG-Y格式存储但自写程序调试阶段用文本格式更省事。常见的文本格式是每道一行或者每道一个文件列表示采样点。我一般先用一个轻量解析函数把数据读成二维数组 data[nx][nt]再封装一个统一的读取接口后续调试时方便替换不同格式的数据源。下面是读取一种常见文本格式第一行是道数、每道采样点数、采样间隔之后每行一道逗号分隔的代码。import numpy as np def read_multichannel_text(filepath): 读取多道面波文本数据。 文件格式第一行三个整数道数nx, 每道采样点数nt, 采样间隔dt(ms) 之后每行一道用逗号分隔采样值。 with open(filepath, r) as f: header f.readline().strip().split(,) nx, nt, dt_ms int(header[0]), int(header[1]), float(header[2]) data np.zeros((nx, nt)) for i in range(nx): line f.readline().strip() if not line: raise ValueError(f第 {i1} 行数据缺失) vals line.split(,) if len(vals) ! nt: raise ValueError(f第 {i1} 道采样点数与声明不一致) data[i, :] [float(v) for v in vals] dt dt_ms / 1000.0 # 转成秒 return data, nx, nt, dt # 实际使用时 # data, nx, nt, dt read_multichannel_text(shot1.txt) # print(data.shape, dt , dt, s)这段代码做了三件事读道头、构建二维数组、把采样间隔统一成秒。很多程序在下一步处理时才暴露单位问题——采样间隔在文件里写的是ms计算频率轴时如果忘了除以1000所有频率轴都会偏差10倍导致最终频散曲线横轴整体错位。所以我在接口层就把单位统一成国际单位制宁可在读入时多写一行转换也不在后面的公式里反复补系数。读SEG-Y时情况类似但要注意SEG-Y的格式有多个修订版本。常见做法是只用numpy原生方式读取二进制体数据部分跳过文本卷头按标准偏移点解析采样间隔和道数。工程上如果只需要做f-k变换完全可以用obspy或segyio这类成熟库来读但要注意小端/大端字节序问题工区数据里常见的“读出来振幅巨大”多半是字节序设错了。3.2 核心变换2D-FFT与f-k谱的规范化输出有了二维数组之后f-k谱计算只有寥寥几行代码但有几个规范化细节值得注意。首先在FFT之前要对数据做去均值处理——把每一道的均值减掉否则零频处会出现一条极亮的高能量横线把低频段的真实频散能量脊淹没。其次二维FFT之后要把零频率、零波数分量移到矩阵中心这样得到的谱图与常规的f-k图示一致四象限分别对应正频正波数、正频负波数等。from scipy.fft import fft2, fftshift, fftfreq def compute_fk_spectrum(data, dt, dx): 计算多道面波数据的f-k谱。 data: 形状为 (nx, nt) 的二维数组行空间道列时间采样 dt: 时间采样间隔秒 dx: 道间距米 返回freq轴, k轴, 中心化后的振幅谱 nx, nt data.shape # 1. 去均值减去每道的时间均值抑制直流分量 data_detrended data - np.mean(data, axis1, keepdimsTrue) # 2. 也可以乘一个空间/时间窗抑制边缘截断引起的泄漏这一步在第4章讨论 # win np.hanning(nt) * np.hanning(nx)[:, None] # data_detrended data_detrended * win # 3. 二维FFT并中心化 fk fftshift(fft2(data_detrended)) # 4. 构建坐标轴 freq fftshift(fftfreq(nt, ddt)) # Hz k fftshift(fftfreq(nx, ddx)) # 1/m amp np.abs(fk) # 只保留正频率和正波数象限因为f-k谱是共轭对称的 pos_freq freq 0 pos_k k 0.0001 # 排除零波数避免除以零 amp_pos amp[np.ix_(pos_k, pos_freq)] k_pos k[pos_k] freq_pos freq[pos_freq] return freq_pos, k_pos, amp_pos这一步的输出amp_pos是一个二维矩阵横轴是正频率纵轴是正波数每个格点的数值代表该频率、该波数处波场的能量强度。傅里叶变换的物理含义是“把波场分解成不同频率、不同波数的平面波叠加”因此频散曲线上的每个点f, k会在这个矩阵里形成一个极大值所有满足相速度对应关系的极值连起来就是我们要提取的频散曲线。参数说明fftshift的作用是把零频挪到数组中央fftfreq的返回值顺序与fftshift后坐标对应二者必须配套使用否则坐标混乱。pos_k里排除零波数是因为提取相速度时要用到 k 作分母零波数处的能量即全排列同相位的垂直入射波没有频散意义。此外如果只取正频率象限你会注意到高频端能量一般较弱这是面波本身的衰减特性不代表算法出错。3.3 能量峰脊拾取自动追踪与平滑策略f-k谱计算出来后最关键的环节是从振幅矩阵中提取频散曲线的坐标序列。简单思路是对每一个频率点在波数轴上找振幅最大值对应的波数然后计算相速度 c f/k。这个思路在信噪比高时确实可行但在实际数据上经常翻车——某个频率上恰好有强噪声能量最大振幅就会跳到假的位置导致提取的曲线断裂或跳变。更稳的做法是“区域约束拾取”以上一个频率点提取到的波数为参考在它附近的一个窗口内搜索当前频率的峰值而不是在全波数轴搜索。这个思路实现起来也很简单代码如下。def pick_dispersion_curve(freq_pos, k_pos, amp_pos, f_min5.0, f_max50.0, search_half_width0.02, smooth_window5): 在f-k谱上自动拾取频散曲线。 策略从低频向高频逐步追踪在每个频率点的搜索窗口内找局部峰值。 参数 freq_pos: 正频率轴 (Hz) k_pos: 正波数轴 (1/m) amp_pos: 振幅谱矩阵形状 (len(k_pos), len(freq_pos)) f_min, f_max: 拾取的频率范围 search_half_width: 当前波数搜索窗口相对于上一拾取点的半宽 (1/m) smooth_window: 中值滤波窗口大小奇数 返回 f_out: 拾取到的频率序列 c_out: 相速度序列 (m/s) k_idx np.arange(len(k_pos)) f_mask (freq_pos f_min) (freq_pos f_max) f_work freq_pos[f_mask] amp_work amp_pos[:, f_mask] f_out, c_out [], [] k_prev None for i, f_now in enumerate(f_work): col amp_work[:, i] if k_prev is None: # 第一个频率点全局搜索 peak_idx np.argmax(col) else: # 后续点在k_prev附近窗口内搜索 mask np.abs(k_pos - k_prev) search_half_width if not np.any(mask): # 窗口内无有效点退化为全局搜索 peak_idx np.argmax(col) else: local_col np.where(mask, col, -1.0) peak_idx np.argmax(local_col) k_peak k_pos[peak_idx] if k_peak 0.01: # 防止零波数导致算出的速度极大 c f_now / k_peak f_out.append(f_now) c_out.append(c) k_prev k_peak f_out np.array(f_out) c_out np.array(c_out) # 中值平滑抑制个别跳变点 if smooth_window 3 and len(c_out) smooth_window: from scipy.ndimage import median_filter c_smooth median_filter(c_out, sizesmooth_window, modenearest) else: c_smooth c_out return f_out, c_smooth这段代码的搜索策略有明确工程意义频散曲线在物理上必须是连续的相速度不会随频率突变因此用上一个拾取点的波数作为先验约束能自动“沿着脊走”。search_half_width 的值取决于频散曲线斜率——基阶曲线在低频段变化快可以适当放宽窗口高阶模态脊比较陡窗口设太大会跨过脊跳到低频能量上设太小又会丢失脊。另一个实用技巧是拾取完成后的中值滤波。中值滤波对付孤立跳变点非常有效但它也会抹掉真实的细节弯曲。对基阶频散曲线建议窗口不超过5个点对高阶模态建议用3个点或干脆不用。频率范围的选择要结合数据实际可用频带野外检波器的自然频率决定低频端高频端则取决于道间距满足空间采样定理决定的最大频率限制超出这个范围拾取到的“曲线”都是假的。4. 让结果更可信频率—波数谱计算的参数设置与选型4.1 频率—波数分辨率的硬约束与权衡f-k域提取频散曲线的精度从根本上受制于两个分辨率指标频率分辨率 Δf 1/(Nt·dt)波数分辨率 Δk 1/(Nx·dx)。它们的含义很直观——频率分辨率是一帧数据里能区分两个相邻频率成分的最小间隔波数分辨率是空间排列上能区分两个相邻波数成分的最小间隔。面波记录时间越长频率分辨率越好排列越长道数多且道距小波数分辨率越好。然而工程现场给不出无限长的排列于是出现了实际中必须接受的权衡频率分辨率和时间窗长度互斥波数分辨率和排列长度互斥。消除一种分辨率的不足唯一办法是增加数据长度而不是靠补零。很多同学在频率分辨率不足时习惯把时间序列尾部补一堆零再做FFT这在视觉上让谱图变“细”了但并没有产生新的信息——形状变光滑了峰值位置没有变化。我一般会提醒补零做插值可以指望它提升分辨率不行后续分析里要把它当作“装饰性操作”。实际参数选型案例48道、道距2 m的排列时间采样率1 ms记录长度1.5 s。计算得到 Δk 1/(48×2) 0.0104 1/m对应低频10 Hz时的相速度分辨率约 10/0.0104 ≈ 960 m/s这个分辨率在低速覆盖层地区尚可接受但若排列缩到24道Δk 翻倍到0.0208 1/m10 Hz处的速度分辨率直接掉到480 m/s频散曲线低频段会粗糙到没法用。这就是为什么面波勘探指向低频信息时排列道数不能省的物理原因。4.2 空间窗、时间窗与补零的选择策略变换前加窗是对付频谱泄漏的标准手段。矩形窗的主瓣最窄但旁瓣最高容易让强能量模态的旁瓣污染相邻模态汉宁窗Hann和汉明窗Hamming旁瓣衰减快是面波处理中最常用的窗代价是主瓣变宽导致能量脊变胖、拾取精度下降。这个取舍没有完美解我采用的经验是信噪比好、模态分离清晰时不用窗或者用矩形窗保精度信噪比差、有强噪声干扰时用汉宁窗避免噪声旁瓣被误认为能量脊。时间和空间两个方向可以分别加窗不必一致——空间上加窗要小心如果对道号方向乘汉宁窗边缘道振幅被压缩等效于空间排列变短波数分辨率进一步恶化所以空间窗一般只在道数很多60道以上时才用道数少于30时慎用。补零策略上标准的工程做法是对时间方向补零到下一个2的幂次方便FFT的快速算法现在scipy的fft已经不需要求2的幂次了这步可省空间方向不要补零太多因为补零等于在排列两端塞入零振幅的“虚拟道”这会让谱图出现额外平滑但不会增加波数分辨率。一个常见陷阱是空间方向补零过多后能量脊变得非常细且出现旁瓣涟漪拾取算法会把这些涟漪当作峰值得到“锯齿状”频散曲线。4.3 基阶与高阶模态分离时的滤波策略f-k谱上如果基阶和高阶能量脊靠得很近拾取时容易互相串扰。处理办法不是盲目调搜索窗口而是先做模态分离常见的有两种思路。第一种是扇区滤波fan filter在f-k平面上画一条速度线低于该速度线即近水平的高波数区的能量全置零只保留低速/低波数区域用于拾取基阶这个滤波用相速度作为分界对频散曲线提取而言物理上非常直观。第二种是相位匹配滤波phase-matched filter先用初步拾取的频散曲线构建一个理论时移函数把数据道按该相速度对齐再做叠加增强目标模态的同时压制其他模态。实现扇区滤波的代码很简单就是在提取峰值之前把振幅谱中速度超过设定上限的部分直接置为零。def fan_filter_velocity(amp, freq_pos, k_pos, v_max3000): 对f-k谱做速度扇区滤波 剔除相速度 v_max 的能量这些要么是高模态噪声要么是体波。 注意返回的是滤波后的振幅谱副本不修改原数据。 amp_filt amp.copy() # 构建相速度矩阵 c f / k F, K np.meshgrid(freq_pos, k_pos, indexingij) with np.errstate(divideignore, invalidignore): C F / K # 形状 (len(freq), len(k)) mask C v_max amp_filt[mask.T] 0.0 # 转置为了对齐矩阵形状 (len(k), len(freq)) return amp_filt参数说明v_max 可以取勘探目标区最上层介质的最大可能相速度。例如覆盖层剪切波速度大约500 m/s瑞雷波相速度约为其0.9倍即450 m/s那么 v_max 设到800~1000 m/s足够覆盖基阶曲线范围同时能把一阶模态在低频段速度明显更高滤掉。当然如果目标就是要提取高阶模态做联合反演就不做这个滤波改而在拾取算法里对不同频率区间指定不同的搜索先验。5. 常见问题排查f-k域频散提取的5个“翻车”现场5.1 现象f-k谱上出现与主能量脊对称的“鬼影”脊在振幅谱正频率象限里除了正常的频散能量脊外在高波数位置又出现一条与它关于某条线对称的假能量带。这条假脊看起来也呈一定频散趋势很容易被误拾。原因空间采样不满足奈奎斯特定理——道间距dx过大相对于目标频率的最高相速度而言空间采样率过低。具体来说最大可无混叠波数是 1/(2dx)如果真实频散脊的波数在超过这个值时发生折叠就从谱的另一端“折返”出现。这和时域采样混叠是同一类问题只是发生在空间维。解决处理前先算一下目标最高频率和最小相速度对应的波数是否小于 1/(2dx)。若不满足要么野外重采缩小道距要么在室内处理时把有效频率上限下调到无混叠区间宁可少提取高频段数据也不可用错误数据。程序设计里的应对是拾取循环中加入波数边界判断超过混叠波数一半的值直接丢弃。5.2 现象低频段能量脊被一片明亮的水平带淹没f-k谱的低频端小于5 Hz出现一条几乎水平的亮带占据很宽的波数范围其下方的频散能量脊几乎看不见。原因近偏移距缺失或者数据中混入了低速强噪声比如大锤敲击后地表波直接到达的声波、风吹草动导致的低频噪声。水平带意味着这些能量近似垂直到达没有频散特征但能量远大于面波信号。解决这是高频段务实的数据清洗问题。时域上切除声波直达波初至前的噪声并把近偏移距前几道如果有明显低频异常剔除或置零。注意剔道后空间采样不再等间隔直接做FFT会引入空间假频——正确做法是保留道位置但将该道振幅置零并配合较大的空间窗来抑制这种缺口带来的泄漏。5.3 现象频散曲线拾取结果呈“锯齿状”速度跳变毫无规律拾取出的曲线没有换成平滑的弧线而是呈锯齿波形同一频率附近上下跳动物理上明显不合理。原因搜索窗口太窄导致无法跨越上一拾取点的误差持续累积或者中值滤波窗口大小设置不当跳变点没被压下去还有一种可能是补零过多在谱面产生了栅格感峰值索引在相邻波数格之间来回跳动。解决处理原则是“先放大搜索窗口再做平滑”。我会把 search_half_width 调到 3~5 倍的波数分辨率Δk 的3~5倍先保证脊被完整跟踪之后再靠中值滤波或样条平滑修整。注意平滑是在拾取后的速度序列上做不是对谱图做否则会让能量脊变糊、进一步降低信噪比。5.4 现象基阶和高阶模态在某频段交叉导致拾取曲线突变到另一条脊上在能量脊图上看到基阶与一阶模态在某个频率点后距离非常近甚至交叉拾取轨迹突然从低速脊跳到高速脊频散曲线出现“V字型”不连续。原因在层状介质参数恰当时基阶和高阶模态的相速度曲线在某个频段确实可以非常接近或交叉。此时拾取算法的局部窗口约束失去作用因为它无法区分“同一脊的连续”和“跨到另一条脊”。解决常见做法是分模态拾取——先只做全频段全局峰值拾取一次得到高频段明显分离的曲线再对低频段用小窗口从低频和高频两端向中间对拾双向追踪最终人工检查中间交叉区并选择物理上更平滑的连接方式。备选的硬核办法是做一个简单的理论正演模型对比用测区已知的地层速度哪怕粗略的计算基阶理论频散和提取结果比对如果相交区背离理论趋势就优先修正拾取结果。5.5 现象程序运行后结果全为NaN或者无穷大f-k谱计算后输出的相速度序列里全是NaN或者某些频率点速度异常大上万m/s程序不报错但结果不可用。原因两种常见情况——数据中含有NaN值坏道未剔除或者拾取点波数 k 为0或极接近0除以近零数导致无穷大更进一步数据全部为静默全零道时FFT结果为零取对数或比值运算后就会产生NaN。解决在预处理阶段显式地扫描所有道发现任意道内存在NaN或全零值就标记为坏道并做置零处理拾取循环里增加 k k_min 的边界判断例如 k_min 1/(5*dx)即波长不超过排列长度五倍。另外如果后续做了频谱归一化或对振幅做log运算要加一个小的白噪底比如 amp 1e-6避免对零取对数。6. 合成数据盲测是你最该信任的验证方式自写频散提取程序最大的风险不是写不出来而是写出来了不知道结果对不对。我的习惯是拿理论模型跑合成数据做盲测——构造一组已知地层参数算出理论频散曲线再正演合成多道面波记录送入自己的程序提曲线最后把两条曲线叠图对比。这一步不花一分钱野外成本却能暴露几乎所有代码层面的错误。合成数据用频散波叠加来构造。假设相速度频散曲线 c(f) 已知在第 i 道、第 j 个时间采样点上的波场值可以表示为多个频率成分的叠加def synth_dispersive_wave(freqs, c_f, nx, nt, dt, dx, offsets): 用解析频散关系合成多道面波记录简化振幅随距离衰减不计。 freqs: 频率数组 (Hz) c_f: 与freqs对应的相速度数组 (m/s) nx: 道数 nt: 采样点数 dt, dx: 采样间隔与道间距 offsets: 各道偏移距数组 (m) t np.arange(nt) * dt data np.zeros((nx, nt)) for fi, f in enumerate(freqs): omega 2 * np.pi * f k omega / c_f[fi] # 波数 角频率/相速度 wavelet np.exp(-((t - 0.3) ** 2) / (2 * 0.02 ** 2)) * np.sin(omega * t) for i in range(nx): delay k * offsets[i] # 到达时间差波数*偏移距 data[i, :] wavelet * np.cos(omega * t - k * offsets[i]) return data逻辑说明这个合成器把每一个频率成分当作一个平面波按相速度 c_f 赋予相应的波数波到达第 i 道的相位延迟是 k·offset_i。合成记录直接体现了“每个频率跑得不一样快”这一频散本质。把合成数据送入 compute_fk_spectrum 和 pick_dispersion_curve提取出的曲线如果与输入的 c_f 误差在2%以内那这个程序就可以拿去看真实数据了。误差如果超过5%问题大概率出在波数轴构建、f-k换算或者拾取约束这几步。验证维度上我会同时看三条曲线理论相速度、全局峰值拾取速度、窗口追踪拾取速度。三条重合说明程序正确只有后两条重合但偏离理论则说明谱计算正确、合成与拾取逻辑有系统性偏差。逐步定位比直接上手处理野外数据要高效得多。这个合成-提取-对比的工作流可以复用到的所有实际工区处理里。真实数据的曲线不应该跑出比合成误差大得多的离群段——如果某频段出现这种情况优先怀疑是噪声或模态混叠而非地质体异常。这么多年做下来我自己最大的教训是千万别把补零后的“细腻谱”错当成分辨率提升分辨率不够就去加长记录时间或者缩小道距别跟数据较劲。程序和参数随时可以重构数据采集参数却要等下一次野外才能调整。做频率—波数域频散曲线提取心里始终要装着那条理论曲线的样子这比任何算法优化都有用。希望帮到你。本文还有配套的精品资源点击获取