news 2026/10/14 2:23:21

Matlab findpeaks峰值检测:参数调优与实战避坑指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Matlab findpeaks峰值检测:参数调优与实战避坑指南

1. 从一段噪声信号说起:为什么峰值检测值得单独拎出来讲

手头有一段从传感器采回来的振动信号,采样率 1 kHz,时长 10 秒,画出来一看,毛刺密密麻麻,真正想找的那几个冲击峰值全被淹没在噪声里。这时候如果直接上findpeaks默认参数,结果要么漏掉一半,要么把噪声尖刺全当成峰值报出来。这个场景在信号处理、生物医学、音频分析、设备故障诊断里反复出现,也是很多人第一次用 Matlab 做峰值提取时踩的第一个坑。

Matlab 2019b 的信号处理工具箱里,findpeaks是最核心的函数,但它远不止"找最大值"这么简单。它背后涉及局部极大值判定、峰显著性度量、最小峰间距约束、峰宽过滤这一整套逻辑。把这套逻辑吃透,你才能从一段脏信号里稳定地提取出真正有物理意义的峰值,而不是被噪声牵着鼻子走。

这篇内容适合三类人:一是刚接触 Matlab 信号处理、想搞明白findpeaks每个参数到底在干什么的新手;二是已经会用但结果总不稳定、想系统梳理参数调优思路的工程师;三是需要把峰值检测嵌入到自动化流程里、要求结果可复现的开发者。我会从原理讲到实操,把参数背后的数学含义、调参的取舍逻辑、以及我在实际项目里踩过的坑都摊开讲。

先给一个最直观的结论:峰值检测的难点从来不是"找到最大值",而是"定义什么才算一个峰"。这个定义权在你手里,靠的就是那几个关键参数。下面逐层拆开。

2. findpeaks 的判定逻辑:一个峰到底是怎么被认出来的

2.1 局部极大值的数学定义与边界处理

findpeaks最底层的判定非常朴素:一个采样点如果同时大于它左右相邻的点,它就是一个局部极大值。用数学语言说,对于序列 x,若x(i) > x(i-1)且x(i) > x(i+1),则 i 是一个候选峰。

这里有个容易被忽略的细节:边界点永远不可能是峰。序列的第一个点和最后一个点没有完整的左右邻居,所以findpeaks直接跳过它们。我见过有人拿一段信号找峰,发现最开头那个明显的尖峰死活检测不到,排查半天以为是参数问题,其实就是因为它落在边界上。解决办法很简单,在信号两端各补一个极小值(比如补零或者补信号的最小值),把真正的峰"挤"进内部。

另一个细节是平台峰的处理。如果信号里有连续几个点值相等,比如[1 3 3 3 1],严格意义上的局部极大值判定会失效,因为中间那几个点并不满足"严格大于邻居"。Matlab 对这种情况的处理是取平台的中点作为一个峰。这个行为在量化精度较低的数据里很常见,比如某些低分辨率 ADC 采回来的信号,峰顶会呈现阶梯状。知道这个行为,你就不会对"为什么峰的位置偏了半个点"感到困惑。

2.2 峰显著性:区分真峰和噪声毛刺的第一道闸门

光靠局部极大值判定,一段噪声信号能给你找出成百上千个"峰"。所以findpeaks引入了**峰显著性(prominence)**这个概念,这是它最精髓的设计之一。

显著性的定义稍微绕一点,我用大白话解释:想象你站在峰顶,要走到一个比当前峰更高的峰(或者信号的边界),路上必须下降的最小高度,就是这个峰的显著性。换个说法,显著性衡量的是"这个峰相对于它周围地形有多突出"。

具体算法是这样的:对每个候选峰,向左右两侧延伸,找到第一个比它高的点(或者到达信号端点),记录这段区间内的最低点,峰高减去这个最低点的高度,就是显著性。如果左右两侧算出来的值不同,取较小的那个。

为什么这个定义比"峰高"更靠谱?因为峰高是绝对高度,一个站在高台上的小凸起,峰高可能很大,但它相对于周围地形根本不突出,显著性就很小。而一个孤立在平地上的尖峰,哪怕绝对高度不高,显著性也会很大。显著性才是"这个峰是不是独立存在"的真正度量。

