Realizace filtrů FIR a IIR v programovacím jazyce C#
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Realizace filtrů FIR a IIR v programovacím jazyce C#Realizace filtrů FIR a IIR v programovacím jazyce C#

 
Hledat
Vybavení pro Laser Game
Spuštěn Filmový magazín
Laser Game Brno
Pergoly a střechy Brno

Realizace filtrů FIR a IIR v programovacím jazyce C#

Google       Google       7. 5. 2010       31 962×

S rozvojem digitální techniky a zvláště té počítačové se objevily nové možnosti při zpracování signálů, a to i v oblastech, kde dříve kralovala pouze technika analogová. Jednou z takových oblastí je i filtrace signálů. Základními stavebními kameny jsou filtry FIR a IIR.

Reklama
Reklama

Ty se realizují ve velkém množství variant, přesto princip zůstává vždy stejný. Ačkoliv hlavní platformou pro jejich využití jsou digitální signálové procesory a obvody FPGA, jejich principu využívá i velké množství softwaru, ať už profesionálního, či vytvořeného „na koleni“. Ačkoliv v dalším textu předpokládám alespoň minimální znalost z oblasti digitálního zpracování signálů, jistě neškodí si připomenout některé základní vlastnosti digitálních filtrů.

Filtry FIR

Filtry FIR jsou matematicky jednoduše popsatelné filtry, které ale v analogové technice nemají ekvivalent (na rozdíl od filtrů IIR). Jsou tvořeny zpožďovacími linkami, kterých je vždy o 1 méně, než je řád filtru. Musíme si ale říci, že řád filtru FIR v tomto případě není totéž co řád filtru analogového. V digitálním filtru FIR musíme volit řád několikanásobně větší. Za zpožďovacími linkami následují násobičky s koeficienty filtru a součtový člen.

Filtry FIR mají oproti IIR několik výhod. Nemění fázi s ohledem na přenášenou frekvenci signálů a tím jsou vhodné i pro signály s větší šířkou pásma. S tím souvisí i skupinové zpoždění signálu. Jsou také jednodušší na pochopení. Ovšem zásadní nevýhodou je velký počet zpožďovacích linek a násobiček, které obsahují. Navíc, než dojde k plné inicializaci filtru, musíme vyhodit prvních několik vzorků. Pokud tedy chceme použít filtr pro „vyčištění“ naměřených dat, FIR filtr nebude tím pravým.

Filtry IIR

Realizace a matematický popis IIR filtru již nejsou tak jednoduché, jako tomu bylo v předchozím případě. IIR filtr obsahuje i zpětnou vazbu. Oproti FIR filtru ale není třeba tak velkého počtu zpožďovacích linek, a proto je možné jej použít i na kratší data (inicializace není tak dlouhá). Nevýhodou tohoto filtru je závislost fáze výstupního signálu na frekvenci. Nehodí se proto na širokopásmové signály. Naproti tomu filtrování pomalu měřených dat lze IIR filtru svěřit zcela bez obav.

Koeficienty filtrů, ať už FIR, nebo IIR, lze bez problémů spočítat například v Matlabu nebo v jiném k tomu určeném softwaru. Existuje také mnoho zdrojů, kde lze zjistit, jakým způsobem koeficienty odhadnout nebo spočítat. Zdroje jsou uvedeny na konci článku.

Realizace FIR filtru v jazyce C#

Následující zdrojový kód představuje jednu z možností, jak realizovat FIR filtr jazyce C#. Kód je dále komentován.

// aplikuje FIR filtr
public static void ApplyFIR(ArrayList coef, ArrayList x, out ArrayList y)
{
    y = new ArrayList();
    int n_x = x.Count;
    int n_c = coef.Count;

    double[] x_field = new double[n_c];
    double sum = 0;

    // provede konvoluci dat a koeficientu
    for (int a = 0; a < n_x; a++)
    {
        // provadi plneni pole x_field, jehoz polozky se nasobi s koeficienty 1:1
        for (int b = 0; b <= a; b++)
        {                   
            double test = (double)x[a-b];
            if (b <= (n_c - 1)) x_field[b] = test;
        }
        // provadi samotnou MAC operaci (vypocet y(b) )
        sum = 0;
        for (int b = 0; b < n_c; b++)
        {
            sum += x_field[b] * (double)coef[b];
        }
        // ulozeni jednoho y(n)
        y.Add(sum);
    }
}

