Deconvoluzione dei segnali 1D offuscata da un kernel gaussiano


12

Ho contorto un segnale casuale con un gaussiano e aggiunto rumore (rumore di Poisson in questo caso) per generare un segnale rumoroso. Ora vorrei deconvolgere questo segnale rumoroso per estrarre il segnale originale usando lo stesso gaussiano.

Il problema è che ho bisogno di un codice che faccia il lavoro di deconvoluzione in 1D. (Ne ho già trovati alcuni in 2D ma il mio obiettivo principale è 1D).

Potete per favore suggerirmi alcuni pacchetti o programmi che sono in grado di farlo? (Preferibilmente in MATLAB)

Grazie in anticipo per l'aiuto.


1
usa la funzione deconv in MATLAB.
GOEKHAN GUEL,

non funziona con rumore aggiunto ...
user1724

Non è possibile deconvolgere un segnale . È possibile stimare una convoluzione inversa dati due segnali : la risposta all'impulso del sistema e l'uscita del sistema. Quale stai cercando di fare?
Phonon,

2
@Phonon: abbastanza tardi con questo commento, ma ci sono metodi di deconvoluzione cieca che non richiedono la conoscenza della risposta all'impulso del sistema. Come puoi immaginare, puoi fare di meglio se conosci la risposta all'impulso.
Jason R,

1
@JasonR Fair point.
Phonon,

Risposte:


14

L'ho spiegato una volta su StackOverflow .


Il tuo segnale può essere rappresentato come un vettore e la convoluzione è una moltiplicazione con una matrice N-diagonale (dove N è la lunghezza del filtro). Sto supponendo per la risposta che il filtro sia molto più piccolo del segnale

Per esempio:

Il tuo vettore / segnale è:

V1
V2
...
Vn

Il filtro (elemento contorto) è:

  [b1 b2 b3];

Quindi la matrice è nxn: (Sia chiamato A):

[b2 b3 0  0  0  0.... 0]
[b1 b2 b3 0  0  0.... 0]
[0  b1 b2 b3 0  0.... 0]
.....
[0  0  0  0  0  0...b2 b3]

La convoluzione è:

A*v;

E la de-convoluzione è

A^(-1) * ( A) * v;

Ovviamente, in alcuni casi la de-convoluzione non è possibile. Questi sono i casi in cui hai singolari A. Anche le matrici che non sono singolari, ma vicine all'essere singolari, possono essere problematiche, poiché avranno un grande errore numerico. È possibile stimarlo calcolando il numero di condizione della matrice.

Se A ha una condizione bassa, è possibile calcolare l'inverso e applicarlo sul risultato.


Ora, vediamo alcuni esempi in Matlab:

Innanzitutto, ho creato una funzione che calcola la matrice di convoluzione.

function A = GetConvolutionMatrix(b,numA)
    A = zeros(numA,numA);
    vec = [b  zeros(1,numA-numel(b))];
    for i=1:size(A,1)
        A(i,:) = circshift(vec,[1 i]);
    end
end

Ora proviamo a vedere cosa succede con kernel diversi:

    b = [1 1 1];
    A = GetConvolutionMatrix(b,10);
    disp(cond(A));

Il numero della condizione è:

 7.8541

Questo è problematico, come previsto. Dopo la media, è difficile ripristinare il segnale originale.

Ora proviamo una media più mite:

b = [0.1 0.8 0.1];
A = GetConvolutionMatrix(b,10);
disp(cond(A));

Il risultato è:

1.6667

Questo va bene con la nostra intuizione, la media leggera del segnale originale è molto più facile da invertire.

Possiamo anche vedere come appare la matrice inversa:

 figure;imagesc(inv(A));

inserisci qui la descrizione dell'immagine

Ecco una riga dalla matrice:

  0.0003   -0.0026    0.0208   -0.1640    1.2910   -0.1640    0.0208   -0.0026    0.0003   -0.0001

Possiamo vedere che la maggior parte dell'energia in ogni linea è concentrata in 3-5 coefficienti attorno al centro. Pertanto, al fine di deconvolgere, possiamo semplicemente convolgere nuovamente il segnale con questa approssimazione:

   [0.0208   -0.1640    1.2910   -0.1640    0.0208]