在 Matlab 里用MinPeakProminence参数控制。设成 0.5 意味着只保留显著性大于 0.5 的峰。这个值怎么定?我的经验是先画图看噪声的幅度范围,把阈值设在噪声峰显著性的 2 到 3 倍左右。如果信号幅度是 1 量级,噪声毛刺的显著性通常在 0.01 到 0.05,那阈值设 0.1 到 0.2 就能滤掉绝大部分毛刺。

2.3 最小峰间距与峰宽:两个互补的约束维度

MinPeakDistance和MinPeakWidth是两个经常被混用的参数,但它们约束的维度完全不同。

MinPeakDistance是横向距离约束:两个峰之间至少隔多少个采样点。它的实现逻辑是,如果两个峰离得太近,只保留其中更高的那个。这个参数特别适合处理"一个真实峰因为抖动被拆成两个"的情况。比如采样率 1 kHz,你预期真实峰的间隔至少 50 ms,那就设MinPeakDistance = 50。

MinPeakWidth是峰的宽度约束:只保留宽度大于某个值的峰。宽度怎么算?Matlab 用的是峰半高宽(FWHM)的概念,即峰高一半处的宽度,单位是采样点数。这个参数用来滤掉那些又尖又窄的噪声脉冲。真实物理峰通常有一定的宽度,而噪声尖刺往往只有一个采样点宽。

这两个参数配合使用效果最好。我一般的顺序是:先用MinPeakProminence做粗筛,再用MinPeakDistance处理粘连,最后用MinPeakWidth清理残余的窄脉冲。这个顺序不是死规定,但符合"从粗到细"的过滤直觉,调起来心里有数。

参数约束维度典型用途单位
MinPeakProminence纵向突出程度滤除噪声毛刺信号幅度单位
MinPeakDistance横向间距合并粘连峰采样点数
MinPeakWidth峰的横向宽度滤除窄脉冲采样点数
MinPeakHeight绝对高度滤除低幅值峰信号幅度单位
Threshold相对邻域的高度差抑制基线漂移影响信号幅度单位

2.4 Threshold 参数:被低估的基线漂移克星

Threshold这个参数用的人不多,但在处理有基线漂移的信号时特别好用。它要求峰的两侧必须比峰低至少 Threshold 的高度,否则不算峰。

为什么它重要?考虑一个缓慢上升的趋势信号,上面叠加了一些小波动。局部极大值判定会把这些小波动全找出来,因为它们在局部确实比邻居高。但如果你要求"峰两侧必须下降至少 0.1",那些骑在上升趋势上的小波动就被滤掉了,因为它们的一侧可能还在上升。

这个参数和显著性的区别在于:显著性看的是"相对于周围最低点"的突出程度,而 Threshold 看的是"紧邻两侧"的下降幅度。对于缓慢漂移的基线,Threshold 往往比显著性更直接有效。

3. 参数调优的实战路径:从一段真实信号出发

3.1 先可视化再调参,别盲猜

我见过太多人拿到信号直接写findpeaks(x),然后对着结果发愁。正确的第一步永远是把信号画出来,把默认检测结果叠加画出来。

fs = 1000; t = 0:1/fs:10-1/fs; % 构造一段含噪声的信号:三个真实峰 + 高频噪声 x = 2*exp(-((t-2).^2)/0.01) + 3*exp(-((t-5).^2)/0.02) ... + 1.5*exp(-((t-8).^2)/0.005) + 0.3*randn(size(t)); [pks, locs] = findpeaks(x); plot(t, x); hold on; plot(t(locs), pks, 'rv', 'MarkerFaceColor', 'r'); title('默认参数检测结果');

跑一遍你就会发现,默认参数下检测出的峰可能有几十个,红三角密密麻麻。这时候你心里就有数了:噪声幅度大概在 0.3 量级,真实峰的幅度在 1.5 以上。这个观察直接告诉你MinPeakHeight至少可以设到 0.8 左右。

可视化这一步不能省,因为参数没有万能值,只有针对具体信号的值。同一套参数换个采样率、换个传感器就完全失效。养成"先看图、再定参"的习惯,比记住任何一组"推荐参数"都有用。

3.2 显著性阈值的定量估算方法

很多人设MinPeakProminence靠试,试到结果顺眼为止。这在小项目里没问题,但如果要写进自动化流程,你需要一个可复现的定量方法。

我的做法是:先检测所有峰,统计它们的显著性分布,找分布的拐点。

[pks, locs, w, p] = findpeaks(x); % p 是每个峰的显著性 figure; histogram(p, 50); xlabel('显著性'); ylabel('峰数量'); title('峰显著性分布');

如果信号里真实峰和噪声峰泾渭分明,这个直方图会呈现双峰分布:左边一大堆低显著性的噪声峰,右边一小撮高显著性的真实峰,中间有个明显的低谷。把阈值设在低谷位置,就是最优分割点。这个方法比拍脑袋靠谱得多,而且换信号后重新跑一遍直方图就行,流程完全可复现。

如果分布没有明显双峰,说明真实峰和噪声的显著性有重叠,单靠显著性分不干净,这时候就要叠加MinPeakDistance或MinPeakWidth一起用。

3.3 采样率变化时参数怎么跟着变

这是一个非常实际的坑:你在 1 kHz 采样率下调好的MinPeakDistance = 50,换到 10 kHz 采样率下就完全不对了,因为同样的物理时间间隔对应的采样点数变成了 500。

凡是和时间相关的参数,都要用"物理时间 × 采样率"来换算。我习惯在代码里这样写:

fs = 10000; % 采样率 minDistTime = 0.05; % 最小峰间隔 50 ms(物理量) minDistSamples = round(minDistTime * fs); % 换算成采样点 [pks, locs] = findpeaks(x, 'MinPeakDistance', minDistSamples);

这样写的好处是,物理需求(峰间隔至少 50 ms)和实现细节(采样点数)分离了。换采样率时只改fs,逻辑不用动。同理,MinPeakWidth也应该用物理宽度乘以采样率来算。

MinPeakProminence和MinPeakHeight是幅度量,和采样率无关,但和信号的物理单位有关。如果信号经过归一化,这两个值就在 0 到 1 之间;如果是原始电压值,可能就是毫伏量级。这一点在跨项目复用代码时特别容易搞混。

3.4 用 MinPeakHeight 做粗筛的性价比

在四个主要参数里,MinPeakHeight是计算成本最低、最直观的一个。它就是一个简单的幅度门限,低于这个值的点直接不考虑。

我的调参顺序通常是:先用 MinPeakHeight 砍掉明显不可能的区域,再用其他参数精修。这样做的好处是减少后续参数需要处理的候选峰数量,调起来更快,也更容易看出每个参数的效果。

但要注意,MinPeakHeight对基线漂移很敏感。如果信号整体在缓慢上升,固定高度门限可能在信号前段滤得太狠、后段又放得太松。这时候要么先做去趋势(detrend函数),要么改用Threshold参数,要么用自适应的滑动窗口门限。这三种方案各有适用场景,去趋势最简单,滑动窗口最灵活但实现复杂。

4. 超越 findpeaks:当内置函数不够用的时候

4.1 小波变换做峰值检测的思路

findpeaks本质上是时域方法,对信噪比有一定要求。当噪声和信号在频域上重叠严重时,时域方法会很吃力。这时候可以考虑小波变换。

思路是这样的:对信号做连续小波变换(CWT),真实峰在特定尺度上会产生明显的模极大值,而噪声的模极大值随尺度增大迅速衰减。所以在大尺度上找模极大值,就能定位真实峰,同时天然抑制了噪声。

Matlab 里可以用cwt函数配合模极大值检测来实现。这个方法的代价是计算量大、参数(小波基、尺度范围)需要调,适合离线分析或者对精度要求极高的场景。实时系统里一般还是用findpeaks加滤波。

4.2 先滤波再检测,还是先检测再滤波

这是一个策略选择问题,没有绝对答案,取决于你的信号特点。

先滤波再检测适合噪声频率明显高于信号频率的情况。比如信号是 10 Hz 的脉搏波,噪声是 50 Hz 工频干扰,一个低通滤波器就能大幅提升检测质量。滤波后findpeaks的参数可以设得更宽松,检测更稳定。

先检测再滤波适合噪声和信号频率重叠、滤波会同时削弱真实峰的情况。这时候先用宽松参数检测出所有候选峰,再根据峰的幅度、宽度、间隔等特征做二次筛选。这种"宽进严出"的策略在生物信号处理里很常见。

