Potresti semplicemente eseguire le posizioni attraverso un filtro passa basso?
Qualcosa dell'ordine
x(n) = (1-K)*x(n-1) + K*S(n)
dove
S è i vostri campioni e x rumorosi, i campioni filtrati passa-basso. K è una costante tra 0 e 1 che probabilmente dovresti sperimentare per ottenere le migliori prestazioni.
suggerimento di Per TK:
mio pseudocodice avrà un aspetto terribilmente c come:
float noisy_lat[128], noisy_long[128];
float smoothed_lat[128], smoothed_lon[128];
float lat_delay=0., lon_delay=0.;
float smooth(float in[], float out[], int n, float K, float delay)
{
int i;
for (i=0; i<n; i++) {
*out = *in++ * K + delay * (1-K);
delay = *out++;
}
return delay;
}
loop:
Get new samples of position in noisy_lat and noise_lon
// LPF the noise samples to produce smoother position data
lat_delay = smooth(noisy_lat, smoothed_lat, 128, K, lat_delay);
lon_delay = smooth(noisy_lon, smoothed_lon, 128, K, lon_delay);
// Rinse. Repeat.
go to loop:
In poche parole, questo è un semplicemente un integratore di retroazione con un ritardo di un campione. Se il tuo ingresso ha un rumore bianco di bassa frequenza sulla parte superiore del segnale desiderato, questo integratore calcolerà la media del segnale di ingresso nel tempo, causando così una media dei componenti di rumore fino allo zero vicino, lasciandoti con il segnale desiderato.
come funziona dipenderà da quanto rumore il segnale ha e il fattore di feedback filtro di K. Come ho detto prima, si dovrà giocare un po 'con il valore per vedere quale valore produce il più pulito, più risultato desiderabile.
Puoi dare un "per esempio" usando lo pseudocodice? Penso che lo renderebbe molto più chiaro per l'OP. –
Grazie per l'esempio dettagliato ... andando ad hash questo oggi e vedere se aiuta. – corrumpu
@corrumpu Ha funzionato? – Yankee