Déconvolution des signaux 1D brouillés par un noyau gaussien

12

J'ai convolué un signal aléatoire avec un bruit gaussien et ajouté (bruit de Poisson dans ce cas) pour générer un signal bruyant. Maintenant, je voudrais déconvoluer ce signal bruyant pour extraire le signal d'origine en utilisant le même gaussien.

Le problème est que j'ai besoin d'un code qui fait le travail de déconvolution en 1D. (J'en ai déjà trouvé en 2D mais mon objectif principal est le 1D).

Pouvez-vous me suggérer des packages ou des programmes capables de le faire? (De préférence dans MATLAB)

Merci d'avance pour l'aide.

user1724
la source
1
utilisez la fonction deconv dans MATLAB.
GOEKHAN GUEL
ne fonctionne pas avec du bruit supplémentaire ...
user1724
Vous ne pouvez pas déconvolver un signal . Vous pouvez estimer une convolution inverse à partir de deux signaux : la réponse impulsionnelle du système et la sortie du système. Lequel essayez-vous de faire?
Phonon
2
@ Phonon: assez tard avec ce commentaire, mais il existe des méthodes de déconvolution aveugles qui ne nécessitent pas de connaître la réponse impulsionnelle du système. Comme vous pouvez l'imaginer, vous pouvez faire mieux si vous connaissez la réponse impulsionnelle.
Jason R
1
@JasonR Fair point.
Phonon

Réponses:

14

Je l'ai expliqué une fois sur StackOverflow .


Votre signal peut être représenté comme un vecteur et la convolution est une multiplication avec une matrice N-diagonale (où N est la longueur du filtre). Je suppose pour la réponse que le filtre est beaucoup plus petit que le signal

Par exemple:

Votre vecteur / signal est:

V1
V2
...
Vn

Votre filtre (élément convolving) est:

  [b1 b2 b3];

Donc, la matrice est nxn: (Qu'on l'appelle 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 convolution est:

A*v;

Et la déconvolution est

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

De toute évidence, dans certains cas, la déconvolution n'est pas possible. Ce sont les cas où vous avez un A. singulier. Même les matrices qui ne sont pas singulières, mais proches de l'être, peuvent être problématiques, car elles auront une grande erreur numérique. Vous pouvez l'estimer en calculant le numéro de condition de la matrice.

Si A est faible, vous pouvez calculer l'inverse et l'appliquer sur le résultat.


Voyons maintenant quelques exemples dans Matlab:

Tout d'abord, j'ai créé une fonction qui calcule la matrice de convolution.

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

Maintenant, essayons de voir ce qui se passe avec différents noyaux:

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

Le numéro de condition est:

 7.8541

Celui-ci est problématique, comme prévu. Après la moyenne, il est difficile de récupérer le signal d'origine.

Maintenant, essayons une moyenne plus douce:

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

Le résultat est:

1.6667

Cela va bien avec notre intuition, une moyenne douce du signal d'origine est beaucoup plus facile à inverser.

Nous pouvons également voir à quoi ressemble la matrice inverse:

 figure;imagesc(inv(A));

entrez la description de l'image ici

Voici une ligne de la matrice:

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

Nous pouvons voir que la plupart de l'énergie dans chaque ligne est concentrée en 3-5 coefficients autour du centre. Par conséquent, afin de déconvoluer, nous pouvons simplement convoluer à nouveau le signal avec cette approximation:

   [0.0208   -0.1640    1.2910   -0.1640    0.0208]

Ce noyau semble intéressant! C'est un opérateur d'affûtage. Notre intuition est correcte, la netteté annule le flou.

Andrey Rubshtein
la source
3
Cette réponse mérite plus de votes positifs
dynamique du
1
Pourquoi pensez-vous que la matrice est tridiagonale? Pour la convolution circulaire, il sera circulant. Dans la plupart des cas, ce sera Toeplitz. Jetez un œil à ma solution.
Royi
Lisez la réponse - J'analyse un cas où le filtre a 3 éléments. Dans la plupart des cas, dans le traitement d'image, le filtre est beaucoup plus petit que le signal. Alors oui, c'est une matrice Toepliz, mais c'est aussi une N-diagonale, où N est la longueur du filtre. La convolution circulaire est également tout à fait inutile dans le traitement d'image.
Andrey Rubshtein
J'ai mis à jour la réponse pour éviter toute confusion supplémentaire.
Andrey Rubshtein
Avez-vous vu le noyau gaussien implémenté en 3 échantillons?
Royi
5

Si vous avez ajouté du bruit aléatoire, vous ne pouvez pas obtenir le signal d'origine ... Vous pouvez essayer de séparer les signaux dans le domaine fréquentiel (si le bruit et le signal sont de fréquences différentes). Mais il semble que ce que vous recherchez soit un filtre de Wiener .

melopsitaco
la source
5

Je pense que c'est toujours un problème ouvert.

Il existe de nombreux articles de recherche qui tentent de récupérer le signal d'origine du mieux qu'ils peuvent.

Une approche classique consiste à utiliser des méthodes basées sur les ondelettes .

Il existe également des approches de dictionnaire comme celle- ci.

Vous pouvez obtenir une vue plus approfondie du problème en suivant les recherches effectuées par David L. Donho, Michael Elad, Alfred M. Bruckstein, etc.

Paul Irofti
la source
1
Un article récent utilisant des ondelettes Morlet complexes par Nguyen, Farge & Schneider semble donner de bons résultats. Google ce code bibliographique: 2012PhyD..241..186N Un de mes amis a utilisé cette méthode avec des ondelettes 2D sur le milieu interstellaire avec d'excellents résultats. Je n'ai pas encore approfondi les choses.
PhilMacKay
3

Si j'ai bien compris le problème, nous pouvons formaliser le problème comme suit:

Nous avons un modèle de signal,

y=HX+η

yHηX

η

Je n'ai pas travaillé sur la récupération du signal sous le bruit de Poisson, mais j'ai googlé et j'ai trouvé que cet article pouvait être utile. Des approches similaires dans ce contexte peuvent être utiles pour ce problème.

Deniz
la source
3

La déconvolution d'une donnée bruyante est connue pour être un problème mal posé, car le bruit est amplifié arbitrairement dans le signal reconstruit. Par conséquent, une méthode de régularisation est nécessaire pour stabiliser la solution. Ici, vous pouvez trouver un package MATLAB qui résout ce problème en implémentant l'algorithme de régularisation de Tikhonov:

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

user10939
la source
3

J'irai au tout début de la question. MATLAB contient des fonctions de déconvolution qui sont utilisées pour les applications de traitement d'image. Cependant, vous pouvez également utiliser ces fonctions pour les signaux 1D. Par exemple,

% 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) Alors pourquoi ne pas déconvoluer le signal de sortie avec la hfonction et obtenir (presque) le signal d'entrée. J'utilise la déconvolution de Wiener ici

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')

entrez la description de l'image ici Alternativement, si vous ne connaissez pas la hfonction, mais connaissez l'entrée et la sortie, cette fois pourquoi ne pas déconvoluer le signal d'entrée avec la sortie qui donnera la h^-1fonction. Ensuite, vous pouvez l'utiliser comme filtre pour filtrer le signal bruyant. ( 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')

entrez la description de l'image ici

J'espère que ça aide.

Ozcan
la source
2

La convolution est la multiplication et la sommation de deux signaux l'un sur l'autre. Je parle de deux signaux déterministes. Si vous voulez déconvoluer l'un de l'autre, cela correspond à la solution du système d'équations. Comme vous le savez peut-être, les systèmes d'équations ne sont pas toujours résolubles. Le système d'équations peut être surdéterminé, sous-déterminé ou exactement résoluble.

Si vous ajoutez du bruit, vous perdez des informations et vous ne pouvez pas récupérer ces informations. Ce que vous pouvez faire, c'est à nouveau de résoudre le système linéaire d'équations en considérant le fait que chaque coefficient est ajouté un terme de bruit. Ou, comme vous pouvez le voir dans une autre réponse à votre question, vous voudrez peut-être d'abord estimer le signal d'origine à partir du signal bruyant, puis essayer de résoudre le système d'équations.

Il est important de noter que le bruit s'ajoute aux coefficients multipliés et additionnés. Par conséquent, il se pourrait même que votre système d'équation ne soit finalement pas uniquement résoluble. Pour être sûr qu'il est uniquement résoluble, votre matrice de coefficients doit être carrée et de rang complet.

GOEKHAN GUEL
la source
2

Ce serait difficile à faire. La convolution avec un gaussien équivaut à une multiplication avec une transformée de Fourier du gaussien dans le domaine fréquentiel. Il se trouve que c'est aussi un gaussien, c'est essentiellement un filtre passe-bas et vraiment efficace. Une fois que vous ajoutez du bruit, toutes les informations contenues dans la "bande d'arrêt" du gaussien sont détruites. Il n'y a aucun moyen de récupérer cela.

La déconvolution se multiplie essentiellement avec l'inverse de la réponse en fréquence. Voici le problème: l'inverse de la réponse en fréquence devient vraiment très grand lorsque le gaussien d'origine est très petit. À ces fréquences, vous amplifieriez essentiellement le bruit par des quantités énormes. Même si tout était complètement silencieux, vous rencontreriez très probablement des problèmes numériques.

Hilmar
la source
2

Approches

Il existe de nombreuses méthodes de déconvolution (à savoir, l'opérateur de dégradation est linéaire et invariant temps / espace).
Tous essaient de faire face au fait que le problème est empoisonné dans de nombreux cas.

Les meilleures méthodes sont celles qui ajoutent une certaine régularisation au modèle des données à restaurer.
Il peut s'agir de modèles statistiques (Prieurs) ou de toute connaissance.
Pour les images, un bon modèle est le lissage par morceaux ou la rareté des dégradés.

Mais pour la réponse, une approche paramétrique simple sera adoptée - Minimiser l'erreur des moindres carrés entre les données restaurées dans le modèle et les mesures.

Modèle

Le modèle des moindres carrés est simple.
La fonction objectif en fonction des données est donnée par:

F(X)=12hX-y22

Le problème d'optimisation est donné par:

argminXF(X)=argminX12hX-y22

Xhy
XRnhRkyRmm=n-k+1

Il s'agit d'une opération linéaire dans un espace fini et peut donc être écrite à l'aide d'une forme matricielle:

argminXF(X)=argminX12HX-y22

HRm×n

Solution

La solution des moindres carrés est donnée par:

X^=(HTH)-1HTy


HTHcond(H)=cond(HTH)

Analyse du numéro de condition

Qu'est-ce qui se cache derrière ce numéro de condition?
On pourrait y répondre en utilisant l'algèbre linéaire.
Mais une approche plus intuitive, à mon avis, serait d'y penser dans le domaine fréquentiel.

Fondamentalement, l'opérateur de dégradation atténue l'énergie, généralement à haute fréquence.
Maintenant, comme en fréquence il s'agit fondamentalement d'une multiplication par élément, on dirait que la manière simple de l'inverser est la division par élément par le filtre inverse.
Eh bien, c'est ce qui est fait ci-dessus.
Le problème se pose avec les cas où le filtre atténue l'énergie pratiquement à zéro. Ensuite, nous avons de vrais problèmes ...
C'est essentiellement ce que le numéro de condition nous dit, à quel point certaines fréquences ont été atténuées par rapport à d'autres.

entrez la description de l'image ici

Au-dessus, on pouvait voir le numéro de condition (en utilisant des unités [dB]) en fonction du paramètre STD du filtre gaussien.
Comme prévu, plus le STD est élevé, plus le nombre de conditions est mauvais, car un STD plus élevé signifie un LPF plus fort (les valeurs qui diminuent à la fin sont des problèmes numériques).

Solution numérique

Ensemble de Gaussian Blur Kernel a été créé.

entrez la description de l'image ici

n=300k=31m=270

Dans MATLAB, le système linéaire a été résolu en utilisant pinv()Pseudo Inverse basé sur SVD et l' \opérateur.

entrez la description de l'image ici

Comme on peut le voir, en utilisant le SVD, la solution est beaucoup moins sensible que prévu.

Pourquoi y a-t-il une erreur?
Recherche d'une solution (pour la MST la plus élevée):

entrez la description de l'image ici

Comme on pouvait le voir, le signal est très bien restitué, sauf pour le début et la fin.
Cela est dû à l'utilisation de la convolution valide qui nous en dit peu sur ces échantillons.

Bruit

Si nous ajoutions du bruit, les choses auraient un aspect différent!
La raison pour laquelle les résultats étaient bons auparavant est due au fait que MATLAB pouvait gérer le DR des données et résoudre les équations même si leur nombre de conditions était élevé.

Mais un grand nombre de conditions signifie que le filtre inverse amplifie fortement (pour inverser la forte atténuation) certaines fréquences.
Lorsque ceux-ci contiennent du bruit, cela signifie que le bruit sera amplifié et que la restauration sera mauvaise.

entrez la description de l'image ici

Comme on pouvait le voir ci-dessus, maintenant la reconstruction ne fonctionnera pas.

Sommaire

Si l'on connaît exactement l'opérateur de dégradation et que le SNR est très bon, des méthodes de déconvolution simples fonctionneront.
Le problème principal de la déconvolution est de savoir à quel point l'opérateur de dégradation atténue les fréquences.
Plus il s'atténue, plus le SNR est nécessaire pour restaurer (c'est essentiellement l'idée derrière Wiener Filter ).
Les fréquences qui ont été mises à zéro ne peuvent pas être restaurées!

En pratique, pour avoir des résultats stables, il faut ajouter quelques priors.

Le code est disponible sur mon référentiel de traitement de signaux StackExchange Q2969 GitHub .

Royi
la source
2

En général, une méthode pour traiter le problème qui se généralise sensiblement à un problème d'extraction de deux composants ou plus consiste à prendre les spectres G¹, G² ⋯, Gⁿ des signaux # 1, # 2, ..., #n, tabuler le total carré Γ (ν) = | G¹ (ν) | ² + | G² (ν) | ² + ⋯ + | Gⁿ (ν) | ² à chaque fréquence ν, et normaliser G₁ (ν) ≡ G¹ (ν) * / Γ (ν), G₂ (ν) ≡ G² (ν) * / Γ (ν), ..., G_n (ν) ≡ Gⁿ (ν) * / Γ (ν). Le problème de mal-définition et de bruit correspond au fait que Γ (ν) ~ 0 est possible pour certaines fréquences ν. Pour gérer cela, ajoutez un autre "signal" pour extraire G⁰ (ν) = constante - le signal "bruit". Maintenant, Γ (ν) sera strictement limité ci-dessous. Ceci est presque certainement lié à la régularisation de Tikhonov, mais je n'ai jamais trouvé ni établi de résultat d'équivalence ou d'autre correspondance. C'est plus simple et plus direct et intuitif.

Alternativement, vous pouvez traiter les G comme des vecteurs équipés d'un produit intérieur approprié, par exemple «G, G '» ≡ ∫ G (ν) * G' (ν) dν, et prendre (G₀, G₁, ⋯, G_n) comme un dual (par exemple l'inverse généralisé) de (G⁰, G¹, ⋯, Gⁿ) - en supposant, bien sûr, que les vecteurs composants sont linéairement indépendants.

Pour la déconvolution gaussienne, on établirait n = 1, G⁰ = le signal "bruit" et G¹ = le signal "gaussien".

RockBrentwood
la source
1

La réponse fournie par Andrey Rubshtein échouera misérablement en présence de bruit, car le problème décrit est très sensible au bruit et aux erreurs de modélisation. C'est une bonne idée de construire une matrice de convolution, mais l'utilisation de la régularisation dans l'inversion est un must absolu dans un problème comme celui-ci. Une méthode de régularisation très simple et directe (bien que coûteuse en termes de calcul) est la décomposition de valeur singulière tronquée (TSVD). Des méthodes comme la régularisation de Tikhonov et la régularisation de la variation totalevalent le détour. La régularisation de Tikhonov (et sa forme générale) a une forme empilée très élégante qui est facile à implémenter dans Matlab. Consultez le livre: Problèmes inverses linéaires et non linéaires avec des applications pratiques par Samuli Siltanen et Jennifer Mueller.

Pekkiini
la source
1

En fait, la question n'est pas claire. Mais les réponses ont confirmé ce que vous aviez demandé. Vous pouvez construire un système d'équations algébriques linéaires comme certains le conseillent, c'est exact, mais la matrice construite sur un signal connu est soi-disant mal conditionnée. Cela signifie que lorsque vous essayez de l'inverser, les erreurs de troncature tuent la solution et vous recevez des nombres aléatoires en résultat. L'approche courante est l'extrémum contraint. Vous minimisez la norme de solution || x || avec contrainte || Axe - y || <delta. Vous recherchez donc un tel x avec la plus petite norme qui ne permette pas à la différence entre Ax et y d'être grande. Il est très simple d'ajouter un soi-disant paramètre de régularisation sur la diagonale principale de la matrice obtenue en appliquant les moindres carrés. Cela s'appelle la régularisation de Tikhonov. J'ai des exemples de codage qui font ça,

Andrew Polar
la source