2010-05-25 9 views
6

Tengo una matriz dimensional única de valores de coma flotante (C# dobla FYI) y necesito encontrar el "pico" de los valores ... como si graficara.Montura de pico de dimensión única

No puedo simplemente tomar el valor más alto, ya que el pico es en realidad una meseta que tiene pequeñas fluctuaciones. Esta meseta está en medio de un montón de ruido. Estoy buscando una solución que me dé el centro de esta meseta.

Un array ejemplo podría tener este aspecto:

1,2,1,1,2,1,3,2,4,4,4,5,6, 8,8,8,8 , 7,8,7,9,7, 5,4,4,3,3,2,2,1,1,1,1,1,2,1,1,1,1

donde el pico está en algún lugar de la sección en negrita.

¿Alguna idea?

Respuesta

3

Primero debe definir lo que quiere decir con 'pequeño'. Por ejemplo, una fluctuación "pequeña" alrededor del máximo se define como cualquier valor que esté dentro y más; ϵ del máximo. Entonces, es sencillo identificar la meseta.

Pase los datos para identificar el máximo y luego haga una segunda pasada para identificar todos los valores que están dentro y más; ϵ del máximo.

+0

Algunas personas aquí dieron respuestas similares, la suya fue la primera. Gracias Anon, no pensé en abordar el problema de esa manera. Recuperé los índices de matriz de una "ventana" dentro de ± ε del máximo, y promedié esos dos valores. Es una gran combinación de velocidad y precisión. ¡Gracias de nuevo! – bufferz

6

Puede aplicar un low-pass filter a su matriz de entrada, para suavizar las pequeñas fluctuaciones, y luego buscar el pico en los datos filtrados. El ejemplo más simple es probablemente un filtro "boxcar" , donde el valor de salida es la suma de los valores de entrada dentro de una cierta distancia desde la posición de la matriz actual. En pseudocódigo, se vería algo como esto:

for i = 0, samplecount-1 
    if (i < boxcar_radius) or (i >= (samplecount - boxcar_radius)) then 
     filtered_data[i] = 0 // boxcar runs off edge of input array, don't use 
    else 
    filtered_data[i] = 0 
    for j = i-boxcar_radius, i+boxcar_radius 
     filtered_data[i] = filtered_data[i] + input_data[j] 
    endfor 
    endif 
endfor 

Si usted tiene alguna idea de cómo amplia la "meseta" será, se puede elegir el radio vagón de carga (aproximadamente la mitad del ancho de la meseta esperado) para detectar características en el escala apropiada

2

La detección de picos es una de las etapas en Phase Correlation y otros algoritmos de estimación de movimiento utilizados en lugares como la compresión de video. Un enfoque es este: considere un candidato para un pico y una ventana de un cierto número de vecinos. Ahora ajuste una función cuadrática usando la regresión estándar. El pico, con precisión subpíxel, está en el máximo del cuadrático ajustado.

1

La solución obviamente exacta depende de los detalles. Si su distribución es siempre buena, como en su ejemplo podría tener:

def GetPeak(l): 
    large = max(l) * 0.8 
    above_large = [i for i in xrange(len(l)) if l[i] > large] 
    left_peak = min(above_large) 
    right_peak = max(above_large) 
    return (left_peak, right_peak) 
Cuestiones relacionadas