我正在尝试使用高斯滤波器平滑时间序列信号,然后区分信号(这是用于边缘检测的应用程序)。卷积的一个很好的特性是:
什么时候是高斯核,是可解析计算的,所以我不需要使用任何有限差分来计算. 但是在对上述等式进行一些数值测试时,我发现上面等式中最右边的等式之间存在一些奇怪的差异。下面的 matlab 代码说明了这个问题。
它定义了一个简单的正弦波信号,然后计算 211 点高斯核及其导数。然后卷积和然后卷积和并比较解决方案。根据上面的已知结果,我希望解决方案是相同的,但令人惊讶的是,我发现两种解决方案之间存在细微差别。任何人都可以阐明发生了什么吗?
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 偏移。
所以这两种解决方案看起来一样,但实际上有细微的差别。由于脚本中的所有内容都使用分析结果(没有有限差分),我希望这两个解决方案是相同的。谁能解释为什么他们不是?