Problem finding "valleys" in signal
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);

Answers (3)
Steven Lord
on 18 May 2023
0 votes
Have you tried using islocalmin on your original data rather than findpeaks on the "flipped" data?
Is it possible your MinPeakDistance is too large?
help sgolayfilt
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.
.
Categories
Find more on Descriptive Statistics in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!