Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MATLAB中函数findpeak的意外行为';s信号处理工具箱_Matlab_Signal Processing - Fatal编程技术网

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])