\section{Digitálne filtre} \label{sec:digitalne_filtre}

Najpriamočiarejší spôsob implementácie digitálnych filtrov je konvolúciou vstup\-né\-ho signálu s impulznou odozvou digitálneho filtru. Keď je impulzná odozva použitá takýmto spôsobom, hovoríme o jadre filtru (filter kernel). Podľa toho aké jadro filtru navrhneme, môžeme vytvoriť filter s takmer ľubovoľnou frekvenčnou charakteristikou. Filter implementovaný konvolúciou, má každú vzorku výstupného signálu vypočítanú vážením vstupných vzoriek (násobením koeficientom) a ich spočítaním.

Iný spôsob vytvárania digitálnych filtrov je pomocou rekurzie.
Rekurzívne filtre používajú na rozdiel od filtrov realizovaných konvolúciou predchádzajúce \emph{výstupné} vzorky. Namiesto použitia jadra filtru sú rekurzívne filtre definované sadou rekurzívnych koeficientov.

Rekurzívne filtre sú tiež nazývané filtre s nekonečnou impulznou odozvou (IIR -- Infinite Impulse Response) a konvolučné filtre sú nazývané filtre s konečnou impulznou odozvou (FIR -- Finite Impulse Response).
 
\subsection{FIR filtre}

FIR filtre môžeme rozdeliť podľa použitia do troch skupín:
\begin{enumerate}
  \item[-] vhodné pre časovú oblasť (kĺzavý priemer), 
  \item[-] pre frekvenčnú oblasť (sinc filtre s okienkovou funkciou -- Windowed-sinc),
  \item[-] filtre plne definované používateľom (vlastný dizajn).
\end{enumerate}


\subsubsection{Filtre realizujúce kĺzavý priemer}

Filtre, ktoré realizujú kĺzavý priemer (Moving Average Filters) sú naj\-po\-u\-ží\-va\-nej\-ší\-mi filtrami v číslicovom spracovaní signálu. Hlavne pretože sú jednoduché na použitie a pochopenie. Kĺzavý priemer je optimálny na odstránenie náhodného šumu (bieleho šumu) pri zachovaní ostrých hrán odozvy na jednotkový skok. To ho robí výborným nástrojom pre signály kódované v časovej oblasti. Vo frekvenčnej oblasti sa veľmi neuplatní, pretože má len malú schopnosť oddeliť jedno pásmo frekvencií od druhého.

Spôsob implementácie kĺzavého filtru je vyjadrený rovnicou \ref{eq:klzavy_priemer}: 
\begin{equation}
  y[i] = \frac{1}{M} \sum_{j = -(M-1)/2}^{(M-1)/2} x[i + j],
  \label{eq:klzavy_priemer}
\end{equation}
kde $x[]$ je vstupný signál, $y[]$ je výstupný signál, $i$ je číslo vzorky a $M$ je počet priemerovaných hodnôt (v tomto vzťahu musí byť $M$ nepárne číslo). 

Frekvenčná odozva filtru realizujúceho kĺzavý priemer je na obrázku \ref{pic:klzavy_priemer_frekvencna_odozva}. Frekvencia na osi x je normovaná k vzorkovaciemu kmitočtu.
\begin{figure}[hbtp]
	\centering
		\includegraphics[width=\columnwidth /3*2]{../obrazky/teoreticky_rozbor/klzavy_priemer_frekvencna_odozva}
	\caption{Frekvenčná odozva filtru s kĺzavým priemerom}
	\label{pic:klzavy_priemer_frekvencna_odozva}
\end{figure}

Odozva sa môže vyjadriť funkciou:
\begin{equation}
  H[f] = \frac{\sin (\pi f M)}{M \sin (\pi f)}, \forall f \neq 0,
  \label{eq:klzavy_priemer_frekvencna_odozva}
\end{equation}
čo je vlastne Fourierova transformácia obdĺžnikového pulzu. Kĺzavý priemer realizuje veľmi zlú dolnú priepusť, kvôli pomalému roll-off faktoru a malému potlačeniu signálu v nepriepustnom pásme.

