How do I linearly interpolate past missing values using future values in a while loop?
    5 vues (au cours des 30 derniers jours)
  
       Afficher commentaires plus anciens
    
I am using MATLAB R2020a on a MacOS. I am trying to remove outlier  values in a while loop. This involves calculating an exponentially  weighted moving mean and then comparing this a vector value. If the  conditions are met, the vector input is then added to a separate vector  of 'acceptable' values. The while loop then advances to the next input  and calculates the new exponentially weighted moving average which  includes the newly accepted vector input. However, if the condition is not met, I written code so that, instead of adding the input sample, a zero is added to the vector of 'acceptable'  values. Upon the next acceptable value being added, I currently have it  so the zero immediately before is replaced by the mean of the 2 framing  acceptable values. However, this only accounts for one past zero and not for multiple outliers. Replacing with a framing mean may also introduce aliaising errors.
Is there any way that the zeros can instead be replaced by linearly  interpolating the "candidate outlier" point using the gradient based on  the framing 2 accepted vector input values? That is, is there a way of  counting backwards within the while loop to search for and replace zeros as soon as a new 'acceptable' value is found?
I would very much appreciate any suggestions, thanks in advance.
%Calculate exponentially weighted moving mean and tau without outliers
accepted_means = zeros(length(cycle_periods_filtered),1); % array for accepted exponentially weighted means
    accepted_means(1) = cycle_periods_filtered(1);
    k = zeros(length(cycle_periods_filtered),1); % array for accepted raw cycle periods
    m = zeros(length(cycle_periods_filtered), 1); % array for raw periods for all cycles with outliers replaced by mean of framing values
    k(1) = cycle_periods_filtered(1); 
    m(1) = cycle_periods_filtered(1);
    tau = m/3; % pre-allocation for efficiency
    i = 2; % index for counting through input signal
    j = 2; % index for counting through accepted exponential mean values
    n = 2; % index for counting through raw periods of all cycles
    cycle_index3(1) = 1;
    while i <= length(cycle_periods_filtered)
        mavCurrent = (1 - 1/w(j))*accepted_means(j - 1) + (1/w(j))*cycle_periods_filtered(i);
          if cycle_periods_filtered(i) < 1.5*(accepted_means(j - 1)) && cycle_periods_filtered(i) > 0.5*(accepted_means(j - 1))  % Identify high and low outliers
            accepted_means(j) = mavCurrent;
            k(j) = cycle_periods_filtered(i);
            m(n) = cycle_periods_filtered(i);
            cycle_index3(n) = i;
            tau(n) = m(n)/3;
            if m(n - 1) == 0
                m(n - 1) = (k(j) + k(j - 1))/2;
                tau(n - 1) = m(n)/3;
            end
            j = j + 1;
            n = n + 1; 
          else
            m(n) = 0;
            n = n + 1;     
          end   
0 commentaires
Réponses (0)
Voir également
Catégories
				En savoir plus sur Bartlett dans Help Center et File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
