1 算法原理-参考链接
移动平均:你知道的与你不知道的
2 MATLAB代码
clc;clear;close all; % 清屏
%%% https:
%%% 赫尔移动平均
%% 数据准备
A=100*sin(0.008*(1:1:1000));
A=A+2*randi([-1,1],1,1000); % 1行1000列的随机数矩阵,数值在30-100之间
[size_A1,size_A2]=size(A);% 获取A的 行数和列数
%% 预先设置的参数
T=80;
DOUBLE_T=2*T;
%% 预置滤波后数据的空间
A_WMA_1=A(1,1:T-1); % 预置滤波后数据的空间
A_WMA_2=A(1,1:DOUBLE_T-1); % 预置滤波后数据的空间
%% 计算T内的加权移动平均
for k=T:1:size_A2
S=0;
for kk=0:1:T-1
S=S+(T-kk)*A(1,k-kk);
end
S=(2*S)/(T*(1+T));
A_WMA_1=[A_WMA_1 S];
end
%% 计算2*T内的加权移动平均
for k=DOUBLE_T:1:size_A2
S=0;
for kk=0:1:DOUBLE_T-1
S=S+(DOUBLE_T-kk)*A(1,k-kk);
end
S=(2*S)/(DOUBLE_T*(1+DOUBLE_T));
A_WMA_2=[A_WMA_2 S];
end
%% 新序列
A_WMA_3=2*A_WMA_1-A_WMA_2;
%% 使用新序列,计算根号T取整内的加权移动平均
T=sqrt(T);
T=round(T);
A_HMA=A_WMA_3(1,1:T-1); % 预置滤波后数据的空间
for k=T:1:size_A2
S=0;
for kk=0:1:T-1
S=S+(T-kk)*A_WMA_3(1,k-kk);
end
S=(2*S)/(T*(1+T));
A_HMA=[A_HMA S];
end
%% 滤波结果可视化
figure('Name','FRAMA滤波演示','NumberTitle','off');
plot1=plot(A,'b-'); % 原始数据
hold on;
plot2=plot(A_WMA_1,'r--'); % 滤波后数据
hold on;
plot3=plot(A_WMA_2,'k--'); % 滤波后数据
hold on;
plot4=plot(A_HMA,'m--'); % 滤波后数据
hold on;
legend([plot1,plot2,plot3,plot4],'原始数据','A\_WMA_1','A\_WMA\_2','A\_HMA');
3 滤波效果
|