Veľká výhoda tohto typu filtru leží v možnosti jeho implementácie pomocou rýchleho a výpočtovo nenáročného algoritmu. Využijeme pritom, že súčet doterajších vzoriek vstupného signálu je uložený v predchádzajúcej výstupnej vzorke. Táto myšlienka je zachytená v rovnici \ref{eq:klzavy_filter_rekurzivna_implementacia}. Člen $x[i-q]$ je najstaršia vzorka vstupného signálu, ktorú musíme odpočítať, aby mal filter konečnú, konštantnú dĺžku.
\begin{equation}
  y[i] = y[i - 1] + x[ i + p] - x[i - q],
  \label{eq:klzavy_filter_rekurzivna_implementacia}
\end{equation}
pričom $p = (M - 1)/2$, $q = p + 1$, $x[]$ je vstupný signál, $y[]$ je výstupný signál, $i$ je číslo vzorky a $M$ je počet priemerovaných hodnôt (nepárne číslo). Prvý bod výstupného signálu ($y[]$) musí byť vypočítaný pomocou rovnice \ref{eq:klzavy_priemer}. \cite{dsp_guide} 


\subsubsection{Windowed-sinc filtre}

Windowed-sinc filtre majú impulznú odozvu funkcie $sinc()$ vynásobenej zvoleným oknom. Sú používané na oddelenie jedného frekvenčného spektra od druhého. Sú veľmi stabilné, pri ich používaní nenarazíme na nepríjemné prekvapenia a dajú sa s nimi dosiahnuť výborné výsledky. Na rozdiel od frekvenčnej oblasti je v časovej oblasti ich výkon slabý. V odozve na jednotkový skok nájdeme výrazný prekmit a zvlnenie. Pri implementácii klasickou konvolúciou sú relatívne pomalé, zrýchlenie dosiahneme použitím konvolúcie realizovanej pomocou rýchlej Fourierovej transformácie.

Modul kmitočtovej charakteristiky ideálnej dolnej priepusti má obdĺžnikový tvar. V časovej oblasti sa jedná o funkciu $sinc()$. Jadro filtru s ideálnou frekvenčnou odozvou je teda funkcia $sinc()$. Problém je, že $sinc()$ je funkcia, ktorej amplitúda sa blíži k nule až v nekonečne (viď obr. \ref{pic:windoved_sinc_sinc}). Takýto filter sa nedá prakticky implementovať. Po redukovaní počtu vzoriek (vynásobení obdĺžnikovým oknom) vznikne vo frekvenčnej odozve nežiaduce zvlnenie a zákmity (obr. \ref{pic:windowed_sinc_sinc_orezany}). Na potlačenie týchto nežiaducich prejavov bola vytvorená sada okien, ktoré orežú funkciu $sinc()$ vhodnejším spôsobom.

\begin{figure}[hbtp]
	\centering
		\includegraphics[width=\columnwidth /3*2]{../obrazky/teoreticky_rozbor/windoved_sinc_sinc}
	\caption{Priebeh funkcie $sinc()$}
	\label{pic:windoved_sinc_sinc}
\end{figure}

\begin{figure}[hbtp]
	\centering
		\includegraphics[width=\columnwidth]{../obrazky/teoreticky_rozbor/windowed_sinc_sinc_orezany}
	\caption{Orezaná funkcia $sinc()$ a jej frekvenčná odozva}
	\label{pic:windowed_sinc_sinc_orezany}
\end{figure}

Existuje viacero okien s rôznymi vlastnosťami, napríklad Bartlettove, Hannove, Blackmanove alebo Hammingove okno. Z nich posledné dve sú naj\-po\-u\-ží\-va\-nej\-šie.

Hammingove okno je popísané funkciou \ref{eq:hammingove_okno}
\begin{equation}
  w[i] = 0.54 - 0.45 \cos (2 \pi i / M)
  \label{eq:hammingove_okno}