Questo kernel sembra interessante! È un operatore di affilatura. La nostra intuizione è corretta, la nitidezza annulla la sfocatura.


3
Questa risposta merita più voti
dinamica il

1
Perché pensi che la matrice sia tridiagonale? Per la circonvoluzione circolare sarà circolante. Nella maggior parte dei casi sarà Toeplitz. Dai un'occhiata alla mia soluzione.
Royi,

Leggi la risposta - Sto analizzando un caso in cui il filtro ha 3 elementi. Nella maggior parte dei casi nell'elaborazione delle immagini, il filtro è molto più piccolo del segnale. Quindi sì, è una matrice Toepliz, ma è anche N-diagonale, dove N è la lunghezza del filtro. La convoluzione circolare è anche abbastanza inutile nell'elaborazione delle immagini.
Andrey Rubshtein,

Ho aggiornato la risposta per evitare ulteriori confusioni.
Andrey Rubshtein,

Hai visto il kernel gaussiano che è implementato in 3 esempi?
Royi,

5

Se hai aggiunto rumore casuale non puoi ottenere il segnale originale ... Puoi provare a separare i segnali nel dominio della frequenza (se il rumore e il segnale sono di frequenze diverse). Ma sembra che quello che stai cercando sia un filtro Wiener .


5

Penso che questo sia ancora un problema aperto.

Esistono numerosi documenti di ricerca che tentano di recuperare il segnale originale nel miglior modo possibile.

Un approccio classico è attraverso i metodi basati su Wavelet .

Esistono anche approcci di dizionario come questo .

È possibile ottenere una visione più approfondita del problema seguendo le ricerche condotte da David L. Donho, Michael Elad, Alfred M. Bruckstein ecc.


1
Un recente articolo che utilizza il complesso wavlet Morlet di Nguyen, Farge & Schneider sembra dare buoni risultati. Google questo codice bibliografico: 2012PhyD..241..186N Un mio amico ha usato questo metodo con onde 2D sul mezzo interstellare con risultati eccellenti. Devo ancora esaminarlo nei dettagli.
PhilMacKay,

3

Se ho compreso correttamente il problema, possiamo formalizzare il problema come segue:

Abbiamo un modello di segnale,

y=Hx+η

dove è l'osservazione, è l'operatore di convoluzione e è il rumore. Vogliamo stimare usando l'osservazione e la conoscenza delle caratteristiche del rumore.H η xyHηx

In questo caso, è simulato da una distribuzione di Poisson. Tuttavia, gli approcci del dizionario sopra menzionati sono alla base di un'ipotesi sul rumore gaussiano. In questo caso, Gaussian è l'operatore di convoluzione, non il rumore.η

Non ho lavorato sul recupero del segnale sotto il rumore di Poisson, ma ho cercato su Google e ho trovato questo documento può essere utile. Approcci simili in quel contesto possono essere utili per questo problema.


3

La deconvoluzione di dati rumorosi è noto per essere un problema mal posto, poiché il rumore viene arbitrariamente ingrandito nel segnale ricostruito. Pertanto, è necessario un metodo di regolarizzazione per stabilizzare la soluzione. Qui puoi trovare un pacchetto MATLAB che risolve questo problema implementando l'algoritmo di regolarizzazione di Tikhonov:

https://github.com/soheil-soltani/TranKin .


3

Andrò all'inizio della domanda. Ci sono funzioni di deconvoluzione in MATLAB che vengono utilizzate per le applicazioni di elaborazione delle immagini. Tuttavia, è anche possibile utilizzare queste funzioni per i segnali 1D. Per esempio,

% a random signal
sig_clean = zeros(1,200); 
sig_clean(80:100)=100;

figure
subplot(1,3,1)
plot(sig_clean,'b-.','LineWidth',2)
legend('Clean Signal')

% convolve it with a gaussian
x=1:30;
h = exp(-(x-15).^2/20); h=h/sum(h);
sig_noisy = conv(sig_clean,h,'same');

% and add noise
sig_noisy = awgn(sig_noisy,0,'measured');

