Деконволюція 1D-сигналів, розмитих ядром Гаусса


12

Я перетворив випадковий сигнал з Гаассіаном і додав шум (шум Пуассона в цьому випадку), щоб генерувати шумний сигнал. Тепер я хотів би відключити цей шумний сигнал для вилучення оригінального сигналу за допомогою того ж Гаусса.

Проблема полягає в тому, що мені потрібен код, який виконує роботу деконволюції в 1D. (Я вже знайшов деякі в 2D, але моя основна мета - 1D).

Чи можете ви запропонувати мені якісь пакети чи програми, які можуть це зробити? (Переважно в MATLAB)

Заздалегідь дякую за допомогу.


1
використовувати функцію deconv в MATLAB.
GUEKHAN GUEL

не працює з додаванням шуму ...
user1724

Ви не можете відключити сигнал . Можна оцінити зворотну згортку за двома сигналами : імпульсною характеристикою системи та вихідною системою. Який ви намагаєтесь зробити?
Phonon

2
@Phonon: Досить пізно з цим коментарем, але є сліпі методи деконволюції , які не потребують знання системної імпульсної реакції. Як ви можете уявити, ви можете зробити краще, якщо знаєте імпульсну відповідь.
Jason R

1
@JasonR Справедливий пункт.
Фонон

Відповіді:


14

Я вже один раз пояснював це на StackOverflow .


Ваш сигнал може бути представлений у вигляді вектора, а згортка - це множення за допомогою N-діагональної матриці (де N - довжина фільтра). Я припускаю заради відповіді, що фільтр набагато менший, ніж сигнал

Наприклад:

Ваш вектор / сигнал:

V1
V2
...
Vn

Ваш фільтр (згортковий елемент):

  [b1 b2 b3];

Отже, матриця nxn: (Нехай її називають 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]

Світ:

A*v;

І деконволюція є

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

Очевидно, що в деяких випадках деконволюція неможлива. Це випадки, коли у вас є однина А. Навіть матриці, які не є сингулярними, але близькими до однини, можуть бути проблематичними, оскільки мають велику числову помилку. Ви можете його оцінити, обчисливши номер умови матриці.

Якщо стан A низький, ви можете обчислити обернену та застосувати її до результату.


Тепер давайте подивимося кілька прикладів у Matlab:

По-перше, я створив функцію, яка обчислює матрицю згортки.

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

Тепер спробуємо подивитися, що відбувається з різними ядрами:

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

Номер умови:

 7.8541

Це, як очікується, проблематично. Після усереднення важко повернути початковий сигнал.

Тепер спробуємо дещо м'якше усереднення:

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

Результат:

1.6667

Це добре поєднується з нашою інтуїцією, м'яке усереднення оригінального сигналу набагато простіше повернути назад.

Ми також можемо побачити, як виглядає обернена матриця:

 figure;imagesc(inv(A));

введіть тут опис зображення

Ось один рядок з матриці:

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

Ми можемо бачити, що більша частина енергії в кожному рядку зосереджена в 3-5 коефіцієнтах навколо центру. Тому, щоб відключити сигнал, ми можемо просто знову перетворити сигнал з таким наближенням:

   [0.0208   -0.1640    1.2910   -0.1640    0.0208]

Це ядро ​​виглядає цікаво! Це оператор заточення. Наша інтуїція правильна, загострення скасовує розмиття.


3
Ця відповідь заслуговує на більшу кількість результатів
динамічна

1
Чому ви вважаєте, що матриця тридіагональна? Для кругової згортки це буде циркуляційним. У більшості випадків це буде Toeplitz. Погляньте на моє рішення.
Рой

Прочитайте відповідь - я аналізую випадок, коли фільтр має 3 елементи. У більшості випадків при обробці зображення фільтр набагато менший, ніж сигнал. Так так, це матриця Toepliz, але це також N-діагональ, де N - довжина фільтра. Кругова згортка також є досить марною в обробці зображень.
Андрій Рубштейн

Я оновив відповідь, щоб уникнути подальшої плутанини.
Андрій Рубштейн

Ви бачили Gaussian Kernel, який реалізований у 3-х зразках?
Рой

5

