0

我想使用 Matlab 从数组中找到多个最大值。

这是我的代码,它只返回一个最大值及其位置:

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

问题是我想在数组中检测多个最大值。事实上,我需要检测前两个峰值及其在以下数组中的位置:

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

我只需要前两个最大值的原因是最后两个是快速傅立叶变换结果的前两个的反射。

4

1 回答 1

3

您可以使用许多峰值查找工具来做到这一点。以下是其中一些:

查找峰

该函数返回输入数据中位置的[pks,locs] = findpeaks(data)局部最大值或峰值(从第一个到最后一个找到)。数据需要具有实值元素的行或列向量,其最小长度为 3。将数据的每个元素与其相邻值进行比较。如果数据元素大于其相邻元素或等于 Inf,则该元素是局部峰值。如果没有局部最大值,则 pks 是一个空向量。pkslocsfindpeaks

例如:

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

在此处输入图像描述

1D Non-derivative Peak Finder - 一种 FEX 工具,无需使用一阶或二阶导数即可找到峰,而是使用给定数据集中的局部斜率特征。

PeakFinder - 来自 nate yoder 的 FEX 的另一个峰值查找器。

FEX 中还有很多这样的...

于 2013-01-31T01:40:33.810 回答