Finding more than one maximum in an array

I would like to find more than one maximum value from an array using Matlab.

Here is my code that returns only one max and its position:

[peak, pos] = max(abs(coeffs));

Problem is that I want to detect more than one max in the array. In fact, I would need to detect the first two peaks and their positions in the following array:

>> abs(coeffs())

ans =

    0.5442
    0.5465
    0.5545
    0.5674
    0.5862
    0.6115
    0.6438
    0.6836
    0.7333
    0.7941
    0.8689
    0.9608
    1.0751
    1.2188
    1.4027
    1.6441
    1.9701
    2.4299
    3.1178
    4.2428
    6.3792
   11.8611
   53.7537
   24.9119
   10.8982
    7.3470
    5.7768
    4.9340
    4.4489
    4.1772
    4.0564
    4.0622
    4.1949
    4.4801
    4.9825
    5.8496
    7.4614
   11.1087
   25.6071
   53.2831
   12.0029
    6.4743
    4.3096
    3.1648
    2.4631
    1.9918
    1.6558
    1.4054
    1.2129
    1.0608
    0.9379
    0.8371
    0.7532
    0.6827
    0.6224
    0.5702
    0.5255
    0.4861
    0.4517
    0.4212
    0.3941
    0.3698
    0.3481
    0.3282
    0.3105
    0.2946
    0.2796
    0.2665
    0.2541
    0.2429
    0.2326
    0.2230
    0.2141
    0.2057
    0.1986
    0.1914
    0.1848
    0.1787
    0.1729
    0.1677
    0.1627
    0.1579
    0.1537
    0.1494
    0.1456
    0.1420
    0.1385
    0.1353
    0.1323
    0.1293
    0.1267
    0.1239
    0.1216
    0.1192
    0.1172
    0.1151
    0.1132
    0.1113
    0.1096
    0.1080
    0.1064
    0.1048
    0.1038
    0.1024
    0.1011
    0.1000
    0.0987
    0.0978
    0.0967
    0.0961
    0.0951
    0.0943
    0.0936
    0.0930
    0.0924
    0.0917
    0.0913
    0.0908
    0.0902
    0.0899
    0.0894
    0.0892
    0.0889
    0.0888
    0.0885
    0.0883
    0.0882
    0.0883
    0.0882
    0.0883
    0.0882
    0.0883
    0.0885
    0.0888
    0.0889
    0.0892
    0.0894
    0.0899
    0.0902
    0.0908
    0.0913
    0.0917
    0.0924
    0.0930
    0.0936
    0.0943
    0.0951
    0.0961
    0.0967
    0.0978
    0.0987
    0.1000
    0.1011
    0.1024
    0.1038
    0.1048
    0.1064
    0.1080
    0.1096
    0.1113
    0.1132
    0.1151
    0.1172
    0.1192
    0.1216
    0.1239
    0.1267
    0.1293
    0.1323
    0.1353
    0.1385
    0.1420
    0.1456
    0.1494
    0.1537
    0.1579
    0.1627
    0.1677
    0.1729
    0.1787
    0.1848
    0.1914
    0.1986
    0.2057
    0.2141
    0.2230
    0.2326
    0.2429
    0.2541
    0.2665
    0.2796
    0.2946
    0.3105
    0.3282
    0.3481
    0.3698
    0.3941
    0.4212
    0.4517
    0.4861
    0.5255
    0.5702
    0.6224
    0.6827
    0.7532
    0.8371
    0.9379
    1.0608
    1.2129
    1.4054
    1.6558
    1.9918
    2.4631
    3.1648
    4.3096
    6.4743
   12.0029
   53.2831
   25.6071
   11.1087
    7.4614
    5.8496
    4.9825
    4.4801
    4.1949
    4.0622
    4.0564
    4.1772
    4.4489
    4.9340
    5.7768
    7.3470
   10.8982
   24.9119
   53.7537
   11.8611
    6.3792
    4.2428
    3.1178
    2.4299
    1.9701
    1.6441
    1.4027
    1.2188
    1.0751
    0.9608
    0.8689
    0.7941
    0.7333
    0.6836
    0.6438
    0.6115
    0.5862
    0.5674
    0.5545
    0.5465

The reason I need only the two first max values is that the two last ones are reflections of the two first ones as a result of a fast fourier transform.

Upvotes: 0

Views: 4990

Answers (1)

bla
bla

Reputation: 26069

you can use many peak finding tools to do that. Here's some of them:

Findpeaks

The function [pks,locs] = findpeaks(data) returns local maxima or peaks, pks, in the input data at locations locs (sorted from first to last found). Data requires a row or column vector with real-valued elements with a minimum length of three. findpeaks compares each element of data to its neighboring values. If an element of data is larger than both of its neighbors or equals Inf, the element is a local peak. If there are no local maxima, pks is an empty vector.

For example:

[pks,locs] = findpeaks(abs(coeffs))
plot(abs(coeffs)); hold on
plot(locs(1:2),pks(1:2),'ro'); 

enter image description here

1D Non-derivative Peak Finder - a FEX tool that finds peaks without taking first or second derivatives, rather it uses local slope features in a given data set.

PeakFinder - another peak finder from the FEX by nate yoder.

and there are plenty more of these in the FEX...

Upvotes: 3

Related Questions