2008-08-06 19 views
50

Usamos una tarjeta de adquisición de datos para tomar lecturas de un dispositivo que aumenta su señal a un pico y luego vuelve a acercarse al valor original. Para encontrar el valor máximo, actualmente buscamos en la matriz la lectura más alta y usamos el índice para determinar el tiempo del valor máximo que se usa en nuestros cálculos.Detección de picos de la señal medida

Esto funciona bien si el valor más alto es el pico que estamos buscando, pero si el dispositivo no está funcionando correctamente, podemos ver un segundo pico que puede ser mayor que el pico inicial. Tomamos 10 lecturas por segundo de 16 dispositivos durante un período de 90 segundos.

Mi idea inicial es recorrer las lecturas para ver si los puntos anterior y siguiente son menores que los actuales para encontrar un pico y construir una matriz de picos. Quizás deberíamos mirar un promedio de varios puntos a cada lado de la posición actual para permitir el ruido en el sistema. ¿Es esta la mejor manera de proceder o hay mejores técnicas?


Hacemos uso de LabVIEW y he comprobado el LAVA forums y hay una serie de ejemplos interesantes. Esto es parte de nuestro software de prueba y estamos tratando de evitar el uso de demasiadas bibliotecas VI no estándar, así que esperaba recibir comentarios sobre el proceso/algoritmos involucrados en lugar de un código específico.

Respuesta

8

Puede intentar promediar la señal, es decir, para cada punto, promedie el valor con los 3 o más puntos que lo rodean. Si las señales de ruido son enormes, incluso esto puede no ser de ayuda.

Me doy cuenta de que esto era independiente del idioma, pero adivinando que está utilizando LabView, hay muchos VI procesadores de señal preempaquetados que vienen con LabView que puede usar para suavizar y reducir el ruido. El NI forums es un gran lugar para obtener ayuda más especializada en este tipo de cosas.

2

Creo que quiere cross-correlate su señal con una señal esperada, ejemplar. Sin embargo, ha pasado mucho tiempo desde que estudié el procesamiento de señales e incluso entonces no presté mucha atención.

0

No sé mucho sobre instrumentación, por lo que esto podría ser totalmente impráctico, pero de nuevo podría ser una dirección diferente útil. Si sabe cómo pueden fallar las lecturas, y hay un cierto intervalo entre los picos dados tales fallos, ¿por qué no hacer el descenso de gradiente en cada intervalo? Si el descenso te lleva de vuelta a un área que has buscado antes, puedes abandonarlo. Dependiendo de la forma de la superficie muestreada, esto también puede ayudarlo a encontrar los picos más rápido que la búsqueda.

6

Este problema se ha estudiado con cierto detalle.

Hay un conjunto de implementaciones muy actualizadas en las clases TSpectrum* de ROOT (una herramienta de análisis de física nuclear/de partículas). El código funciona en datos de una a tres dimensiones.

El código fuente de ROOT está disponible, por lo que puede obtener esta implementación si lo desea.

De la documentación TSpectrum clase:

Los algoritmos utilizados en esta clase se han publicado en las siguientes referencias:

[1] M.Morhac et al.: Fondo métodos de eliminación para coincidencia multidimensional rayos gamma espectros. Instrumentos Nucleares y Methods in Physics Investigación A 401 (1997) 113- 132.

[2] M.Morhac et al .: eficiente de uno y de dos dimensiones oro deconvolución y su aplicación a gamma- descomposición del espectro de rayos. Instrumentos y métodos nucleares en Physics Research A 401 (1997) 385-408.

[3] M.Morhac et al .: identificación de picos en coincidencia multidimensional gamma-ray espectros. Nuclear Instruments y Methods in Research Physics A 443 (2000), 108-125.

Los documentos están vinculados desde la documentación de la clase para aquellos de ustedes que no tienen una suscripción en línea a NIM.


La versión corta de lo que se hace es que el histograma aplanada para eliminar el ruido, y luego máximos locales son detectados por la fuerza bruta en el histograma aplanado.

