Деконволюция одномерных сигналов, размытых гауссовым ядром


12

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

Проблема в том, что мне нужен код, который выполняет деконволюцию в 1D. (Я уже нашел некоторые в 2D, но моя главная цель - 1D).

Можете ли вы предложить мне несколько пакетов или программ, которые могут это сделать? (Желательно в MATLAB)

Заранее спасибо за помощь.


1
используйте функцию deconv в MATLAB.
GOEKHAN GUEL

не работает с добавленным шумом ...
user1724

Вы не можете деконволюции сигнала . Вы можете оценить обратную свертку по двум сигналам : импульсная характеристика системы и выходная мощность системы. Какой вы пытаетесь сделать?
Фонон

2
@Phonon: Довольно поздно с этим комментарием, но есть слепые методы деконволюции, которые не требуют знания импульсной реакции системы. Как вы можете себе представить, вы можете добиться большего успеха, если знаете импульсный отклик.
Джейсон Р

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
Почему вы думаете, что матрица трехдиагональная? Для круговой свертки это будет циркулярно. В большинстве случаев это будет теплица. Посмотрите на мое решение.
Рой

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

Я обновил ответ, чтобы избежать дальнейшей путаницы.
Андрей Рубштейн

Вы видели Gaussian Kernel, который реализован в 3 образцах?
Рой

5

Если вы добавили случайный шум, вы не можете получить исходный сигнал ... Вы можете попытаться разделить сигналы в частотной области (если шум и сигнал имеют разные частоты). Но, похоже, вы ищете фильтр Винера .


5

Я думаю, что это все еще открытая проблема.

Есть многочисленные исследовательские работы, которые пытаются восстановить исходный сигнал как можно лучше.

Одним из классических подходов является использование вейвлет-методов .

Есть также словарные подходы, как этот .

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


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

3

Если я правильно понял проблему, мы можем формализовать проблему следующим образом:

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

y=Hx+η

где - наблюдение, - оператор свертки, а & - шум. Мы хотим оценить , используя наблюдения и знание характеристик шума.H η xyHηx

В этом случае моделируется из распределения Пуассона. Однако вышеупомянутые словарные подходы лежат в основе предположения о гауссовском шуме. В этом случае гауссиан является оператором свертки, а не шума.η

Я не работал над восстановлением сигнала при пуассоновском шуме, но я погуглил и обнаружил, что эта статья может оказаться полезной. Подобные подходы в этом контексте могут быть полезны для этой проблемы.


3

Известно, что деконволюция зашумленных данных представляет собой некорректную проблему, поскольку шум в произвольно увеличенном сигнале восстанавливается. Поэтому для стабилизации решения требуется метод регуляризации. Здесь вы можете найти пакет MATLAB, который решает эту проблему путем реализации алгоритма регуляризации Тихонова:

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


3

Я пойду к самому началу вопроса. В MATLAB есть функции деконволюции, которые используются для обработки изображений. Однако вы также можете использовать эти функции для одномерных сигналов. Например,

% 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

Как видно, это требует обращения матрицы.
Способность решить эту проблему адекватно зависит от номера условия оператора которому подчиняется . cond ( H ) =HTHcond(H)=cond(HTH)

Анализ номера условия

Что стоит за этим условным номером?
На это можно ответить с помощью линейной алгебры.
Но более интуитивный, на мой взгляд, подход будет думать об этом в частотной области.

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

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

Выше можно увидеть число условий (с использованием единиц [дБ]) как функцию параметра STD фильтра Гаусса.
Как и ожидалось, чем выше STD, тем хуже число условий, так как более высокий STD означает более сильный LPF (значения, снижающиеся в конце, являются числовыми проблемами).

Численное решение

Создан ансамбль Gaussian Blur Kernel.

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

Параметры: , и . Данные являются случайными и без шума были добавлены.к = 31 м = 270n=300k=31m=270

В MATLAB была решена линейная система с pinv()использованием псевдообращения на основе SVD и \оператора.

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

Как видно, при использовании SVD решение гораздо менее чувствительно, чем ожидалось.

Почему там ошибка?
Глядя на решение (для самого высокого ЗППП):

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

Как видно, сигнал восстанавливается очень хорошо, за исключением начала и конца.
Это связано с использованием Valid Convolution, которая мало говорит нам об этих образцах.

Шум

Если бы мы добавили шум, все было бы иначе!
Причина, по которой результаты были хороши раньше, связана с тем, что MATLAB мог обрабатывать DR данных и решать уравнения, даже если они имели большое число условий.

Но большое число условий означает, что обратный фильтр сильно усиливает (чтобы обратить сильное затухание) некоторые частоты.
Когда они содержат шум, это означает, что шум будет усилен, и восстановление будет плохим.

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

Как можно видеть выше, сейчас реконструкция не будет работать.

Резюме

Если кто-то точно знает Оператор деградации и SNR очень хорош, то будут работать простые методы деконволюции.
Основная проблема деконволюции заключается в том, насколько сильно оператор деградации ослабляет частоты.
Чем больше он ослабевает, тем больше SNR требуется для восстановления (это в основном идея фильтра Винера ).
Частоты, которые были установлены на ноль, не могут быть восстановлены!

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

Код доступен в моем хранилище обработки сигналов StackExchange Q2969 GitHub .


2

В общем, один из способов решения проблемы, которая в значительной степени обобщает проблему извлечения двух или более компонентов, состоит в том, чтобы взять спектры G¹, G² ⋯, Gⁿ сигналов # 1, # 2, ..., #n, суммировать итоговые значения квадрат Γ (ν) = | G¹ (ν) | ² + | G² (ν) | ² + ⋯ + | Gⁿ (ν) | ² на каждой частоте ν и нормализуем G₁ (ν) ≡ G¹ (ν) * / Γ (ν), G₂ (ν) ≡ G² (ν) * / Γ (ν), ..., G_n (ν) ≡ Gⁿ (ν) * / Γ (ν). Проблема с неопределенностью и шумом соответствует тому, что Γ (ν) ~ 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 || <дельта Таким образом, вы ищете такой x с наименьшей нормой, который не позволяет разнице между Ax и y быть большой. Это очень просто, вам нужно добавить так называемый параметр регуляризации на главной диагонали матрицы, полученной в результате применения метода наименьших квадратов. Это называется тихоновская регуляризация. У меня есть примеры кодирования, которые делают это,

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.