如何在 Matlab 中平滑阶梯状图

Posted

技术标签:

【中文标题】如何在 Matlab 中平滑阶梯状图【英文标题】:How to smooth a stairstep-like graph in Matlab 【发布时间】:2018-07-17 17:12:54 【问题描述】:

图表的阶梯状外观是无意的。当我绘制相同大小的向量 ArbV (plot (Arb, V, 'r')) 时,我得到以下图表:

enter image description here

为了让它更平滑,我尝试使用一维数据插值,interp1,如下:

xq = 0:0.001:max(Arb);
Vq = interp1 (Arb, V, xq);
plot (xq, Vq);

但是,我收到以下错误消息:

Error using interp1>reshapeAndSortXandV (line 416)
X must be a vector.

Error in interp1 (line 92)
    [X,V,orig_size_v] = reshapeAndSortXandV(varargin1,varargin2)

【问题讨论】:

插值如何帮助平滑?您只会在相同的形状中获得更多积分。尝试某种拟合线(如果您知道数据确实应该是线性的),绘制在各个数据点的顶部。 你试过'smooth'功能吗? 我有。它对图形的总体外观几乎没有影响。它只会使台阶的边缘更圆一点。 【参考方案1】:

interp1 将对您的数据使用线性插值,因此对您没有多大帮助。您可以尝试的一件事是使用带有interp1 的三次样条曲线,但再次考虑到数据的性质,我认为它不会有太大帮助。例如

备选方案 1。三次样条

xq = 0:0.001:max(Arb);
Vq = interp1 (Arb, V, xq, 'spline');
plot (xq, Vq);

备选方案 2. 多项式拟合

您可以尝试的另一种选择是使用polyfit 进行多项式插值。例如

p = polifit(Arb, V, 2); % I think a 2nd order polynomial should do
xq = 0:0.001:max(Arb);
Vq = polyval(p, xq);
plot (xq, Vq);

备选方案 3。 Alpha-Beta 过滤器

最后但并非最不重要的一点是,要尝试的另一件事是在您的 V 数据上使用平滑 alpha-beta filter。一种可能的实现方式是:

% x is the input data
% a is the "smoothing" factor from [0, 1]
% a = 0 full smoothing
% a = 1 no smoothing
function xflt  = alphaBeta(x, a)
    xflt = zeros(1,length(x));
    xflt(1) = x(1);

    a = max(min(a, 1), 0); % Bound coefficient between 0 and 1;

    for n = 2:1:length(x);
        xflt(n) = a * x(n) + (1 - a) * xflt(n-1);
    end
end

用法:

plot (Arb, alphaBeta(V, 0.65), 'r')

【讨论】:

以上是关于如何在 Matlab 中平滑阶梯状图的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中平滑曲线

如何在纯 JavaScript 中平滑滚动到元素

如何在opengl中平滑多个四边形的纹理

如何在 Java 中平滑 JFrame 的滚动

如何在 iOS 中平滑放大和缩小 UIButton

如何在 as3 中平滑图像的“缩放”和“平移”