我个人的偏好是:如果滤波不会明显改变峰的位置和幅度,就先滤波。因为滤波后的信号更干净,后续所有参数都更好调。判断标准很简单,把滤波前后的信号画在一起,看峰的位置有没有偏移、幅度有没有明显衰减。如果偏移超过半个采样点,就要谨慎了。

4.3 处理非平稳信号的滑动窗口策略

真实信号往往不是平稳的,前段噪声大、后段噪声小,或者幅度整体在变化。固定参数在这种信号上表现会很差。

滑动窗口策略是:把信号切成若干段,每段单独估计噪声水平,然后动态设定该段的检测参数。窗口长度怎么选?太短了统计不稳定,太长了跟不上信号变化。我的经验是窗口内至少包含 5 到 10 个预期峰,这样统计才有意义。

实现上可以用buffer函数切分,或者简单地用循环加索引。每段内先算噪声的标准差,把MinPeakProminence设为噪声标准差的 3 倍左右,然后检测。段与段之间要有重叠,避免边界处的峰被漏掉或重复计算。

这个策略的代价是代码复杂度上升,但换来的是对非平稳信号的鲁棒性。在设备状态监测这类信号幅度会随工况变化的场景里,滑动窗口几乎是必需的。

5. 那些文档里不会写的踩坑记录

5.1 峰位置偏移半个采样点的真相

有段时间我一直困惑:明明信号峰值目测在 t=2.003 秒,findpeaks返回的位置却是 t=2.002 秒。查了半天以为是 bug,后来才想明白。

findpeaks返回的是采样点的索引,不是峰的精确连续位置。如果真实峰顶落在两个采样点之间,findpeaks只能返回离它最近的那个采样点。这个误差最大是半个采样周期。在 1 kHz 采样率下就是 0.5 ms,在 10 kHz 下是 0.05 ms。

如果需要亚采样点精度的峰位置,得做抛物线插值:用峰点及其左右邻居三个点拟合一条抛物线,抛物线的顶点就是精确峰位置。Matlab 里可以手写这几行:

% 对第 k 个峰做抛物线插值 i = locs(k); if i > 1 && i < length(x) y1 = x(i-1); y2 = x(i); y3 = x(i+1); delta = 0.5 * (y1 - y3) / (y1 - 2*y2 + y3); preciseLoc = i + delta; % 精确位置(采样点单位) end

这个技巧在需要精确测量峰间时间间隔的场景里很重要,比如心率变异性分析,半个采样点的误差累积起来会影响结果。

5.2 端点效应:为什么信号开头结尾的峰总丢

前面提过边界点不算峰,但实际影响比想象的大。如果你的信号是分段处理的,每段的首尾都会有峰丢失,段与段拼接起来就会在接缝处出现规律性的漏检。

解决办法有两个:一是段间重叠,每段多取一些数据,检测完后只保留中间部分的结果;二是端点延拓,在信号两端各补一段镜像或极值,检测完再去掉补的部分。段间重叠更通用,我一般用这个方法,重叠长度设为预期最大峰间距的两倍就够。

5.3 当信号有多个通道时怎么批量处理

多通道信号(比如多路传感器)做峰值检测时,最忌讳的是对每个通道用同一套参数。不同通道的噪声水平、信号幅度可能差很多,统一参数必然有的通道过检、有的通道漏检。

正确做法是逐通道独立估计参数。写一个函数,输入单通道信号,内部完成噪声估计、参数设定、峰值检测,然后对每个通道循环调用。这样每个通道都得到适合自己的参数,结果才可靠。

如果通道数很多,可以考虑并行化。Matlab 的parfor用起来很简单,把循环变量换成parfor就行。但要注意,并行池的启动有开销,通道数少于 4 个时可能还不如串行快。

5.4 结果可复现性:随机性从哪里来

峰值检测本身是确定性的,同样的输入和参数必然得到同样的输出。但如果你在检测前做了随机性的预处理(比如某些自适应滤波算法含随机初始化),结果就不可复现了。

保证可复现的做法:固定随机数种子。在代码开头加rng(42),这样每次运行得到的随机序列都一样。这个习惯在调试阶段特别有用,能排除随机性干扰,让你专注于参数本身的影响。