subplot(1,3,2)
plot(sig_noisy,'r')
hold on, plot(sig_clean,'b-.','LineWidth',3)
legend('Blurred and noise added signal','Clean Signal')

( sig_noisy = sig_clean * h + noise) Quindi perché non deconvolgere il segnale di uscita con la hfunzione e ottenere il segnale (quasi) di ingresso. Sto usando la deconvoluzione di Wiener qui

sig_deconvolved=deconvwnr(sig_noisy,h,1);

subplot(1,3,3)
plot(sig_noisy,'r')
hold on, plot(sig_clean,'b-.','LineWidth',2)
hold on, plot(sig_deconvolved,'k--','LineWidth',2)
legend('Blurred and noise added signal','Clean Signal','Deconvolved Signal')

inserisci qui la descrizione dell'immagine In alternativa, se non si conosce la hfunzione, ma si conoscono l'ingresso e l'uscita, questa volta perché non deconvolgere il segnale di ingresso con l'uscita che darà la h^-1funzione. Quindi puoi usarlo come filtro per filtrare il segnale rumoroso. ( sig_clean = sig_noisy * h^-1)

h_inv=deconvwnr(sig_clean,sig_noisy,1);

figure;
subplot(1,2,1)
plot(h_inv)
legend('h^-^1')


sig_filtered=conv(sig_noisy,h_inv,'same');
subplot(1,2,2)
plot(sig_noisy,'r')
hold on, plot(sig_clean,'b-.','LineWidth',2)
hold on, plot(sig_filtered,'k--','LineWidth',2)
legend('Blurred and noise added signal','Clean Signal','Filtered Signal')

inserisci qui la descrizione dell'immagine

Spero possa essere d'aiuto.


2

La convoluzione è la moltiplicazione e la somma di due segnali l'uno sull'altro. Sto parlando di due segnali deterministici. Se vuoi deconvolgere l'uno dall'altro, questo corrisponde alla soluzione del sistema di equazioni. Come forse saprai, il sistema di equazioni non è sempre risolvibile. Il sistema di equazioni può essere sovradeterminato, sottodeterminato o esattamente risolvibile.

Nel caso in cui si aggiunga del rumore, si perdono alcune informazioni e non è possibile recuperarle. Quello che puoi fare è di nuovo risolvere il sistema lineare di equazioni considerando il fatto che a ciascun coefficiente viene aggiunto un termine di rumore. O come puoi vedere in un'altra risposta alla tua domanda, potresti voler prima stimare il segnale originale dal segnale rumoroso e quindi provare a risolvere il sistema di equazioni.

È importante notare che il rumore viene aggiunto ai coefficienti moltiplicati e sommati. Pertanto, potrebbe anche accadere che il sistema di equazioni alla fine non sia risolvibile in modo univoco. Per essere sicuro che sia risolvibile in modo univoco, la matrice dei coefficienti dovrebbe essere quadrata e di rango massimo.


2

Questo sarebbe difficile da fare. La convoluzione con un gaussiano equivale alla moltiplicazione con una trasformata di Fourier del gaussiano nel dominio della frequenza. Questo sembra essere anche un gaussiano, in sostanza si tratta di un filtro passa-basso e molto efficace. Una volta aggiunto rumore, tutte le informazioni che si trovano nella "banda di arresto" del gaussiano vengono distrutte. Non c'è modo di recuperarlo.

La de-convoluzione si sta essenzialmente moltiplicando con l'inverso della risposta in frequenza. Ecco il problema: l'inverso della risposta in frequenza diventa molto, molto grande dove l'originale gaussiano è molto piccolo. A queste frequenze amplificheresti sostanzialmente il rumore di enormi quantità. Anche se tutto sarebbe completamente privo di rumore, molto probabilmente ti imbatteresti in problemi numerici.


2

approcci