\end{equation}
a Blackmanove okno rovnicou \ref{eq:blackmanove_okno}
\begin{equation}
  w[i] = 0.42 - 0.5 \cos (2 \pi i / M) + 0.08 \cos (4 \pi i / M),
  \label{eq:blackmanove_okno}
\end{equation}
kde $i$ sa mení od 0 do $M$, výsledkom je teda filter dlhý $M+1$ vzoriek.

Z obr. \ref{pic:blackman_hamming} je vidieť, že Hammingove okno má lepší roll-off faktor ako Blackmanove (asi o 20 \% \cite{dsp_guide}). To má zase lepší útlm v nepriepustnom pásme (-74 dB so zvlnením 0.02 \%) oproti Hammingovmu oknu s -53 dB útlmom a zvlnením 0.2 \%. 

\begin{figure}[hbtp]
	\centering
		\includegraphics[width=\columnwidth]{../obrazky/teoreticky_rozbor/blackman_hamming}
	\caption{Frekvenčné charakteristiky Hammingovho a Blackmanovho okna}
	\label{pic:blackman_hamming}
\end{figure}

Jadro windowed-sinc filtru vypočítame pomocou rovnice \ref{eq:windowed_sinc_jadro}
\begin{equation}
  h[i] = K \frac{\sin (2 \pi f_C (i - M / 2))}{i - M/2} \left[ 0.42 - 0.5 \cos \left( \frac{2 \pi i}{M} \right) + 0.08 \cos \left( \frac{4 \pi i}{M} \right) \right],
  \label{eq:windowed_sinc_jadro}
\end{equation}
kde $f_C$ je medzná frekvencia vyjadrená ako hodnota medzi 0 a 0.5 (pomer k vzorkovacej frekvencii), $M$ je dĺžka jadra filtru (párne celé číslo) a $K$ slúži na prispôsobenie zisku na nulovej frekvencii. Pri $i = M/2$ je $h[i] = 2 \pi f_C K$. \cite{dsp_guide}


\subsection{IIR filtre}

IIR filtre umožňujú získať dlhú impulznú odozvu efektívnym spôsobom, bez nutnos\-ti počítať konvolúciu. Tento spôsob je založený na využití rekurzie. Rovnica \ref{eq:IIR_rekurzia} ukazuje ako sa počíta hodnota aktuálnej vzorky. Využíva sa pri tom hodnôt vstupného signálu, aj starších hodnôt výstupného signálu. Každá hodnota vý\-stup\-né\-ho signálu sa určí vynásobením hodnôt vstupného signálu koeficientmi $a$ a spo\-čí\-ta\-ním s hodnotami výstupných vzoriek vynásobených koeficientmi $b$. V praxi sa nepoužíva viac ako tucet koeficientov (pri väčšom množstve sa stáva filter ľahko nestabilným).
\begin{multline}
  y[n] = a_0 x[n] + a_1 x[n - 1] + a_2 x[n - 2] + a_3 x[n - 3] + \dots \\
   + b_1 y[n - 1] + b_2 y[n - 2] + b_3 y[n - 3] + \dots ,
  \label{eq:IIR_rekurzia}
\end{multline}
kde $a$ a $b$ sú koeficienty, $x[]$ sú vstupné vzorky, $y[]$ sú výstupné vzorky a $n$ je poradové číslo vzorky. 

Podobne ako sme rozdelili FIR filtre na tri skupiny, môžeme rozdeliť aj IIR filtre:
\begin{enumerate}
  \item[-] vhodné pre časovú oblasť (s jedným pólom (Single pole)),
  \item[-] vhodné pre frekvenčnú oblasť (Chebyshev),
  \item[-] vlastný návrh (iteratívny dizajn).
\end{enumerate}

\subsubsection{Jednopólové rekurzívne filtre} 

Pomocou jednopólových filtrov realizujeme celkom jednoducho ekvivalenty a\-na\-ló\-go\-vých RC a CR článkov. 

Filter s koeficientmi $a_0 = 0.15$ a $b_1 = 0.85$ je ekvivalentom integračného RC článku. Keď zmeníme koeficienty $a_0 = 0.93$, $a_1 = -0.93$ a $b_1 = 0.86$ získame obdobu derivačného CR článku. Pomocou týchto jednoduchých filtrov môžeme od\-strá\-niť jednosmernú zložku, vysokofrekvenčný šum, tvarovať signál, atď. Ľahko sa programujú a nie sú výpočtovo náročné.

Hodnoty koeficientov sa určia pomocou nasledujúcich rovníc:
\begin{enumerate}
  \item[-] pre dolnú priepusť:
    \begin{equation}
    \begin{gathered}
      a_0 = 1 - x \\
      b_1 = x
    \end{gathered}
      \label{eq:IIR_DP}
    \end{equation}
  \item[-] pre hornú priepusť:
    \begin{equation}
    \begin{gathered}
      a_0 = (1 + x) / 2 \\
      a_1 = -(1 + x) / 2 \\
      b_1 = x
    \end{gathered}
      \label{eq:IIR_HP}
    \end{equation}
\end{enumerate}

Neznámu $x$ v rovniciach \ref{eq:IIR_DP} a \ref{eq:IIR_HP} vypočítame nasledovne 
\begin{equation}
  x = e^{-1/d},
  \label{eq:IIR_x_d}
\end{equation}
$d$ je požadovaná časová konštanta filtru. Inými slovami počet vzoriek, kým do\-siah\-ne amplitúda výstupného signálu 63.2 \% amplitúdy vstupného signálu pre dolnú priepusť (respektíve 36.8 \% pre hornú priepusť).

Vzťah medzi medznou frekvenciou a parametrom $x$ je daný rovnicou \ref{eq:IIR_x_fc}
\begin{equation}
  x = e^{-2 \pi f_C},
  \label{eq:IIR_x_fc}
\end{equation}
kde $f_C$ je medzná frekvencia filtru.

\subsubsection{Chebyshevove filtre}

Chebyshevove filtre sa používajú na oddelenie jedného frekvenčného pásma od druhého. Napriek tomu, že neposkytujú až také extrémne parametre ako windowed-sinc filtre, využívajú sa v mnohých situáciach. Hlavná výhodná vlastnosť Chebyshevových filtrov je rýchlosť, pretože namiesto konvolúcie sa na ich výpočet využíva rekurzia. Na zistenie koeficientov filtra sa využíva Z-transformácia. 

Na obr. \ref{pic:odozva_chebyshev} je frekvenčná odozva Chebyshevovho filtru. Na dosiahnutie rýchlej\-šie\-ho prechodu medzi priepustným a nepriepustným pásmom, sa využíva povolenie zvlnenia v priepustnom pásme. Existujú aj Chebyshevove filtre so zvlnením iba v nepriepustnom pásme, ale tie sa používajú iba zriedka. 
Dôležitým typom je tzv. eliptický filter. Ten má zvlnenie aj v priestupnom aj v nepriestupnom pásme. Tým pádom poskytuje najlepší roll-off na najmenší počet pólov. Nevýhodou je jeho zložitý návrh.

\begin{figure}[hbtp]
	\centering
		\includegraphics[width=\columnwidth /3*2]{obrazky/odozva_chebyshev}
	\caption{Odozva Chebyshevovho filtru s rôznym zvlnením}
	\label{pic:odozva_chebyshev}
\end{figure}

Limitácia rekurzívnych filtrov leží hlavne vo výpočtovej náročnosti. Napríklad filter šiesteho rádu má veľkosť niektorých koeficientov rádovo na úrovni $10^{-10}$. Takto malé hodnoty sa pri použití jednoduchej presnosti (single precision) čísel s plávajúcou desatinnou čiarkou strácajú v zaokrúhľovacom šume. Použitá presnosť čísel v programe teda limituje maximálny počet pólov Chebyshevovho filtru. Maximálny počet pólov pri jednoduchej presnosti závisí aj od medznej frekvencie a pohybuje sa v rozsahu 4 až 20 pólov pre frekvencie medzi 0.02 až 0.25 násobkom vzorkovacieho kmitočtu. \cite{dsp_guide}

\subsection{IIR filtre pre realizáciu digitálneho ekvalizéra} \label{subsec:ekv}
Pre realizáciu digitálneho ekvalizéra je nutné použiť filtre s nastaviteľným zis\-kom. Pre najnižšie pásmo kmitočtov je použitý filter typu \emph{low shelving}, pre stredné pásma kmitočtov sú použité \emph{peak} filtre a pre najvyššie pásmo je použitý \emph{high shelving} filter.

Pre kvalitný ekvalizér je vhodné použiť filtre štvrtého radu. Pretože so zvy\-šu\-jú\-cim sa radom filtru stúpa citlivosť IIR filtrov na kvantizáciu koeficientov, je vhodné realizovať filtre vyšších radov treťou kanonickou formou, čiže sériovým zapojením filtrov druhého radu.

V ďalšom texte uvedieme vzťahy pre výpočet koeficientov filtrov druhého radu.

\subsubsection{Shelving filtre}
Vstupné parametre pre shelving filtre sú:
\begin{enumerate}
	\item[-] $F_c$: medzná frekvencia filtru, frekvencia na ktorej sa zmení zisk filtru o polovicu,
	\item[-] $F_s$: vzrokovacia frekvencia,
	\item[-] $S$: sklon,
	\item[-] $Gain_{dB}$: zisk filtru. 
\end{enumerate}

Pre výpočet normalizovaného zisku $Gain$ použijeme pre obidva typy filtrov vzťah \ref{eq:sf_gain}.
\begin{equation}
  Gain = 10^{(Gain_{dB}/40)},
  \label{eq:sf_gain}
\end{equation}
kde $Gain_{dB}$ je požadovaný zisk filtru v decibeloch.

Koeficienty $\alpha$ a $\beta$, používané v ďalších výpočtoch, určíme podľa rovníc \ref{eq:sf_alfa} a \ref{eq:beta}.
\begin{equation}
  \alpha = \frac{\sin(\theta_c)}{2} \cdot \sqrt{\left(\left(Gain + \left(\frac{1}{Gain}\right)\right)\cdot \left(\frac{1}{S} - 1 \right) + 2 \right)},
  \label{eq:sf_alfa}
\end{equation}

\begin{equation}
  \beta = 2 \cdot \alpha \cdot \sqrt{Gain},
  \label{eq:beta}
\end{equation}
kde $S$ je sklon a parameter $\theta_c$ sa vypočíta nasledovne:
\begin{equation}
  \theta_c = \frac{2  \pi  F_c}{F_s}.
  \label{eq:sf_theta}
\end{equation}

Pre výpočet koeficientov low shelving filtru potom platia vzťahy \ref{eq:low_shelving_coeffs}
\begin{equation}
    \begin{gathered}
      	a_0 = (Gain + 1) + (Gain - 1) \cdot \cos \theta_c + \beta \\
  		a_1 = -2 \cdot (Gain - 1) + (Gain + 1) \cdot \cos \theta_c \\
  		a_2 = (Gain + 1) + (Gain - 1) \cdot \cos \theta_c - \beta \\
  		b_0 = Gain \cdot ((Gain + 1) - (Gain - 1) \cdot \cos \theta_c + \beta) \\
 		b_1 = 2 \cdot Gain \cdot ((Gain - 1) - (Gain + 1) \cdot \cos \theta_c) \\
  		b_2 = Gain \cdot ((Gain + 1) - (Gain - 1) \cdot \cos \theta_c - \beta)
    \end{gathered}
    \label{eq:low_shelving_coeffs}
\end{equation}
a pre high shelving filter vzťahy \ref{eq:high_shelving_coeffs}
\begin{equation}
    \begin{gathered}
      	a_0 = (Gain + 1) - (Gain - 1) \cdot \cos \theta_c + \beta \\
  		a_1 = 2 \cdot (Gain - 1) - (Gain + 1) \cdot \cos \theta_c \\
  		a_2 = (Gain + 1) - (Gain - 1) \cdot \cos \theta_c - \beta \\
  		b_0 = Gain \cdot ((Gain + 1) + (Gain - 1) \cdot \cos \theta_c + \beta) \\
 		b_1 = -2 \cdot Gain \cdot ((Gain - 1) - (Gain + 1) \cdot \cos \theta_c) \\
  		b_2 = Gain \cdot ((Gain + 1) + (Gain - 1) \cdot \cos \theta_c - \beta)
    \end{gathered}
    \label{eq:high_shelving_coeffs}
\end{equation}

\subsubsection{Peak filtre}
Vstupné parametre pre peak filter sú:
\begin{enumerate}
	\item[-] $F_c$: stredová frekvencia filtru, frekvencia na ktorej je maximálny zisk filtru,
	\item[-] $F_s$: vzrokovacia frekvencia,
	\item[-] $Q$: kvalita filtru,
	\item[-] $Gain_{dB}$: zisk filtru pre $f = F_c$. 
\end{enumerate}

Normalizovaný zisk vypočítame podľa vzťahu \ref{eq:pf_gain}
\begin{equation}
  Gain = e^{(Gain_{dB} \cdot 0.115129254)},
  \label{eq:pf_gain}
\end{equation}

Výpočet koeficientov sa líši pre negatívny a pozitívny zisk. 

Pre negatívny zisk (\emph{cut}) je výpočet nasledovný:
\begin{equation}
  CutValue = 1 + K \cdot \left( \frac{Q}{Gain} \right) + W,
  \label{eq:pf_cut}
\end{equation}
kde 
\begin{equation}
  K = \tan (\theta_c / 2),
  \label{eq:pf_k}
\end{equation}
a
\begin{equation}
  W = K^2,
  \label{eq:pf_w}
\end{equation}
Parameter $\theta_c$ vypočítame podľa rovnice \ref{eq:sf_theta}.

Hodnoty koeficientov sa dajú získať pomocou vzťahov \ref{eq:pf_neg_coeffs}.
\begin{equation}
    \begin{gathered}
      	a_0 = 1 \\
  		a_1 = 4 \cdot \frac{(W - 1)}{CutValue} \\
  		a_2 = \frac{1 - \frac{Q}{Gain} + W}{CutValue} \\
  		b_0 = \frac{1 + \frac{K}{Q} + W}{CutValue} \\
 		b_1 = 2 \cdot \frac{W - 1}{CutValue} \\
  		b_2 = \frac{1 - \frac{K}{Q} + W}{CutValue}
    \end{gathered}
    \label{eq:pf_neg_coeffs}
\end{equation}

Pre pozitívny zisk (\emph{boost}) je výpočet nasledovný:
\begin{equation}
  BoostValue = 1 + \frac{K}{Q} + W,
  \label{eq:pf_boost}
\end{equation}
kde $K$ a $W$ vypočítame podľa vzťahov \ref{eq:pf_k} a \ref{eq:pf_w}.

Hodnoty koeficientov môžeme vypočítať pomocou vzťahov \ref{eq:pf_pos_coeffs}.
\begin{equation}
    \begin{gathered}
      	a_0 = 1 \\
  		a_1 = \frac{1 + K \cdot \frac{Gain}{Q} + W}{BoostValue} \\
  		a_2 = \frac{1 - \frac{K}{Q} + W}{BoostValue} \\
  		b_0 = 2 \cdot \frac{1 + K \cdot \frac{Gain}{Q} + W}{BoostValue} \\
 		b_1 = 2 \cdot \frac{W - 1}{BoostValue} \\
  		b_2 = \frac{1 - K \cdot \frac{Gain}{Q} + W}{BoostValue}
    \end{gathered}
    \label{eq:pf_pos_coeffs}
\end{equation}

Vyššie uvedené vzťahy boli prebrané z aplikačných poznámok firmy STMicroelectronics \emph{IIR filter design equations for Sound Terminal} \cite{ekvalizer_koeficienty}.