0

我有以下代码用于对信号进行反卷积。它工作得很好,在我的错误限制内......只要我将最终结果除以一个非常大的因子(11000)。

width = 83.66;
x = linspace(-400,400,1000);

       a2 =  1.205e+004  ;
       al =  1.778e+005  ;
       b1 =       94.88  ;
       c1 =       224.3  ;
       d =       4.077  ;

measured =  al*exp(-((abs((x-b1)./c1).^d)))+a2;

rect = @(x) 0.5*(sign(x+0.5) - sign(x-0.5));
rt = rect(x/83.66);

signal = conv(rt,measured,'same');


check = (1/11000)*conv(signal,rt,'same');

这就是我所拥有的。 measured代表我收到的信号。信号是我想要找到的。检查是为了验证如果我将我的狭缝与我发现的信号进行卷积,我会得到相同的结果。如果你完全使用我所拥有的,你会看到检查和测量结果偏离了我扔在那里的 11000~ish 的因子。

有没有人有什么建议。我的想法是,狭缝高度不完全是 1,或者卷积实际上不会像我要求的那样有效地去卷积。(使用 deconv 只给了我 1 分,所以我用 convolve 代替)。

4

1 回答 1

3

我认为您误解了 conv(也可能因此 deconv)在做什么。

离散卷积只是一个和。实际上,您可以将其扩展为总和,使用几个显式循环,测量和 rt 向量的乘积之和。

请注意, sum(rt) 不是 1。如果将 rt 缩放为 sum 为 1,则 conv 将保留原始向量的缩放比例。所以,请注意缩放是如何通过这里的。

sum(rt)
ans =
   104

sum(measured)
ans =
   1.0231e+08

signal = conv(rt,measured);
sum(signal)
ans =
   1.0640e+10

sum(signal)/sum(rt)
ans =
   1.0231e+08

看到下一个版本确实保留了向量的缩放:

signal = conv(rt/sum(rt),measured);
sum(signal)
ans =
   1.0231e+08

现在,事实证明,您对 conv 使用相同的选项。这引入了边缘效应,因为它会截断一些信号,因此最终会丢失一点。

signal = conv(rt/sum(rt),measured,'same');
sum(signal)
ans =
   1.0187e+08

这个想法是,只要将内核缩放为总和为 1,conv 就会保留信号的缩放比例,并且不会因边缘截断而造成损失。当然卷积作为积分也有类似的性质。

顺便问一下,这个大约 11000 的引用因子是从哪里来的?

sum(rt)^2
ans =
       10816

可能是巧合。或不。想想看。

于 2013-07-01T21:17:38.563 回答