Esistono molti metodi per la deconvoluzione (vale a dire l'operatore di degrado è lineare e invariante tempo / spazio).
Tutti cercano di affrontare il fatto che il problema è malato in molti casi.

I metodi migliori sono quelli che aggiungono una certa regolarizzazione al modello dei dati da ripristinare.
Può essere modelli statistici (Priori) o qualsiasi conoscenza.
Per le immagini, un buon modello è il saggio liscio o la scarsità dei gradienti.

Ma per motivi di risposta sarà necessario un semplice approccio parametrico: -Minimizzare l'errore dei minimi quadrati tra i dati ripristinati nel modello e le misurazioni.

Modello

Il modello dei minimi quadrati è semplice.
La funzione obiettivo in funzione dei dati è data da:

f(x)=12hxy22

Il problema di ottimizzazione è dato da:

argminxf(x)=argminx12hxy22

Dove sono i dati da ripristinare, è il kernel di sfocatura (gaussiano in questo caso) e è l'insieme di misurazioni date. Il modello presuppone che le misurazioni vengano fornite solo per la parte valida della convoluzione. Vale a dire se e allora dove .xhy
xRnhRkyRmm=nk+1

Questa è un'operazione lineare nello spazio finito, quindi può essere scritta usando un Matrix Form:

argminxf(x)=argminx12Hxy22

Dove è la matrice di convoluzione.HRm×n

Soluzione

La soluzione dei minimi quadrati è data da:

x^=(HTH)1HTy

Come si può vedere, richiede un'inversione di matrice.
La capacità di risolverlo adeguatamente dipende dal numero di condizione dell'operatore che obbedisce a . cond ( H ) =HTHcond(H)=cond(HTH)

Analisi del numero di condizione

Cosa c'è dietro questo numero di condizione?
Si potrebbe rispondere usando l'algebra lineare.
Ma un approccio più intuitivo, secondo me, lo starebbe pensando nel dominio della frequenza.

Fondamentalmente l'operatore di degradazione attenua l'energia, generalmente, ad alta frequenza.
Ora, poiché in frequenza si tratta sostanzialmente di una moltiplicazione saggia di elementi, si direbbe che il modo più semplice per invertirla è la divisione saggia di elementi per il filtro inverso.
Bene, è quello che è stato fatto sopra.
Il problema sorge con i casi in cui il filtro attenua praticamente l'energia a zero. Quindi abbiamo problemi reali ...
Questo è fondamentalmente ciò che ci dice il numero di condizione, quanto duramente alcune frequenze sono state attenuate rispetto ad altre.

inserisci qui la descrizione dell'immagine

Sopra si vedeva il numero di condizione (utilizzando le unità [dB]) in funzione del parametro STD del filtro gaussiano.
Come previsto, maggiore è l'STD, peggiore è il numero della condizione poiché un STD più elevato significa LPF più forte (i valori che scendono alla fine sono numeri).

Soluzione numerica

Nasce l'Ensemble of Gaussian Blur Kernel.

inserisci qui la descrizione dell'immagine

I parametri sono , e . I dati sono casuali e non è stato aggiunto alcun rumore.k = 31 m = 270n=300k=31m=270

In MATLAB è stato risolto il sistema lineare pinv()che utilizza lo pseudo inverso basato su SVD e l' \operatore.

inserisci qui la descrizione dell'immagine

Come si può vedere, utilizzando SVD la soluzione è molto meno sensibile del previsto.

Perché c'è un errore?
Guardando una soluzione (per il più alto STD):

inserisci qui la descrizione dell'immagine

Come si può vedere, il segnale viene ripristinato molto bene, tranne l'inizio e la fine.
Ciò è dovuto all'uso della Convoluzione valida che ci dice poco su quei campioni.

Rumore

Se aggiungessimo rumore, le cose sembrerebbero diversamente!
Il motivo per cui i risultati erano buoni prima è dovuto al fatto che MATLAB poteva gestire il DR dei dati e risolvere le equazioni anche se avevano un numero di condizione elevato.

Ma un numero di condizione elevato indica che il filtro inverso amplifica fortemente (per invertire l'attenuazione forte) alcune frequenze.
Quando quelli contengono rumore significa che il rumore sarà amplificato e il restauro sarà cattivo.

inserisci qui la descrizione dell'immagine

Come si può vedere sopra, ora la ricostruzione non funzionerà.

Sommario

Se si conosce esattamente l'operatore di degradazione e l'SNR è molto buono, funzioneranno semplici metodi di deconvoluzione.
Il problema principale della deconvoluzione è la forza con cui l'operatore di degradazione attenua le frequenze.
Più attenua, più SNR è necessario per ripristinare (questa è fondamentalmente l'idea alla base di Wiener Filter ).
Le frequenze impostate su zero non possono essere ripristinate!

In pratica, al fine di avere risultati stabili su dovrebbe aggiungere alcuni priori.

Il codice è disponibile nel mio repository GitHub di elaborazione del segnale StackExchange Q2969 .


2

In generale, un metodo per gestire il problema che si generalizza sostanzialmente a un problema di estrazione di due o più componenti è quello di prendere gli spettri G¹, G² ⋯, Gⁿ dei segnali # 1, # 2, ..., #n, tabulare il totale quadrato Γ (ν) = | G¹ (ν) | ² + | G² (ν) | ² + ⋯ + | Gⁿ (ν) | ² ad ogni frequenza ν e normalizzare G₁ (ν) ≡ G¹ (ν) * / Γ (ν), G₂ (ν) ≡ G² (ν) * / Γ (ν), ..., G_n (ν) ≡ Gⁿ (ν) * / Γ (ν). Il problema con mal-definizione e rumore corrisponde al fatto che Γ (ν) ~ 0 è possibile per alcune frequenze ν. Per gestirlo, aggiungi un altro "segnale" per estrarre G⁰ (ν) = costante - il segnale "rumore". Ora Γ (ν) sarà strettamente limitato di seguito. Questo è quasi certamente collegato alla regolarizzazione di Tikhonov, ma non ho mai trovato o stabilito alcun risultato di equivalenza o altra corrispondenza. È più semplice, più diretto e intuitivo.

In alternativa, puoi trattare le G come vettori dotati di un prodotto interno adatto, ad es. «G, G '» ≡ ∫ G (ν) * G' (ν) dν, e prendere (G₀, G₁, ⋯, G_n) come un doppio (es. l'inverso generalizzato) di (G⁰, G¹, ⋯, Gⁿ) - supponendo, ovviamente, che i vettori dei componenti siano linearmente indipendenti.

Per la deconvoluzione gaussiana, si dovrebbe impostare n = 1, G⁰ = segnale "rumore" e G¹ = segnale "gaussiano".


1

La risposta fornita da Andrey Rubshtein fallirà miseramente in presenza di rumore, poiché il problema descritto è molto sensibile al rumore e agli errori di modellazione. È una buona idea costruire una matrice di convoluzione, ma l'uso della regolarizzazione nell'inversione è un must assoluto in un problema come questo. Un metodo di regolarizzazione molto semplice e diretto (sebbene computazionalmente costoso) è la decomposizione troncata del valore singolare (TSVD). Metodi come la regolarizzazione di Tikhonov e la regolarizzazione delle variazioni totalivale la pena dare un'occhiata. La regolarizzazione di Tikhonov (e la sua forma generale) ha una forma impilata molto elegante che è facile da implementare in Matlab. Dai un'occhiata al libro: Problemi inversi lineari e non lineari con applicazioni pratiche di Samuli Siltanen e Jennifer Mueller.


1

In realtà, la domanda non è chiara. Ma le risposte hanno confermato ciò che hai chiesto. È possibile costruire un sistema di equazioni algebriche lineari come suggeriscono alcune persone, questo è corretto, ma la matrice costruita sul segnale noto è cosiddetta mal condizionata. Ciò significa che quando si tenta di invertirlo, gli errori di troncamento uccidono la soluzione e si ottengono numeri casuali nel risultato. L'approccio comune è limite estremo. Riduci al minimo la norma di soluzione || x || con vincolo || Ax - y || <delta. Quindi stai cercando tale x con la norma più piccola che non permetta che la differenza tra Ax e y sia grande. È molto semplice aggiungere i cosiddetti parametri di regolarizzazione sulla diagonale principale della matrice ottenuta in applicazione dei minimi quadrati. Si chiama regolarizzazione di Tikhonov. Ho esempi di codifica che lo fanno,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.