我试图在MATLAB中检测峰值。我试图使用findpeaks
功能。问题是我的数据包含4200行,我只想检测每50行中的最小和最大点。
在我将此代码用于实时加速度计数据之后。
这是我的代码:
[peaks,peaklocations] = findpeaks( filteredX, 'minpeakdistance', 50 );
plot( x, filteredX, x( peaklocations ), peaks, 'or' )
答案 0 :(得分:1)
因此,您希望首先将矢量整形为50个样本行,然后计算每行的峰值。
A = randn(4200,1);
B = reshape (A,[50,size(A,1)/50]); %//which gives B the structure of 50*84 Matrix
pks=zeros(50,size(A,1)/50); %//pre-define and set to zero/NaN for stability
pklocations = zeros(50,size(A,1)/50); %//pre-define and set to zero/NaN for stability
for i = 1: size(A,1)/50
[pks(1:size(findpeaks(B(:,i)),1),i),pklocations(1:size(findpeaks(B(:,i)),1),i)] = findpeaks(B(:,i)); %//this gives you your peak, you can alter the parameters of the findpeaks function.
end
这会为每个细分生成2个矩阵,pklocations和pks。 c的缺点是因为你不知道每个段会得到多少个峰值,并且你的矩阵必须具有相同的每列长度,所以我用零填充它,如果你愿意,可以用NaN填充它。
编辑,因为OP每50个样本只需要1个最大值和1个最小值,所以MATLAB中的min / max函数可以很容易地满足这一要求。
A = randn(4200,1);
B = reshape (A,[50,size(A,1)/50]); %//which gives B the structure of 50*84 Matrix
[pks,pklocations] = max(B);
[trghs,trghlocations] = min(B);
我猜或者,你可以做一个max(pks),但它只是让它变得复杂。