【问题标题】:How to make a curve smoothing in matlab?如何在matlab中使曲线平滑?
【发布时间】:2012-10-10 20:58:43
【问题描述】:

蓝色图是原始图(红色)的嘈杂图。有什么方法可以将蓝色图近似为接近红色的图?

【问题讨论】:

  • 当然。有很多不同的方法可以实现这一点,您尝试过什么?作为一种简单的第一种方法,给一个移动平均滤波器一个镜头,或者,因为你似乎有很大的异常值,一个移动中值滤波器。上传您的数据样本是有意义的。

标签: matlab signal-processing curve-fitting


【解决方案1】:

让我们定义一个波浪函数:

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);

红色是原始函数,蓝色是噪声版本,绿色是平滑后的“恢复”函数。

【讨论】:

  • 首先,这不是多项式。其次,原始问题的情节中的示例噪声根本不是正态分布的,当然也不是同方差的。高斯滤波器涉及一些隐含的假设。
  • 首先,很公平,它是一个多项式加一个正弦。其次,我认为它仍然有效。但可以肯定的是,另一个过滤器可能会为他的数据提供更好的结果,我并不是说这是唯一的方法。
  • @Junuxx 是的,当我对高斯滤波的结果进行平均滤波时,它有点工作。是的,噪音是正态分布的,所以结果不够好。
  • 注意:对于gausswin(),需要信号处理工具箱。
  • @Junuxx 这对我非常有用,谢谢!我在哪里可以获得有关此主题的更多信息(数据过滤、高斯窗口...等)?您推荐的任何资源/好书?
【解决方案2】:

另一种选择是使用“平滑”。我喜欢使用它,因为它是一个单行功能。使用@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

【讨论】:

  • 要使用'smooth',您可能需要:smooth - 曲线拟合工具箱
【解决方案3】:

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 代码:

【讨论】:

    【解决方案4】:

    只是添加一个额外的选项:

    在matlab的提示中使用cftool

    【讨论】:

      猜你喜欢
      • 2023-04-08
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 2021-05-25
      • 1970-01-01
      • 2018-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多