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

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

 

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

Google       Google       7. 5. 2010       27 145×

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

Reklama
Reklama
Obrázek ke článku Nový IT hráč na českém trhu

Nový IT hráč na českém trhu

V roce 2015 otevřela v Praze na Pankráci v budově City Tower své kanceláře společnost EPAM Systems (NYSE:EPAM), jejíž centrála se nachází v USA. Společnost byla založená v roce 1993 a od té doby prošla velkým vývojem a stále roste.

Obrázek ke článku České Radiokomunikace opět hledají nejlepší nápady pro internet věcí

České Radiokomunikace opět hledají nejlepší nápady pro internet věcí

České Radiokomunikace (CRA) pořádají druhý ročník CRA IoT Hackathonů. Zájemci z řad vývojářů a fanoušků moderních technologií mohou změřit své síly a během jediného dne sestrojit co nejzajímavější funkční prototyp zařízení, které bude komunikovat prostřednictvím sítě LoRa. CRA IoT Hackathony se letos uskuteční ve dvou fázích, na jaře a na podzim, v různých městech České republiky. Jarní běh se odstartuje 31. března v Brně a 7. dubna v Praze.

Obrázek ke článku Cloud computing je využíván stále intenzivněji

Cloud computing je využíván stále intenzivněji

Využívání cloud computingu nabývá na intenzitě. Jen v letošním roce vzroste podle analytiků trh se službami veřejného cloudu o 18 %, přičemž o téměř 37 % vzrostou služby typu IaaS. Růst o více než pětinu pak čeká služby poskytování softwaru formou služby, tedy SaaS. Aktuálním trendům v oblasti využívání cloudu se bude věnovat konference Cloud computing v praxi, která se koná 23. března. 2017 v pražském Kongresovém centru Vavruška na Karlově náměstí 5.

Reklama autora

loadingtransparent (function() { var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true; po.src = 'https://apis.google.com/js/plusone.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s); })();
Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032017 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý