Pokud jste podrobně studovali odkazy z minula, jistě jste zjisili, že mezi mnou a matematiky je jistý rozpor - klouzavý průměr dvou sousedních hodnot, který jsem označoval za N=2 označují matematici za filtr prvního stupně a označují jej N=1 - doufám že přežijete když zůstaneme u toho že moje čísla jsou o jedničku větší. Mimochodem další důvod nevykládat ve škole, co jste se zde dočetli.
Ačkoliv jsem matematiku kolem toho nikdy nestudoval, tak pokud máte prostý klouzavý průměr N sousedních prvků a máte vzorkovací frekvenci f tak tento filtr funguje jako dolní propust, který propouští frekvence menší než f/2N, pokud používáte exponenciální klouzavý průměr pak dělící frekvence je přibližně f/4N.
Když už jsem měl AVR assembler kolem těchto filtrů vypilovaný k naprosté dokonalosti, žačal jsem si s filtry hrát. nejenom že můžete prvky sčítat, ale taky odčítat a to nejenom sousední ale taky od sebe více vzdálené. K tomu pak potřebujete kruhové buffery. Pak jsem logicky odvodil jak udělat jednoduchou frekvenční propust - a to takto : Pokud hodnotu v bodě A odečteme od hodnoty v bodě B. - pokud je frekvence signálu rovná modré sinusovce, nebo jejím lichým násobkům - "vyšším harmonickým" (fialová sinusovka) - dostaneme signál s dvojnásobnou amplitudou, zatímco signály na jiných frekvencích jsou utlumené, nebo dokonce úplně potlačené (žlutá sinusovka). Kdybyste to potřebovali napsat matematicky takto:
Y (n) = X(n) - X(n-k)
kde k je polovina periody filtrovaného signálu v počtech vzorků. Tedy pokud potřebujeme při vrorkování 10 kHz filtrovat 1 kHz pak je to 10 vzorků na periodu a k=5 jasné ?
Vzhledem k tomu že na pravé straně rovnítka se nám nevyskytuje Y - tudíž výstup tohoto filtru neovlivňje jeho vstup - tudíž jste pochopili, že tento fitr je typu Finite impulse reponse.
Nicméně jeho filtrační účinnost není nic moc. A protože obecně exponenciální průměry / filtry (alias Infinite impulse response) jsou při jednodušší matematice účinnější než Finite impulse - tak jse začal experimentovat i s nimi a došel jsem ke "skoro geniálnímu" filtru jehož vstup vidíte modře a výsup fialově. Zde je vzoreček.
Y (n) = X(n) - X(n-k) - alfa * Y(n-k)
k je opět polovina periody. Všimněte si, že oproti minulé verzi tam přibyl jenom jeden člen navíc. Zajímavý je koeficient alfa - ten určuje míru přednosu "energie" z výstupu na vstup filtru. pokud je roven 1 - filtr se rozkmitá a nikdy nepřestane, pokud je menší než 1 - filtr se podobá analogovým filtrům ve starých rádiích "audionech", které pro zvýšení selektivity, taky malé množství signálu vracely na vstup - tak aby pracovaly "těsně pod bodem rozkmitání".
Že to funguje i pro zašumělé signály - vidíte na obrázku - amplituda šumu je stejná jako amplituda užitečného signálu, a přesto jej je filtr schopen detekovat. Protože u takto zašumělých signálů je výstpu filtru taky znešištěn šumem je za výstupem filtru ještě klasícký exponenciální klouzavý filtr, který modrou křivku pěkně "uhladí". Pokud byste si chtěli s filtry tohoto druhu hrát ZDE je původní excelový soubor, ze kterého jsem grafy generoval.
Jestli máte pocit, že jsme dneska nezabředli do žádné matematické teorie - není se čemu divit - toto vše jsem skoro jako Jára da Cimrman "objevil" sám. Pak jsem to použil pro filtraci signálů u mých pokusů s měřením vzdálenosti pomoci zvuku na slyšitelné frekvenci alias "Zvukarem" A pak ( konečně !!!) jsem zjistil, že matematici tyto filtry znají - jako tak zvané "hřebenové filtry". Případně jako tzv. CIC "cascaded integrator comb" filtry. První vrianta, kterou jsem popsal je tzv "feed forward" varianta, druhá "oscilující" varianta je "feed back" varianta - která má velmi úzká maxima propustnost - není div že dovede ze šumu ''vytěžit" signál i v nepříznivých podmínkách.
Samozřejmě je otázka, jestli bych se neměl stydět, že tohle je moje samo-domo pokusničení a né součást akademického vzdělání - osobně se za to nestydím - protože takhle jsem došel sice dosti daleko, ale nikoliv tak daleko aby se filtr tohoto typu nedal naprogramovat v AVR assembleru.
Jako obvykle dvě poznámky
1. čím více se koeficient "alfa" blíží 1 tím lépe filtr rozliší v šumu vlastní kmitočet, ale tím déle "dokmitává" - což je jenom čílsicová varianta koeficientu Q z klasických filtrů - filtry s vysokým Q dokonale rezonují, jsou vysoce selektivní, ale díky dlouhému "dozvuku" mají jen úzké pásmo propustnosti (dozvuk brání reagovat na rychlé změny signálu). Naopak filtry které mají nízké Q jsou daleko více "širokopásmové" propustí širší pásmo, ale na změny reagují rychleji.
přibližný vzoreček pro vztah Q a našeho koeficientu "alfa" je Q = 1/(1-alfa).
2. neuvádím žádné přiklady prográmků - protože předpokládám, že stejně budete všechno programovat v C a tudíž by můj AVR assembler nebyl pro vás zajímavý. Filtry jsou natolik nenáročné, že rozdíl výkonu mezi C a ASM nestojí většinou za tu práci. Místo progámků si prosdujte zmíněný příklad v XLS.
Zbývá už jenom rada paní Kubáčové novomanželkám - točí se váš mažel za cizími ženami a vás to štve ? Místo tichého zuření doporučuju úplně opačný postup - už z dálky musíte manželovi nahlas oznamovat: "Táto támhle jde fantastická kočka, žejo ?" Uvidíte, že mažel bude minimálně lehce zaražen ....
Dobré, dobré. Měl jsem to ve škole, ale v paměti mi po tom zůstala jen jakási negativně okořeněná mlha s matematickou pachutí.
Což mi připomíná; protože tu neustále vidím mrtvé diskuze, rád bych oficiálně dal na vědomí, že jsem za tyhle články docela rád, i když posledních pár let na elektroniku nemám čas. Je to zajímavé čtení.