Gauss Çekirdeği Bulanık 1D Sinyallerinin Geri Dönüşümü


12

Bir Gaussian ile rastgele bir sinyal çaldım ve gürültülü bir sinyal oluşturmak için gürültü (bu durumda Poisson gürültüsü) ekledim. Şimdi, aynı Gaussian'ı kullanarak orijinal sinyali çıkarmak için bu gürültülü sinyali deconvolve etmek istiyorum.

Sorun ben 1D dekonvolüsyon işini yapan bir koda ihtiyacım var. (2B'de zaten bazılarını buldum ama asıl amacım 1D).

Bana bunu yapabilen bazı paketler veya programlar önerebilir misiniz? (Tercihen MATLAB'da)

Yardımınız için şimdiden teşekkür ederiz.


1
MATLAB içindeki deconv işlevini kullanır.
GOEKHAN GUEL

eklenen gürültü ile çalışmıyor ...
user1724

Bir sinyali dekonvolve edemezsiniz . İki sinyal verilen ters evrişimi tahmin edebilirsiniz : sistemin dürtü yanıtı ve sistem çıkışı. Hangisini yapmaya çalışıyorsun?
Phonon

2
@Phonon: Bu yorumla oldukça geç, ancak sistem dürtü yanıtı hakkında bilgi gerektirmeyen kör dekonvolüsyon yöntemleri var. Tahmin edebileceğiniz gibi, dürtü yanıtını biliyorsanız daha iyisini yapabilirsiniz.
Jason R

1
@JasonR Fuar noktası.
Phonon

Yanıtlar:


14

Bir kez StackOverflow üzerinde açıkladım .


Sinyaliniz bir vektör olarak temsil edilebilir ve evrişim bir N-diyagonal matrisle çarpmadır (burada N, filtrenin uzunluğudur). Cevap uğruna filtrenin sinyalden çok daha küçük olduğunu varsayıyorum

Örneğin:

Vektörünüz / sinyaliniz:

V1
V2
...
Vn

Filtreniz (kıvrımlı eleman):

  [b1 b2 b3];

Yani matris nxn: (A olarak adlandırılsın):

[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]

Evrişim:

A*v;

Ve evrişim

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

Açıkçası, bazı durumlarda konvolüsyon mümkün değildir. Bunlar tekil A'ya sahip olduğunuz durumlardır. Tekil olmayan, ancak tekil olmaya yakın olan matrisler bile büyük sayısal hatalara sahip olacaklarından sorunlu olabilir. Matrisin durum numarasını hesaplayarak tahmin edebilirsiniz .

A'nın durumu düşükse, tersi hesaplayabilir ve sonuca uygulayabilirsiniz.


Şimdi Matlab'daki bazı örnekleri görelim:

İlk olarak, evrişim matrisini hesaplayan bir işlev yaptım.

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

Şimdi, farklı çekirdeklerde neler olduğunu görmeye çalışalım:

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

Koşul numarası:

 7.8541

Bu beklendiği gibi sorunlu. Ortalamadan sonra, orijinal sinyali geri almak zordur.

Şimdi biraz daha hafif ortalama deneyelim:

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

Sonuç:

1.6667

Bu sezgimizle iyi gider, orijinal sinyalin hafif ortalamasının tersine çevrilmesi çok daha kolaydır.

Ters matrisin nasıl göründüğünü de görebiliriz:

 figure;imagesc(inv(A));

resim açıklamasını buraya girin

İşte matristen bir satır:

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

Her bir hattaki enerjinin çoğunun merkez etrafında 3-5 katsayıda yoğunlaştığını görebiliriz. Bu nedenle, dekonvolvasyon yapmak için, sinyali bu yaklaşımla tekrar birleştirebiliriz:

   [0.0208   -0.1640    1.2910   -0.1640    0.0208]

Bu çekirdek ilginç görünüyor! Bir bileme operatörüdür. Sezgimiz doğrudur, keskinleştirme bulanıklığı iptal eder.


3
Bu cevap daha fazla oyu hak ediyor
dinamik

1
Sizce matris neden üçgensel? Dairesel Konvolüsyon için dolaşım olacaktır. Çoğu durumda Toeplitz olacaktır. Çözümüme bir göz atın.
Royi

Cevabı okuyun - Filtrenin 3 elementi olan bir durumu analiz ediyorum. Görüntü işlemede çoğu durumda, filtre sinyalden çok daha küçüktür. Yani evet, bu bir Toepliz matrisi, ama aynı zamanda N-diyagonal, burada N filtrenin uzunluğu. Dairesel evrişim görüntü işlemede de oldukça işe yaramaz.
Andrey Rubshtein

Daha fazla karışıklık olmaması için cevabı güncelledim.
Andrey Rubshtein

3 örnekte uygulanan Gauss Çekirdeğini gördünüz mü?
Royi

5

Rastgele gürültü eklediyseniz, orijinal sinyali alamazsınız ... Frekans alanındaki sinyalleri ayırmayı deneyebilirsiniz (gürültü ve sinyal farklı frekanslardaysa). Ama aradığınız şey bir Wiener filtresi.


5

Bence bu hala açık bir problem.

Orijinal sinyali ellerinden gelenin en iyisini sağlamaya çalışan çok sayıda araştırma makalesi vardır.

Klasik bir yaklaşım Dalgacık Tabanlı Yöntemlerdir .

Gibi sözlük yaklaşımlar da vardır bu one.

David L. Donho, Michael Elad, Alfred M. Bruckstein vb. Tarafından yapılan araştırmayı takip ederek sorunun daha derinlemesine bir görünümünü elde edebilirsiniz.


1
Nguyen, Farge & Schneider'in karmaşık Morlet dalgacığını kullanan yeni bir makale iyi sonuçlar veriyor gibi görünüyor. Google bu bibliyografik kodu: 2012PhyD..241..186N Bir arkadaşım, bu yöntemi yıldızlararası ortamdaki 2D dalgacıklarla mükemmel sonuçlarla kullandı. Henüz ayrıntılara bakmadım.
PhilMacKay

3

Sorunu doğru anladıysam, sorunu şu şekilde resmileştirebiliriz:

Bir sinyal modelimiz var,

y='Hx+η

nerede y gözlemdir, 'H evrişim operatörüdür ve ηgürültü. Tahmin etmek istiyoruzx Gözlem ve gürültünün özellikleri bilgisini kullanarak.

Bu durumda, ηbir Poisson dağılımından simüle edilmiştir. Bununla birlikte, yukarıda bahsedilen sözlük yaklaşımları bir Gauss gürültü varsayımının temelini oluşturmaktadır. Bu durumda, Gaussian gürültü değil evrişim operatörüdür.

Poisson gürültüsü altında sinyal kurtarma üzerinde çalışmadım, ancak googled ve bu makalenin yararlı olabileceğini buldum . Bu bağlamdaki benzer yaklaşımlar bu sorun için yararlı olabilir.


3

Gürültülü verilerin dekonvolüsyonunun kötü bir sorun olduğu bilinmektedir, çünkü gürültü yeniden yapılandırılmış sinyalde keyfi olarak büyütülür. Bu nedenle, çözeltiyi stabilize etmek için bir düzenleme yöntemi gereklidir. Burada, Tikhonov'un düzenleme algoritmasını uygulayarak bu sorunu ele alan bir MATLAB paketi bulabilirsiniz:

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


3

Sorunun başlangıcına gideceğim. MATLAB'da görüntü işleme uygulamaları için kullanılan dekonvolüsyon fonksiyonları vardır. Ancak, bu işlevleri 1D sinyalleri için de kullanabilirsiniz. Örneğin,

% 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) O zaman neden çıkış sinyalini hfonksiyonla çözmüyorsunuz ve (neredeyse) giriş sinyalini almıyorsunuz ? Burada Wiener dekonvolüsyonunu kullanıyorum

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

resim açıklamasını buraya girin Alternatif olarak, hişlevi bilmiyorsanız , ancak giriş ve çıkışı biliyorsanız, bu kez giriş sinyalini h^-1işleve verecek olan çıkış ile deşifre etmeyin . Sonra gürültülü sinyali filtrelemek için bir filtre olarak kullanabilirsiniz. ( 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')

resim açıklamasını buraya girin

Umut ediyorum bu yardım eder.


2

Konvolüsyon iki sinyalin birbiri ile çarpımı ve toplamıdır. İki deterministik sinyalden bahsediyorum. Birini diğerinden dekonvolve etmek istiyorsanız, bu denklem sisteminin çözümüne karşılık gelir. Bildiğiniz gibi denklemler sistemi her zaman çözülemez. Denklemler sistemi fazla belirlenebilir, yetersiz belirlenebilir veya tam olarak çözülebilir.

Biraz gürültü eklerseniz, bazı bilgileri kaybedersiniz ve bu bilgileri geri alamazsınız. Yapabileceğiniz şey, her katsayının bir gürültü terimi eklendiğini göz önünde bulundurarak doğrusal denklem sistemini çözmek. Veya sorunuzun başka bir cevabında görebileceğiniz gibi, önce gürültülü sinyalden orijinal sinyali tahmin etmek ve ardından denklem sistemini çözmeye çalışmak isteyebilirsiniz.

Gürültünün çarpılan ve toplanan katsayılara eklendiğini belirtmek önemlidir. Bu nedenle, denklem sisteminizin nihayetinde tek başına çözülemeyeceği bile olabilir. Eşsiz bir şekilde çözülebilir olduğundan emin olmak için katsayı matrisinizin kare ve tam rütbeli olması gerekir.


2

Bunu yapmak zor olurdu. Bir Gaussian ile konvolüsyon, frekans alanında Gauss'un Fourier Dönüşümü ile çarpmaya eşdeğerdir. Bu aynı zamanda bir Gauss'ludur, aslında bu düşük geçişli bir filtredir ve gerçekten etkili bir filtredir. Gürültü ekledikten sonra Gaussian'ın "stop band" ındaki tüm bilgiler imha edilir. Bunu kurtarmanın bir yolu yok.

Konvolüsyon esas olarak frekans cevabının tersi ile çarpılmaktadır. Sorun şu: Frekans tepkisinin tersi, orijinal Gauss'un çok küçük olduğu yerlerde gerçekten, gerçekten büyür. Bu frekanslarda gürültüyü temelde büyük miktarlarda artırırsınız. Her şey tamamen gürültüsüz olsa bile, büyük olasılıkla sayısal problemlerle karşılaşırsınız.


2

Yaklaşımlar

Dekonvolüsyon için birçok yöntem vardır (yani bozunma operatörü doğrusal ve Zaman / Uzay Değişmez).
Hepsi, sorunun birçok durumda hasta olduğu gerçeğiyle başa çıkmaya çalışır.

Daha iyi yöntemler, geri yüklenecek verilerin modeline bir miktar düzenlilik katan yöntemlerdir.
İstatistiksel modeller (Öncelikler) veya herhangi bir bilgi olabilir.
Görüntüler için iyi bir model, parça halinde pürüzsüz veya degradelerin seyrekliğidir.

Ancak cevap uğruna basit bir parametrik yaklaşım alınacaktır.

model

En küçük kareler modeli basittir.
Verilerin bir fonksiyonu olarak objektif fonksiyon:

f(x)=12h*x-y22

Optimizasyon sorunu şu şekilde verilir:

argminxf(x)=argminx12h*x-y22

Nerede x geri yüklenecek verilerdir, h Bulanıklaştırma Çekirdeği (bu durumda Gaussian) ve yverilen ölçümler kümesidir.
Model, ölçümlerin sadece evrişimin geçerli kısmı için verildiğini varsayar. Yani eğerxR,n ve hR,k sonra yR,m nerede m=n-k+1.

Bu, sonlu uzaydaki doğrusal bir işlemdir, dolayısıyla bir Matris Formu kullanılarak yazılabilir:

argminxf(x)=argminx12'Hx-y22

Nerede 'HR,mxn evrişim matrisidir.

Çözüm

En Küçük Kareler çözümü:

x^=('HT'H)-1'HTy

Görülebileceği gibi bir matris inversiyonu gerektirir.
Bunu yeterince çözme yeteneği, operatörün durum numarasına bağlıdır'HT'H hangi itaat eder cond('H)=cond('HT'H).

Durum Numarası Analizi

Bu koşul sayısının arkasında ne var?
Buna Lineer Cebir kullanarak cevap verilebilir.
Ama bence daha sezgisel bir yaklaşım, bunu Frekans Alanında düşünmek olurdu.

Temel olarak bozunma operatörü, genellikle yüksek frekansın enerjisini zayıflatır.
Şimdi, frekansta bu temelde bir eleman akıllıca çarpma olduğundan, tersine çevirmenin elemanın akıllıca bölme olduğunu tersine çevirmenin kolay yolu söylenebilir.
Yukarıda yapılan şey budur.
Sorun, filtrenin enerjiyi pratik olarak sıfıra indirdiği durumlarda ortaya çıkar. O zaman gerçek problemlerimiz var ...
Temel olarak Durum Numarası bize bunu söylüyor, bazı frekansların diğerlerine göre ne kadar zayıfladığını.

resim açıklamasını buraya girin

Yukarıda, Koşul Numarası ([dB] birimlerini kullanarak) Gauss Filtresi STD parametresinin bir fonksiyonu olarak görülebilir.
Beklendiği gibi, STD ne kadar yüksek olursa, daha yüksek STD daha güçlü LPF anlamına geldiği için durum numarası da o kadar kötü olur (Sonunda aşağı inen değerler sayısal sorunlardır).

Sayısal Çözüm

Gauss Bulanıklığı Çekirdeği topluluğu oluşturuldu.

resim açıklamasını buraya girin

Parametreler n=300, k=31 ve m=270.
Veriler rastgele ve gürültü eklenmedi.

MATLAB'da, pinv()SVD tabanlı Yalancı Ters ve \operatör kullanan Lineer Sistem çözüldü .

resim açıklamasını buraya girin

Görüldüğü gibi, SVD kullanarak çözüm beklendiği gibi çok daha az hassastır.

Neden bir hata var?
Bir çözüme bakma (En yüksek STD için):

resim açıklamasını buraya girin

Görüldüğü gibi, sinyal başlangıç ​​ve bitiş dışında çok iyi geri yüklenir.
Bunun nedeni, bize bu örnekler hakkında çok az şey anlatan Geçerli Konvolüsyonun kullanılmasıdır.

gürültü, ses

Gürültü eklersek, işler farklı görünürdü!
Sonuçların daha önce iyi olmasının nedeni, MATLAB'ın çok sayıda durum olmasına rağmen verilerin DR'sini işleyebilmesi ve denklemleri çözebilmesidir.

Ancak büyük koşul sayısı, ters filtrenin bazı frekansları güçlü bir şekilde yükseltmesi (Güçlü zayıflamayı tersine çevirmek) anlamına gelir.
Bunlar gürültü içerdiğinde, gürültünün yükseltileceği ve restorasyonun kötü olacağı anlamına gelir.

resim açıklamasını buraya girin

Yukarıda görebileceğiniz gibi, şimdi yeniden yapılanma çalışmaz.

özet

Degradasyon Operatörünü tam olarak biliyor ve SNR çok iyi ise, basit dekonvolüsyon yöntemleri işe yarayacaktır.
Dekonvolüsyonun ana konusu Degradasyon Operatörünün frekansları ne kadar zayıflattığıdır.
Ne kadar fazla zayıflarsa, geri yüklemek için o kadar çok SNR gerekir (Bu temelde Wiener Filtresinin arkasındaki fikirdir ).
Sıfıra ayarlanan frekanslar geri yüklenemez!

Uygulamada, istikrarlı sonuçlar elde edebilmek için bazı öncelikler eklemelisiniz.

Kod, StackExchange Sinyal İşleme Q2969 GitHub Depomda bulunabilir .


2

Genel olarak, iki veya daha fazla bileşenin çıkarılması sorununa büyük ölçüde genelleşen sorunu ele almanın bir yöntemi, # 1, # 2, ..., #n sinyallerinin G¹, G² ⋯, Gⁿ spektrumlarını almaktır. kare Γ (ν) = | G¹ (ν) | ² + | G² (ν) | ² + ⋯ + | Gⁿ (ν) | ² her frekansta ν ve G₁ (ν) ≡ G¹ (ν) * / Γ normalleştirin (ν), G₂ (ν) ≡ G² (ν) * / Γ (ν), ..., G_n (ν) ≡ Gⁿ (ν) * / Γ (ν). Kötü tanımlanma ve gürültü ile ilgili problem, bazı frekanslar ν için Γ (ν) ~ 0'ın mümkün olduğu gerçeğine karşılık gelir. Bunu işlemek için, G⁰ (ν) = sabit - "gürültü" sinyalini çıkarmak için başka bir "sinyal" ekleyin. Şimdi Γ (ν) kesinlikle aşağıda sınırlandırılacaktır. Bu neredeyse kesinlikle Tikhonov düzenlenmesi ile bağlantılıdır, ancak hiçbir zaman denklik sonucu veya başka bir yazışma bulamadım veya kurmadım. Daha basit, daha doğrudan ve sezgisel.

Alternatif olarak, G'leri, örneğin G, G '»as ∫ G (ν) * G' (ν) dν gibi uygun bir iç ürünle donatılmış vektörler olarak ele alabilir ve (G₀, G₁, ⋯, G_n) ikili olarak alabilirsiniz. (G⁰, G¹, ⋯, Gⁿ) 'nın (örn. genelleştirilmiş tersi) - elbette, bileşen vektörlerinin doğrusal olarak bağımsız olduğu varsayılarak.

Gauss dekonvolüsyonu için n = 1, G⁰ = "gürültü" sinyali ve G¹ = "Gauss" sinyali ayarlanır.


1

Andrey Rubshtein tarafından sağlanan cevap, açıklanan sorun gürültü ve modelleme hatalarına karşı çok hassas olduğu için gürültü mevcudiyetinde sefil bir şekilde başarısız olacaktır. Bir evrişim matrisi oluşturmak iyi bir fikirdir, ancak tersinmede düzenlileştirmenin kullanılması böyle bir problemde mutlak bir zorunluluktur. Çok basit ve anlaşılır bir düzenlileştirme yöntemi (hesaplamalı olarak pahalı olmasına rağmen) Kesik Tekil Değer Ayrıştırmasıdır (TSVD). Tikhonov Düzenlemesi ve Toplam Varyasyon Düzenlemesi gibi yöntemlerkontrol etmeye değer. Tikhonov düzenlenmesi (ve genel formu) Matlab'da uygulanması kolay olan çok zarif bir yığın formuna sahiptir. Kitabı inceleyin: Samuli Siltanen ve Jennifer Mueller'in pratik uygulamalarıyla doğrusal ve doğrusal olmayan ters problemler.


1

Aslında soru net değil. Ama cevaplar ne istediğini önemsedi. Bazı insanların tavsiyesi olarak doğrusal cebirsel denklemler sistemi inşa edebilirsiniz, bu doğrudur, ancak bilinen sinyale dayanan matris kötü koşullandırılmış olarak adlandırılır. Bu, tersine çevirmeye çalıştığınızda, kesme hataları çözümü öldürür ve sonuçta rastgele sayılar alırsınız. Ortak yaklaşım kısıtlanmış ekstremumdur. Çözüm normunu en aza indirirsiniz || x || kısıtlaması olan || Ax - y || <delta. Böylece Ax ve y arasındaki farkın büyük olmasına izin vermeyen en küçük normlara sahip x'i arıyorsunuz. En küçük karelerin uygulanmasında elde edilen matrisin ana köşegenine düzenlileştirme parametresi eklemeniz çok basittir. Buna Tikhonov düzenlenmesi denir. Bunu yapan kodlama örnekleri var,

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.