Digitalni filtr napeti potenciometru jednoduch dig. filtr celocisleny

Lukáš Grepl L.Grepl@sh.cvut.cz
Středa Duben 8 20:06:21 CEST 2009


> muzete udelat jednoduchy dig. filtr celociselny. Prumer poslednich
> ctyr napriklad. Neni nutny zadny kruhovy buffer. Staci si pamatovat
> soucet.

Pro klouzavý průměr posledních (např. čtyřech) hodnot, kde každá má 
stejnou váhu je vždy potřeba nějaký ten buffer na zapamatování minulých 
hodnot mít (ať už v jakékoliv podobě).

Teoreticky to probíhá takto
A[0] = 0
A[1] = X[1]
A[2] = X[1] + X[2]
A[3] = X[1] + X[2] + X[3]
A[4] = X[1] + X[2] + X[3] + X[4]
A[5] =        X[2] + X[3] + X[4] + X[5]
A[6] =               X[3] + X[4] + X[5] + X[6]
A[7] =                      X[4] + X[5] + X[6] + X[7]
atd...

Nicméně v každém kroku stačí udělat jen jeden součet a jeden rozdíl, 
takže z výpočetního hlediska to má příjemnou složitost O(1).

Obecně jde o následující výpočet (pro velikost bufferu N průměruje 
poslední N vzorků):
A[n] = A[n-1] - A[n-N] + X[n]
Y[n] = A[n] / N

v praxi se to napíše takto
A := A - B[n] + X;
B[n] := X;
n := (n + 1) mod N;
Y := A / N;

Jemnou modifikací se dá dosáhnout toho, že pro buffer o velikosti N se 
průměruje N+1 posledních vzorků.

> Algoritmus pro prumer posl.4:
> 
> 1. Pri prvnim mereni naplnim hodnotu souctu 4x danou hodnotou tj.
> jednoduchy bitovy posun 2x 2. Vysledna hodnota po prvnim a jakemkoliv
> dalsim mereni je zase posun bitovy 2x na druhou stranu 3. Pri zapisu
> nove hodnoty do souctu nejrpve odectu 1/4 tj. s posunem bitu 2x a
> pote prictu novou hodnotu.

Tohle je v podstatě číslicová dolní propust prvního řádu - tj. realizuje 
to exponenciální zapomínání, nikoliv lineární. V podstatě děláte

A[n] = 3/4*A[n-1] + X[n], Y[n] = A[n]/4

předpokládejme A[0] = 0
potom postupně
A[1] = X[1]
A[2] = 3/4*X[1] + X[2]
A[3] = 9/16*X[1] + 3/4*X[2] + X[3]
A[4] = 27/64*X[1] + 9/16*X[2] + 3/4*X[3] + X[4]
A[5] = 81/256*X[1] + 27/64*X[2] + 9/16*X[3] + 3/4*X[4] + X[5]
A[6] = 243/1024*X[1] + ... + X[5]
A[7] = 729/4096*X[1] + ...... + X[6]
atd.

To samozřejmě v principu není na závadu a je to naprosto legitimní 
postup, pokud to tak chcete. Ale nedá se říct, že je to průměrování 
posledních čtyřech vzorků. Všimněte si, že na výsledek mají teoreticky 
vliv, při nekonečně přesnosti, dokonce všechny vzorky za celou historii.

Pokud vzorec filtru zobecním na
A[n] = (k-1)/k*A[n-1] + X[n]
potom časová konstanta filtru (počet vzorků pro přenesení ~63% skokové 
změny vstupní hodnoty na výstup) je

d = 1/ln(k/(k-1))

tedy pro k=4 je d ~ 3.5. Po cca 3*d už bude výstup téměř ustálený.

Snad jsem se v tom někde nezamotal.

Lukáš Grepl



Další informace o konferenci Hw-list