Ecco un algoritmo che potrebbe funzionare a seconda di quanto sia rumoroso il segnale. Qui definisco un picco come set di punti collegati maggiore di un dato valore di soglia.
Supponendo che i dati originali siano nell'array A. In primo luogo, per una soglia:
t = (max(A)+min(A))/2;
Quindi, trovare tutti i punti superiori a questa soglia t: numero
P = A>t;
conte di iscrizioni punti collegati che sono maggiori di t utilizzando bwlabel
L = bwlabel(P);
numberOfPeaks = max(L);
Ora numberOfPeaks dovrebbe dirvi quanti picchi (punti collegati maggiori del valore di soglia) che avete nei vostri dati
Ora per trovare il punto minimo tra i due picchi dobbiamo identificare quei punti che separano i due picchi usando la matrice di etichette L.
firstPoint = find(L==1,1,'last')+1;
lastPoint = find(L==2,1,'first')-1;
Quindi la valle tra i primi due picchi è punti con indice tra firsPoint e LASTPOINT. Il minimo sarebbe quindi
minValue = min(A(firstPoint:lastPoint));
Soluzione che non dipende Image Processing Toolbox
Come @Nzbuu osserva l'Aboth si basa sulla elaborazione dell'immagine funzione STRUMENTI bwlabel. Quindi, qui è via per evitarlo. Innanzitutto, suppongo che l'array P identifichi correttamente i punti appartenenti al picco (P (i) = 1) e quelli appartenenti alle valli (P (i) = - 1). In questo caso, è possibile identificare il limite tra i picchi e le valli quando dP = P(i+1)-P(i) = 1
o -1
.
dP = diff(P);
Per calcolare il numero di picchi semplicemente sommare il numero di 1 di in dP
:
numberOfPeaks = sum(dP==1);
E i punti che identificano la prima valle sono tra
firstPoint = find(dP==-1,1,'first')+1 %# the -1 represents the last point of the peak so add 1
lastPoint = find(dP==1,2,'first'); #% Find the start of the second peak
lastPoint = lastPoint(end); #% Keep the last value
@Nzbuu: Questo ha a che fare con l'elaborazione del segnale. Non tutto il segnale è un'immagine. – Jonas