4

Este método es básicamente del libro de David Marr "Visión"

desenfoque gaussiano su señal con la anchura esperada de sus picos. Esto elimina los picos de ruido y los datos de fase no están dañados.

Entonces Detectar bordes (LOG hará)

A continuación, sus bordes eran los bordes de características (como picos). mira entre los bordes de los picos, clasifica los picos por tamaño, y listo.

He usado variaciones en esto y funcionan muy bien.

0

¿Hay una diferencia cualitativa entre el pico deseado y el segundo pico no deseado? Si ambos picos son "nítidos", es decir, de corta duración, al mirar la señal en el dominio de la frecuencia (al hacer FFT) obtendrás energía en la mayoría de las bandas. Pero si el pico "bueno" tiene energía presente de manera confiable en frecuencias que no existen en el pico "malo", o viceversa, puede ser capaz de diferenciarlas automáticamente de esa manera.

82

Existen muchos métodos de detección de picos clásicos, cualquiera de los cuales podría funcionar. Deberá ver qué, en particular, limita la calidad de sus datos. Aquí están las descripciones básicas:

  1. entre dos puntos cualesquiera de sus datos, (x(0), y(0)) y (x(n), y(n)), sume y(i + 1) - y(i) para 0 <= i < n y llamar a este T ("viaje") y ajuste R ("ascenso") a y(n) - y(0) + k de forma adecuada pequeño k. T/R > 1 indica un pico. Esto funciona bien si es poco probable un viaje grande debido al ruido o si el ruido se distribuye simétricamente alrededor de una forma de curva base. Para su aplicación, acepte el pico más temprano con un puntaje por encima de un umbral determinado, o analice la curva de viaje por valor de subida para obtener propiedades más interesantes.

  2. Use emparejado filtros para puntuación de similitud a una forma de pico estándar (esencialmente, utilice un punto-producto normalizado contra algunos forma de conseguir un coseno-métrica de similitud)

  3. deconvoluir contra una forma de pico estándar y de verificación para valores altos (aunque a menudo encuentro que 2 es menos sensible al ruido para la salida de instrumentación simple).

  4. suavizar los datos y comprobar si tripletes de puntos igualmente espaciados donde, si x0 < x1 < x2, y1 > 0.5 * (y0 + y2) o del check distancias euclidianas como esta: D((x0, y0), (x1, y1)) + D((x1, y1), (x2, y2)) > D((x0, y0),(x2, y2)), que se basa en la desigualdad triangular. El uso de ratios simples nuevamente le proporcionará un mecanismo de puntuación.

  5. Ajuste un modelo de mezcla 2-gaussiano muy simple a sus datos (por ejemplo, Numerical Recipes tiene un buen fragmento de código listo). Toma el pico anterior. Esto tratará correctamente con picos superpuestos.

  6. Encuentre la mejor coincidencia en los datos con una curva Gaussiana, Cauchy, Poisson o lo que sea que tenga. Evalúe esta curva en un amplio rango y reste de una copia de los datos después de notar que es la ubicación máxima. Repetir. Tome el pico más temprano cuyos parámetros de modelo (desviación estándar probablemente, pero algunas aplicaciones podrían preocuparse por la curtosis u otras características) cumplen con algún criterio. Tenga cuidado con los artefactos que quedan cuando se restan los picos de los datos. La mejor coincidencia podría estar determinada por el tipo de puntuación de partido sugerida en el n. ° 2 anterior.

He hecho lo que estás haciendo antes: la búsqueda de picos de datos de secuencias de ADN, la búsqueda de picos en derivados estimados a partir de curvas de medición, y la búsqueda de picos en los histogramas.

Lo invito a que asista cuidadosamente a la línea de base adecuada. El filtrado de Wiener u otro tipo de filtrado o simple análisis de histograma a menudo es una manera fácil de basal en presencia de ruido.

