Я свел случайный сигнал с гауссовским и добавленным шумом (шум Пуассона в данном случае) для генерации шумового сигнала. Теперь я хотел бы деконвертировать этот шумовой сигнал, чтобы извлечь исходный сигнал, используя тот же гауссовский сигнал.
Проблема в том, что мне нужен код, который выполняет деконволюцию в 1D. (Я уже нашел некоторые в 2D, но моя главная цель - 1D).
Можете ли вы предложить мне несколько пакетов или программ, которые могут это сделать? (Желательно в MATLAB)
Заранее спасибо за помощь.
Ответы:
Я объяснил это однажды на StackOverflow .
Ваш сигнал может быть представлен как вектор, а свертка - это умножение на N-диагональную матрицу (где N - длина фильтра). Ради ответа я предполагаю, что фильтр намного меньше сигнала
Например:
Ваш вектор / сигнал:
Ваш фильтр (свертывающий элемент):
Таким образом, матрица nxn: (пусть она будет называться A):
Свертка это:
И деконволюция
Очевидно, что в некоторых случаях деконволюция невозможна. Это те случаи, когда у вас есть единичный А. Даже матрицы, которые не являются единичными, но близки к единичным, могут быть проблематичными, так как они будут иметь большую числовую ошибку. Вы можете оценить это, вычислив номер условия матрицы.
Если A имеет низкое условие, вы можете вычислить обратное и применить его к результату.
Теперь давайте посмотрим несколько примеров в Matlab:
Во-первых, я сделал функцию, которая вычисляет матрицу свертки.
Теперь давайте попробуем посмотреть, что происходит с разными ядрами:
Номер условия:
Это проблематично, как и ожидалось. После усреднения трудно вернуть исходный сигнал.
Теперь давайте попробуем усреднить:
Результат:
Это хорошо с нашей интуицией, мягкое усреднение исходного сигнала намного легче обратить.
Мы также можем увидеть, как выглядит обратная матрица:
Вот одна строка из матрицы:
Мы видим, что большая часть энергии в каждой линии сосредоточена в 3-5 коэффициентах вокруг центра. Следовательно, для того, чтобы деконвертировать, мы можем просто снова свертить сигнал в следующем приближении:
Это ядро выглядит интересно! Это оператор заточки. Наша интуиция верна, резкость отменяет размытие.
источник
Если вы добавили случайный шум, вы не можете получить исходный сигнал ... Вы можете попытаться разделить сигналы в частотной области (если шум и сигнал имеют разные частоты). Но, похоже, вы ищете фильтр Винера .
источник
Я думаю, что это все еще открытая проблема.
Есть многочисленные исследовательские работы, которые пытаются восстановить исходный сигнал как можно лучше.
Одним из классических подходов является использование вейвлет-методов .
Есть также словарные подходы, как этот .
Вы можете получить более глубокое представление о проблеме, следуя исследованиям, проведенным Дэвидом Л. Донхо, Майклом Эладом, Альфредом М. Брукштейном и т. Д.
источник
Если я правильно понял проблему, мы можем формализовать проблему следующим образом:
У нас есть модель сигнала,
где - наблюдение, - оператор свертки, а & - шум. Мы хотим оценить , используя наблюдения и знание характеристик шума.H η xy H η x
В этом случае моделируется из распределения Пуассона. Однако вышеупомянутые словарные подходы лежат в основе предположения о гауссовском шуме. В этом случае гауссиан является оператором свертки, а не шума.η
Я не работал над восстановлением сигнала при пуассоновском шуме, но я погуглил и обнаружил, что эта статья может оказаться полезной. Подобные подходы в этом контексте могут быть полезны для этой проблемы.
источник
Известно, что деконволюция зашумленных данных представляет собой некорректную проблему, поскольку шум в произвольно увеличенном сигнале восстанавливается. Поэтому для стабилизации решения требуется метод регуляризации. Здесь вы можете найти пакет MATLAB, который решает эту проблему путем реализации алгоритма регуляризации Тихонова:
https://github.com/soheil-soltani/TranKin .
источник
Я пойду к самому началу вопроса. В MATLAB есть функции деконволюции, которые используются для обработки изображений. Однако вы также можете использовать эти функции для одномерных сигналов. Например,
(
sig_noisy = sig_clean * h + noise
) Тогда почему бы не деконволюировать выходной сигнал с помощьюh
функции и получить (почти) входной сигнал. Я использую деконволюцию Винера здесьВ качестве альтернативы, если вы не знаете
h
функцию, но знаете вход и выход, на этот раз почему бы не деконвертировать входной сигнал с выходом, который дастh^-1
функцию. Затем вы можете использовать его в качестве фильтра для фильтрации шумового сигнала. (sig_clean = sig_noisy * h^-1
)Я надеюсь, что это помогает.
источник
Свертка - это умножение и суммирование двух сигналов один на другой. Я говорю о двух детерминированных сигналах. Если вы хотите деконволюции одного из другого, то это соответствует решению системы уравнений. Как вы знаете, система уравнений не всегда разрешима. Система уравнений может быть переопределена, недоопределена или точно решаема.
Если вы добавите шум, вы потеряете некоторую информацию и не сможете получить эту информацию обратно. То, что вы можете сделать, это снова решить линейную систему уравнений, учитывая тот факт, что к каждому коэффициенту добавляется шумовой член. Или, как вы можете видеть в другом ответе на ваш вопрос, вы можете сначала оценить исходный сигнал из зашумленного сигнала, а затем попытаться решить систему уравнений.
Важно отметить, что шум добавляется к умноженным и суммированным коэффициентам. Поэтому может даже случиться, что ваша система уравнений в конечном итоге не будет однозначно разрешимой. Чтобы быть уверенным, что матрица коэффициентов однозначно разрешима, она должна быть квадратной и иметь полный ранг.
источник
Это было бы трудно сделать. Свертка с гауссианом эквивалентна умножению с помощью преобразования Фурье гауссиана в частотной области. Это также Гауссиан, по сути, это фильтр низких частот, и действительно эффективный. Как только вы добавите шум, вся информация, находящаяся в «стоп-полосе» гауссиана, будет уничтожена. Нет способа восстановить это.
Деконволюция существенно умножается на обратную частотную характеристику. Вот проблема: инверсия частотной характеристики становится действительно очень большой, если исходный гауссиан очень мал. На этих частотах вы бы в основном усилили шум. Даже если бы все было абсолютно бесшумным, вы, скорее всего, столкнулись бы с численными проблемами.
источник
подходы
Существует много методов деконволюции (а именно, оператор деградации линейный и инвариант времени / пространства).
Все они пытаются разобраться с тем, что во многих случаях проблема плохо сбалансирована.
Лучшие методы - это те, которые добавляют некоторую регуляризацию к модели данных, которые будут восстановлены.
Это могут быть статистические модели (Приоры) или любые знания.
Для изображений хорошей моделью является кусочно-плавный или разреженный градиент.
Но ради ответа будет принят простой параметрический подход: - Минимизация ошибки наименьших квадратов между восстановленными данными в модели и измерениями.
модель
Модель наименьших квадратов проста.
Целевая функция как функция данных определяется как:
Задача оптимизации задается следующим образом:
Где - данные, которые должны быть восстановлены, - Ядро Размытия (в данном случае гауссово), а - набор данных измерений. Модель предполагает, что измерения даны только для действительной части свертки. А именно, если и то где .x h y
x∈Rn h∈Rk y∈Rm m=n−k+1
Это линейная операция в конечном пространстве, поэтому ее можно записать с использованием матричной формы:
Где - матрица свертки.H∈Rm×n
Решение
Решение наименьших квадратов дается:
Как видно, это требует обращения матрицы.HTH cond(H)=cond(HTH)−−−−−−−−−−√
Способность решить эту проблему адекватно зависит от номера условия оператора которому подчиняется . cond ( H ) = √
Анализ номера условия
Что стоит за этим условным номером?
На это можно ответить с помощью линейной алгебры.
Но более интуитивный, на мой взгляд, подход будет думать об этом в частотной области.
В основном оператор деградации ослабляет энергию, как правило, высокой частоты.
Теперь, поскольку по частоте это в основном поэлементное умножение, можно сказать, что простым способом инвертировать его является поэлементное деление с помощью обратного фильтра.
Ну, это то, что сделано выше.
Проблема возникает в случаях, когда фильтр ослабляет энергию практически до нуля. Тогда у нас есть реальные проблемы ...
Это в основном то, что говорит нам Условное число, насколько сильно некоторые частоты были ослаблены относительно других.
Выше можно увидеть число условий (с использованием единиц [дБ]) как функцию параметра STD фильтра Гаусса.
Как и ожидалось, чем выше STD, тем хуже число условий, так как более высокий STD означает более сильный LPF (значения, снижающиеся в конце, являются числовыми проблемами).
Численное решение
Создан ансамбль Gaussian Blur Kernel.
Параметры: , и . Данные являются случайными и без шума были добавлены.к = 31 м = 270n=300 k=31 m=270
В MATLAB была решена линейная система с
pinv()
использованием псевдообращения на основе SVD и\
оператора.Как видно, при использовании SVD решение гораздо менее чувствительно, чем ожидалось.
Почему там ошибка?
Глядя на решение (для самого высокого ЗППП):
Как видно, сигнал восстанавливается очень хорошо, за исключением начала и конца.
Это связано с использованием Valid Convolution, которая мало говорит нам об этих образцах.
Шум
Если бы мы добавили шум, все было бы иначе!
Причина, по которой результаты были хороши раньше, связана с тем, что MATLAB мог обрабатывать DR данных и решать уравнения, даже если они имели большое число условий.
Но большое число условий означает, что обратный фильтр сильно усиливает (чтобы обратить сильное затухание) некоторые частоты.
Когда они содержат шум, это означает, что шум будет усилен, и восстановление будет плохим.
Как можно видеть выше, сейчас реконструкция не будет работать.
Резюме
Если кто-то точно знает Оператор деградации и SNR очень хорош, то будут работать простые методы деконволюции.
Основная проблема деконволюции заключается в том, насколько сильно оператор деградации ослабляет частоты.
Чем больше он ослабевает, тем больше SNR требуется для восстановления (это в основном идея фильтра Винера ).
Частоты, которые были установлены на ноль, не могут быть восстановлены!
На практике для получения стабильных результатов следует добавить несколько априоров.
Код доступен в моем хранилище обработки сигналов StackExchange Q2969 GitHub .
источник
В общем, один из способов решения проблемы, которая в значительной степени обобщает проблему извлечения двух или более компонентов, состоит в том, чтобы взять спектры 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¹ = «гауссовский» сигнал.
источник
Ответ, предоставленный Андреем Рубштейном, с треском провалится при наличии шума, так как описанная проблема очень чувствительна к шуму и ошибкам моделирования. Хорошей идеей является построение матрицы свертки, но использование регуляризации в инверсии является абсолютной необходимостью в такой проблеме. Очень простым и простым методом регуляризации (хотя и дорогостоящим в вычислительном отношении) является Усеченное разложение по сингулярным значениям (TSVD). Такие методы, как регуляризация Тихонова и полная регуляризация вариацийстоит проверить. Регуляризация Тихонова (и ее общая форма) имеет очень элегантную сложенную форму, которую легко реализовать в Matlab. Проверьте книгу: Линейные и нелинейные обратные задачи с практическими приложениями Самули Силтанен и Дженнифер Мюллер.
источник
На самом деле, вопрос не ясен. Но ответы соответствовали тому, что вы просили. Вы можете построить систему линейных алгебраических уравнений по совету некоторых людей, это правильно, но матрица, построенная на известном сигнале, является так называемой плохо обусловленной. Это означает, что когда вы пытаетесь инвертировать его, ошибки усечения убивают решение, и в результате вы получаете случайные числа. Общий подход - это ограниченный экстремум. Вы минимизируете норму решения || x || с ограничением || Ax - y || <дельта Таким образом, вы ищете такой x с наименьшей нормой, который не позволяет разнице между Ax и y быть большой. Это очень просто, вам нужно добавить так называемый параметр регуляризации на главной диагонали матрицы, полученной в результате применения метода наименьших квадратов. Это называется тихоновская регуляризация. У меня есть примеры кодирования, которые делают это,
источник