Finding Valley of Waveform (local minimum) without displacing wave

9 visualizaciones (últimos 30 días)
I am trying to find the peak and valley of a waveform. My data is attached in the matrix. It is a waveform repeated four times. I have written code based off of another thread. I am using findpeaks function, which worked well. I then used taking the max of the matrix and subtracting it to inverse the waveforms. However, it is displacing the waveform, which is a problem because I am trying to get the ratio of the peak to valley, so the displacing of the waveform is giving me inaccurate ratio. I will attach my code. Any ideas on how I might go about finding the valleys without displacing the waveform?
if true
datain=example;
fs=4e4;
[pks,locs,w,p]=findpeaks(datain,fs,'NPeaks',4);
inverted=max(datain)-datain;
pksmean=mean(pks);
[valleys,locsvalley,wvalley,pvalley]=findpeaks(inverted,fs,'NPeaks',4,'WidthReference','halfheight');
valleysmean=mean(valleys);
peakvalleyratio=pksmean/valleysmean;
halfwidthaveragevalleys=mean(wvalley);
end

Respuesta aceptada

Star Strider
Star Strider el 18 de Nov. de 2016
It’s easiest to use the subscripts rather than the times to get the valleys. Also, there appears to be a bug in findpeaks such that supplying the sampling frequency does not produce the correct times for the peak locations. An easy workaround is to provide a time vector instead and use that.
See if this does what you want:
D = load('Krispy Scripts example.mat');
datain=D.datain;
fs=4e4;
t = linspace(0, 1, length(datain))'/fs; % Time Vector
[pks,locs,w,p]=findpeaks(datain,t,'NPeaks',4);
inverted=max(datain)-datain;
pksmean=mean(pks);
[valleys,locsvalley,wvalley,pvalley]=findpeaks(inverted,'NPeaks',4,'WidthReference','halfheight');
valleysmean=mean(valleys);
peakvalleyratio=pksmean/valleysmean;
halfwidthaveragevalleys=mean(wvalley);
valleys_actual = datain(locsvalley);
valleys_time = t(locsvalley);
figure(1)
plot(t, datain)
hold on
plot(locs, pks, '^r', 'MarkerFaceColor','r')
plot(valleys_time, valleys_actual, 'vr', 'MarkerFaceColor','r')
hold off
grid
The Plot
  7 comentarios
Greg Dionne
Greg Dionne el 5 de Dic. de 2016
I think your observed issue with FINDPEAKS can be traced to how you set the input:
t = linspace(0, 1, length(datain))'/fs;
This should read instead:
t = (0:length(datain)-1)'/fs;

Iniciar sesión para comentar.

Más respuestas (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by