主要内容

峰值分析

这个例子展示了如何执行基本的峰值分析。它将帮助您回答以下问题:我如何找到信号中的峰值?如何测量峰与峰之间的距离?如何测量受趋势影响的信号的峰值振幅?如何在噪声信号中找到峰值?如何找到局部极小值?

寻找Maxima或Peaks

苏黎世太阳黑子相对数测量了太阳黑子的数量和大小。使用findpeaks函数来查找峰值的位置和值。

负载sunspot.dat年=太阳黑子(:,1);relNums =太阳黑子(:,2);findpeaks (relNums,年)包含(“年”) ylabel (“太阳黑子数量”)标题(“找到所有山峰”

图中包含一个轴对象。标题为Find All Peaks的axes对象包含2个类型为line的对象。

上面的图表显示了300年来太阳黑子的数量,并标记了探测到的峰值。下一节将展示如何测量这些峰值之间的距离。

测量峰间距离

信号的峰值似乎每隔一定的时间出现一次。然而,有些山峰彼此非常接近。的MinPeakProminence属性可以过滤掉这些峰值。考虑在遇到更大的太阳黑子数之前,两边至少下降40个相对太阳黑子数的峰值。

findpeaks (relNums,年,“MinPeakProminence”, 40)包含(“年”) ylabel (“太阳黑子数量”)标题(“发现突出的山峰”

图中包含一个轴对象。标题为Find Prominent Peaks的axes对象包含2个类型为line的对象。

以下直方图显示了各年峰值间隔的分布情况:

figure [pks, locs] = findpeaks(relNums,year,“MinPeakProminence”, 40);peakInterval = diff(locs);直方图(peakInterval)网格包含(“间隔年”) ylabel (“发生频率”)标题(峰值间隔直方图(年)

图中包含一个轴对象。标题为“峰值间隔直方图(年)”的axes对象包含一个类型为直方图的对象。

平均数(diff(locs))
AverageDistance_Peaks = 10.9600

分布表明,大多数峰值间隔在10年至12年之间,表明信号具有周期性。此外,两个峰值之间的平均间隔为10.96年,与已知的11年周期太阳黑子活动相匹配。

在剪切或饱和信号中寻找峰值

您可能希望将平峰视为峰或将它们排除在外。在后一种情况下,最小偏移被定义为峰值与其直接邻居之间的振幅差,使用阈值财产。

负载clippedpeaks.mat数字显示第一个图中的所有峰值Ax (1) = subplot(2,1,1);findpeaks (saturatedData)包含(“样本”) ylabel (“振幅”)标题(“检测饱和峰值”在第二个图中指定最小偏移Ax (2) = subplot(2,1,2);findpeaks (saturatedData“阈值”(5)包含“样本”) ylabel (“振幅”)标题(“过滤饱和峰值”链接并放大以显示更改linkaxes (ax (1:2),“xy”)轴(x,[50 70 0 250])

图中包含2个轴对象。标题为“检测饱和峰值”的Axes对象1包含2个类型为line的对象。标题为“过滤饱和峰值”的Axes对象2包含2个类型为line的对象。

从第一个子图可以看出,在峰为平坦的情况下,将上升边检测为峰。第二个子图表明,指定一个阈值可以帮助拒绝平坦的峰值。

测量峰的振幅

这个例子显示了ECG(心电图)信号中的峰值分析。ECG是对一段时间内心脏电活动的测量。该信号由附着在皮肤上的电极测量,对诸如电源干扰和运动伪影引起的噪声等干扰很敏感。

负载noisyecg.matt = 1:length(noisyECG_withTrend);figure plot(t,noisyECG_withTrend)“趋势信号”)包含(“样本”);ylabel (“电压(mV)”)传说(“噪声心电信号”网格)

图中包含一个轴对象。标题为Signal with Trend的axes对象包含一个line类型的对象。该对象表示噪声心电信号。

消除趋势数据

上述信号显示了基线偏移,因此不代表真实的振幅。为了消除趋势,拟合一个低阶多项式的信号,并使用多项式去趋势。

[p,s,mu] = polyfit((1: nummel (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])“去趋势心电信号”)包含(“样本”) ylabel (“电压(mV)”)传说(“去趋势心电信号”

图中包含一个轴对象。标题为“去趋势心电信号”的axis对象包含一个类型为line的对象。该对象表示去趋势心电信号。

去趋势后,找到QRS复合体,它是心电信号中最突出的重复峰。QRS复合体对应于人类心脏右心室和左心室的去极化。它可以用来确定病人的心率或预测心脏功能异常。下图显示了ECG信号中QRS复合物的形状。

通过阈值来找到感兴趣的峰值

QRS复合体由三个主要部分组成:Q波,R波,S波.R波可以检测到阈值峰值高于0.5 mV。请注意,R波被200多个样本分开。使用此信息通过指定“MinPeakDistance”来删除不需要的峰值。

[~,locs_Rwave] = findpeaks(ECG_data,“MinPeakHeight”, 0.5,...“MinPeakDistance”, 200);

为了检测s波,在信号中找到局部最小值,并适当地应用阈值。

寻找信号中的局部极小值

局部极小值可以通过在原始信号的反转版本上寻找峰值来检测。

ecg_倒置= -ECG_data;[~,locs_Swave] = findpeaks(ecg_reversed,“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波

图中包含一个轴对象。噪声心电信号中标题为R波和S波的轴对象包含3个类型线对象。这些对象代表心电信号,R波,S波。

接下来,我们试着确定Q波的位置。阈值的峰值定位Q波结果检测不需要的峰值,因为Q波埋在噪声中。我们先对信号进行滤波,然后找到峰值。采用Savitzky-Golay滤波去除信号中的噪声。

smoothECG = sgolayfilt(ECG_data,7,21);图绘制(t ECG_data“b”t smoothECG“r”网格)包含(“样本”) ylabel (“电压(mV)”)传说(“噪声心电信号”“过滤信号”)标题(“过滤有噪声的心电信号”

图中包含一个轴对象。标题为Filtering noise ECG Signal的坐标轴对象包含2个类型为line的对象。这些对象分别代表有噪声的心电信号、滤波信号。

我们对平滑信号进行峰值检测,并使用逻辑索引来查找Q波的位置。

[~,min_locs] = findpeaks(-smoothECG,“MinPeakDistance”, 40);%峰值在-0.2mV和-0.5mV之间locs_Qwave = min_locs(smoothECG(min_locs)>-0.5 & smoothECG(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])“平稳心电图信号”“Q波”非线性波的' S波

图中包含一个轴对象。在Signal中标题为Thresholding Peaks的axes对象包含4个类型为line的对象。这些对象代表平滑心电信号,Q波,R波,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 = mean(locs_Rwave-locs_Qwave);平均上升时间avg_fallTime = mean(locs_wave - locs_rwave);平均降落时间avg_riseLevel = mean(val_Rwave-val_Qwave);平均上升水平avg_fallLevel = mean(val_rwave - val_wave);平均下降水平%smoothECG helperPeakAnalysisPlot (t,...locs_Qwave、locs_Rwave locs_Swave,...val_Qwave、val_Rwave val_Swave,...avg_riseTime avg_fallTime,...avg_riseLevel avg_fallLevel)

图中包含一个轴对象。心电信号中标题为QRS-complex的坐标轴对象包含11个类型为line, text的对象。这些对象表示QRS-Complex,峰值,最小值。

另请参阅