Problem finding "valleys" in signal
7 views (last 30 days)
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
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);
Steven Lord on 18 May 2023
Have you tried using islocalmin on your original data rather than findpeaks on the "flipped" data?
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);
plot(t(locs), -pks, 'xr')
Adjust the 'MinPeakProminence' value to get the desired result with your data.