algorithm - inteligentes - definicion instrumentacion inteligente
Detección de pico de señal medida (9)
¿Existe una diferencia cualitativa entre el pico deseado y el segundo pico no deseado? Si ambos picos son "agudos", es decir, de corta duración, al mirar la señal en el dominio de 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.
Usamos una tarjeta de adquisición de datos para tomar lecturas de un dispositivo que aumenta su señal al máximo 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 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 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 recorrer las lecturas para verificar si los puntos anteriores y siguientes son menores que los actuales para encontrar un pico y construir una serie de picos. Tal vez 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 revisado los foros de LAVA y hay varios ejemplos interesantes. Esto es parte de nuestro software de prueba y estamos tratando de evitar el uso de demasiadas bibliotecas VI no estándar, por lo que esperaba recibir comentarios sobre el proceso / algoritmos involucrados en lugar de código específico.
Creo que desea cross-correlate su señal con una señal esperada y ejemplar. Pero, ha pasado tanto tiempo desde que estudié el procesamiento de señales e incluso entonces no le presté mucha atención.
Este método es básicamente del libro de David Marr "Visión"
Gaussian difumina tu señal con el ancho esperado de tus picos. Esto elimina los picos de ruido y sus datos de fase no están dañados.
Luego detección de bordes (LOG hará)
Entonces tus bordes eran los bordes de las entidades (como picos). busque picos entre los bordes, ordene los picos por tamaño y listo.
He usado variaciones sobre esto y funcionan muy bien.
Este problema ha sido 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 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. Instrumentos y métodos nucleares en la investigación de la física A 401 (1997) 113-132.
[2] M.Morhac et al .: Desconvolución eficiente del oro de una y dos dimensiones y su aplicación a la descomposición de los espectros de rayos gamma. Instrumentos y métodos nucleares en la investigación de física 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 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 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 por la fuerza bruta en el histograma aplanado.
Existen muchos 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:
Entre dos puntos en sus datos,
(x(0), y(0))
y(x(n), y(n))
, sumey(i + 1) - y(i)
para0 <= i < n
llame a estoT
("viaje") y establezcaR
("aumento") eny(n) - y(0) + k
paray(n) - y(0) + k
adecuadamente pequeño.T/R > 1
indica un pico. Esto funciona bien si es improbable un gran desplazamiento 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 por encima de un umbral determinado, o analice la curva de recorrido por valores de aumento para obtener propiedades más interesantes.Use filtros coincidentes para obtener similitud con una forma de pico estándar (esencialmente, use un producto de punto normalizado contra alguna forma para obtener una métrica coseno de similitud)
Deconvolucione contra una forma de pico estándar y verifique valores altos (aunque a menudo encuentro que 2 es menos sensible al ruido para una salida de instrumentación simple).
Alise los datos y verifique los tripletes de puntos igualmente espaciados donde, si
x0 < x1 < x2, y1 > 0.5 * (y0 + y2)
, o verifique las 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. Usar proporciones simples nuevamente le proporcionará un mecanismo de puntuación.Ajuste un modelo de mezcla 2-gaussiano muy simple a sus datos (por ejemplo, Numerical Recipes tiene una buena porción de código lista para usar). Toma el pico más temprano. Esto tratará correctamente los picos superpuestos.
Encuentre la mejor coincidencia en los datos con una simple curva gaussiana, cauchy, de Poisson o de lo que tenga. Evalúe esta curva en un amplio rango y reste de una copia de los datos después de observar su ubicación máxima. Repetir. Tome el pico más temprano cuyos parámetros del modelo (desviación estándar probablemente, pero algunas aplicaciones podrían preocuparse por la curtosis u otras características) cumplen algún criterio. Tenga cuidado con los artefactos que quedan cuando los picos se restan de los datos. La mejor coincidencia podría estar determinada por el tipo de puntuación de coincidencia 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 histogramas.
Le animo a que preste atención a la línea de base adecuada. El filtrado de Wiener u otro tipo de filtrado o análisis de histograma simple es a menudo una forma fácil de referencia en presencia de ruido.
Finalmente, si sus datos son típicamente ruidosos y está obteniendo datos de la tarjeta como salida de un solo extremo sin referencia (o incluso referenciada, simplemente no diferencial), y si está promediando muchas observaciones en cada punto de datos, intente ordenarlas observaciones y tirar el primer y último cuartil y promediar lo que queda. Hay una gran cantidad de tácticas de eliminación tan atípicas que pueden ser realmente útiles.
Me gustaría contribuir a este hilo un algoritmo que he desarrollado yo mismo :
Se basa en el principio de dispersion : si un nuevo punto de datos es un número x dado de desviaciones estándar de alguna media móvil, el algoritmo señala (también llamado 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 usará 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 le da a las señales 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
> Respuesta original
No sé mucho acerca de la instrumentación, por lo que esto podría ser totalmente poco práctico, pero nuevamente 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 hacer un 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 picos más rápido que la búsqueda.
Puede aplicar alguna desviación estándar a su lógica y notar picos superiores al x%.
Puede intentar promediar señales, 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 ayudar.
Me doy cuenta de que esto era independiente del lenguaje, pero suponiendo 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.