高斯核模糊的一维信号的反卷积


12

我已经将一个随机信号与a高斯进行卷积,并添加了噪声(在这种情况下为Poisson噪声)以生成一个噪声信号。现在,我想对这个噪声信号进行反卷积,以使用相同的高斯信号提取原始信号。

问题是我需要执行一维反卷积的代码。(我已经在2D中找到了一些,但我的主要目标是1D)。

您能否建议我一些能够做到的软件包或程序?(最好在MATLAB中)

先谢谢您的帮助。


1
使用MATLAB中的deconv函数。
GOEKHAN GUEL 2012年

不能与增加的噪音一起工作...
2012年

你不能解卷积信号。您可以根据两个信号来估计反卷积:系统的脉冲响应和系统输出。您要尝试哪一个?
声子

2
@Phonon:这个评论很晚了,但是有一些盲反卷积方法不需要了解系统脉冲响应。如您所料,如果您知道脉冲响应,则可以做得更好。
杰森R

1
@JasonR公平点。
声子

Answers:


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的情况。即使不是单数但接近单数的矩阵也可能会出现问题,因为它们会产生较大的数值误差。您可以通过计算矩阵的条件数来估计它。

如果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是滤波器的长度。循环卷积在图像处理中也非常无用。
安德烈·鲁布施泰因

我已经更新了答案,以避免进一步的混乱。
安德烈·鲁布施泰因

您是否看到过3个示例中实现的高斯核?
罗伊,

5

如果添加了随机噪声,则无法获得原始信号...您可以尝试在频域中分离信号(如果噪声和信号的频率不同)。但似乎您正在搜索的是维纳滤波器。


5

我认为这仍然是一个未解决的问题。

有许多研究论文试图尽可能地恢复原始信号。

一种经典的方法是通过基于小波的方法

也有像字典的方法一个。

通过遵循David L. Donho,Michael Elad,Alfred M.Bruckstein等所做的研究,您可以对问题有更深入的了解。


1
Nguyen,Farge和Schneider最近使用复合Morlet小波的论文似乎产生了很好的结果。Google此书目代码:2012PhyD..241..186N我的一个朋友在星际介质上将此方法与2D小波一起使用,效果很好。我还没有详细研究它。
PhilMacKay 2012年

3

如果我对问题的理解正确,我们可以将问题形式化如下:

我们有一个信号模型

y=Hx+η

yHηx

η

我没有从事泊松噪声下的信号恢复工作,但是我在Google上搜索后发现本文可能有用。在这种情况下,类似的方法对于此问题可能很有用。


3

众所周知,对噪声数据进行去卷积是一个不适当地的问题,因为在重构信号中噪声会被任意放大。因此,需要一种正则化方法来稳定溶液。在这里,您可以找到一个MATLAB包,该包通过实现Tikhonov的正则化算法来解决此问题:

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

方法

有很多解卷积的方法(即,退化算子是线性的,并且时/空不变)。
在许多情况下,他们所有人都试图解决问题很严重的事实。

更好的方法是为要恢复的数据模型添加一些正则化的方法。
它可以是统计模型(先验)或任何知识。
对于图像,好的模型是逐段平滑的或稀疏的渐变。

但是为了得到答案,将采用一种简单的参数方法-最小化模型中恢复的数据与测量值之间的最小二乘误差。

模型

最小二乘模型很简单。
目标函数作为数据的函数由下式给出:

FX=1个2HX-ÿ22

优化问题由下式给出:

精氨酸XFX=精氨酸X1个2HX-ÿ22

