【发布时间】:2012-10-10 20:58:43
【问题描述】:
蓝色图是原始图(红色)的嘈杂图。有什么方法可以将蓝色图近似为接近红色的图?
【问题讨论】:
-
当然。有很多不同的方法可以实现这一点,您尝试过什么?作为一种简单的第一种方法,给一个移动平均滤波器一个镜头,或者,因为你似乎有很大的异常值,一个移动中值滤波器。上传您的数据样本是有意义的。
标签: matlab signal-processing curve-fitting
蓝色图是原始图(红色)的嘈杂图。有什么方法可以将蓝色图近似为接近红色的图?
【问题讨论】:
标签: matlab signal-processing curve-fitting
让我们定义一个波浪函数:
x = 0:.1:20;
y1 = 5*sin(x) + 2*x - x.^2 +.3*x.^3 - .2*(x-15).^4 - 10*x.^2.*cos(x./3+12).^3 + .5*(x-12).^4;
并添加大量噪音:
r = randi(1000,1,201) - 500;
y2 = y1+r;
现在制作一个一维高斯滤波器,对其进行归一化并使用我们的函数convolve:
g = gausswin(20); % <-- this value determines the width of the smoothing window
g = g/sum(g);
y3 = conv(y2, g, 'same')
让我们看看结果
figure;
hold on;
plot(y1, 'r', 'linewidth', 3);
plot(y2, 'b');
plot(y3, 'g', 'linewidth', 3);
红色是原始函数,蓝色是噪声版本,绿色是平滑后的“恢复”函数。
【讨论】:
gausswin(),需要信号处理工具箱。
另一种选择是使用“平滑”。我喜欢使用它,因为它是一个单行功能。使用@Junuxx 上一个答案的代码:
x = 0:.1:20;
y1 = 5*sin(x) + 2*x - x.^2 +.3*x.^3 - .2*(x-15).^4 - 10*x.^2.*cos(x./3+12).^3 + .5*(x-12).^4;
r = randi(1000,1,201) - 500;
y2 = y1+r;
现在应用平滑:
ys = smooth(x,y2,0.25,'rloess');
plot(x,y2,x,ys)
更多信息:
doc smooth
【讨论】:
gausswin() 需要信号处理工具箱
smooth() 需要曲线拟合工具箱
如果你没有这些工具箱,这里有一个简单的smooth() 实现:
smooth.m:
function yy = smooth(y, span)
yy = y;
l = length(y);
for i = 1 : l
if i < span
d = i;
else
d = span;
end
w = d - 1;
p2 = floor(w / 2);
if i > (l - p2)
p2 = l - i;
end
p1 = w - p2;
yy(i) = sum(y(i - p1 : i + p2)) / d;
end
end
y3 = smooth(y2, 15) 的结果,使用 @Junuxx 代码:
【讨论】:
【讨论】: