高斯滤波器卷积给出了意想不到的结果

信息处理 过滤器 卷积 高斯
2022-02-07 04:02:56

我正在尝试使用高斯滤波器平滑时间序列信号,然后区分信号(这是用于边缘检测的应用程序)。卷积的一个很好的特性是:

ddx(s(t)g(t))=ds(t)dtg(t)=s(t)dg(t)dt
什么时候g(t)是高斯核,dg(t)/dt是可解析计算的,所以我不需要使用任何有限差分来计算ds(t)/dt. 但是在对上述等式进行一些数值测试时,我发现上面等式中最右边的等式之间存在一些奇怪的差异。下面的 matlab 代码说明了这个问题。

它定义了一个简单的正弦波信号s(t)=sin(t),然后计算 211 点高斯核及其导数。然后卷积s(t)dg/dt然后卷积ds/dtg(t)并比较解决方案。根据上面的已知结果,我希望解决方案是相同的,但令人惊讶的是,我发现两种解决方案之间存在细微差别。任何人都可以阐明发生了什么吗?

h = 0.001;    % step size for signal
K = 211;      % window size of gaussian
sigma = 0.25; % stddev of gaussian window

% define signal and its derivative
x = -pi:h:pi;
signal = sin(x)';
dsignal = cos(x)';

% make Gaussian window, size K
L = K - 1;
n = [-1:2/L:1]';
g = exp(-(1/2)*(n/sigma).^2);

% now its derivative
dg = -(1/sigma^2/(L/2)) * n .* g / h;

% normalize so convolution has unit gain
w = g / sum(g);
dw = dg / sum(g);

% compute sol1 = d/dx signal(x) * G(x)
sol1 = conv(dsignal, w, 'same');

% compute sol2 = signal(x) * dG(x)/dx
sol2 = conv(signal, dw, 'same');

% plot solutions - they are visually identical
plot(x,sol1,x,sol2+1e-2)

% ...but this tells another story
r = sol1 - sol2;
rmsdiff = sqrt(dot(r,r) / length(r))
maxdiff = max(r)
mindiff = min(r)

matlab代码的输出是:

rmsdiff =
     9.266306205125738e-04
maxdiff =
     9.940615138074316e-04
mindiff =
  -0.008096374978515

我希望所有这些都为零。下面是两个解决方案的图,由一个小 epsilon 偏移。 图。1

所以这两种解决方案看起来一样,但实际上有细微的差别。由于脚本中的所有内容都使用分析结果(没有有限差分),我希望这两个解决方案是相同的。谁能解释为什么他们不是?

0个回答
没有发现任何回复~