分享轨迹平滑算法之滑动平均平滑(Moving Average, MA)MATLAB代码

应用

用于一维、二维、三维轨迹平滑(对需要平滑的轴使用该函数即可)

公式

以5点MA平滑为例:
y s ( i ) = 1 2 N + 1 ( y ( i + N ) + y ( i + N − 1 ) + … + y ( i − N ) ) y s ( 1 ) = y ( 1 ) y s ( 2 ) = ( y ( 1 ) + y ( 2 ) + y ( 3 ) ) / 3 y s ( 3 ) = ( y ( 1 ) + y ( 2 ) + y ( 3 ) + y ( 4 ) + y ( 5 ) ) / 5 y s ( 4 ) = ( y ( 2 ) + y ( 3 ) + y ( 4 ) + y ( 5 ) + y ( 6 ) ) / 5 \begin{array}{l} y_{s}(i)=\frac{1}{2 N+1}(y(i+N)+y(i+N-1)+\ldots+y(i-N)) \\ y_{s}(1)=y(1) \\ y_{s}(2)=(y(1)+y(2)+y(3)) / 3 \\ y_{s}(3)=(y(1)+y(2)+y(3)+y(4)+y(5)) / 5 \\ y_{s}(4)=(y(2)+y(3)+y(4)+y(5)+y(6)) / 5 \end{array} ys(i)=2N+11(y(i+N)+y(i+N1)++y(iN))ys(1)=y(1)ys(2)=(y(1)+y(2)+y(3))/3ys(3)=(y(1)+y(2)+y(3)+y(4)+y(5))/5ys(4)=(y(2)+y(3)+y(4)+y(5)+y(6))/5

MATLAB函数

function res = MovingAverage(input,N)
%% input为平滑前序列(列向量和行向量均可);N为平滑点数(奇数);res返回平滑后的序列(默认行向量)。
sz = max(size(input));
n = (N-1)/2;
res = [];
for i = 1:length(input)
    if i <= n
        res(i) = sum(input(1:2*i-1))/(2*i-1);
    elseif i < length(input)-n+1
        res(i) = sum(input(i-n:i+n))/(2*n+1);
    else
        temp = length(input)-i+1;
        res(i) = sum(input(end-(2*temp-1)+1:end))/(2*temp-1);
    end
end
end

input为平滑前序列(列向量和行向量均可);N为平滑点数(奇数);res返回平滑后的序列。

一个例子

clear;clc;close all;
arr = [1,2,4,3,6,5,7,7,9,10];
plot(1:10,arr,'LineWidth',3,'color','r');hold on;
arr_MA = MovingAverage(arr, 5);
plot(1:10,arr_MA,'LineWidth',3,'color','b')
legend("平滑前","平滑后");grid on;

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43145941/article/details/114178281
今日推荐