另外,findpeaks对输入数据的类型敏感。单精度和双精度算出来的结果可能有微小差异,在临界情况下会导致峰的取舍不同。如果对可复现性要求极高,统一用双精度(Matlab 默认)处理。

6. 把峰值检测嵌入自动化流程的几个工程细节

6.1 参数配置的外部化

当峰值检测成为自动化流程的一环,参数就不应该硬编码在函数里。我的做法是把所有参数写进一个结构体或配置文件,检测函数从外部读取。

params.minProminence = 0.15; params.minDistanceTime = 0.05; params.minWidthTime = 0.01; params.fs = 1000; function [pks, locs] = detectPeaks(x, params) minDist = round(params.minDistanceTime * params.fs); minW = round(params.minWidthTime * params.fs); [pks, locs] = findpeaks(x, ... 'MinPeakProminence', params.minProminence, ... 'MinPeakDistance', minDist, ... 'MinPeakWidth', minW); end

这样换信号时只改配置,不动代码逻辑。参数配置还可以存成 mat 文件或文本文件,方便版本管理和回溯。

6.2 检测结果的质量评估指标

自动化流程需要知道"这次检测结果靠不靠谱"。我通常监控几个指标:检测到的峰数量、峰显著性的均值和中位数、峰间距的变异系数。

如果峰数量突然比历史均值多很多或少很多,说明信号特性变了或者参数失效了,需要报警。显著性均值下降说明噪声水平上升。峰间距变异系数异常说明检测到了不该检测的峰,或者漏掉了该检测的峰。

这些指标不需要很精确,作为趋势监控足够了。关键是建立基线:在信号正常时记录这些指标的典型范围,后续偏离范围就触发检查。

6.3 从检测到提取:峰特征参数的完整清单

检测出峰位置只是第一步,真正有用的是峰的特征参数。一个完整的峰特征集包括:

  • 峰位置:采样点索引或物理时间
  • 峰幅度:峰值本身
  • 峰显著性:相对于周围地形的突出程度
  • 峰宽度:半高宽,反映峰的陡峭程度
  • 峰面积:峰两侧到基线之间的积分,反映能量
  • 峰间距:相邻峰之间的时间差

findpeaks直接返回位置、幅度、宽度、显著性。峰面积和峰间距需要自己算。峰面积可以用梯形积分,从峰左侧的谷点到右侧的谷点积分。峰间距就是相邻位置的差分。

这些特征组合起来,能刻画峰的完整形态,为后续的分类、识别、诊断提供输入。比如在故障诊断里,冲击峰的宽度和面积往往比峰高更能反映故障类型。

7. 一个完整的可复现示例:从原始信号到特征表

把前面讲的东西串起来,给一个端到端的例子。假设有一段含噪声的振动信号,目标是提取所有冲击峰并输出特征表。

