Buffer v klouzavym průměru = zpožďovací linka ve FIR. Do funkce budeš jen muset přidat pole s koeficienty a to pronásobit se zpožďovací linkou (= bufferem minulých vzorků) a celý to sečít. Je to jednoduchý. Členy “z^-1” ve schématu filtrů jsou zpožděné prvky. Tedy první Z^-1 je minulý. Druhý Z^-1 za prvním je předminulý atd… Realizace této zpožďovací linky se dělá kruhovým bufferem. Jelikož ho C nezná(DSP pro to mají hw podporu), používají se k tomu pointery - je to stejný princip jako jsem použil u klouzavýho průměru. Trochu se snaž, preci za tebe nebudu tu bakalářku nebo co to je dělat celou
(ikdyž by pro mě bylo rychlejší ti sem vysypat kód a vyřešeno).
Koeficinty si spočítej třeba v excelu, rovnici máš na odkazu na wiki. Jsou tam i grafy, podle nich si můžeš svoje výpočty zkontrolovat. Pro filtr 11. řádu z příkladu pro matlab výše vyšly koeficienty:[code]N(0,1): 1,48671951473430e-06 0,000133830225764885 0,00443184841193801 0,0539909665131881 0,241970724519143 0,398942280401433 0,241970724519143 0,0539909665131881 0,00443184841193801 0,000133830225764885 1,48671951473430e-06
N(0,3): 0,00357099380847855 0,0160040839217032 0,0513934432679231 0,118255073909459 0,194969655722741 0,230329432980890 0,194969655722741 0,118255073909459 0,0513934432679231 0,0160040839217032 0,00357099380847855[/code]
V matlabu jsem je počítal přímo, do procesoru si samozřejmě nahraješ jen tabulku s nimi.
Řekněme, že budeš počítat v 16 bitech, vstupní hodnoty budou v rozsahu <0, 255>. Koeficienty do tabulky pro C je tedy nutné přednásobit 65535/255 = 257 (a zaokrouhlit). Výstup bude v rozsahu <0, 65535> a tedy pro úpravu výsledku do <0, 255> stačí vydělit 256 (8x posun vpravo).
Pro rozdělení N(0, 3) zjistíš, že výstup je pouze v rozsahu <0, 65025> a po vydělení <0, 254>. Je to dáno tím, že součet zaokrouhlených koeficientů již není plných 257, ale pouze 255 (to je věc statistiky a gaussova rozdělení). To lze vyřešit třeba přičtením 1 ke krajním koeficientům.