我已经将一个随机信号与a高斯进行卷积,并添加了噪声(在这种情况下为Poisson噪声)以生成一个噪声信号。现在,我想对这个噪声信号进行反卷积,以使用相同的高斯信号提取原始信号。
问题是我需要执行一维反卷积的代码。(我已经在2D中找到了一些,但我的主要目标是1D)。
您能否建议我一些能够做到的软件包或程序?(最好在MATLAB中)
先谢谢您的帮助。
我已经将一个随机信号与a高斯进行卷积,并添加了噪声(在这种情况下为Poisson噪声)以生成一个噪声信号。现在,我想对这个噪声信号进行反卷积,以使用相同的高斯信号提取原始信号。
问题是我需要执行一维反卷积的代码。(我已经在2D中找到了一些,但我的主要目标是1D)。
您能否建议我一些能够做到的软件包或程序?(最好在MATLAB中)
先谢谢您的帮助。
Answers:
我已经在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]
这个内核看起来很有趣!它是一个锐化运算符。我们的直觉是正确的,锐化可以消除模糊。
我认为这仍然是一个未解决的问题。
有许多研究论文试图尽可能地恢复原始信号。
一种经典的方法是通过基于小波的方法。
也有像字典的方法这一个。
通过遵循David L. Donho,Michael Elad,Alfred M.Bruckstein等所做的研究,您可以对问题有更深入的了解。
众所周知,对噪声数据进行去卷积是一个不适当地的问题,因为在重构信号中噪声会被任意放大。因此,需要一种正则化方法来稳定溶液。在这里,您可以找到一个MATLAB包,该包通过实现Tikhonov的正则化算法来解决此问题:
我将开始讨论这个问题。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')
希望对您有所帮助。
有很多解卷积的方法(即,退化算子是线性的,并且时/空不变)。
在许多情况下,他们所有人都试图解决问题很严重的事实。
更好的方法是为要恢复的数据模型添加一些正则化的方法。
它可以是统计模型(先验)或任何知识。
对于图像,好的模型是逐段平滑的或稀疏的渐变。
但是为了得到答案,将采用一种简单的参数方法-最小化模型中恢复的数据与测量值之间的最小二乘误差。
最小二乘模型很简单。
目标函数作为数据的函数由下式给出:
优化问题由下式给出:
这是有限空间中的线性运算,因此可以使用矩阵形式编写:
最小二乘解由下式给出:
这个条件编号后面是什么?
可以使用线性代数回答它。
但是我认为,更直观的方法是在频域中考虑它。
基本上,降级运算符衰减通常为高频的能量。
现在,由于在频率上这基本上是一个元素明智的乘法,所以可以说,将其反转的简单方法是通过逆滤波器进行元素明智的除法。
好吧,这就是上面所做的。
问题出在滤波器实际上将能量衰减为零的情况下。然后我们遇到了实际的问题...
这基本上是条件编号告诉我们的,某些频率相对于其他频率衰减的程度。
上方可以看到条件数(使用[dB]单位)与高斯滤波器STD参数的关系。
不出所料,STD越高,条件数越差,因为STD越高意味着LPF越强(最后的值下降是数字问题)。
高斯模糊核合奏创建。
在MATLAB中pinv()
,使用基于SVD的伪逆和\
算子对线性系统进行了求解。
可以看到,使用SVD解决方案比预期的要敏感得多。
为什么会出现错误?
寻找解决方案(针对最高性病):
可以看到,除了开始和结束之外,信号都恢复得很好。
这是由于使用了有效卷积,对于这些样本我们了解得很少。
如果添加噪音,情况将有所不同!
之所以之前取得好的结果是因为MATLAB即使条件数很大也可以处理数据的DR并求解方程。
但是条件数大意味着逆滤波器会在某些频率上强烈放大(以逆转强衰减)。
当那些包含噪声时,这意味着噪声将被放大并且恢复将是不好的。
从上面可以看到,现在的重建将无法进行。
如果人们确切地知道Degradation Operator且SNR很好,那么简单的反卷积方法将起作用。
反卷积的主要问题是退化算子衰减频率的难易程度。
它衰减得越多,需要更多的SNR才能恢复(这基本上是Wiener滤波器背后的思想)。
设置为零的频率无法恢复!
在实践中,为了获得稳定的结果应添加一些先验条件。
该代码可从我的StackExchange Signal Processing Q2969 GitHub Repository获得。
通常,一种解决该问题的方法基本上可以概括为提取两个或多个分量的问题,即采取信号#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¹=“高斯”信号。