Pregunta

Usamos una tarjeta de adquisición de datos para tomar lecturas de un dispositivo que aumenta su señal hasta un pico y luego vuelve a caer hasta cerca del valor original.Para encontrar el valor máximo, actualmente buscamos en la matriz la lectura más alta y utilizamos el índice para determinar el momento del valor máximo que se utiliza en nuestros cálculos.

Esto funciona bien si el valor más alto es el pico que buscamos pero si el dispositivo no funciona 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.

Mis pensamientos iniciales son recorrer las lecturas para ver si los puntos anterior y siguiente son menores que la corriente para encontrar un pico y construir una serie 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 existen mejores técnicas?


Usamos LabVIEW y he verificado el Foros de LAVA 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 de VI no estándar, por lo que esperaba recibir comentarios sobre el proceso/algoritmos involucrados en lugar de código específico.

¿Fue útil?

Solución

Podrías intentar promediar la señal, es decir.para cada punto, promedie el valor con los 3 o más puntos circundantes.Si los ruidos son enormes, es posible que ni siquiera esto ayude.

Me doy cuenta de que esto era independiente del idioma, pero suponiendo que está usando LabView, hay muchos VI de procesamiento de señales preempaquetados que vienen con LabView que puede usar para suavizar y reducir el ruido.El Foros de NI son un gran lugar para obtener ayuda más especializada en este tipo de cosas.

Otros consejos

Existen muchísimos métodos clásicos de detección de picos, cualquiera de los cuales podría funcionar.Tendrá que ver qué limita, en particular, la calidad de sus datos.Aquí hay descripciones básicas:

  1. Entre dos puntos cualesquiera de sus datos, (x(0), y(0)) y (x(n), y(n)), agregar y(i + 1) - y(i) para 0 <= i < n y llama a esto T ("viajar") y establecer R ("elevarse a y(n) - y(0) + k para adecuadamente pequeño k. T/R > 1 indica un pico.Esto funciona bien si es poco probable que se produzca un gran recorrido 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 una puntuación superior a un umbral determinado, o analice la curva de viajes por valores de ascenso para propiedades más interesantes.

  2. Use filtros coincidentes para calificar la similitud con una forma de pico estándar (esencialmente, use un producto escalar normalizado contra alguna forma para obtener una métrica coseno de similitud)

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

  4. Suaviza los datos y comprueba si hay tripletas de puntos igualmente espaciados donde, si x0 < x1 < x2, y1 > 0.5 * (y0 + y2), o verifique 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 del triángulo.El uso de proporciones simples le proporcionará nuevamente un mecanismo de puntuación.

  5. Ajuste un modelo de mezcla de 2 gaussianos muy simple a sus datos (por ejemplo, Numerical Recipes tiene un buen fragmento de código listo para usar).Tome el pico anterior.Esto solucionará correctamente los picos superpuestos.

  6. Encuentre la mejor coincidencia en los datos con una curva simple de Gauss, Cauchy, Poisson o lo que sea.Evalúe esta curva en un rango amplio y réstela de una copia de los datos después de observar su ubicación máxima.Repetir.Tomemos el primer pico cuyos parámetros del modelo (probablemente la desviación estándar, pero algunas aplicaciones pueden preocuparse por la curtosis u otras características) cumplen algún criterio.Tenga cuidado con los artefactos que quedan cuando se restan los picos de los datos.El mejor partido podría determinarse según el tipo de puntuación del partido sugerido en el punto 2 anterior.

He hecho lo que estás haciendo antes:encontrar picos en datos de secuencias de ADN, encontrar picos en derivados estimados a partir de curvas medidas y encontrar picos en histogramas.

Le animo a que preste atención a la línea de base adecuada.El filtrado de Wiener u otro filtrado o análisis de histograma simple suele ser una manera fácil de establecer una línea de base en presencia de ruido.

Finalmente, si sus datos suelen ser ruidosos y los obtiene de la tarjeta como una salida de un solo extremo sin referencia (o incluso referenciada, pero no diferencial), y si está promediando muchas observaciones en cada punto de datos, intente ordenarlas. observaciones y descartar el primer y último cuartil y promediar lo que queda.Existe una gran cantidad de tácticas de eliminación de valores atípicos que pueden resultar realmente útiles.

Este problema ha sido estudiado con cierto detalle.

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

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

Desde el Espectro documentación de clase:

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

[1] M. Morhac y otros:Métodos de eliminación de antecedentes para espectros de rayos gamma de coincidencia multidimensional.Instrumentos y métodos nucleares en investigación física A 401 (1997) 113-132.

[2] M. Morhac y otros:Desaconvolución de oro uno y bidimensional eficiente y su aplicación a la descomposición de espectros de rayos gamma.Instrumentos y métodos nucleares en investigación física A 401 (1997) 385-408.

[3] M. Morhac y otros:Identificación de picos en espectros de rayos gamma de coincidencia multidimensional.Instrumentos y métodos nucleares en Física de la Investigación A 443 (2000), 108-125.

Los artículos 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 se aplana para eliminar el ruido y luego los máximos locales se detectan mediante fuerza bruta en el histograma aplanado.

Me gustaría contribuir a este hilo con un algoritmo que me he desarrollado:

Se basa en el principio de dispersión:Si un nuevo punto de datos está a un número x dado de desviaciones estándar de alguna media móvil, el algoritmo señala (también llamado puntuación z).El algoritmo es muy robusto porque construye un separado media móvil y desviación, de modo que las señales no corrompan el umbral.Por lo tanto, las señales futuras se identifican aproximadamente con 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.A 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.Asimismo, un influence de 0 ignora completamente las señales para recalcular el nuevo umbral:por lo tanto, una influencia de 0 es la opción más sólida.

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

Manifestación

Demonstration of robust thresholding algorithm

> Respuesta original

Este método es básicamente del libro "Vision" de David Marr.

Gaussian desenfoca su señal con el ancho esperado de sus picos.esto elimina los picos de ruido y los datos de fase no se dañan.

Luego detecta el borde (LOG servirá)

Entonces tus bordes eran los bordes de las características (como picos).busque picos entre los bordes, clasifique los picos por tamaño y listo.

He usado variaciones de esto y funcionan muy bien.

creo que quieres correlación cruzada su señal con una señal esperada y ejemplar.Pero ha pasado mucho tiempo desde que estudié procesamiento de señales y aun así no le presté mucha atención.

No sé mucho sobre instrumentación, por lo que esto podría resultar totalmente impráctico, pero también 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 fallas, ¿por qué no realizar un descenso de gradiente en cada intervalo?Si el descenso te lleva de vuelta a una zona que ya has buscado antes, puedes abandonarla.Dependiendo de la forma de la superficie muestreada, esto también podría ayudarle a encontrar picos más rápido que la búsqueda.

¿Existe una diferencia cualitativa entre el pico deseado y el segundo pico no deseado?Si ambos picos son "nítidos", es decirDe corta duración: al observar la señal en el dominio de la frecuencia (al hacer FFT), obtendrá 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, es posible que pueda diferenciarlos automáticamente de esa manera.

Podrías aplicar algunos Desviación Estándar a su lógica y observe los picos superiores al x%.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top