此示例显示如何执行基本峰值分析。它将帮助您回答问题:我如何在我的信号中找到峰值?如何测量峰之间的距离?如何测量受趋势影响的信号的峰值幅度?如何在嘈杂的信号中发现峰值?如何找到当地的最小值?
苏黎世太阳黑子相对数测量了太阳黑子的数量和大小。使用findpeaks.
函数查找峰值的位置和值。
加载sunspot.dat年=太阳黑子(:,1);Relnums = Sunspot(:,2);Findpeaks(Relnums,年)Xlabel(“年”)ylabel(“太阳黑子数量”) 标题('找到所有山峰')
上面的图显示了300年来太阳黑子的数量,并标记了探测到的峰值。下一节将展示如何测量这些峰之间的距离。
信号的峰值似乎以一定的间隔出现。然而,有些山峰彼此非常接近。的minpeakpromence
可以使用这些峰值。在遇到更大的值之前,将两侧下降至少40个相对太阳黑子数字的峰值。
findpeaks(Relnums,年,'minpeakprominence',40)xlabel(“年”)ylabel(“太阳黑子数量”) 标题('找到突出的峰值')
以下柱状图显示了峰值区间在各年的分布情况:
figure [pks, locs] = findpeaks(relNums,year,'minpeakprominence', 40);Peakinterval = Diff(LOC);直方图(Peakinterval)网格在Xlabel(“间隔年”)ylabel(发生的频率) 标题('峰值间隔的直方图(年)')
AverageageAstance_Peaks =均值(Diff(LOC))
AverageDistance_Peaks = 10.9600
分布表明,大多数峰间隔位于10到12年之间,表示信号具有循环性质。此外,峰之间的平均间隔为10.96岁与11年的已知循环太阳黑子活性相匹配。
你可能想把平的峰视为峰或排除它们。在后一种情况下,最小偏移被定义为峰值与其相邻峰之间的幅值差,使用临界点
财产。
加载Clippeaks.mat.数字%在第一个图中显示所有的峰值斧头(1)=子图(2,1,1);findpeaks(saterateddata)xlabel(“样本”)ylabel('振幅') 标题(“检测饱和峰”)%在第二个绘图中指定最小偏移斧头(2)=子图(2,1,2);findpeaks(sermateddata,'临界点'(5)包含“样本”)ylabel('振幅') 标题('过滤饱和峰')链接并放大以显示更改linkaxes (ax (1:2),'xy')轴(AX,[50 70 0 250])
第一副图显示,在一个平坦的峰,上升边被检测为峰。第二个子图显示,指定一个阈值可以帮助拒绝平坦的峰值。
该示例在ECG(电磁图)信号中显示了峰值分析。ECG是一种衡量心脏的电气活动随着时间的推移。信号通过连接到皮肤的电极测量,并且对由于运动伪像而敏感诸如电源干扰和噪声的扰动。
加载noisyecg.matt = 1:长度(noisyecg_withtrend);图绘图(t,noisyecg_withtrend)标题(“带有趋势的信号”)Xlabel(“样本”);ylabel ('电压(MV)')传说('嘈杂的心电图信号') 网格在
争取数据
上述信号显示基线移位,因此不代表真正的幅度。为了消除趋势,将低阶多项式贴合到信号并使用多项式来拒绝它。
[p,s,mu] = polyfit((1:numel(noisyecg_withtrend)',noisyecg_withtrend,6);f_y = polyval(p,(1:numel(noisyecg_withtrend))',[],mu);ECG_DATA = NOISYECG_WITHTREND - F_Y;%去趋势数据图绘制(t, ECG_data)网格在ax =轴;轴([ax(1:2) -1.2 1.2])'贬低了ECG信号')Xlabel(“样本”)ylabel('电压(MV)')传说('贬低了ECG信号')
去趋势后,找到QRS复峰,这是心电信号中最突出的重复峰。QRS复合体对应于人类心脏的左右心室的去极化。它可以用来确定病人的心率或预测心功能异常。下图显示了心电信号中QRS复波的形状。
QRS复合体由三个主要组件组成:Q波,R波,S波.R波可以通过超过0.5 mV的阈值峰检测到。注意,R波被超过200个样本分开。使用此信息通过指定“MinPeakDistance”来删除不需要的峰值。
[〜,locs_rwave] = findpeaks(ECG_DATA,“MinPeakHeight”,0.5,...'minpeakdistance', 200);
为了检测S波,在信号中找到局部最小值并适当地应用阈值。
在信号中找到本地最小值
局部极小值可以通过在原始信号的反方向上寻找峰值来检测。
ECG_inverted = -ECG_data;[~, locs_Swave] = findpeaks (ECG_inverted,“MinPeakHeight”,0.5,...'minpeakdistance', 200);
下图显示了信号中检测到的R波和S波。
图保存在情节(t, ECG_data)情节(locs_Rwave ECG_data (locs_Rwave),“房车”,'markerfacecolor',“r”)情节(locs_Swave ECG_data (locs_Swave),“rs”,'markerfacecolor',“b”)轴([0 1850 -1.1 1.1])网格在传奇('ECG信号',R波的,“浪潮”)Xlabel(“样本”)ylabel('电压(MV)') 标题(噪声心电信号中的R波和S波)
接下来,我们尝试确定Q波的位置。阈值定位Q峰值的峰值导致检测不需要的峰值,因为Q波被埋入噪声。我们首先过滤信号,然后找到峰值。Savitzky-golay过滤用于消除信号中的噪声。
smoothECG = sgolayfilt (ECG_data 7 21);图绘制(t ECG_data“b”t smoothECG“r”) 网格在轴紧的Xlabel(“样本”)ylabel('电压(MV)')传说('嘈杂的心电图信号','过滤信号') 标题('过滤嘈杂的心电图信号')
我们对平滑信号进行峰值检测,并使用逻辑索引来查找Q波的位置。
[〜,min_locs] = findpeaks(-smoothecg,'minpeakdistance', 40);%峰值在-0.2mV和-0.5mV之间locs_Qwave = min_locs(smoocg (min_locs)>-0.5 & smoocg (min_locs)<-0.2);图保存在情节(t, smoothECG);情节(locs_Qwave smoothECG (locs_Qwave),“rs”,'markerfacecolor','G')情节(locs_Rwave smoothECG (locs_Rwave),“房车”,'markerfacecolor',“r”)plot(locs_swave,shopdeccg(locs_swave),“rs”,'markerfacecolor',“b”) 网格在标题('信号中的阈值峰值')Xlabel(“样本”)ylabel('电压(MV)')轴=轴;轴([0 1850 -1.1 1.1])传奇(光滑的ECG信号的,“Q波”,非线性波的,浪潮')
上图显示了在噪声心电信号中成功检测到QRS复波。
嘈杂和平滑信号之间的误差
注意原始QRS复合物之间的平均差异和促进过滤信号。
极值的%值[val_qwave,val_rwave,val_swave] =交易(Shimplecg(locs_qwave),shockecg(locs_rwave),shockecg(locs_swave));MeanError_qwave =均值((noisyecg_withtrend(locs_qwave) - val_qwave))
MeanError_qwave = 0.2771
MeanError_rwave =均值((noisyecg_withtrend(locs_rwave) - val_rwave))
MeanError_rwave = 0.3476.
MeanError_swave =均值((noisyecg_withtrend(locs_swave) - val_swave))
MeanError_swave = 0.1844
这表明对噪声峰值分析进行了噪声的噪声。
峰特性
一些重要的峰值特性包括上升时间、下降时间、上升电平和下降电平。对心电信号中的每个QRS复形计算了这些性质。这些属性的平均值如下图所示。
avg_riseTime =意味着(locs_Rwave-locs_Qwave);%平均上升时间avg_falltime =均值(locs_swave-locs_rwave);平均下降时间%avg_riselevel =均值(val_rwave-val_qwave);%平均上升水平avg_fallLevel =意味着(val_Rwave-val_Swave);%平均下降水平Helperpeakanalissinplot(T,Smoothecg,...locs_qwave,locs_rwave,locs_swave,...val_Qwave、val_Rwave val_Swave,...avg_risetime,avg_falltime,...avg_riselevel,avg_falllevel)