%% 1. 准备信号 fs = 2000; t = 0:1/fs:5-1/fs; % 模拟冲击信号:5个冲击,间隔约1秒,叠加噪声 x = zeros(size(t)); impactTimes = [0.5, 1.5, 2.5, 3.5, 4.5]; for k = 1:length(impactTimes) x = x + 2*exp(-((t-impactTimes(k)).^2)/0.0005); end x = x + 0.2*randn(size(t)); %% 2. 可视化与噪声估计 figure; plot(t, x); title('原始信号'); noiseLevel = mad(x, 1); % 用中位数绝对偏差估计噪声,比标准差抗异常值 %% 3. 参数设定(物理量转采样点) params.fs = fs; params.minProminence = 5 * noiseLevel; % 噪声的5倍 params.minDistanceTime = 0.3; % 最小间隔300ms params.minWidthTime = 0.005; % 最小宽度5ms %% 4. 检测 minDist = round(params.minDistanceTime * fs); minW = round(params.minWidthTime * fs); [pks, locs, w, p] = findpeaks(x, ... 'MinPeakProminence', params.minProminence, ... 'MinPeakDistance', minDist, ... 'MinPeakWidth', minW); %% 5. 抛物线插值精修位置 preciseLocs = locs; for k = 1:length(locs) i = locs(k); if i > 1 && i < length(x) y1 = x(i-1); y2 = x(i); y3 = x(i+1); denom = y1 - 2*y2 + y3; if abs(denom) > eps delta = 0.5 * (y1 - y3) / denom; preciseLocs(k) = i + delta; end end end %% 6. 组装特征表 peakTimes = (preciseLocs - 1) / fs; peakIntervals = [NaN; diff(peakTimes)]; resultTable = table(peakTimes', pks, p, w, peakIntervals, ... 'VariableNames', {'Time_s', 'Amplitude', 'Prominence', 'Width', 'Interval_s'}); disp(resultTable); %% 7. 结果可视化 figure; plot(t, x); hold on; plot(peakTimes, pks, 'rv', 'MarkerFaceColor', 'r', 'MarkerSize', 8); xlabel('时间 (s)'); ylabel('幅度'); title('峰值检测结果');

这段代码里有几个值得说的点。第一,噪声估计用mad而不是std,因为mad对异常值更鲁棒,而信号里的冲击峰本身就是异常值,用std会把噪声水平估高。第二,显著性阈值设为噪声的 5 倍,这个倍数不是死的,可以根据实际效果调整,但 3 到 5 倍是个合理的起点。第三,抛物线插值前检查了分母,避免除以零。

跑完这段代码,你会得到一张干净的特征表,每个冲击峰的时间、幅度、显著性、宽度、间隔都列得清清楚楚。这个表可以直接喂给后续的分析流程。

8. 关于参数敏感性和鲁棒性的一点个人体会

做了这么多峰值检测的项目,我最大的体会是:不要追求一组"完美参数",要追求一套"参数调整的方法论"。

信号是会变的。今天调好的参数,明天换个工况可能就失效了。真正有价值的是知道每个参数在什么情况下该往哪个方向调,以及怎么快速判断当前参数是否合适。

我的判断流程是这样的:先看检测结果的可视化图,如果漏检明显,降低MinPeakProminence或MinPeakHeight;如果过检明显,提高这两个值;如果峰位置粘连,增大MinPeakDistance;如果窄脉冲混进来了,增大MinPeakWidth。每次只调一个参数,调完立刻看效果,这样能建立参数和结果之间的直觉映射。

还有一点,保留中间结果。检测过程中的候选峰、显著性分布、噪声估计值,这些都存下来。出问题时能回溯,调参时能对比。我习惯把每次检测的参数和结果指标记进日志,时间长了就能看出哪些参数组合在哪些信号条件下表现好,形成自己的经验库。

最后说一个容易被忽视的点:峰值检测的验收标准要和下游任务对齐。如果下游是做峰计数,那漏检和过检的代价可能不对称,参数就要往减少代价大的那个方向偏。如果下游是做峰定位,那位置精度比数量更重要,抛物线插值就不能省。脱离下游需求谈"检测准不准"是没有意义的。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/14 2:22:15

惠普 DL380 Gen9 安装win10系统

1.图片2.先F10 清除原来的阵列信息 创建单盘raid0 作为系统盘 然后F11进入冰封启动pe 然后diskgenis创建自动分区1 然后安装win10的镜像到系统清除阵列并重新创建&#xff0c;会丢失该阵列上的所有数据&#xff0c;操作前请务必确认数据已完成备份或确实不再需要。1. 清除现…

作者头像 李华
网站建设 2026/10/14 2:21:28

ponytail插件:轻量级代码去重与资源收拢实战指南

1. 从“ponytail”这个词说起&#xff1a;它到底指什么第一次看到“ponytail”这个词&#xff0c;绝大多数人脑子里蹦出来的画面是发型——马尾辫。但在技术圈和工具圈里&#xff0c;这个词最近被反复提起&#xff0c;尤其是和“插件”绑在一起之后&#xff0c;它的含义就完全变…

作者头像 李华
网站建设 2026/10/14 2:20:30

DNS与ICMP实战:从网站打不开到网络故障排查全解析

早上九点刚过&#xff0c;同事在群里喊了一嗓子"官网打不开了&#xff0c;快点看一下"。第一反应自然是先确认连通性——ping一下域名&#xff0c;结果直接报unknown host&#xff0c;连域名都解析不出来。改成ping IP地址&#xff0c;通了&#xff0c;延迟还很正常。…

作者头像 李华