Якщо ви додали випадковий шум, ви не можете отримати вихідний сигнал ... Ви можете спробувати розділити сигнали в частотній області (якщо шум і сигнал мають різні частоти). Але здається, що те, що ви шукаєте, - це фільтр Вінера .


5

Я думаю, це все ще відкрита проблема.

Існує чимало наукових робіт, які намагаються відновити оригінальний сигнал найкращим чином.

Класичний підхід - це методи, засновані на вейвлетах .

Існують також словникові підходи, як цей .

Ви можете отримати більш глибокий огляд проблеми, прослідкувавши дослідження Девіда Л. Донхо, Майкла Елада, Альфреда М. Брюкштайна тощо.


1
Недавній документ, що використовує складний вейлет Morlet від Nguyen, Farge & Schneider, здається, дає хороші результати. Google має цей бібліографічний код: 2012PhyD..241..186N Мій друг використовував цей метод із двовимірними вейвлетами на міжзоряному носії з відмінними результатами. Мені ще належить розібратися в цьому докладно.
PhilMacKay

3

Якщо я правильно зрозумів проблему, ми можемо формалізувати проблему так:

У нас є модель сигналу,

y=Hx+η

де y це спостереження, H є оператором згортки та η- шум. Ми хочемо оцінитиx за допомогою спостереження та знання характеристик шуму.

В цьому випадку, ηмоделюється з розподілу Пуассона. Однак вищезгадані словникові підходи лежать в основі гауссового припущення щодо шуму. У цьому випадку Гаусс є оператором згортки, а не шумом.

Я не працював над відновленням сигналу під шумом Пуассона, але я погуглив і виявив, що цей документ може бути корисним. Подібні підходи в цьому контексті можуть бути корисними для цієї проблеми.


3

Деконволюція шумних даних, як відомо, є невдалою проблемою, оскільки шум довільно збільшується в реконструйованому сигналі. Тому для стабілізації розчину потрібен метод регуляризації. Тут ви можете знайти пакет MATLAB, який вирішує цю проблему, реалізуючи алгоритм регуляризації Тихонова:

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


3

Я перейду до самого початку питання. У MATLAB є функції деконволюції, які використовуються для програм обробки зображень. Однак ви також можете використовувати ці функції для 1D-сигналів. Наприклад,

% 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) Тоді, чому б не відключити вихідний сигнал за допомогою hфункції та отримати (майже) вхідний сигнал. Я тут використовую Вінерську деконволюцію

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

