1
$\begingroup$

Suppose we have a time series which have peaks and troughs.(The red curve below)

I would like to get an algorithm which is able to identify the peaks and troughs locations, then find the midpoint between every peak and trough in both X,Y coordinates (the orange points below)

Then connect those midpoints by spline. (the blue line below)

How can I accomplish it using matlab or so? or there is a common solution for such problem?

Thanks in advance,

enter image description here

$\endgroup$
1
$\begingroup$

This is not in matlab but in R. It seems to do what you need. The plot below mimics your original in colors (red is the original; circles are peaks and troughs; orange are the interpolating points; and blue is the interpolating signal).

enter image description here


R Code Below

#31438

#install.packages("quantmod")
require(signal)
require(quantmod)
T <- 100
filt <- butter(5,0.1)
red_line <- filter(filt, rnorm(T, 0, 1))    
peaks <- findPeaks(red_line)
valleys <- findValleys(red_line)

plot(as.numeric(red_line), col="red", type="l")
points(peaks + 1, red_line[peaks], col="red")
points(valleys + 1, red_line[valleys], col="red", lwd = 3)

peak_idx <- 1
valley_idx <- 1
counter <- 1

values <- array(0, c(2,T))

while ( (peak_idx <= length(peaks)) && (valley_idx <= length(valleys)))
{
  mid_idx <- floor((peaks[peak_idx] + valleys[valley_idx]) / 2 )
  mid_value <- (red_line[peaks[peak_idx]] + red_line[valleys[valley_idx]])/2
  points(mid_idx, mid_value, col="orange", lwd = 5)

  values[1,counter] <- mid_idx
  values[2,counter] <- mid_value
  counter <- counter + 1

  if (valleys[valley_idx] > peaks[peak_idx])
  {
    peak_idx <- peak_idx + 1
  }
  else
  {
    valley_idx <- valley_idx + 1
  }
}

values[1,counter] <- T
values[2,counter] <- red_line[T]

interpolated <- spline(values[1,], values[2,], n=T)
lines(interpolated, col="blue")
| improve this answer | |
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.