Vstupními parametry filtru jsou jeho koeficienty „coef“ a vstupní vzorky „x“. Nejprve je vytvořeno pole „y“ pro výstupní vzorky a spočítána velikost vstupních vzorků a velikost koeficientů. Následně je vytvořeno pole „x_field“ o velikosti totožné s velikostí pole koeficientů. V poli „x_field“ bude v každé iteraci filtrační smyčky posloupnost vstupních vzorků posunuta o jeden vzorek směrem k nejmladšímu vzorku. Následným násobením „x_field[b]*coef[b]“ je zajištěno ono násobení vzorků koeficienty uvedené v popisu FIR filtru výše. Po kompletním vynásobení polí „x_field“ a „coef“ jsou součiny sečteny a výsledek uložen do pole „y“. Popsaný proces se nazývá konvoluce.

Uvedený příklad je velmi jednoduchý. Na konec článku jsou doplněny plné zdrojové kódy spolu s ukázkou využití této operace v praxi. Je jasné, že v prostředí C# není možné filtrovat data nějakou zázračnou rychlostí, nicméně pro zpracování dat off-line se to může hodit.

Realizace IIR filtru v jazyce C#

Následující zdrojový kód představuje jednu z možností, jak realizovat IIR filtr jazyce C#. Kód je dále komentován.

// aplikuje IIR filtr
public static void ApplyIIR(double[] coefA, double[] coefB, ArrayList data, out     ArrayList y)
{            
    y = new ArrayList();   // incializace vystupu
    int cn = coefA.Length; // pocet koeficientu fitru, rad filtru = cn-1
    double[] xn = new double[cn]; // pole pro dopredny smer
    double[] yn = new double[cn]; // pole pro zpetny smer
    
    // inicializace dat
    for (int i = 0; i < cn; i++) xn[i] = yn[i] = (double)data[0];

    // vypocet filtru
    for (int i = 0; i < data.Count; i++)
    {
        
        // posuv dat
        for (int ii = 1; ii < cn; ii++)
        {
            xn[cn - ii] = xn[cn - (ii + 1)];
            yn[cn - ii] = yn[cn - (ii + 1)];
        }
        
        // inicializace vypoctu jedne iterace
        xn[0] = (double)data[i];
        yn[0] = 0;

        // dopredny smer = SUM(x_i,b_i)
        for (int ii = 0; ii < cn; ii++)
            yn[0] += coefB[ii] * xn[ii];

        // zpetny smer = SUM(y_i,a_i)
        for (int ii = 1; ii < cn; ii++)
            yn[0] -= coefA[ii] * yn[ii];

        // ulozeni vysledku
        y.Add(yn[0]);
    }
}

Uvedený zdrojový kód je přímým přepisem matematické formulace IIR filtru, uvedené v popisu výše. V první části jsou opět zjištěny délky koeficientů. Protože se předpokládá, že koeficienty pro přímý i zpětný směr mají stejnou délku, počítá se jen první z nich. Následně je inicializována zpožďovací linka. Je vhodné ji inicializovat prvním vzorkem vstupních dat, aby se ve výstupu neprojevila odezva na jednotkový skok.

Poté je již pouze zajišťována správa zpožďovací linky a výpočet dle matematického vzorce uvedeného v definici IIR filtru výše. Nejprve je počítán dopředný směr, poté směr zpětný a výsledek opět uložen do výstupního pole y(n).

Na následujících grafech jsou uvedeny průběhy vstupního a vyfiltrovaného signálu s mezní frekvencí 0,2 fvz. Prvním signálem je vždy Diracův impulz, druhým pak logaritmus vloženým Diracovým impulzem. V případě IIR filtru byl zvolen filtr o 59 koeficientech a také z grafu je jasné, že zpoždění filtru je 59/2 (tedy 29) vzorků. V případě IIR filtru byl zvolen filtr o 4 koeficientech a zpoždění je tedy výrazně menší.

