首页 > 解决方案 > 在MATLAB中计算指数加权移动平均值时如何从向量中连续去除异常值?

问题描述

我在 MacOS 上使用 MATLAB R2020a。我正在使用 dsp.MovingAverage 函数计算指数加权移动平均值,并尝试根据 2 个条件实时删除矢量元素 - 如果新元素导致平均值超过迄今为止“整体”平均值的 1.5 倍,或者如果它低于到目前为止“整体”平均值的 0.5 倍。

也就是说,将当前元素的加权平均值与之前的加权平均值进行比较,如果当前元素导致加权平均值增加到之前平均值的 1.5 倍以上或低于之前平均值的 0.5 倍,则应忽略并且递归方程改为应用于下一个元素,依此类推。最后,我想删除一个包含异常值的向量。

这是我用来计算指数加权移动平均值的函数:

movavgExp = dsp.MovingAverage('Method', 'Exponential weighting', 'ForgettingFactor', 0.4);
mean_cycle_period_exp = movavgExp(cycle_periods);

我尝试通过创建一个 for 循环来操作 dsp.MovingAverage 函数使用的算法,如下所述:

https://uk.mathworks.com/help/dsp/ref/dsp.movi​​ngaverage-system-object.html

但是,这种查找加权平均值的手动方法会为函数产生不同的图形输出。

% Create a vector containing 60 cycle periods with a step increase by 0.002 seconds 
cycle_period_step_change = [0.7:0.002:0.82]; 

% Calculate weights manually 
lambda = 0.1;
w = zeros(length(cycle_period_step_change),1); 
w(1) = 1; % initialize the weight for the first sample
for i = 2:length(cycle_period_step_change)
    w(i) = lambda*w(i-1) + 1; % calculate the successive weights
end

% Calculate moving mean with weights manually
x = zeros(length(cycle_period_step_change), 1);
x(1) = 2;
for i = 2:length(cycle_period_step_change)
    x(i) = (1 - 1/w(i))*x(i - 1) + (1/w(i))*x(i);
end

这是我手动计算加权平均值 时的输出 这是我使用函数计算加权平均值时的输出

此外,当我实现一个 for 循环以实时从移动平均值中排除异常值时,它会产生错误:

% Calculate moving mean with weights manually
x = zeros(length(cycle_period_step_change), 1);
x(1) = 2;
for i = 2:length(cycle_period_step_change)
    x(i) = (1 - 1/w(i))*x(i - 1) + (1/w(i))*x(i);
      if x(i) > 1.5*(1 - 1/w(i - 1))*x(i - 2) + (1/w(i - 1))*x(i - 1)
        x(i) = [];
      elseif x(i) < 0.5*(1 - 1/w(i - 1))*x(i - 2) + (1/w(i - 1))*x(i - 1)
        x(i) = [];
      end
end   

我非常感谢有关如何解决此问题的任何建议,在此先感谢!

标签: matlabsignal-processing

解决方案


推荐阅读