Por último, si sus datos son generalmente ruidosos y está obteniendo datos de la tarjeta como datos finales no referenciados (o incluso referenciados, simplemente no diferenciales), y si está promediando muchas observaciones en cada punto de datos , intente ordenar esas observaciones y tirar el primer y el último cuartil y promediar lo que queda. Hay una gran cantidad de tácticas de eliminación de valores atípicos que pueden ser realmente útiles.

+0

Wow, gracias por toda esta información. He aplicado varias de estas tácticas (mal) para secar y resolver mi problema de detección de picos, pero voy a ver mejor el punto 1. Gracias por esta gran cantidad de datos. John. –

+0

Esta respuesta tiene información agnóstica del idioma mucho mejor, en particular, sé que el código de recetas numéricas que se adapta a un gaussiano funciona bien, ya que lo usamos aquí en el trabajo en la salida FFT. – Brendan

+0

Con respecto a "+ k para una k adecuadamente pequeña", ¿k es un valor constante para todos los cálculos? ¿Cómo lo eliges? ¿Qué significa adecuadamente pequeño? – Loren

5

me gustaría contribuir a este hilo de un algoritmo que I have developed myself:

Se basa en el principio de dispersion: si un nuevo punto de datos es un número x dado de desviaciones estándar de distancia de algunas mover media, el algoritmo señales (también llamadas z-score). El algoritmo es muy robusto porque construye separado media y desviación móviles, de modo que las señales no corrompan el umbral. Por lo tanto, las señales futuras se identifican con aproximadamente la misma precisión, independientemente de la cantidad de señales anteriores. El algoritmo toma 3 entradas: lag = the lag of the moving window, threshold = the z-score at which the algorithm signals y influence = the influence (between 0 and 1) of new signals on the mean and standard deviation. Por ejemplo, un lag de 5 utilizará las últimas 5 observaciones para suavizar los datos. Un threshold de 3.5 indicará si un punto de datos está a 3.5 desviaciones estándar de la media móvil. Y un influence de 0.5 da señales medio de la influencia que tienen los puntos de datos normales. Del mismo modo, un influence de 0 ignora las señales por completo para recalcular el nuevo umbral: una influencia de 0 es por lo tanto la opción más robusta.

funciona de la siguiente manera:

Pseudocódigo

# Let y be a vector of timeseries data of at least length lag+2 
# Let mean() be a function that calculates the mean 
# Let std() be a function that calculates the standard deviaton 
# Let absolute() be the absolute value function 

# Settings (the ones below are examples: choose what is best for your data) 
set lag to 5;   # lag 5 for the smoothing functions 
set threshold to 3.5; # 3.5 standard deviations for signal 
set influence to 0.5; # between 0 and 1, where 1 is normal influence, 0.5 is half 

# Initialise variables 
set signals to vector 0,...,0 of length of y; # Initialise signal results 
set filteredY to y(1,...,lag)     # Initialise filtered series 
set avgFilter to null;       # Initialise average filter 
set stdFilter to null;       # Initialise std. filter 
set avgFilter(lag) to mean(y(1,...,lag));  # Initialise first value 
set stdFilter(lag) to std(y(1,...,lag));  # Initialise first value 

for i=lag+1,...,t do 
    if absolute(y(i) - avgFilter(i-1)) > threshold*stdFilter(i-1) then 
    if y(i) > avgFilter(i-1) 
     set signals(i) to +1;      # Positive signal 
    else 
     set signals(i) to -1;      # Negative signal 
    end 
    # Adjust the filters 
    set filteredY(i) to influence*y(i) + (1-influence)*filteredY(i-1); 
    set avgFilter(i) to mean(filteredY(i-lag,i),lag); 
    set stdFilter(i) to std(filteredY(i-lag,i),lag); 
    else 
    set signals(i) to 0;      # No signal 
    # Adjust the filters 
    set filteredY(i) to y(i); 
    set avgFilter(i) to mean(filteredY(i-lag,i),lag); 
    set stdFilter(i) to std(filteredY(i-lag,i),lag); 
    end 
end 

demostración

Demonstration of robust thresholding algorithm

> Original answer