findpeaksの閾値設定について

69 views (last 30 days)
Ibuki Takahashi
Ibuki Takahashi on 14 Jun 2021
Commented: Ibuki Takahashi on 14 Jun 2021
変化が微小なグラフにおいて、findpeaksを用いたところ、ノイズ部分もpeak判定がされてしまい、適切なpeak値を求めることができませんでした。
閾値の設定を行い、この問題を解決したいと思っております。
できればプログラムの中で、「xの値が10以内の時に、y軸の値の最大値と最小値の差が3以上」のものを1つのpeak値として設定を行いたいと考えております。
私はmatlabの経験が浅いため、これ以上にもっと簡単な設定方法があれば、教えていただけると幸いです。
よろしくお願いします。
  2 Comments
Akira Agata
Akira Agata on 14 Jun 2021
y = f(x) の形で表される信号に対して「xの値が10以内の時に、y軸の値の最大値と最小値の差が3以上」を求めるには、findpeaks 'MinPeakProminence' オプションを 3 に指定したうえで、見つかったピークのうち x < 10 のものを抽出すれば良いと思います。
「これ以上にもっと簡単な設定方法があれば」とのことですが、具体的な対象信号を確認しないと何とも言えませんので、よろしければ対象となる信号データファイルを添付頂けますでしょうか?
Ibuki Takahashi
Ibuki Takahashi on 14 Jun 2021
Akira Agataさん、分かりやすいご回答ありがとうございました。
手書きで申し訳ございませんが、今求めたいのは、白黒画像の、行の和を計算した、以下のようなグラフを解析したいと考えております。
今回のグラフでは、ピーク値を2個確認できますが、ノイズが入ってしまい、不適切なピーク値が1つ混ざってしまいます。
このノイズを誤認しないように、閾値を設定したいと考えておりました。
また、xの値が10以下ではなく、「xの値の範囲が、10以下の時」(例えば、7<x<19や35<x<47などの任意の範囲)といった閾値の設定ができれば、わかる範囲で教えていただけると幸いです。
簡単なプログラムの書き方を教えていただけるととても助かります。
よろしくお願いします。

Sign in to comment.

Accepted Answer

Akira Agata
Akira Agata on 14 Jun 2021
Edited: Akira Agata on 14 Jun 2021
@Ibuki Takahashi さん、ご説明ありがとうございます。
「xの値の範囲が10以下の時」という条件を、「ピークの半値全幅 (FWHM: Full Width at Half Maximum) が 10以下の時」と近似的に読み替え可能でしたら、'MaxPeakWidth' オプションを指定することで検出可能です。分かりやすくするために、簡単な例を作成してみました。
x = linspace(0,1,1000);
Pos = [1 3 5 7]/10;
Hgt = [2 5 5 1];
Wdt = [2 0.5 2 1]/100;
y = zeros(size(x));
for n = 1:length(Pos)
y = y + Hgt(n)*exp(-((x - Pos(n))/Wdt(n)).^2);
end
% yの最大と最小の差が3以上、かつFWHMが10以下を満たすピークを検出 (-> 左から2番目のピークのみが条件を満たす)
findpeaks(y,'MinPeakProminence',3,'MaxPeakWidth',10)
  1 Comment
Ibuki Takahashi
Ibuki Takahashi on 14 Jun 2021
わかりやすい説明ありがとうございました。

Sign in to comment.

More Answers (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!