Note that there are some explanatory texts on larger screens.

plurals
  1. POpeaks and troughs in MATLAB (but with corresponding definition of a peak and trough)
    text
    copied!<p>I want to look for peaks and troughs in a given vector of data, with the following definition.</p> <p>A "peak" is a local maximum at least x% higher than the preceding trough, and a "trough" is a local minimum at least x% lower than the preceding peak. x here is referred to as a cutoff. In the paper I am writing, the cutoff is referred to as the standard deviation of the data.</p> <p>I thought of writing a function that enables me to find a peak and a trough. The function that I wrote was this. I will call this from the main data.</p> <pre><code>function [vectpeak,vecttrough]=peaktrough(cutoff,x,lastobs,t) % This function gives you two outputs: a vector of ones and zeros that locate PEAKS and % a vector of ones and zeros that locate TROUGHS. % To be able to get a vector of peaks and troughs, we have to give % four inputs. % CUTOFF: This is what Chang and Osler [1999] use to identify if a data % point is a peak or a trough. A PEAK is defined as "a local maximum that is % x percent higher than the preceding trough." (Chang and Osler, 1999) % and a TROUGH is defined as "a local minimum that is x percent lower % than the preceding peak." This is a scalar. % VECTOR: This is the vector of data that will be used for the purposes of % the identification. % LASTOBS: This is the last observation of the data. % t: This specifies the time. % Pre-allocations. vectpeak=zeros(lastobs,1); % This is the vector of peaks. vecttrough=zeros(lastobs,1); % This is the vector of troughs. % Computing for the troughid's and peakid's. temptroughid=troughid(cutoff,x,lastobs,t); temppeakid=peakid(cutoff,x,lastobs,t); % Determining whether a function is a peak or a trough. while t&lt;lastobs t=t+1; if x(t)&gt;=temptroughid(t); vecttrough(t)=1; vectpeak(t)=0; maximum=x(t); elseif x(t)&lt;=temppeakid(t); vecttrough(t)=0; vectpeak(t)=1; minimum=x(t); else vecttrough(t)=0; vectpeak(t)=0; end end function findtrough=troughid(cutoff,y,lastobs,t) % This function computes for the TROUGHID which will be used in % determining whether we have a trough or a peak. % Initializations. findtrough=zeros(lastobs,1); tempmin=zeros(lastobs,1); minimum=y(1); % This is how the function works. while t&lt;lastobs; t=t+1; if y(t)&lt;minimum; tempmin(t)=y(t); minimum=y(t); else tempmin(t)=minimum; end findtrough(t)=tempmin(t)*(1+cutoff); end end function findpeak=peakid(cutoff,y,lastobs,t) % This function computes for the PEAKID which will be used in % determining whether we have a peak. % Initializations. findpeak=zeros(lastobs,1); tempmax=zeros(lastobs,1); maximum=y(1); % This is how the function works. while t&lt;lastobs; t=t+1; if y(t)&gt;maximum; tempmax(t)=y(t); maximum=y(t); else tempmax(t)=maximum; end findpeak(t)=tempmax(t)*(1-cutoff); end end end </code></pre> <p>The problem that I am getting is that I am getting weird results. For instance, I get a vector where all are peaks, and none are troughs, which does not make sense, since if I use the <code>findpeaks</code> command of MATLAB, I am able to identify peaks and troughs, and they are not successive. </p> <p>Is there a way where I could tweak my code, or if not, to use findpeaks or its algorithm to find the peaks and troughs based on my definition? </p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload