2012-01-24 14 views
6

Estoy haciendo un análisis de video.
La matriz resultado final que se ve es algo así como:Cómo extraer y trazar solo los picos mínimos y máximos de una matriz, -análisis de gráficos- 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: array real que se ve es por lo general de 600

Así que cuando sus parcelas, me siento muy mal aspecto gráfico, así que quiero filtrar esta matriz y solo mantiene los ** máximos y máximos ** máximos y mínimos locales para que el gráfico tenga ondas más bonitas

¿Hay alguna manera de hacerlo con MATLAB?

si no, ¿puedo hacerlo con Excel? ya que normalmente guardar esta matriz para sobresalir hoja gusta esta

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 

En el que la primera columna es el tiempo (eje y) y segunda columna es la amplitud. (Eje ​​x)

utilizo esta fórmula para contar máximos locales (Gracias a brettdj de stackoverflow.com)

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

Y esta fórmula para contar mínimos locales

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

Pero lo que necesito es filtrar la matriz para mantener solo los máximos locales y los mínimos locales, de modo que pueda obtener una curva dibujada sin ruido.

Respuesta

1

si desea que los valores máximo y mínimo sólo tiene que utilizar:

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

, pero no podía entender exactamente lo que quiere ... ya que mi cuenta es nueva, que no puedo comentar sobre su pregunta para tratar de entenderlo mejor.

- edición 1:

Ok, ahora entiendo lo que quiere.No sé por qué tiene esta matriz con números repetitivos, pero suponiendo que no los quiere, o al menos es mejor eliminarlos para encontrar máximos y mínimos locales, debe hacer:

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

donde signal_norep será su nueva matriz que contiene sólo los valores que se diferencia de la anterior:

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

Ahora podemos buscar el índice donde se produce máximos y mínimos locales en esta matriz, haciendo:

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; 

y sus valores:

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

Eso es todo x)

+0

no quiero valor mínimo y máximo en la matriz, quiero el máximo local de la curva y el máximo (el pico de la curva) pico de la curva cuando lo trazas en un gráfico quiero decir – Zalaboza

+0

El pico se define si es más que el valor anterior y después (el) – Zalaboza

1

Simplemente escribiría un bucle simple sobre la matriz en Matlab para lograr esto. No veo ningún problema fundamental allí?

Si no desea bucles en Matlab, puede hacerlo con algunas operaciones de matriz. Si tiene dos arreglos a y b igual de largos, puede hacer algo como c = a> b, que le da una lista con unos y ceros. Usted puede usar esto como un delineador para seleccionar los máximos/mínimos. Zo suponga que tiene una matriz desplazada hacia arriba y hacia abajo b, c. Tal que (excepto en los puntos finales) b (n-1) = a (n) = c (n + 1). Puede obtener una matriz que contiene solo los extremos y ceros por q=a.*((a>b).*(a>c) + (a<b).*(a<c))

Un consejo: si la señal tiene ruido, entonces también esta selección será ruidosa. Para suavizar la función, debe aplicar algún tipo de promediado móvil con un núcleo que le guste.

+1

i no quiero min y el valor máximo de la matriz, quiero que los mínimos y máximos locales (el pico de la curva) de pico de la curva cuando se trazan en un gráfico me refiero – Zalaboza

+0

Entonces, puede identificarlos fácilmente por el bucle ¿verdad? También por tener 3 matrices, una con desplazamiento hacia arriba (b), una hacia abajo (c), tienes los picos locales en Matlab realizando a. * (A> b). * (A> c). Entonces obtendrás los extremos y ceros en todos lados. – Bernhard

3

Este VBA

  • lee los datos de la columna A y B en una variante matrices
  • Encuentra los mínimos locales y máximos y extractos que a la segunda matriz
  • Crea una tabla nueva de los mínimos/maximia (ver imagen)

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 
Cuestiones relacionadas