0
if (pbcg(k+M) > pbcg(k-1+M) && pbcg(k+M) > pbcg(k+1+M) && pbcg(k+M) > threshold)

    peaks_y(Counter) = pbcg(k+M);

    peaks_x(Counter) = k + M;

    py = peaks_y(Counter);
    px = peaks_x(Counter);


    plot(px,py,'ro');
    Counter = (Counter + 1)-1;

    fid = fopen('y1.txt','a');
    fprintf(fid, '%d\t%f\n', px, py);
    fclose(fid);
  end
end

このコードは、以前はピークの検出に問題がありませんでした..唯一のピークを検出するための主な要因は、if (pbcg(k+M) > pbcg(k-1+M) && pbcg(k+M) です。 ) > pbcg(k+1+M) && pbcg(k+M) > しきい値) しかし、今のところ、特定の最高ピークではなく、しきい値を超えるすべてのピークが表示され続けます..

更新: 最高のピークに同じ値を取得した 4 つのノードがある場合はどうなりますか?

編集: 同じ値の表面を持つ複数のピークがある場合は、中央の値を取得してプロットします。

つまり、たとえば [1,1,1,4,4,4,2,2,2] です。

5番目の位置にある「4」を取るので、プロットはグラフの中央になります。

4

3 に答える 3

3

組み込みのmax関数を使用して、最大値がしきい値よりも大きいかどうかをテストすると、はるかに高速で読みやすくなります。

[C,I] = max(pbcg);
if C > threshold
    ... 
    %// I is the index of the maximal value, and C is the maximal value.
end
于 2013-07-23T09:33:40.377 に答える
0

ピークを持つベクトルがあると仮定するとpbcg 、中央のベクトルを取得する方法は次のとおりです。

highestPeakValue = max(pbcg)
f = find(pbcg == highestPeakValue);
middleHighestPeakLocation = f(ceil(length(f)/2))

ピークがない場合でもより堅牢にすることができ、2 つの中間ピークがある場合に異なる動作を与えるように調整できることに注意してください (2 つ目のピークが使用されます)。

于 2013-07-25T07:36:54.640 に答える
0

別の解決策として、組み込み関数 を使用するアイデアを評価することもできますfindpeaks。これには、特定の信号内のピークの存在を確認するためのいくつかの方法が含まれます。これらのメソッド内で呼び出すことができます

findPeaks = findpeaks(data,'threshold',threshold_resolution);

私が見る唯一の制限はfindpeaksSignal Processing Toolbox.

編集

定義されたしきい値を超える複数のピークの場合、max次のように最高のピークを計算するために呼び出します。

max(peaks);
于 2013-07-23T16:32:23.970 に答える