在信号处理的时候,有的时候希望确定信号峰值的大小以及位置,并最好对信号进行分离,可以更好地进行后续处理。本人使用了集中不同的思路和方式来进行位置确定和提取,仅供参考。
注意: 部分程序仅兼容Matlab2016b以后版本
目标
提取和检测如下图类似信号的峰值及位置
方法1
调用的findpeaks函数
参考程序,通过设定合适的峰值参数,可以输出相应的峰值
%% 找到数据中的峰值
clc;
clear;
x = linspace(0,1,1000);
Pos = [1 2 3 5 7 8]/10;
Hgt = [3 4 4 2 2 3];
Wdt = [2 6 3 3 4 6]/100;
for n = 1:length(Pos)
Gauss(n,:) = Hgt(n)*exp(-((x - Pos(n))/Wdt(n)).^2);
end
Data = sum(Gauss);%产生假设信号
% NPeaks表示返回值中最大的峰值个数
[pks,locs,w,p] = findpeaks(Data,x,...pks为输出峰值,locs为峰值位置
'NPeaks',1,...输出的最大峰值个数
'SortStr','ascend',...输出峰值是否进行排序,升序或降序或不进行排序
'Threshold',0,...峰值之间的最小差值阈值,如数组为[]则未找到符合参数的阈值
'WidthReference','halfprom',...
...'MiniPeakWidth','0',...最小的峰值宽度
'MaxPeakWidth',Inf,...最大的峰值宽度
'Annotate','peaks',...在定义输出后无效
'MinPeakHeight',50);%最小峰值高度
findpeaks(Data,x,'Annotate','extents')
text(locs+.02,pks,num2str((1