通信算法之261: 时频分析- findpeaks 函数查找满足宽度要求的峰值
% 输入参数说明:
% above_level : 预处理后的信号(已提升至噪声水平以上)
% signal_length_min_samples : 最小数据包长度(样本数)
% signal_length_max_samples : 最大数据包长度(样本数)
% 调用 findpeaks 函数查找满足宽度要求的峰值
[peaks, locs, widths, ~] = findpeaks(above_level,...
'MinPeakHeight', 0, ... % 高度阈值设为0(已预处理)
'MinPeakWidth', signal_length_min_samples, ... % 最小宽度
'MaxPeakWidth', signal_length_max_samples, ... % 最大宽度
'WidthReference','halfprom', ... % 使用半高宽测量方式
'Annotate','extents'); % 显示宽度标注
% 输出参数说明:
% peaks : 峰值幅度向量
% locs : 峰值位置索引(样本点)
% widths : 实际测量的峰值宽度(样本数)
参数优化对照表
参数名称 | 典型值范围 | 优化目标 |
---|---|---|
MinPeakDistance | 10~50 samples | 避免相邻峰误判 |
MinPeakProminence | 0.1~0.5 | 抑制旁瓣干扰 |
WidthReference | halfheight | 提高宽峰测量稳定性 |
Threshold | 0.05~0.2 | 平衡噪声免疫性和灵敏度 |
关键差异对比表
Python (scipy.signal.find_peaks)
MATLAB (findpeaks)
说明
width=[min, max]
MinPeakWidth/MaxPeakWidth
MATLAB需分开设置最小/最大宽度参数
wlen=100*max_width
无直接对应参数
MATLAB自动根据信号长度优化检测窗口,可通过调整 WidthReference 补偿
properties 字典
第四个返回参数 widths
MATLAB通过多个返回值获取属性
默认宽度测量方式(半高宽)
需显式设置 'WidthReference','halfprom'
确保与Python的宽度测量方式一致

验证代码正确性的建议步骤
1.
生成测试信号:
Fs = 1000;
t = 0:1/Fs:1;
% 创建包含3个高斯脉冲的测试信号
test_signal = 2*gauspuls(t-0.2,10,0.5) + 1.5*gauspuls(t-0.5,15,0.7) + 3*gauspuls(t-0.8,20,0.3);
noise = 0.2*randn(size(t));
above_level = test_signal + noise;
2.
设置参数:
signal_length_min_samples = 30; % 最小脉冲宽度30样本
signal_length_max_samples = 70; % 最大脉冲宽度70样本
3.
执行转换代码:
[peaks, locs, widths] = findpeaks(above_level,...
'MinPeakHeight',0,...
'MinPeakWidth',30,...
'MaxPeakWidth',70,...
'WidthReference','halfprom');
4.
可视化验证:
figure;
findpeaks(above_level, 'MinPeakHeight',0,...
'MinPeakWidth',30,...
'MaxPeakWidth',70,...
'WidthReference','halfprom',...
'Annotate','extents');
title('MATLAB峰值检测结果');

特殊场景处理
1.
处理非对称波形:
% 设置更严格的宽度参考标准
[peaks, locs, widths] = findpeaks(above_level,...
'MinPeakHeight',0,...
'MinPeakWidth',signal_length_min_samples,...
'MaxPeakWidth',signal_length_max_samples,...
'WidthReference','halfheight'); % 改用半高宽测量
2.
处理高频噪声干扰:
matlab
% 添加平滑预处理
smoothed_signal = smoothdata(above_level, 'gaussian', 50);
[peaks, locs, widths] = findpeaks(smoothed_signal,...);
3.
处理多峰重叠:
matlab
% 启用峰分离功能
[peaks, locs, widths] = findpeaks(above_level,...
'MinPeakDistance', signal_length_min_samples/2,... % 设置最小峰间距
'MinPeakWidth',signal_length_min_samples,...);

性能优化建议
1.
大数据量加速:
matlab
% 启用并行计算(需要 Parallel Computing Toolbox)
if ~isempty(gcp('nocreate')), parpool; end
options = statset('UseParallel',true);
[peaks, locs, widths] = findpeaks(above_level,'Options',options,...);
2.
内存预分配:
matlab
max_peaks = floor(length(above_level)/signal_length_min_samples);
peaks = zeros(1,max_peaks);
locs = zeros(1,max_peaks);
widths = zeros(1,max_peaks);
3.
混合编程加速:
matlab
% 调用C++ MEX函数实现核心算法
mex find_peaks_mex.cpp
[peaks, locs, widths] = find_peaks_mex(above_level,...);

该转换完整保留了Python代码的功能特性,同时遵循MATLAB的最佳实践。建议通过可视化对比(如图2)和交叉验证检测到的脉冲宽度来确认结果一致性。