Problem finding "valleys" in signal
    12 views (last 30 days)
  
       Show older comments
    
Hello,
I am using the findpeaks function to find the valleys in a signal, but it is not consistent and was wondering if there was a better way of doing this.
My code is below along with an image of a "missed" valley around the 8 second mark.  Any help on this would be greatly appreciated.
  [yfft_, freqvec_, yfft_dB_, freq_res] = calcFFT(temp_snip, 'hamming', Fs*100, Fs);
  [fft_pks fft_locs] = findpeaks(yfft_, 'MinPeakHeight', 0.004);
  BreathrateHz = freqvec_(fft_locs(2));
  RespRate = (BreathrateHz * snippp)/2
  %Get valleys
  inverted_snip = max(temp_snip) - temp_snip;
  snip_lo = max(inverted_snip);
  [v1, vv] = findpeaks(inverted_snip, "MinPeakDistance", Fs*((RespRate)/2), "MinPeakHeight", snip_lo *.85); %-(Fs*BreathInstance_error))/5);

0 Comments
Answers (3)
  Steven Lord
    
      
 on 18 May 2023
        Have you tried using islocalmin on your original data rather than findpeaks on the "flipped" data?
0 Comments
  Image Analyst
      
      
 on 18 May 2023
        Is it possible your MinPeakDistance is too large?
help sgolayfilt
0 Comments
  Star Strider
      
      
 on 18 May 2023
        I prefer using 'MinPeakProminence' instead of 'MinPeakHeight' since that is usually more robust.  
t = linspace(0, 10);
y = 0.03*sin(2*pi*t*0.7) + 0.06 + randn(size(t))/100;
[pks,locs] = findpeaks(-y, 'MinPeakDistance', 10, 'MinPeakProminence',0.025);
figure
plot(t, y)
hold on
plot(t(locs), -pks, 'xr')
hold off
Adjust the 'MinPeakProminence' value to get the desired result with your data.  
.
0 Comments
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!