XHÿ
X[RñH[Rķÿ[R=ñ-ķ+1个

这是有限空间中的线性运算,因此可以使用矩阵形式编写:

精氨酸XFX=精氨酸X1个2HX-ÿ22

H[R×ñ

最小二乘解由下式给出:

X^=HŤH-1个HŤÿ


HŤH条件H=条件HŤH

条件编号分析

这个条件编号后面是什么?
可以使用线性代数回答它。
但是我认为,更直观的方法是在频域中考虑它。

基本上,降级运算符衰减通常为高频的能量。
现在,由于在频率上这基本上是一个元素明智的乘法,所以可以说,将其反转的简单方法是通过逆滤波器进行元素明智的除法。
好吧,这就是上面所做的。
问题出在滤波器实际上将能量衰减为零的情况下。然后我们遇到了实际的问题...
这基本上是条件编号告诉我们的,某些频率相对于其他频率衰减的程度。

在此处输入图片说明

上方可以看到条件数(使用[dB]单位)与高斯滤波器STD参数的关系。
不出所料,STD越高,条件数越差,因为STD越高意味着LPF越强(最后的值下降是数字问题)。

数值解

高斯模糊核合奏创建。

在此处输入图片说明

ñ=300ķ=31=270

在MATLAB中pinv(),使用基于SVD的伪逆和\算子对线性系统进行了求解。

在此处输入图片说明

可以看到,使用SVD解决方案比预期的要敏感得多。

为什么会出现错误?
寻找解决方案(针对最高性病):

在此处输入图片说明

可以看到,除了开始和结束之外,信号都恢复得很好。
这是由于使用了有效卷积,对于这些样本我们了解得很少。

噪声

如果添加噪音,情况将有所不同!
之所以之前取得好的结果是因为MATLAB即使条件数很大也可以处理数据的DR并求解方程。

但是条件数大意味着逆滤波器会在某些频率上强烈放大(以逆转强衰减)。
当那些包含噪声时,这意味着噪声将被放大并且恢复将是不好的。

在此处输入图片说明

从上面可以看到,现在的重建将无法进行。

摘要

如果人们确切地知道Degradation Operator且SNR很好,那么简单的反卷积方法将起作用。
反卷积的主要问题是退化算子衰减频率的难易程度。
它衰减得越多,需要更多的SNR才能恢复(这基本上是Wiener滤波器背后的思想)。
设置为零的频率无法恢复!

在实践中,为了获得稳定的结果应添加一些先验条件。

该代码可从我的StackExchange Signal Processing Q2969 GitHub Repository获得


2

通常,一种解决该问题的方法基本上可以概括为提取两个或多个分量的问题,即采取信号#1,#2,...,#n的频谱G¹,G²,Gⁿ,将总和制成表格平方Γ(ν)= |G¹(ν)|²+ |G²(ν)|²+⋯+ |Gⁿ(ν)|²在每个频率ν处,并对G₁(ν)≡G¹(ν)* /Γ进行归一化(ν),G 2(ν)≡G2(ν)* /Γ(ν),...,G_n(ν)≡Gⁿ(ν)* /Γ(ν)。不确定性和噪声的问题对应于以下事实:对于某些频率ν,Γ(ν)〜0是可能的。要处理此问题,请添加另一个“信号”以提取G⁰(ν)=常数-“噪声”信号。现在Γ(ν)将严格限制在下面。这几乎可以肯定与Tikhonov正则化有关,但是我从未发现或建立任何等效结果或其他对应关系。它更简单,更直接,更直观。

或者,您可以将G视为带有适当内积的向量,例如«G,G'»≡∫G(ν)* G'(ν)dν,然后将(G₀,G₁,⋯,G_n)当作对偶(例如,G 1,G 1,I 2,G 3)的广义逆(例如广义逆)-当然,假设分量矢量是线性独立的。

对于高斯反卷积,将设置n = 1,G⁰=“噪声”信号,G¹=“高斯”信号。


1

在存在噪声的情况下,Andrey Rubshtein提供的答案将惨败,因为所描述的问题对噪声和建模错误非常敏感。构造卷积矩阵是一个好主意,但是在这样的问题中,绝对必须使用反演中的正则化截断奇异值分解(TSVD)是一种非常简单直接的正则化方法(尽管计算量很大)。诸如Tikhonov正则化总变异正则化的方法值得一试。Tikhonov正则化(及其一般形式)具有非常优雅的堆叠形式,可以轻松在Matlab中实现。查阅Samuli Siltanen和Jennifer Mueller所著的《线性和非线性反问题及其实际应用》一书。


1

实际上,这个问题尚不清楚。但是答案证实了您的要求。您可以按照某些人的建议构建线性代数方程组,这是正确的,但是基于已知信号的矩阵是所谓的条件差的。这意味着当您尝试将其求逆时,截断错误会杀死解决方案,并且您会收到随机数。常见的方法是约束极值。您可以最小化解的范数|| x || 约束|| Ax-y || <三角洲。因此,您正在寻找具有最小范数且不允许Ax和y之间的差异较大的x。非常简单,您需要在应用最小二乘法获得的矩阵的主对角线上添加所谓的正则化参数。这称为Tikhonov正则化。我有编码样本可以做到这一点,

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.