Не могли бы вы просто провести позиции через фильтр нижних частот?
что-то порядка
x(n) = (1-K)*x(n-1) + K*S(n)
, где
S - ваши зашумленные сэмплы, а x - сэмплы нижних частот. K - это константа от 0 до 1, с которой вам, вероятно, придется поэкспериментировать для достижения наилучшей производительности.
За предложение ТЗ:
Мой псевдокод будет выглядеть ужасно C как:
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:
В двух словах, это просто интегратор обратной связи с задержкой в одну выборку. Если ваш вход имеет низкочастотный белый шум поверх желаемого сигнала, этот интегратор будет усреднять входной сигнал с течением времени, в результате чего составляющие шума будут усредняться почти до нуля, оставляя вас с желаемым сигналом.
Насколько хорошо он будет работать, зависит от уровня шума в вашем сигнале и коэффициента обратной связи фильтра K. Как я уже говорил, вам придется немного поэкспериментировать со значением, чтобы увидеть, какое значение дает наиболее чистый и желательный результат. результат.