当前位置: 首页 > news >正文

通信算法之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  : 实际测量的峰值宽度(样本数)
 

参数优化对照表

参数名称典型值范围优化目标
MinPeakDistance10~50 samples避免相邻峰误判
MinPeakProminence0.1~0.5抑制旁瓣干扰
WidthReferencehalfheight提高宽峰测量稳定性
Threshold0.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)和交叉验证检测到的脉冲宽度来确认结果一致性。

相关文章:

  • PyQt6基础_pyqtgraph_k线图缩放
  • 41、web前端开发之Vue3保姆教程(五 项目实战)
  • 足球比分分析页面可视化展示
  • ImportError: The ‘read_file‘ function requires the ‘pyogrio‘ or ‘fiona‘ package
  • 【深度学习与实战】3.1 逻辑回归模型
  • 网络相关基本概念
  • Rasa总体目录架构介绍
  • Python中如何用正则表达式精准匹配IP地址?
  • 常用环境部署(二十六)——Centos搭建MQTT服务端EMQX
  • 35.Java线程池(线程池概述、线程池的架构、线程池的种类与创建、线程池的底层原理、线程池的工作流程、线程池的拒绝策略、自定义线程池)
  • OpenStack Yoga版安装笔记(十九)启动一个实例(Self-service networks)
  • mysql 重复读自己事务中可以看到新插入数据
  • JS里对于Map的简单介绍
  • 蓝桥杯简单题练习
  • win11 redis3.0下载和运行
  • 力扣面试150题--有效的数独
  • 【Android】Android 打包 Release 崩溃问题全解析:Lint 错误、混淆类丢失及解决方法大全
  • React 条件渲染
  • Agent2Agent协议学习资源大全:从理论到实践
  • 【Linux】单例模式及其在线程池中的应用
  • 合肥网站建设公司/8个公开大数据网站
  • 360免费wifi连不上/网站性能优化方法
  • 做直播网站开发教程/seo网站查询
  • 企业产品网站模板/什么是关键词举例说明
  • 电子业网站建设/杭州排名推广
  • 企业网站建设犇类建筑/网站用户体验优化