введіть тут опис зображення Як варіант, якщо ви не знаєте hфункції, але знаєте вхід і вихід, то цього разу чому б не відключити вхідний сигнал з виходу, який дасть h^-1функцію. Потім ви можете використовувати його як фільтр для фільтра шумового сигналу. ( 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')

введіть тут опис зображення

Я сподіваюся, що це допомагає.


2

Звиття - це множення та підсумовування двох сигналів один на інший. Я говорю про два детерміновані сигнали. Якщо ви хочете відключити одне від іншого, то це відповідає рішенню системи рівнянь. Як ви знаєте, система рівнянь не завжди вирішується. Система рівнянь може бути переопределеною, недоозначеною або точно вирішуваною.

Якщо ви додасте трохи шуму, ви втратите деяку інформацію і не зможете отримати цю інформацію назад. Те, що ви можете зробити, - це знову вирішити лінійну систему рівнянь, враховуючи той факт, що до кожного коефіцієнта додається термін шуму. Або, як ви бачите в іншій відповіді на своє запитання, ви можете спершу оцінити вихідний сигнал із шумового сигналу, а потім спробувати вирішити систему рівнянь.

Важливо зазначити, що шум додається до помножених і підсумованих коефіцієнтів. Тому може бути навіть так, що ваша система рівнянь зрештою не є однозначно вирішуваною. Щоб бути впевненим, що це однозначно вирішимо, ваша матриця коефіцієнтів повинна бути квадратною та повною.


2

Це було б важко зробити. Конволюція з Гауссом еквівалентна множенню з перетворенням Фур'є Гаусса в частотній області. Це також є гауссом, по суті це фільтр низьких частот і дійсно ефективний. Після того, як ви додасте шум, вся інформація, що знаходиться у "гальмівній смузі", буде знищена. Неможливо це відновити.

Деконволюція по суті множиться з оберненою частотною характеристикою. Ось проблема: Зворотна частотна характеристика стає дійсно, дуже великою, де оригінальний Гаусс дуже маленький. На цих частотах ви, в основному, посилюєте шум величезними кількостями. Навіть якщо все буде абсолютно без шуму, ви, швидше за все, зіткнетеся з числовими проблемами.


2

Підходи

Існує багато методів деконволюції (а саме оператор деградації лінійний та інваріантний час / простір).
Усі вони намагаються впоратися з тим, що проблема є болісною в багатьох випадках.

Кращими є методи, які додають деяку регуляризацію до моделі даних, що підлягають відновленню.
Це можуть бути статистичні моделі (Пріори) або будь-які знання.
Для зображень гарною моделлю є штучна гладка або рідкість градієнтів.

Але задля відповіді буде застосовано простий параметричний підхід - -Змінення Помилки найменших квадратів між відновленими даними в моделі до вимірювань.

Модель

Модель з найменшими квадратами проста.
Цільову функцію як функцію даних задають:

f(x)=12hxy22

Проблема оптимізації задається:

argminxf(x)=argminx12hxy22

Де - це дані, що підлягають відновленню, - ядро ​​розмиття (в даному випадку Гауссана), а - сукупність заданих вимірювань. Модель передбачає, що вимірювання наведені лише для дійсної частини згортки. А саме, якщо і то де .xhy
xRnhRkyRmm=nk+1

Це лінійна операція в кінцевому просторі, отже, її можна записати за допомогою форми матриці:

argminxf(x)=argminx12Hxy22

Де - матриця згортки.HRm×n

Рішення

Рішення з найменшими квадратами задається:

x^=(HTH)1HTy

Як видно, потрібна інверсія матриці.
Здатність адекватно вирішити це залежить від номера умови оператора який підкоряється . HTHcond(H)=cond(HTH)

Аналіз номера стану

Що стоїть за цим номером умови?
Можна відповісти на це за допомогою лінійної алгебри.
Але, на мою думку, більш інтуїтивним підходом було б роздуми про це в частотній області.

В основному оператор деградації зменшує енергію, як правило, високої частоти.
Тепер, оскільки за частотою це в основному мультиплікаційне множення елементів, можна сказати, що найпростішим способом його інвертувати є поділ на мудрому елементі за допомогою зворотного фільтра.
Ну, це те, що зроблено вище.
Проблема виникає у випадках, коли фільтр послаблює енергію практично в нуль. Тоді у нас виникають реальні проблеми ...
Це, в основному, те, що говорить нам номер стану, наскільки жорсткі були послаблені одні частоти відносно інших.

введіть тут опис зображення

Зверху можна було побачити номер стану (використовуючи одиниці [dB]) як функцію параметра STD фільтра Гаусса.
Як і очікувалося, чим вище ЗПСШ, тим гірше число стану, оскільки вища ЗПСШ означає сильніший ФНП (значення, що знижуються в кінці, є числовими питаннями).

Числове рішення

Створений ансамбль ядра Гаусса Розмиття.

введіть тут опис зображення

Параметри , і . Дані випадкові і шуму не додано.n=300k=31m=270

У MATLAB лінійна система була вирішена за допомогою pinv()якої використовується псевдоінверсія на базі SVD та \оператор.

введіть тут опис зображення

Як бачимо, за допомогою SVD розчин набагато менш чутливий, як очікувалося.

Чому виникає помилка?
Дивлячись на рішення (для найвищого ІСТ):

введіть тут опис зображення

Як видно, сигнал відновлюється дуже добре, за винятком початку та кінця.
Це пов’язано з використанням Valid Convolution, що мало говорить про ці зразки.

Шум

Якби ми додали шум, все виглядало б інакше!
Причина, до якої результати були добрі, пов’язана з тим, що MATLAB міг обробляти дані ДР та вирішувати рівняння, хоча вони мали велику кількість умов.

Але велике число умов означає, що зворотний фільтр сильно посилюється (для зворотного сильного ослаблення) деяких частот.
Якщо вони містять шум, це означає, що шум посилиться і відновлення буде поганим.

введіть тут опис зображення

Як можна було бачити вище, зараз реконструкція не працюватиме.

Підсумок

Якщо ви точно знаєте Оператора деградації і SNR дуже хороший, прості методи деконволюції спрацюють.
Основне питання деконволюції полягає в тому, наскільки сильно Оператор деградації послаблює частоти.
Чим більше воно зменшується, тим більше SNR потрібно для відновлення (це в основному ідея, що стоїть за Фільтром Вінера ).
Частоти, встановлені на нуль, не можна відновити!

На практиці для досягнення стабільних результатів слід додати кілька пріорів.

Код доступний у моєму StackExchange обробці сигналів Q2969 у сховищі GitHub .


2

Загалом, одним із способів вирішення проблеми, який суттєво узагальнює проблему вилучення двох або більше компонентів, є прийняття спектрів G¹, G² ⋯, Gⁿ сигналів №1, №2, ..., #n, підрахунку загальної кількості квадрат Γ (ν) = | G¹ (ν) | ² + | G² (ν) | ² + ⋯ + | Gⁿ (ν) | ² при кожній частоті ν, і нормалізувати G₁ (ν) ≡ G¹ (ν) * / Γ (ν), G₂ (ν) ≡ G² (ν) * / Γ (ν), ..., G_n (ν) ≡ Gⁿ (ν) * / Γ (ν). Проблема з невизначеністю та шумом відповідає тому, що some (ν) ~ 0 можливий для деяких частот ν. Щоб вирішити це, додайте ще один "сигнал" для вилучення G⁰ (ν) = константа - сигнал "шум". Тепер Γ (ν) буде строго обмежено внизу. Це майже напевно пов'язане з регуляризацією Тихонова, але я ніколи не знайшов і не встановив жодного результату еквівалентності чи іншої відповідності. Він простіший і пряміший та інтуїтивніший.

Крім того, ви можете ставитися до G як до векторів, оснащених відповідним внутрішнім продуктом, наприклад «G, G '» ≡ ∫ G (ν) * G' (ν) dν, і приймати (G₀, G₁, ⋯, G_n) як подвійне (наприклад, узагальнена зворотна) (G⁰, G¹, ⋯, Gⁿ) - якщо, звичайно, вектори компонентів лінійно незалежні.

Для гауссової деконволюції було б встановлено n = 1, G⁰ = сигнал "шум" і G¹ = сигнал "Гаусса".


1

Відповідь, надана Андрієм Рубштейном, буде невдалою при наявності шуму, оскільки описана проблема дуже чутлива до шуму та помилок моделювання. Хороша ідея побудувати матрицю згортки, але використання регуляризації в інверсії є абсолютною необхідністю у подібній проблемі. Дуже простий і прямолінійний метод регуляризації (хоча обчислювально дорогий) - усічене сингулярне значення декомпозиції (TSVD). Такі методи як регуляризація Тихонова та регуляризація загальної варіаціїварто перевірити. Регуляризація Тихонова (та її загальна форма) має дуже елегантну складену форму, яку легко реалізувати в Matlab. Ознайомтеся з книгою: Лінійні та нелінійні зворотні проблеми з практичними програмами Самулі Сілтанен та Дженніфер Мюллер.


1

Власне, питання не ясно. Але відповіді підкреслили те, про що ви просили. Ви можете побудувати систему лінійних алгебраїчних рівнянь як поради деяких людей, це правильно, але матриця, побудована на відомому сигналі, називається погано обумовленою. Це означає, що при спробі його перевернути помилки усікання вбивають рішення, і ви отримуєте в результаті випадкові числа. Загальний підхід - це обмежений екстремум. Ви мінімізуєте норму розчину || x || з обмеженням || Ось - у || <дельта. Отже, ви шукаєте такий х з найменшою нормою, що не дозволяє різниці між Ax і y бути великими. Дуже просто потрібно додати так званий параметр регуляризації на головній діагоналі матриці, отриманий при застосуванні найменших квадратів. Це називається регуляризацією Тихонова. У мене є зразки кодування, які роблять це,

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.