滤波算法——分形自适应移动平均

滤波算法——分形自适应移动平均

  • 1 原理参考链接
  • 2 MATLAB代码
  • 3 滤波效果
  • 如有错误,请大家多多指正,希望与大家多多交流 !

1 原理参考链接

移动平均:你知道的与你不知道的

2 MATLAB代码

clc;clear;close all; % 清屏
%%% https://zhuanlan.zhihu.com/p/38276041
%%% 分形自适应移动平均

%% 数据准备
A=100*sin(0.02*(1:1:1000));
A=A+5*randi([-6,10],1,1000); % 11000列的随机数矩阵,数值在30-100之间
[size_A1,size_A2]=size(A);% 获取A的 行数和列数
A_FRAMA=[]; % 预置滤波后数据的空间

%% 预先设置的参数
T=6;
DOUBLE_T=2*T;

%% 1~DOUBLE_T内的采用指数移动平均
for k=1:1:DOUBLE_T-1
    if k==1
    EMA_k0=A(1,k);
    elseif k>1
    EMA_k0=(1-1/DOUBLE_T)*A(1,k)+(1/DOUBLE_T)*EMA_k0;
    end
    A_FRAMA(1,k)=EMA_k0;
end
    
%% DOUBLE_T以后的的采用FRAMA
for k=DOUBLE_T:1:size_A2
    
    %% 计算W_1窗口内的N1
    A_min=A(1,k-T+1);
    A_max=A(1,k-T+1);
    for kk=k-T+1:1:k-1
        if  A(1,kk+1)<A_min% 比较法找最小值
            A_min=A(1,kk+1);
        elseif A(1,kk+1)>A_max% 比较法找最大值
            A_max=A(1,kk+1);
        end
        N1=A_max-A_min;
        N1=N1/T;
    end
    A_min=A(1,k-DOUBLE_T+1);
    A_max=A(1,k-DOUBLE_T+1);
    
    %% 计算W_2窗口内的N2
    for kk=k-DOUBLE_T+1:1:k-T-1
        if  A(1,kk+1)<A_min% 比较法找最小值
            A_min=A(1,kk+1);
        elseif A(1,kk+1)>A_max% 比较法找最大值
            A_max=A(1,kk+1);
        end
        N2=A_max-A_min;
        N2=N2/T;
    end
    A_min=A(1,k-DOUBLE_T+1);
    A_max=A(1,k-DOUBLE_T+1);
    
    %% 计算W窗口内的N
    for kk=k-DOUBLE_T+1:1:k-1
        if  A(1,kk+1)<A_min% 比较法找最小值
            A_min=A(1,kk+1);
        elseif A(1,kk+1)>A_max% 比较法找最大值
            A_max=A(1,kk+1);
        end
        N=A_max-A_min;
        N=N/DOUBLE_T;
    end
    
    %% 命令窗口调试
    
    %% 计算分形维数D
    D=N1+N2;
    D=log(D);
    D=D-log(N);
    D=D/log(2);
    %% 计算分形维数alpha
    alpha=D-1;
    alpha=-4.6*alpha;
    alpha=exp(alpha);
    
    %% 利用alpha进行指数移动平均计算
    if k==DOUBLE_T+1
    EMA_k0=A(1,k);
    elseif k>DOUBLE_T+1
    EMA_k0=alpha*A(1,k)+(1-alpha)*EMA_k0;
    end
    A_FRAMA=[A_FRAMA EMA_k0];
end

%% 滤波结果可视化
figure('Name','FRAMA滤波演示','NumberTitle','off');
plot1=plot(A,'b-'); % 原始数据
hold on;
plot2=plot(A_FRAMA,'r--'); % 滤波后数据
hold on;
legend([plot1,plot2],'原始数据','滤波后数据');

3 滤波效果

滤波算法——分形自适应移动平均_第1张图片

如有错误,请大家多多指正,希望与大家多多交流 !

你可能感兴趣的:(MPC,控制算法,数据处理,大数据,时序数据库)