Convolví una señal aleatoria con un ruido gaussiano y agregado (ruido de Poisson en este caso) para generar una señal ruidosa. Ahora me gustaría desconvolver esta señal ruidosa para extraer la señal original usando el mismo gaussiano.
El problema es que necesito un código que haga el trabajo de desconvolución en 1D. (Ya he encontrado algunos en 2D, pero mi objetivo principal es 1D).
¿Puede sugerirme algunos paquetes o programas que puedan hacerlo? (Preferiblemente en MATLAB)
Gracias de antemano por la ayuda.
matlab
convolution
continuous-signals
deconvolution
1d
usuario1724
fuente
fuente
Respuestas:
Lo expliqué una vez en StackOverflow .
Su señal se puede representar como un vector, y la convolución es la multiplicación con una matriz N-diagonal (donde N es la longitud del filtro). Supongo, por el bien de la respuesta, que el filtro es mucho más pequeño que la señal
Por ejemplo:
Su vector / señal es:
Su filtro (elemento convolucionario) es:
Entonces la matriz es nxn: (Sea llamado A):
La convolución es:
Y la deconvolución es
Obviamente, en algunos casos la desconvolución no es posible. Estos son los casos en que tiene un singular A. Incluso las matrices que no son singulares, pero que están cerca de ser singulares, pueden ser problemáticas, ya que tendrán un gran error numérico. Puede estimarlo calculando el número de condición de la matriz.
Si A tiene una condición baja, puede calcular el inverso y aplicarlo en el resultado.
Ahora, veamos algunos ejemplos en Matlab:
Primero, hice una función que calcula la matriz de convolución.
Ahora, intentemos ver qué sucede con los diferentes núcleos:
El número de condición es:
Este es problemático, como se esperaba. Después del promedio, es difícil recuperar la señal original.
Ahora, intentemos un promedio más suave:
El resultado es:
Eso va bien con nuestra intuición, un promedio leve de la señal original es mucho más fácil de revertir.
También podemos ver cómo se ve la matriz inversa:
Aquí hay una línea de la matriz:
Podemos ver que la mayor parte de la energía en cada línea se concentra en 3-5 coeficientes alrededor del centro. Por lo tanto, para desconvolucionar, simplemente podemos convolucionar la señal nuevamente con esta aproximación:
¡Este núcleo se ve interesante! Es un operador de afilado. Nuestra intuición es correcta, el afilado cancela el desenfoque.
fuente
Si ha agregado ruido aleatorio, no puede obtener la señal original ... Puede intentar separar las señales en el dominio de la frecuencia (si el ruido y la señal son de frecuencias diferentes). Pero parece que lo que está buscando es un filtro Wiener .
fuente
Creo que esto sigue siendo un problema abierto.
Existen numerosos trabajos de investigación que intentan recuperar la señal original lo mejor que pueden.
Un enfoque clásico es a través de métodos basados en Wavelet .
También hay enfoques de diccionario como este .
Puede obtener una visión más profunda del problema siguiendo la investigación realizada por David L. Donho, Michael Elad, Alfred M. Bruckstein, etc.
fuente
Si entendí el problema correctamente, podemos formalizar el problema de la siguiente manera:
Tenemos un modelo de señal,
No trabajé en la recuperación de la señal bajo el ruido de Poisson, pero busqué en Google y descubrí que este documento puede ser útil. Enfoques similares en ese contexto pueden ser útiles para este problema.
fuente
Se sabe que la desconvolución de datos ruidosos es un problema mal planteado, ya que el ruido se amplía arbitrariamente en la señal reconstruida. Por lo tanto, se requiere un método de regularización para estabilizar la solución. Aquí, puede encontrar un paquete MATLAB que resuelve este problema implementando el algoritmo de regularización de Tikhonov:
https://github.com/soheil-soltani/TranKin .
fuente
Iré al comienzo de la pregunta. Hay funciones de desconvolución en MATLAB que se utilizan para aplicaciones de procesamiento de imágenes. Sin embargo, también puede usar estas funciones para señales 1D. Por ejemplo,
(
sig_noisy = sig_clean * h + noise
) Entonces, ¿por qué no desvincular la señal de salida con lah
función y obtener la señal (casi) de entrada? Estoy usando la deconvolución de Wiener aquíAlternativamente, si no conoce la
h
función, pero conoce la entrada y la salida, esta vez por qué no desvincular la señal de entrada con la salida que le dará lah^-1
función. Luego puede usarlo como filtro para filtrar la señal ruidosa. (sig_clean = sig_noisy * h^-1
)Espero que ayude.
fuente
La convolución es la multiplicación y suma de dos señales una sobre la otra. Estoy hablando de dos señales deterministas. Si desea desconvolucionar uno del otro, esto corresponde a la solución del sistema de ecuaciones. Como sabrás, el sistema de ecuaciones no siempre es solucionable. El sistema de ecuaciones puede estar sobredeterminado, subdeterminado o exactamente solucionable.
En caso de que agregue algo de ruido, perderá algo de información y no podrá recuperarla. Lo que puede hacer es nuevamente resolver el sistema lineal de ecuaciones considerando el hecho de que a cada coeficiente se le agrega un término de ruido. O como puede ver en otra respuesta a su pregunta, es posible que desee estimar primero la señal original a partir de la señal ruidosa y luego tratar de resolver el sistema de ecuaciones.
Es importante tener en cuenta que el ruido se agrega a los coeficientes multiplicados y resumidos. Por lo tanto, incluso podría darse el caso de que su sistema de ecuaciones eventualmente no sea solucionable de manera unívoca. Para estar seguro de que tiene una solución única, su matriz de coeficientes debe ser cuadrada y de rango completo.
fuente
Esto sería difícil de hacer. La convolución con un gaussiano es equivalente a la multiplicación con una transformada de Fourier del gaussiano en el dominio de la frecuencia. Esto resulta ser también un gaussiano en esencia, este es un filtro de paso bajo y realmente efectivo. Una vez que agrega ruido, se destruye toda la información que está en la "banda de detención" del gaussiano. No hay forma de recuperar eso.
La deconvolución se multiplica esencialmente con el inverso de la respuesta de frecuencia. Aquí está el problema: el inverso de la respuesta de frecuencia se vuelve muy, muy grande donde el Gaussiano original es muy pequeño. A estas frecuencias básicamente amplificarías el ruido en grandes cantidades. Incluso si todo estuviera completamente libre de ruido, lo más probable es que te encuentres con problemas numéricos.
fuente
Enfoques
Existen muchos métodos para la deconvolución (es decir, el operador de degradación es lineal e invariante en el tiempo / espacio).
Todos ellos tratan de lidiar con el hecho de que el problema está mal preparado en muchos casos.
Los mejores métodos son aquellos que agregan cierta regularización al modelo de los datos a restaurar.
Pueden ser modelos estadísticos (Priors) o cualquier conocimiento.
Para las imágenes, un buen modelo es una pieza suave o escasa de los gradientes.
Pero por el bien de la respuesta, se tomará un enfoque paramétrico simple: -Minimizar el error de mínimos cuadrados entre los datos restaurados en el modelo y las mediciones.
Modelo
El modelo de mínimos cuadrados es simple.
La función objetivo en función de los datos viene dada por:
El problema de optimización viene dado por:
Donde son los datos a restaurar, es el núcleo borroso (gaussiano en este caso) es el conjunto de medidas dadas. El modelo supone que las mediciones se dan solo para la parte válida de la convolución. Es decir, si y entonces donde .h y x ∈ R n h ∈ R k y ∈ R m m = n - k + 1x h y
x∈Rn h∈Rk y∈Rm m=n−k+1
Esta es una operación lineal en espacio finito, por lo tanto, se puede escribir usando una Forma Matriz:
Donde es la matriz de convolución.H∈Rm×n
Solución
La solución de mínimos cuadrados viene dada por:
Como se puede ver, requiere una inversión de matriz.HTH cond(H)=cond(HTH)−−−−−−−−−−√
La capacidad de resolver esto adecuadamente depende del número de condición del operador que obedece a . cond ( H ) = √
Análisis de número de condición
¿Qué hay detrás de este número de condición?
Se podría responder con álgebra lineal.
Pero un enfoque más intuitivo, en mi opinión, sería pensarlo en el dominio de frecuencia.
Básicamente, el operador de degradación atenúa la energía de, generalmente, alta frecuencia.
Ahora, dado que en frecuencia esto es básicamente una multiplicación sabia de elementos, uno diría que la forma más fácil de invertirlo es la división sabia de elementos por el filtro inverso.
Bueno, es lo que se hizo arriba.
El problema surge con los casos en que el filtro atenúa la energía prácticamente en cero. Entonces tenemos problemas reales ...
Esto es básicamente lo que nos dice el número de condición, cuán fuerte se atenuaron algunas frecuencias en relación con otras.
Arriba se podía ver el número de condición (usando unidades [dB]) en función del parámetro Gaussian Filter STD.
Como se esperaba, cuanto mayor es la ETS, peor es el número de condición, ya que una ETS más alta significa un LPF más fuerte (los valores que bajan al final son problemas numéricos).
Solución numérica
Conjunto de Gaussian Blur Kernel fue creado.
Los parámetros son , y . Los datos son aleatorios y no se agregaron ruidos.k = 31 m = 270n=300 k=31 m=270
En MATLAB, el Sistema Lineal se resolvió utilizando
pinv()
el Pseudo Inverso basado en SVD y el\
operador.Como se puede ver, usando el SVD la solución es mucho menos sensible como se esperaba.
¿Por qué hay un error?
Buscando una solución (para la ETS más alta):
Como se podía ver, la señal se restaura muy bien, excepto por el inicio y el final.
Esto se debe al uso de la convolución válida, que nos dice poco sobre esas muestras.
ruido
Si agregamos ruido, ¡las cosas se verían de otra manera!
La razón por la que los resultados fueron buenos antes se debe al hecho de que MATLAB podría manejar el DR de los datos y resolver las ecuaciones a pesar de que tenían un número de condición grande.
Pero un número de condición grande significa que el filtro inverso amplifica fuertemente (para revertir la atenuación fuerte) algunas frecuencias.
Cuando estos contienen ruido, significa que el ruido se amplificará y la restauración será mala.
Como se puede ver arriba, ahora la reconstrucción no funcionará.
Resumen
Si uno conoce exactamente al Operador de degradación y la SNR es muy buena, los métodos simples de desconvolución funcionarán.
El principal problema de la deconvolución es la intensidad con que el operador de degradación atenúa las frecuencias.
Cuanto más se atenúa, más SNR se necesita para restaurar (esta es básicamente la idea detrás del filtro Wiener ).
¡Las frecuencias que se establecieron en cero no se pueden restaurar!
En la práctica, para tener resultados estables debería agregar algunos antecedentes.
El código está disponible en mi StackExchange Signal Processing Q2969 Repositorio de GitHub .
fuente
En general, un método para manejar el problema que se generaliza sustancialmente a un problema de extracción de dos o más componentes es tomar los espectros G¹, G² ⋯, Gⁿ de las señales # 1, # 2, ..., #n, tabular el total cuadrado Γ (ν) = | G¹ (ν) | ² + | G² (ν) | ² + ⋯ + | Gⁿ (ν) | ² en cada frecuencia ν, y normalizar G₁ (ν) ≡ G¹ (ν) * / Γ (ν), G₂ (ν) ≡ G² (ν) * / Γ (ν), ..., G_n (ν) ≡ Gⁿ (ν) * / Γ (ν). El problema con la mala definición y el ruido corresponde al hecho de que Γ (ν) ~ 0 es posible para algunas frecuencias ν. Para manejar esto, agregue otra "señal" para extraer G⁰ (ν) = constante - la señal de "ruido". Ahora Γ (ν) se limitará estrictamente a continuación. Es casi seguro que esto está relacionado con la regularización de Tikhonov, pero nunca encontré ni establecí ningún resultado de equivalencia u otra correspondencia. Es más simple y más directo e intuitivo.
Alternativamente, puede tratar los G's como vectores equipados con un producto interno adecuado, por ejemplo, «G, G '» ≡ ∫ G (ν) * G' (ν) dν, y tomar (G₀, G₁, ⋯, G_n) como un dual (por ejemplo, el inverso generalizado) de (G⁰, G¹, ⋯, Gⁿ), suponiendo, por supuesto, que los vectores componentes sean linealmente independientes.
Para la deconvolución gaussiana, uno establecería n = 1, G⁰ = la señal de "ruido" y G¹ = la señal de "Gauss".
fuente
La respuesta proporcionada por Andrey Rubshtein fallará miserablemente en presencia de ruido, ya que el problema descrito es muy sensible al ruido y a los errores de modelado. Es una buena idea construir una matriz de convolución, pero el uso de la regularización en la inversión es absolutamente obligatorio en un problema como este. Un método de regularización muy simple y directo (aunque computacionalmente costoso) es la descomposición del valor singular truncado (TSVD). Métodos como Tikhonov Regularization y Total Variation RegularizationVale la pena echarle un vistazo. La regularización de Tikhonov (y su forma general) tiene una forma apilada muy elegante que es fácil de implementar en Matlab. Consulte el libro: Problemas inversos lineales y no lineales con aplicaciones prácticas de Samuli Siltanen y Jennifer Mueller.
fuente
En realidad, la pregunta no está clara. Pero las respuestas carificaron lo que has pedido. Puede construir un sistema de ecuaciones algebraicas lineales como aconsejan algunas personas, eso es correcto, pero la matriz construida sobre la señal conocida se denomina mal condicionada. Eso significa que cuando intentas invertirlo, los errores de truncamiento matan la solución y recibes números aleatorios como resultado. El enfoque común es el límite extremo. Minimiza la norma de solución || x || con restricción || Ax - y || <delta. Entonces está buscando una x con la norma más pequeña que no permita que la diferencia entre Ax e y sea grande. Es muy simple que necesite agregar el llamado parámetro de regularización en la diagonal principal de la matriz obtenida en la aplicación de mínimos cuadrados. Se llama regularización de Tikhonov. Tengo muestras de codificación que hacen eso,
fuente