使用MATLAB在两个峰值或点之间找到局部最大值

时间:2013-02-08 18:04:26

标签: matlab signal-processing

intensity plot

我的强度点在上图中标记为粉红色,并且这些强度点存储在变量中,并以

的形式给出
intensity_info =[ 35.9349
   46.4465
   46.4790
   45.7496
   44.7496
   43.4790
   42.5430
   41.4351
   40.1829
   37.4114
   33.2724
   29.5447
   26.8373
   24.8171
   24.2724
   24.2487
   23.5228
   23.5228
   24.2048
   23.7057
   22.5228
   22.0000
   21.5210
   20.7294
   20.5430
   20.2504
   20.2943
   21.0219
   22.0000
   23.1096
   25.2961
   29.3364
   33.4351
   37.4991
   40.8904
   43.2706
   44.9798
   47.4553
   48.9324
   48.6855
   48.5210
   47.9781
   47.2285
   45.5342
   34.2310 ];

我也有A,B和C点的信息,它们的计算方法如下:

  [maxtab, mintab] = peakdet(intensity_info, 1); % maxtab has A and B information and 
                                                  % mintab has C information

peakdet.m matlab代码可以在这里找到:(http://www.billauer.co.il/peakdet.html)。我想计算点D(其中强度值有视力增加,即如果我们从点A下降强度减小但在点D处强度略微增加)。从下图中可以看出,C点也可以位于D点的左侧,在这种情况下,如果我们从B点强度减小下来,在D点,强度会略有增加。下图中的强度值如下:

intensity_info =[29.3424
   39.4847
   43.7934
   47.4333
   49.9123
   51.4772
   52.1189
   51.6601
   48.8904
   45.0000
   40.9561
   36.5868
   32.5904
   31.0439
   29.9982
   27.9579
   26.6965
   26.7312
   28.5631
   29.3912
   29.7496
   29.7715
   29.7294
   30.2706
   30.1847
   29.7715
   29.2943
   29.5667
   31.0877
   33.5228
   36.7496
   39.7496
   42.5009
   45.7934
   49.1847
   52.2048
   53.9123
   54.7276
   54.9781
   55.0000
   54.9781
   54.7276
   53.9342
   51.4246
   38.2512];

和A,B和C点以与上述相同的方式计算。

在这些情况下如何计算D点?

Intensity plot 2 with C on left of D point

3 个答案:

答案 0 :(得分:0)

我不是MATLAB识字,但如果'tabs'是子表,那么也许你可以操纵它们来创建其他子表......就像(我重复,文盲)

left_of_graph = part of graph from A to C
right_of_graph = part of graph from C to B

left_delta = some fraction of the difference between A's y-value and C's y-value
right_delta = some fraction of the difference between C's y-value and B's y-value

[left_maxtab,left_mintab] = peakdet(left_of_graph,left_delta)
[right_maxtab,right_mintab] = peakdet(right_of_graph,right_delta)

有一些峰值分析的经验,所以我会说这有助于而不是回答问题。您可以找到所需的所有峰值,但这并不意味着数据值得眯眼。噪音和不完美的分辨率是真实的。快乐狩猎!

PS你也可以扫描比整个乐队中的两个邻居更高的所有点。可以保证不会错过任何“真正的”最大值,但是为了给你提供比你可以计算更多的'假'最大值(虽然你的数据看起来非常流畅!)。

答案 1 :(得分:0)

您正在寻找的解决方案是基于迭代的数值方法,在您的特定情况下,二分是最适合的原因,因为统一顺序搜索等其他人不会将间隔作为输入。 这是二分法的实现:

    function [ a, b, L ] = Bisection( f, a, b, e, d )
%[a,b] is the interval for your local maxima; e is the error for the result and d is the step(dx).

L = b - a;
while(L > e)
  xa = ((a + b)/2) - d/2;
  xb = ((a + b)/2) + d/2;

  ya = subs(f,xa);
  yb = subs(f,xb);

  if(ya < yb) 
      a = xa;
  else
      b = xb;
  end
  L = b - a;    
end
end

之前的方法非常有效且易于使用,尽管其他方法甚至更好(在性能方面),如Fibonacci和Gold Section方法。

干杯。

答案 2 :(得分:0)

我找到了替代解决方案。 extrema.m帮助在上面两个garphs中找到了D点。 extrema.m可以从(http://www.mathworks.com/matlabcentral/fileexchange/12275-extrema-m-extrema2-m)下载并以下列方式用于查找D点:

 [ymax,imax,ymin,imin] = extrema(intensity_info);
 figure;plot(x,intensity_info,x(imax),ymax,'g.',x(imin),ymin,'r.');