MATLAB中函数findpeak的意外行为';s信号处理工具箱
编辑:实际上这不是意外的行为,但我仍然需要一个解决方案。MATLAB中函数findpeak的意外行为';s信号处理工具箱,matlab,signal-processing,Matlab,Signal Processing,编辑:实际上这不是意外的行为,但我仍然需要一个解决方案。 findpeaks将每个数据元素与其相邻值进行比较。 我有包含峰值的数据,我用信号处理工具箱中的函数检测到这些峰值。有时函数似乎无法正确地检测峰值,当我有两个相邻的相同值时。这种情况在我的数据中非常罕见,但下面是一个示例来说明我的问题: >> values values = -0.0324 -0.0371 -0.0393 -0.0387 -0.0331 -0.0280 -0.021
findpeaks将每个数据元素与其相邻值进行比较。
我有包含峰值的数据,我用信号处理工具箱中的函数检测到这些峰值。有时函数似乎无法正确地检测峰值,当我有两个相邻的相同值时。这种情况在我的数据中非常罕见,但下面是一个示例来说明我的问题:
>> values
values =
-0.0324
-0.0371
-0.0393
-0.0387
-0.0331
-0.0280
-0.0216
-0.0134
-0.0011
0.0098
0.0217
0.0352
0.0467
0.0548
0.0639
0.0740
0.0813
0.0858 <-- here should be another peak
0.0858 <--
0.0812
0.0719
0.0600
0.0473
0.0353
0.0239
0.0151
0.0083
0.0034
-0.0001
-0.0025
-0.0043
-0.0057
-0.0048
-0.0038
-0.0026
0.0007
0.0043
0.0062
0.0083
0.0106
0.0111
0.0116
0.0102
0.0089
0.0057
0.0025
-0.0025
-0.0056
如果我绘制数据,很明显FindPeak忽略了位置18/19
处的一个峰值,因为它们都有0.08579
的值
找到那些缺失的山峰的最佳方法是什么 改用?如果您有图像处理工具箱,您可以使用查找峰值,然后可以使用regionprops查找区域中心(如果您需要),即
最后我写了我自己的更简单版本的findpeaks,这似乎符合我的目的
function [pks,locs] = my_findpeaks(X)
M = numel(X);
pks = [];
locs = [];
if (M < 4)
datamsgid = generatemsgid('emptyDataSet');
error(datamsgid,'Data set must contain at least 4 samples.');
else
for idx=1:M-3
if X(idx)< X(idx+1) && X(idx+1)>=X(idx+2) && X(idx+2)> X(idx+3)
pks = [pks X(idx)];
locs = [locs idx];
end
end
end
end
函数[pks,locs]=my_findpeaks(X)
M=努美尔(X);
pks=[];
locs=[];
if(M<4)
datamsgid=generatemsgid('emptyDataSet');
错误(datamsgid,'数据集必须至少包含4个样本');
其他的
对于idx=1:M-3
如果X(idx)=X(idx+2)&&X(idx+2)>X(idx+3)
pks=[pks X(idx)];
locs=[locs idx];
结束
结束
结束
结束
编辑:为了澄清,问题出现了,当我有一个峰值正好在两个采样点之间,而这两个采样点恰好有相同的值。在一万多起案件中只发生过几次 这是一个老生常谈的话题,但也许有些人仍在寻找更简单的解决方案(就像我今天所做的那样): 也可以从平台上的所有值中减去一些非常小的固定值,第一个值除外。这会导致高原上的每个第一个值始终是各个高原上的最高值,从而将它们作为峰值包括在内 只需在您的代码中创建类似以下部分的内容:
peaks = yourdata;
verysmallvalue = .001;
plateauvalue = peaks(1);
for i = 2:size(peaks,1)
if peaks(i) == plateauvalue
peaks(i) = peaks(i) - verysmallvalue;
else
plateauvalue = peaks(i);
end
end
[PKS,LOCS] = findpeaks(peaks);
plot(yourdata);
hold on;
plot(LOCS, yourdata(LOCS), 'Color', 'Red', 'Line', 'None', 'Marker', 'o');
希望这有帮助 您描述的行为是R2010b之前版本的MATLAB中的已知错误。最起码的例子是
findpeaks([0 1 1 0])
返回[]
,而
findpeaks([0 1 0])
返回峰值的(位置)
该漏洞已在R2010b中修复,稍后,请参阅官方。有了这个修正,
findpeaks
返回“具有重复值的峰值”(我称之为高原)的上升沿。问题不在于我只检测到一个峰值,而在于我根本没有检测到高峰值。@Lucas:是的,这个公式不是很好,过滤解决方案也不能保证解决问题,所以我把它拿走了。不管怎样,imregionalmax
可以满足您的需要,但如果有两个以上的相等值,它也可以工作。您可能仍然希望先进行过滤,以删除由于噪声而导致的局部最大值。imregionalmax似乎确实有效。我可能仍然使用我自己的函数。我看不出X(idx+1)>X(idx+1)
的计算结果如何为真。“一定是某个地方打错了字。”乔纳斯:是的,对不起,你说得对。我采用了旧版本,因为我添加了一些特定于我的问题的内容。它包含错误。请尝试以下资源:,
findpeaks([0 1 1 0])
findpeaks([0 1 0])