You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MATLAB等间隔采样脉冲序列的单脉冲峰值点检测方法咨询

脉冲序列峰值点检测方案

你拥有一组等间隔采样的脉冲序列幅值样本,将采样得到的脉冲幅值数组记为A,时间数组记为t,在MATLAB中可通过plot(t, A)命令绘制对应的脉冲序列波形图。
脉冲序列整体波形图如下:
脉冲序列整体波形
波形放大版如下,其中绿色点为采样点,红色圆圈为待检测的峰值点:
脉冲序列放大波形
你需要实现算法自动检测每个脉冲的最大值点(即上述红圈标注的点位),并将这些点位信息存入数组,现有遍历检测代码未达到预期效果,对应代码如下:

kk = 0
for i=1:length(t)-2
        if y(i)>0 & y(i+1)>y(i) & y(i+2)>y(i+1) & y(i+3)<y(i+2)
            kk = kk+1;
            maxPointTime(kk) = t(i+2);
            maxPointVoltage(kk)  = A(i+2);
        end
end

现有代码问题梳理

  • 索引越界:循环终止条件为length(t)-2,但判断逻辑用到了i+3,运行时会出现索引超出数组长度的报错
  • 峰值判断逻辑僵化:仅支持「连续3个点递增+第4个点递减」的单一峰值形态,若峰值为平顶、峰值前后有微小波动都会出现漏检
  • 变量名不一致:判断逻辑用的是变量y,存幅值用的是数组A,代码运行会直接报变量未定义错误
  • 无噪声过滤机制:未设置幅值阈值,容易把小幅噪声尖峰误判为有效脉冲峰值

正确实现方案

方案1:调用MATLAB自带findpeaks函数(推荐)

该函数是MATLAB官方封装的峰值检测工具,适配绝大多数峰值检测场景,示例代码如下:

% 可调参数:最小峰值幅值阈值,过滤低于阈值的噪声尖峰,根据你的实际脉冲幅值调整
minPeakHeight = 0.5; 
% 可调参数:两个峰值之间的最小间隔点数,避免同一个脉冲被检出多个峰值
minPeakDistance = 10; 

% 检测峰值,返回峰值幅值和峰值对应的数组索引
[maxPointVoltage, peakIdx] = findpeaks(A, 'MinPeakHeight', minPeakHeight, 'MinPeakDistance', minPeakDistance);
% 提取峰值对应的时间
maxPointTime = t(peakIdx);

方案2:手动优化遍历逻辑

如果需要自己实现底层检测逻辑,优化后代码如下:

kk = 0;
% 预先初始化结果数组,提升运行效率
maxPointTime = zeros(1, length(t));
maxPointVoltage = zeros(1, length(t));
% 峰值幅值阈值,按需调整
peakThreshold = 0.5;

% 修正循环边界,避免索引越界
for i = 2:length(A)-1
    % 核心判断:当前点比左右相邻点都大,且幅值超过阈值
    if A(i) > A(i-1) && A(i) > A(i+1) && A(i) > peakThreshold
        kk = kk + 1;
        maxPointTime(kk) = t(i);
        maxPointVoltage(kk) = A(i);
    end
end
% 截取有效结果,去掉预分配的空值
maxPointTime = maxPointTime(1:kk);
maxPointVoltage = maxPointVoltage(1:kk);

如果你的脉冲存在平顶峰值的情况,可额外增加平顶判断逻辑,取平顶段的中点或第一个点作为峰值即可。

内容的提问来源于stack exchange,提问作者user1245

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 14:36:04