Detección máxima de señal medida

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.

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

Mis pensamientos iniciales son revisar 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?


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

Podría intentar promediar la señal, es decir, para cada punto, promedie el valor con los 3 o más puntos circundantes. 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á usando LabView, hay muchos VI de procesamiento de señal preempaquetados que vienen con LabView que puede usar para suavizar y reducir el ruido. Los foros de NI son un gran lugar para obtener ayuda más especializada en este tipo de cosas.

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

  1. Entre dos puntos cualesquiera en sus datos, (x(0), y(0)) y (x(n), y(n)) , sume y(i + 1) - y(i) para 0 <= i < n y llama a esto T ("viaje") y establece R ("subida") a y(n) - y(0) + k para y(n) - y(0) + k adecuadamente pequeña. 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 filtros combinados para calificar la similitud con una forma de pico estándar (esencialmente, use un producto de punto normalizado contra alguna forma para obtener una métrica de coseno de similitud)

  3. Desconéctese de una forma de pico estándar y compruebe 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 busca trillizos de puntos igualmente espaciados donde, si x0 < x1 < x2, y1 > 0.5 * (y0 + y2) , o comprueba 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 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: encontrar picos en los datos de la secuencia de ADN, encontrar picos en derivados estimados a partir de curvas medidas y encontrar picos en histogtwigs.

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

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

Este problema ha sido estudiado en 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 ROOT está disponible, por lo que puede obtener esta implementación si lo desea.

De la documentación de la clase TSpectrum :

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

[1] M.Morhac et al .: Métodos de eliminación de fondo para espectros de rayos gamma de coincidencia multidimensional. Nuclear Instruments and Methods in Physics Research A 401 (1997) 113 – 132.

[2] M.Morhac et al .: Deconvolución de oro eficiente de una y dos dimensiones y su aplicación a la descomposición de los espectros de rayos gamma. Nuclear Instruments and Methods in Physics Research A 401 (1997) 385-408.

[3] M.Morhac et al .: 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 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 histogtwig se aplana para eliminar el ruido, y luego los máximos locales se detectan mediante la fuerza bruta en el histogtwig aplanado.

Me gustaría contribuir a este hilo un algoritmo que he desarrollado yo mismo :

Se basa en el principio de dispersión : si un nuevo punto de datos es un número x dado de desviaciones estándar de una media móvil, las señales del algoritmo (también llamadas z-score ). El algoritmo es muy robusto porque construye una media móvil y una desviación separadas , de modo que las señales no corrompen 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 e 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 una influence de 0.5 da señales de la mitad de la influencia que tienen los puntos de datos normales. Del mismo modo, una influence de 0 ignora las señales por completo para volver a calcular el nuevo umbral: una influencia de 0 es por lo tanto 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

Demostración de algoritmo de umbral robusto

> Respuesta original

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

Gaussian borra su señal con el ancho esperado de sus picos. esto elimina los picos de ruido y los datos de su fase no están dañados.

Entonces edge detect (LOG lo hará)

Entonces tus bordes fueron los bordes de las características (como los picos). busca los picos entre los bordes, ordena los picos por tamaño y listo.

He usado variaciones en esto y funcionan muy bien.

Creo que quieres correlacionar de forma cruzada tu señal con una señal ejemplar esperada. Sin embargo, ha pasado mucho tiempo desde que estudié el procesamiento de señales e incluso entonces no presté mucha atención.

Puede aplicar algún estándar devision a su lógica y tomar nota de picos sobre x%.

No sé mucho sobre instrumentación, así que esto podría ser totalmente impráctico, pero de nuevo podría ser una dirección diferente. 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.

¿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.