Modře jsou označeny vstupní signály, červeně signály výstupní. 

Závěr

Uvedené grafy potvrzují, že realizace digitálních filtrů v jazyce C# je velice jednoduchou záležitostí. V některém z dalších článků se budeme věnovat filtraci dvourozměrných dat. Tyto metody se často uplatňují pro filtraci a vylepšování obrazu, tak jak je známe například z programů typu Photoshop.

×Odeslání článku na tvůj Kindle

Zadej svůj Kindle e-mail a my ti pošleme článek na tvůj Kindle.
Musíš mít povolený příjem obsahu do svého Kindle z naší e-mailové adresy kindle@programujte.com.

E-mailová adresa (např. novak@kindle.com):

TIP: Pokud chceš dostávat naše články každé ráno do svého Kindle, koukni do sekce Články do Kindle.

Hlasování bylo ukončeno    
0 hlasů
Google
(fotka) Ondřej KarasAutor se věnuje vývoji řídících a komunikačních systémů a tvorbě podpůrných aplikací.
Web    

Nové články

Obrázek ke článku Konference: Moderní informační systémy podporují automatizaci

Konference: Moderní informační systémy podporují automatizaci

Současná situace v šíření onemocnění Covid-19 klade na řadu firem nové nároky a mnohé z nich jsou nyní více než kdy jindy závislé na nejmodernějších informačních technologiích. Proto i v oblasti podnikových informačních systémů vidíme rostoucí důraz na automatizaci nebo na důslednou integraci. Také o těchto trendech se bude mluvit na konferenci Firemní informační systémy, která se koná 24.9.2020 v pražském Kongresovém centru Vavruška na Karlově náměstí.

Reklama
Reklama
Obrázek ke článku Nebezpečí ukrytá v USB: z nuly na škvarek za pět sekund

Nebezpečí ukrytá v USB: z nuly na škvarek za pět sekund

Za cenu šesti dolarů lze celkem bez obtíží koupit nový, líbivě vyhlížející flash disk. Přidaná hodnota, které se vám spolu s ním dostane, už tak moc líbivá není. To, co se před pár sekundami tvářilo jako externí disk, se po připojení k počítači změní v důmyslné elektrické křeslo, které vaše zařízení v onen příslovečný škvarek promění za pár sekund. Cílovou skupinou pro koupi takových zařízení by mohli být záškodníci, kteří by tímto způsobem osnovali pomstu třeba vůči záletnému partnerovi. 

Obrázek ke článku Znalosti, dovednosti i prestižní titul MBA: Jde to i moderně a online

Znalosti, dovednosti i prestižní titul MBA: Jde to i moderně a online

Snad nikdy není špatná příležitost na investici do hodnotného vzdělání. Obzvlášť v případě, že absolvent dovede teoretické poznatky přetavit v praktické dovednosti, využitelné při řešení problémů i v komunikaci. Právě na to se specializuje studijní program MBA Řízení informačních technologií, vyučovaný na Business Institutu.

Obrázek ke článku Coding Bootcamp Praha: Obor IT krize nepoznamenala, žádaní jsou weboví vývojáři

Coding Bootcamp Praha: Obor IT krize nepoznamenala, žádaní jsou weboví vývojáři

Pandemie Covid-19 otřásla trhem práce v základech. Dopady krize pocítilo celkově až 45 % zaměstnanců. Není divu, že čím dál větší jistotu přináší obor IT. Ten zůstal krizí téměř nepoznamenán a při nutnosti začít dělat věci na dálku se ještě více ukázalo, jak moc mnohé firmy kvalitní IT potřebují. Do IT nyní přicházejí začátečníci, kteří v něm vidí lukrativní budoucnost a jistotu, ale i freelanceři a zaměstnanci z oborů zasažených krizí

Reklama autora

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032020 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý