这个例子展示了如何执行基本的峰值分析。它将帮助您回答以下问题:我如何找到信号的峰值?如何测量峰与峰之间的距离?我如何测量一个受趋势影响的信号的峰值幅度?如何在嘈杂信号中找到峰值?如何找到局部极小值?
苏黎世太阳黑子相对数测量了太阳黑子的数量和大小。使用findpeaks
函数查找峰值的位置和值。
负载sunspot.dat年=太阳黑子(:1);relNums =太阳黑子(:,2);findpeaks (relNums,年)包含(“年”) ylabel (“太阳黑子数量”)标题(“找到所有峰”)
上面的图显示了300年来太阳黑子的数量,并标记了探测到的峰值。下一节将展示如何测量这些峰之间的距离。
信号的峰值似乎以一定的间隔出现。然而,有些山峰彼此非常接近。的MinPeakProminence
属性可以用来过滤掉这些峰值。考虑在太阳黑子数大于40的情况下,在太阳黑子数大于40的情况下,太阳黑子数大于40的情况。
findpeaks (relNums,年,“MinPeakProminence”, 40)包含(“年”) ylabel (“太阳黑子数量”)标题(“找到著名的山峰”)
以下柱状图显示了峰值区间在各年的分布情况:
figure [pks, locs] = findpeaks(relNums,year,“MinPeakProminence”, 40);peakInterval = diff (loc);直方图(peakInterval)网格在包含(“间隔年”) ylabel (发生的频率)标题(“峰值间隔(年)直方图”)
AverageDistance_Peaks =意味着(diff (loc))
AverageDistance_Peaks = 10.9600
分布表明,大部分峰值间隔在10 ~ 12年之间,表明信号具有周期性。此外,两次太阳活动高峰之间10.96年的平均间隔与已知的11年太阳黑子活动周期相吻合。
你可能想把平的峰视为峰或排除它们。在后一种情况下,最小偏移被定义为峰值与其相邻峰之间的幅值差,使用阈值
财产。
负载clippedpeaks.mat数字%在第一个图中显示所有的峰值斧子(1)=次要情节(2,1,1);findpeaks (saturatedData)包含(“样本”) ylabel (“振幅”)标题(“检测饱和峰”)%指定第二个地块的最小偏移量斧子(2)=次要情节(2,1,2);findpeaks (saturatedData“阈值”(5)包含“样本”) ylabel (“振幅”)标题(“滤除饱和峰值”)链接并放大以显示更改linkaxes (ax (1:2),“xy”轴(ax,[50 70 0 250])
第一副图显示,在一个平坦的峰,上升边被检测为峰。第二个子图显示,指定一个阈值可以帮助拒绝平坦的峰值。
这个例子显示了心电信号的峰值分析。心电图是一种随时间变化的心脏电活动的测量方法。该信号是由附着在皮肤上的电极测量的,并且对由于运动伪影造成的电源干扰和噪声等干扰很敏感。
负载noisyecg.matt = 1:长度(noisyECG_withTrend);图绘制(t, noisyECG_withTrend)标题(“趋势信号”)包含(“样本”);ylabel (“电压(mV)”)传说(嘈杂的ECG信号的网格)在
消除趋势数据
上面的信号显示了一个基线偏移,因此不代表真实的振幅。为了去除趋势,拟合一个低阶多项式到信号,并使用多项式去趋势。
(p, s,μ)= polyfit((1:元素个数(noisyECG_withTrend))”,noisyECG_withTrend 6);f_y = polyval (p(1:元素个数(noisyECG_withTrend))”[],μ);ECG_data = noisyECG_withTrend - f_y;%去趋势数据图绘制(t, ECG_data)网格在ax =轴;轴([ax(1:2) -1.2 1.2])去趋势ECG信号的)包含(“样本”) 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);
对于横波的检测,要找到信号中的局部极小值,并适当地应用阈值。
求信号的局部极小值
局部极小值可以通过在原始信号的反方向上寻找峰值来检测。
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])网格在传奇(心电信号的,R波的,' S波)包含(“样本”) ylabel (“电压(mV)”)标题(噪声心电信号中的R波和S波)
接下来,我们试着确定Q波的位置。当Q波被噪声掩埋时,对峰值进行阈值化以定位Q波会导致检测到不必要的峰值。我们先对信号进行滤波,然后找出峰值。采用Savitzky-Golay滤波去除信号中的噪声。
smoothECG = sgolayfilt (ECG_data 7 21);图绘制(t ECG_data“b”t smoothECG“r”网格)在轴紧包含(“样本”) ylabel (“电压(mV)”)传说(嘈杂的ECG信号的,“过滤信号”)标题(“滤波噪声心电信号”)
我们对平滑信号进行峰值检测,并使用逻辑索引来查找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”)情节(locs_Swave smoothECG (locs_Swave),“rs”,“MarkerFaceColor”,“b”网格)在标题(“信号的阈值峰值”)包含(“样本”) ylabel (“电压(mV)”) ax =轴;轴([0 1850 -1.1 1.1])光滑的ECG信号的,“Q波”,非线性波的,' S波)
上图显示了在噪声心电信号中成功检测到QRS复波。
噪声信号与平滑信号之间的误差
注意原始信号和去趋势滤波信号的QRS复波之间的平均差异。
%极值[val_Qwave, val_Rwave, val_Swave] = deal(smoothECG(locs_Qwave), smoothECG(locs_Rwave), smoothECG(locs_Swave));mean(((noisyECG_withTrend(locs_Qwave) - val_Qwave)))
meanError_Qwave = 0.2771
mean(((noisyECG_withTrend(locs_Rwave) - val_Rwave)))
meanError_Rwave = 0.3476
meanError_Swave = mean((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);%平均下降水平smoothECG helperPeakAnalysisPlot (t,...locs_Qwave、locs_Rwave locs_Swave,...val_Qwave、val_Rwave val_Swave,...avg_riseTime avg_fallTime,...avg_riseLevel avg_fallLevel)