2012-01-24 17 views
6

Sto facendo analisi video.
L'array risultato finale che ottengo è qualcosa di simile:Come estrarre e tracciare solo i picchi minimi e massimi di un array, -graph analysis- Con Matlab o excel

signal = 

    Columns 1 through 7 

     73960  73960  73960  73960  68102  68102  68102 

    Columns 8 through 14 

     68102  19187  19187  19187  19187  14664  14664 

    Columns 15 through 21 

     14664  14664  13715  13715  13715  13715  30832 

    Columns 22 through 28 

     30832  30832  30832  53031  53031  53031  53031 

    Columns 29 through 35 

     56897  56897  56897  16104  16104  16104  16104 

    Columns 36 through 42 

     15188  15188  15188  15188  13973  13973  13973 

Nota: effettivo allineamento che ottengo è di solito 600+

Così, quando ho tracciare questo mi sento molto male grafico guardando, quindi voglio filtrare questo array e mantiene solo i picchi ** minimi e minimi ** massimi e minimi locali in modo che il grafico abbia onde più piacevoli

C'è un modo per farlo con MATLAB?

se no, allora posso farlo con Excel? come di solito salvare questa matrice per foglio Excel come non

0.1 68102 
0.15 19187 
0.2 14664 
0.25 13715 
0.3 30832 
0.35 53031 
0.4 56897 
0.45 16104 
0.5 15188 
0.55 13973 
0.6 21437 
0.65 66950 
0.7 65356 
0.75 22562 
0.8 14154 
0.85 13938 
0.9 20692 
0.95 72823 
1 69975 
1.05 15328 
1.1 14494 
1.15 13681 
1.2 14205 
1.25 65278 
1.3 63055 
1.35 16999 
1.4 14050 
1.45 14245 

In cui la colonna 1 è il tempo (asse y) e 2a colonna è l'ampiezza. (Asse x)

uso questa formula per contare massimi locali (Grazie a brettdj da stackoverflow.com)

=SUMPRODUCT(--(B2:B149>B1:B148),--(B2:B149>B3:B150)) 

E questa formula per contare minimi locali

=SUMPRODUCT(--(B2:B149<B1:B148),--(B2:B149<B3:B150)) 

Ma quello di cui ho bisogno è filtrare l'array per mantenere solo i massimi locali ei minimi locali in modo da ottenere curve ben disegnate senza rumore.

risposta

1

Se si desidera che i valori massimi e minimi basta usare:

[sig_min, idx_min] = min(signal); 
[sig_max, idx_max] = max(signal); 

Ma non riuscivo a capire esattamente quello che vuoi ... dato che il mio account è nuovo, Non posso commentare la tua domanda per cercare di capire meglio.

- modifica 1:

Ok, ora capisco quello che vuoi.Non so perché hai questo array con numeri ripetitivi, ma supponendo che non li vuoi, o, almeno, che è meglio rimuoverli per trovare massimi e minimi locali, dovresti fare:

sinal_norep = signal(find(diff(sinal))); 

dove signal_norep sarà il vostro nuovo array che contiene solo i valori che si differenzia da quello ultimo:

On the left is your signal, on the right the new one

Ora possiamo cercare l'indice in cui si verifica massimi locali e minimi su questo array, facendo:

minimas_idx = find(signal_norep(2:end-1)<signal_norep(1:end-2) & signal_norep(2:end-1)<signal_norep(3:end))+1; 
maximas_idx = find(signal_norep(2:end-1)>signal_norep(1:end-2) & signal_norep(2:end-1)>signal_norep(3:end))+1; 

E loro valori:

signal_maximas = signal_norep(maximas_idx); 
signal_minimas = signal_norep(minimas_idx); 

Ecco fatto X)

+0

non voglio il valore minimo e massimo nell'array, voglio il minimo locale e il massimo (il picco della curva) picco di curva quando lo si traccia su un grafico intendo – Zalaboza

+0

Il picco è definito se è Più del valore precedente e dopo (il) – Zalaboza

1

Vorrei semplicemente scrivere un semplice ciclo sull'array in Matlab per ottenere ciò. Non vedo nessun problema fondamentale lì?

Se non si desidera loop in Matlab, è possibile farlo con alcune operazioni di array. Se hai due array equamente lunghi a e b, puoi fare qualcosa come c = a> b, che ti dà una lista con uno e uno zero. You1 può usarlo come oneliner per selezionare i massimi/minimi. Zo supponi di avere un array spostato verso l'alto e verso il basso b, c. Tale che (eccetto per gli endpoint) b (n-1) = a (n) = c (n + 1). È possibile ottenere un array contenente solo gli estremi e gli zeri di q=a.*((a>b).*(a>c) + (a<b).*(a<c))

Un consiglio: se il segnale è disturbato, anche questa selezione sarà disturbata. Per smussare la funzione, dovresti applicare una sorta di media mobile con un kernel che ti piace.

+1

io non voglio min e il valore massimo nella matrice, voglio minimi locali e massimi (il picco della curva) picco della curva quando si traccia su un grafico voglio dire – Zalaboza

+0

Quindi, puoi facilmente identificarli tramite il ciclo giusto? Inoltre, disponendo di 3 matrici, una superiore (b), una ridotta (c), i picchi locali di Matlab eseguono un. * (A> b). * (A> c). Quindi otterrai gli estremi e gli zeri ovunque. – Bernhard

3

Questo VBA

  • legge i dati della colonna A e B in un array variante
  • Trova minimi locali e maxima ed estrae quello al secondo array
  • Crea un grafico nuovo di zecca dei minimi/massimi (vedi immagine)

enter image description here

 Sub NewGraph() 
    Dim X 
    Dim Y 
    Dim lngRow As Long 
    Dim lngCnt As Long 
    Dim Chr As ChartObject 

    X = Range([a1], Cells(Rows.Count, "b").End(xlUp)) 
    Y = Application.Transpose(X) 

    For lngRow = 2 To UBound(X, 1) - 1 
     If X(lngRow, 2) > X(lngRow - 1, 2) Then 
      If X(lngRow, 2) > X(lngRow + 1, 2) Then 
       lngCnt = lngCnt + 1 
       Y(1, lngCnt) = X(lngRow, 1) 
       Y(2, lngCnt) = X(lngRow, 2) 
      End If 
     Else 
      If X(lngRow, 2) < X(lngRow + 1, 2) Then 
       lngCnt = lngCnt + 1 
       Y(1, lngCnt) = X(lngRow, 1) 
       Y(2, lngCnt) = X(lngRow, 2) 
      End If 
     End If 
    Next lngRow 

    ReDim Preserve Y(1 To 2, 1 To lngCnt) 

    Set Chr = ActiveSheet.ChartObjects.Add(250, 175, 275, 200) 
    With Chr.Chart 

     With .SeriesCollection.NewSeries 
      .XValues = Application.Index(Application.Transpose(Y), 0, 1) 
      .Values = Application.Index(Application.Transpose(Y), 0, 2) 
     End With 
     .ChartType = xlXYScatter 
    End With 

End Sub 
Problemi correlati