2012-11-26 8 views
6

Ho un set di dati di 1 secondo di 86400 valori di velocità del vento (WS) in Matlab e ho bisogno di assistenza nel filtrarlo. Richiede un certo livello di intelligenza.Rompicapo: algoritmo di filtraggio con medie mobili

Se il WS media superiore:

  • 25m/s in un tempo 600s intervallo
  • 28m/s in un intervallo 30s tempo
  • 30m/s in 3 s intervallo di tempo

Se uno di questi parametri viene soddisfatto, il WS viene considerato 'non valido' fino a quando il WS medio rimane inferiore a 22 m/s in un intervallo di 300 s.

Ecco quello che ho per il secondo requisito di 600. Faccio una media mobile di 600 e 300 secondi sui dati contenuti in "set di dati". Filtro gli intervalli dalla prima apparizione di una media di 25 m/s alla successiva comparsa di un valore inferiore a 22 m/s come 'NaN'. Dopo il filtraggio, farò un'altra media di 600 secondi, e gli intervalli con valori segnalati con un NaN saranno lasciati a un NaN.

cioè

Rolling600avg(:,1) = tsmovavg(dataset(:,2), 's', 600, 1); 

Rolling300avg(:,1) = tsmovavg(dataset(:,2), 's', 300, 1); 

a = find(Rolling600avg(:,2)>25) 

b = find(Rolling300avg(:,2)<22) 

dataset(a:b(a:find(b==1)),2)==NaN; %?? Not sure 

Questo sta per richiedere un uso intelligente di 'trovare' e un po 'indicizzazione. Qualcuno potrebbe aiutarmi? I filtri da 28 m/se 30 m/s seguiranno lo stesso metodo.

+0

Non che sia eccessivamente rilevante per risolvere il problema, ma suppongo che con "WS" intendi la velocità del vento? – Mac

+0

Sì, grazie. L'ho aggiunto. – user1854628

+0

cosa stai cercando di fare con quest'ultima affermazione? – jerad

risposta

1

Se seguo la domanda, un approccio consiste nell'utilizzare un ciclo for per identificare dove devono iniziare e finire i NaN.

m = [19 19 19 19 28 28 19 19 28 28 17 17 17 19 29 18 18 29 18 29]; %Example data 
a = find(m>25); 
b = find(m<22); 
m2 = m; 
% Use a loop to isolate segments that should be NaNs; 
for ii = 1:length(a) 
    firstNull = a(ii) 
    lastNull = b(find(b>firstNull,1))-1 % THIS TRIES TO FIND A VALUE IN B GREATER THAN A(II) 
    % IF THERE IS NO SUCH VALUE THEN NANS SHOULD FILL TO THE END OF THE VECTOR 
    if isempty(lastNull), 
     lastNull=length(m); 
    end 
    m2(firstNull:lastNull) = NaN 
end 

Si noti che questo funziona solo se tsmovavg restituisce un vettore di lunghezza pari a quella passata ad esso. In caso contrario, è più complicato e richiederà alcune modifiche.

Probabilmente c'è un modo per evitare un ciclo for, ma questa è una soluzione piuttosto semplice.

+1

Sì, penso che questo dovrebbe funzionare. Ci sono 3 casi separati, tutti che terminano quando il WS è inferiore a 22m/s per 300 secondi. Questo è un caso: m1 = tsmovavg (dataset, 's', 300, 1); m2 = tsmovavg (dataset, 's', 600, 1); a = find (m1 <22); b = find (m2> 25); m21 = m2; % Utilizzare un ciclo per isolare i segmenti che dovrebbero essere NaN; per ii = 1: lunghezza (b) firstNull = b (ii) lastNull = a (find (a> firstNull, 1)) -1 if isempty (lastNull), lastNull = length (m2); fine m21 (firstNull: lastNull) = NaN; fine – user1854628

+1

sì, dovresti applicare questo metodo a tutti i tuoi criteri. Spero che questo sia stato d'aiuto. se ha risolto il tuo problema, sentiti libero di accettare la mia risposta controllando il segno di spunta accanto alla mia risposta. – jerad