Filtry: Różnice pomiędzy wersjami

Z Brain-wiki
 
(Nie pokazano 63 pośrednich wersji utworzonych przez tego samego użytkownika)
Linia 1: Linia 1:
=[[Analiza_sygnałów_-_lecture|AS/]] Filtry=
+
=[[Analiza_sygnałów_-_lecture|AS/]] Funkcja przejścia i filtry=
  
Filtry liniowe niezmiennicze w czasie <math>x[n] \longrightarrow \boxed{LTI} \longrightarrow y[n]</math> opisuje liniowe równanie różnicowe o stałych współczynnikach
+
Cyfrowe filtry liniowe niezmiennicze w czasie <math>x[n] \longrightarrow \boxed{LTI} \longrightarrow y[n]</math> opisuje liniowe równanie różnicowe o stałych współczynnikach
  
  
 
:<math>
 
:<math>
 
\displaystyle
 
\displaystyle
y[k] = \sum_{k=1}^K a_k y[n-k] + \sum_{l=0}^L b_l x[n-l]
+
y[n] = \sum_{k=1}^K a_k y[n-k] + \sum_{l=0}^L b_l x[n-l]
 
</math>
 
</math>
  
Linia 70: Linia 70:
 
-->
 
-->
  
=Funkcja przejścia (transfer function)=
+
==Funkcja przejścia (transfer function)==
  
Zastosujmy do obu stron powyższego równania opisującego system LTI, czyli
+
Zastosujmy do obu stron powyższego równania transformatę <math>\mathcal{Z}</math>:
 
 
<math>
 
\displaystyle
 
\sum_{k=0}^K a_k y[n-k] = \sum_{l=0}^L b_l x[n-l]
 
</math>
 
 
 
transformatę <math>\mathcal{Z}</math>:
 
  
  
Linia 114: Linia 107:
 
</math>
 
</math>
  
<!--
 
lub
 
  
:<math>
+
<math>H(z)</math> &mdash; funkcja systemu ''(system function)'' pozwala spójnie przedstawić działanie filtra  LTI na sygnał <math>x</math> w przestrzeni transformaty <math>\mathcal{Z}</math>:
H(z) = \mathrm{const} \frac {\prod_{l=0}^L \left(1-\frac{d_l}{z}\right) }     {\prod_{k=0}^K \left(1-\frac{c_k}{z}\right) } .
+
 
 +
 
 +
::<math>
 +
\displaystyle
 +
Y[z]=H[z]X[z]=\frac{b_0 + b_1 z^{-1}+\dots +b_{L} z^{-L}}{a_0+a_1 z^{-1}+\dots +a_{K} z^{-K}}X[z]
 
</math>
 
</math>
  
-->
 
  
<math>H(z)</math> &mdash; funkcja systemu ''(system function)'' pozwala spójnie przedstawić działanie filtra  LTI na sygnał <math>x</math> w przestrzeni transformaty <math>\mathcal{Z}</math>:
+
W dziedzienie czasu mamy
 +
 
 +
 
 +
::<math>
 +
\displaystyle
 +
\begin{array}{rl}
 +
y[n] = &b_0 x[n]+ b_1 x[n-1] + \dots + b_L x[n-L]\\
 +
&- a_1 y[n-1] - \dots - a_K y[n-K]
 +
\end{array}
 +
</math>
 +
 
  
 +
==Finite Impulse Response (FIR) — filtr o skończonej odpowiedzi impulsowej==
  
 +
Jeśli w równaniu
 +
:<math>
 +
\displaystyle
 +
\sum_{k=0}^K a_k y[n-k] = \sum_{l=0}^L b_l x[n-l]
 +
</math>
 +
położymy <math>a_i = 0</math> poza <math>a_0=1</math>, dostaniemy
 
:<math>
 
:<math>
 
\displaystyle
 
\displaystyle
Y(z)=H(z) X(z)
+
y[n] = \sum_{l=0}^L b_l x[n-l]
 
</math>
 
</math>
  
 +
W funkcji przejścia mianownik będzie stały i dostaniemy
  
 +
<math>
 +
\displaystyle
 +
Y[z]=H[z]X[z]=\left(b_0+b_1 z^{-1}+\dots +b_L z^{-L}\right) X[z]
 +
</math>
  
  
 +
a w dziedzienie czasu
  
  
==Działanie filtru w dziedzinie czasu, typy filtrów==
+
:<math>
Przypomnijmy definicję splotu:   <math>
+
\displaystyle
(f * g)[n] = \sum_{m = -\infty}^{\infty} f[m] g[n - m]
+
y(n) = b_0 *x[n] + b_1 *x[n-1] + \dots + b_L *x[n-L]
 
</math>
 
</math>
  
  
=== FIR (MA) ===
+
jeśli współczynniki <math>b_i</math> zapiszemy jako <math>b[i]</math>, dostaniemy splot
Działanie filtru zadanego przez odpowiedź impulsową ''b'' o długości <math>n_b</math> na sygnał ''x'' można zapisać:
+
 
 +
 
 +
:<math>
 +
\displaystyle
 +
y(n) = b[0]*x[n] + b[1]*x[n-1] + \dots + b[L]*x[n-L] = b[n]*x[n]
 +
</math>
 +
 
  
:<math>y(n) = (b*x)[n] =b[0]*x[n] + b[1]*x[n-1] + \dots + b[n_b]*x[n-n_b]</math>
 
  
Taki filtr nazywamy filtrem o skończonej odpowiedzi impulsowej (Finite Impulse Response, FIR), bo odpowiedź na impulsowe wzbudzenie kończy się po <math>n_b</math> próbkach. Inna nazwa to średnia biegnąca (Moving Average, MA).
+
Taki filtr nazywamy filtrem o skończonej odpowiedzi impulsowej (Finite Impulse Response, FIR), bo odpowiedź na impulsowe wzbudzenie kończy się po <math>L</math> próbkach. Inna nazwa to średnia biegnąca (Moving Average, MA).
  
 +
<!--
 
Dla filtrów FIR współczynniki filtru i odpowiedź impulsowa są takie same.
 
Dla filtrów FIR współczynniki filtru i odpowiedź impulsowa są takie same.
 +
-->
  
Jeśli współczynniki tworzą sekwencję symetryczną bądź antysymetryczną, oparty na nich filtr FIR będzie liniowo przesuwał fazę filtrowanego sygnału ('''linear phase filter''') -- sygnał filtrowany jest przesunięty w czasie o ok. <math>n_b / 2</math>.
+
==Infinite Impulse Response (IIR) —  filtr o nieskończonej odpowiedzi impulsowej==
 +
Jeśli w równaniu
 +
:<math>
 +
\displaystyle
 +
\sum_{k=0}^K a_k y[n-k] = \sum_{l=0}^L b_l x[n-l]
 +
</math>
 +
położymy <math>b_i = 0</math> poza <math>b_0=1</math>, dostaniemy
 +
:<math>
 +
\displaystyle
 +
\sum_{k=0}^K a_k y[n-k] = x[n]
 +
</math>
 +
 
 +
w funkcji przejścia licznik będzie stały
 +
 
 +
::<math>
 +
\displaystyle
 +
Y[z]=H[z]X[z]=\frac{1}{a_0+a_1 z^{-1}+\dots +a_{K} z^{-K}}X[z]
 +
</math>
  
  
=== IIR (AR) ===
 
 
Operacja splotu działa tu na sekwencji wyjściowej:
 
Operacja splotu działa tu na sekwencji wyjściowej:
 
:<math>
 
:<math>
y[n] = x[n] - a[1]*y[n-1] - \dots - a[n_a]*y[n-n_a]
+
y[n] = x[n] - a[1]*y[n-1] - \dots - a[n_a]*y[n-K]
 
</math>
 
</math>
  
Filtr ten nazywany jest filtr rekursywnym lub autoregresyjnym (AR). W ogólności jego odpowiedź impulsowa może być nieskończona. Faza filtrowanego sygnału zaburzana jest nieliniowo ('''nonlinear phase filter''')
 
  
 +
Taki filtr ten nazwać można filtrem rekursywnym lub autoregresyjnym (AR).
 +
 +
W praktyce filtry IIR są zwykle implementowane jako połączenie członów AR i MA, czyli:
  
===IIR (ARMA) ===
 
Najbardziej ogólnym typem jest połączenie dwóch powyższych czyli:
 
 
::<math>
 
::<math>
 
\begin{array}{ll}
 
\begin{array}{ll}
y[n] = b[0]*x[n] &+ b[1]*x[n-1] + \dots + b[n_b]*x[n-n_b]\\
+
y[n] = b[0]*x[n] &+ b[1]*x[n-1] + \dots + b[L]*x[n-L]\\
&- a[1]*y[n-1] - \dots - a[n_a]*y[n-n_a]
+
&- a[1]*y[n-1] - \dots - a[K]*y[n-K]
 
\end{array}
 
\end{array}
 
</math>
 
</math>
Tą wersję filtru nazywamy filtrem o nieskończonej odpowiedzi impulsowej (Infinite Impulse Response IIR) bo potencjalnie raz wzbudzony może dowolnie długo produkować niezerowe wyjście.
 
  
'''Rzędem filtru''' nazywamy maksymane opóźnienie w próbkach potrzebne do wytworzenia nowej próbki wyjściowej. Dla filtrów FIR jest on równy liczbie <math> n_b</math>. Dla filtrów IIR jest to większa z liczb <math>n_a, n_b</math>.
+
Tę wersję filtru nazywamy filtrem o nieskończonej odpowiedzi impulsowej (Infinite Impulse Response IIR) bo potencjalnie raz wzbudzony może dowolnie długo produkować niezerowe wyjście.
 +
Faza filtrowanego sygnału zaburzana jest nieliniowo ('''nonlinear phase filter''')
 +
 
 +
==Liniowe i nieliniowe przesunięcie fazy==
 +
''Jeśli współczynniki filtra FIR tworzą sekwencję symetryczną bądź antysymetryczną'', oparty na nich filtr o skończonej odpowiedzi impulsowej będzie liniowo przesuwał fazę filtrowanego sygnału ('''linear phase filter''') — cały sygnał skutkiem filtrowania jest przesunięty w czasie o ok. połowę długości filtra FIR.
 +
 
 +
'''Rzędem filtru''' nazywamy maksymane opóźnienie w próbkach potrzebne do wytworzenia nowej próbki wyjściowej. Dla filtrów FIR jest on równy liczbie <math>L</math>. Dla filtrów IIR jest to większa z liczb <math>L, K</math>.
 +
 
 +
 
 +
[[Plik:Phase1.png|500px|bezramki]]
 +
[[Plik:Phase2.png|500px|bezramki]]
 +
[[Plik:Phase3.png|500px|bezramki]]
  
  
 +
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
 +
| <strong>kod (uproszczony) </strong>
 +
|-
 +
|<source lang=python>
 +
import matplotlib.pyplot as plt
 +
import numpy as np
  
 +
t = np.arange(0.0, 3, 0.01)
 +
s1 = np.sin(2 * np.pi * t)
 +
s2= np.sin(2 * np.pi * t + np.pi/2)
 +
s3= np.sin(2*2 * np.pi * t)
 +
s4= np.sin(2*2 * np.pi * t + np.pi/2)
 +
s5= np.sin(2*2 * np.pi * t + 2*np.pi/2)
  
==Działanie filtru w dziedzinie częstości==
+
fig1, ax1 = plt.subplots(3, 1)
Stosując transformatę <math>Z</math> ([[%C4%86wiczenia_5#Jak_znale.C5.BA.C4.87_A_.E2.80.94_transformata_Z|analogicznie jak dla procesu AR]]) możemy równanie z dziedziny czasu przenieść do dziedziny częstości. Filtrowanie odpowiada przemnożeniu transformaty sygnału przez transformatę funkcji przenoszenia filtru:
+
ax1[0].plot(t, s1)
 +
ax1[1].plot(t, s3)
 +
ax1[2].plot(t, s1+s3, 'r')
 +
ax1[0].set_title('sin(wt)')
 +
ax1[1].set_title('sin(2wt)')
 +
ax1[2].set_title('sin(wt) + sin(2wt)')
  
::<math>Y[z]=H[z]X[z]=\frac{b[0]+b[1]z^{-1}+\dots +b[n_b]z^{-n_b}}{a[0]+a[1]z^{-1}+\dots +a[n_a]z^{-n_a}}X[z]</math>
+
fig2, ax2 = plt.subplots(3, 1)
 +
ax2[0].plot(t, s2)
 +
ax2[1].plot(t, s4)
 +
ax2[2].plot(t, s2+s4, 'r')
 +
ax2[0].set_title('sin(wt+pi/2)')
 +
ax2[1].set_title('sin(2wt+pi/2)')
 +
ax2[2].set_title('sin(wt+pi/2) + sin(2wt+pi/2)')
  
Występująca tu funkcja ''H'' nosi nazwę transmitancja lub funkcja przenoszenia.
+
fig3, ax3 = plt.subplots(3, 1)
Znając funkcję <math>H</math>  łatwo możemy przewidzieć co się stanie z widmem sygnału po przefiltrowaniu. Weźmy <math> z = e^{i 2\pi  f}</math>. Wówczas transmitancja jest funkcją częstości ''f''. Dla każdej konkretnej częstości <math>f_k</math> przypisuje ona liczbę zespoloną, którą można wyrazić jako <math>A_k e^{i \phi_k}</math>. W dziedzinie częstości sygnał wyrażony jest przez współczynniki Fourierowskie. Dla konkretnej częstości współczynnik taki <math>X_k = |X_k| e^{i \theta_k}</math> (liczba zespolona) mówi z jaką amplitudą i jaką fazą exponens zespolony o danej częstości (<math>z_k = e^{i 2\pi f_k}</math>) wchodzi w skład sygnału.
+
ax3[0].plot(t, s2)
 +
ax3[1].plot(t, s5)
 +
ax3[2].plot(t, s2+s5, 'r')
 +
ax3[0].set_title('sin(w(t+pi/2))')
 +
ax3[1].set_title('sin(2wt+2*pi/2)')
 +
ax3[2].set_title('sin(wt+pi/2) + sin(2wt+2*pi/2)')
  
 +
plt.show()
 +
</source>
 +
|}
 +
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
 +
| <strong>kod generujący obrazki </strong>
 +
|-
 +
|<source lang=python>
  
Zatem działanie filtru na sygnał w dziedzinie częstości polega na przemnożeniu składowej sygnału o częstości <math>f_k</math> przez liczbę <math>A_k e^{i \phi_k}</math>:
+
import matplotlib.pyplot as plt
:<math>Y(f_k) = A_k e^{i \phi_k} |X_k| e^{i \theta_k} z_k = A_k |X_k| e^{i ( \phi_k +\theta_k)}  e^{i 2\pi  f_k} </math>
+
import numpy as np
 +
 
 +
t = np.arange(0.0, 3, 0.01)
 +
s1 = np.sin(2 * np.pi * t)
 +
s2 = np.sin(2 * np.pi * t + np.pi / 2)
 +
s3 = np.sin(2 * 2 * np.pi * t)
 +
s4 = np.sin(2 * 2 * np.pi * t + np.pi / 2)
 +
s5 = np.sin(2 * 2 * np.pi * t + 2 * np.pi / 2)
 +
 
 +
def fix_axes():
 +
    for i in range(0, 3):
 +
        ax[i].set_yticks([0], [])
 +
        ax[i].set_xlim([0, 3])
 +
        ax[i].grid(True)
 +
        ax[i].set_frame_on(False)
 +
        ax[i].tick_params(length=0)
 +
        ax[i].set_ylim(-2, 2)
 +
 
 +
fig1, ax = plt.subplots(3, 1, dpi=200)
 +
ax[0].plot(t, s1)
 +
ax[1].plot(t, s3)
 +
ax[2].plot(t, s1 + s3, 'r')
 +
ax[0].set_title('sin( $\omega$t )', loc='left')
 +
ax[1].set_title('sin( 2*$\omega$t )', loc='left')
 +
ax[2].set_title('sin( $\omega$t ) + sin( 2*$\omega$t )', loc='left')
 +
fix_axes()
 +
for i in range(0, 3):
 +
    ax[i].set_xticks(np.arange(.25, 3, 1), [])
 +
plt.show()
 +
 
 +
fig2, ax = plt.subplots(3, 1, dpi=200)
 +
ax[0].plot(t, s2)
 +
ax[1].plot(t, s4)
 +
ax[2].plot(t, s2 + s4, 'r')
 +
ax[0].set_title('sin( $\omega$t + $\pi$/2 )', loc='left')
 +
ax[1].set_title('sin( 2*$\omega$t + $\pi/2$ )', loc='left')
 +
ax[2].set_title('sin( $\omega$t + $\pi$/2 ) + sin( 2*$\omega$t + $\pi$/2 )', loc='left')
 +
fix_axes()
 +
for i in range(0, 3):
 +
    ax[i].set_xticks(np.arange(0, 3, 1), [])
 +
plt.show()
 +
 
 +
fig3, ax = plt.subplots(3, 1, dpi=200)
 +
ax[0].plot(t, s2)
 +
ax[1].plot(t, s5)
 +
ax[2].plot(t, s2 + s5, 'r')
 +
ax[0].set_title('sin( $\omega$(t + $\pi$/2) )', loc='left')
 +
ax[1].set_title('sin( 2*$\omega$t + 2*$\pi$/2 )', loc='left')
 +
ax[2].set_title('sin( $\omega$t + $\pi$/2 ) + sin( 2*$\omega$t + 2*$\pi$/2 )', loc='left')
 +
fix_axes()
 +
for i in range(0, 3):
 +
    ax[i].set_xticks(np.arange(0, 3, 1), [])
 +
plt.show()
 +
</source>
 +
|}
 +
 
 +
 
 +
 
 +
 
 +
Stosując transformatę <math>Z</math> możemy równanie z dziedziny czasu przenieść do dziedziny częstości. Filtrowanie odpowiada przemnożeniu transformaty sygnału przez transformatę funkcji przenoszenia filtru:
 +
 
 +
 
 +
::<math>
 +
\displaystyle
 +
Y[z]=H[z]X[z]=\frac{b[0]+b[1]z^{-1}+\dots +b[n_b]z^{-n_b}}{a[0]+a[1]z^{-1}+\dots +a[n_a]z^{-n_a}}X[z]</math>
 +
 
 +
 
 +
Występująca tu funkcja <math>H(z)</math> nosi nazwę transmitancji lub funkcja przenoszenia.
 +
Znając funkcję <math>H</math>  łatwo możemy przewidzieć co się stanie z widmem sygnału po przefiltrowaniu. Weźmy <math> z = e^{i\omega}</math>. Wówczas transmitancja jest funkcją częstości <math>\omega</math>. Konkretnej częstości <math>\omega_k</math> przypisuje ona liczbę zespoloną, którą można wyrazić jako <math>A_k e^{i \phi_k}</math>.
 +
 
 +
::<math>
 +
\displaystyle
 +
Y[e^{i\omega}]=H[e^{i\omega}]X[e^{i\omega}]=\frac{b[0]+b[1]e^{-i\omega}+\dots +b[n_b]e^{-i\omega n_b}}{a[0]+a[1]e^{-i\omega}+\dots +a[n_a]e^{-i\omega n_a}}X[e^{i\omega}]
 +
</math>
 +
 
 +
W dziedzinie częstości sygnał wyrażony jest przez współczynniki Fourierowskie. Dla konkretnej częstości współczynnik taki <math>X_k = |X_k| e^{i \theta_k}</math> (liczba zespolona) mówi z jaką amplitudą i jaką fazą exponens zespolony o danej częstości (<math>z_k = e^{i\omega_k}</math>) wchodzi w skład sygnału.
 +
 
 +
Działanie filtru na sygnał w dziedzinie częstości polega na przemnożeniu składowej sygnału o częstości <math>f_k</math> przez liczbę <math>A_k e^{i \phi_k}</math>:
 +
 
 +
:<math>Y(f_k) = A_k e^{i \phi_k} |X_k| e^{i \theta_k} = A_k |X_k| e^{i ( \phi_k +\theta_k)}  e^{i 2\pi  f_k} </math>
 
   
 
   
Zatem w wyniku filtrowania składowa sygnału o danej częstości może zmienić amplitudę i fazę ale co warto zauważyć nie zmienia częstości.
+
W wyniku filtrowania sinusoidalna składowa sygnału o danej częstości może zmienić amplitudę i fazę ale co warto zauważyć nie zmienia częstości.
 
+
Zera i bieguny filtra to odpowiednio miejsca zerowe licznika i mianownika funkcji przenoszenia.
'''Zera i bieguny''' filtra to odpowiednio miejsca zerowe licznika i mianownika funkcji przenoszenia.
 

Aktualna wersja na dzień 17:59, 10 lut 2024

AS/ Funkcja przejścia i filtry

Cyfrowe filtry liniowe niezmiennicze w czasie [math]x[n] \longrightarrow \boxed{LTI} \longrightarrow y[n][/math] opisuje liniowe równanie różnicowe o stałych współczynnikach


[math] \displaystyle y[n] = \sum_{k=1}^K a_k y[n-k] + \sum_{l=0}^L b_l x[n-l] [/math]


gdzie [math]a_i[/math] i [math]b_i[/math] to współczynniki, [math]x[n][/math] to sygnał wejściowy, a [math]y[n][/math] — wyjście; w ogólniejszej postaci można je zapisać jako


[math] \displaystyle \sum_{k=0}^K a_k y[n-k] = \sum_{l=0}^L b_l x[n-l] [/math]


Funkcja przejścia (transfer function)

Zastosujmy do obu stron powyższego równania transformatę [math]\mathcal{Z}[/math]:


[math] \displaystyle \mathcal{Z}\left\{\sum_{k=0}^K a_k y[n-k] \right\} = \mathcal{Z}\left\{ \sum_{l=0}^L b_l x[n-l] \right\} [/math]


[math] \displaystyle \sum_{k=0}^K a_k \mathcal{Z}\left\{ y[n-k]\right\} = \sum_{l=0}^L b_l \mathcal{Z} \left\{x[n-l]\right\} [/math]


[math] \displaystyle \sum_{k=0}^K a_k z^{-k} Y(z) = \sum_{l=0}^L b_l z^{-l} X(z) [/math]


[math] \displaystyle Y(z) \sum_{k=0}^K a_k z^{-k} = X(z) \sum_{l=0}^L b_l z^{-l} [/math]


Dla systemu przyczynowego dostajemy:


[math] \displaystyle \frac{Y(z)}{X(z)} \equiv H(z) = \frac{\sum_{l=0}^L b_l z^{-l}}{\sum_{k=0}^K a_k z^{-k}} [/math]


[math]H(z)[/math] — funkcja systemu (system function) pozwala spójnie przedstawić działanie filtra LTI na sygnał [math]x[/math] w przestrzeni transformaty [math]\mathcal{Z}[/math]:


[math] \displaystyle Y[z]=H[z]X[z]=\frac{b_0 + b_1 z^{-1}+\dots +b_{L} z^{-L}}{a_0+a_1 z^{-1}+\dots +a_{K} z^{-K}}X[z] [/math]


W dziedzienie czasu mamy


[math] \displaystyle \begin{array}{rl} y[n] = &b_0 x[n]+ b_1 x[n-1] + \dots + b_L x[n-L]\\ &- a_1 y[n-1] - \dots - a_K y[n-K] \end{array} [/math]


Finite Impulse Response (FIR) — filtr o skończonej odpowiedzi impulsowej

Jeśli w równaniu

[math] \displaystyle \sum_{k=0}^K a_k y[n-k] = \sum_{l=0}^L b_l x[n-l] [/math]

położymy [math]a_i = 0[/math] poza [math]a_0=1[/math], dostaniemy

[math] \displaystyle y[n] = \sum_{l=0}^L b_l x[n-l] [/math]

W funkcji przejścia mianownik będzie stały i dostaniemy

[math] \displaystyle Y[z]=H[z]X[z]=\left(b_0+b_1 z^{-1}+\dots +b_L z^{-L}\right) X[z] [/math]


a w dziedzienie czasu


[math] \displaystyle y(n) = b_0 *x[n] + b_1 *x[n-1] + \dots + b_L *x[n-L] [/math]


jeśli współczynniki [math]b_i[/math] zapiszemy jako [math]b[i][/math], dostaniemy splot


[math] \displaystyle y(n) = b[0]*x[n] + b[1]*x[n-1] + \dots + b[L]*x[n-L] = b[n]*x[n] [/math]


Taki filtr nazywamy filtrem o skończonej odpowiedzi impulsowej (Finite Impulse Response, FIR), bo odpowiedź na impulsowe wzbudzenie kończy się po [math]L[/math] próbkach. Inna nazwa to średnia biegnąca (Moving Average, MA).


Infinite Impulse Response (IIR) — filtr o nieskończonej odpowiedzi impulsowej

Jeśli w równaniu

[math] \displaystyle \sum_{k=0}^K a_k y[n-k] = \sum_{l=0}^L b_l x[n-l] [/math]

położymy [math]b_i = 0[/math] poza [math]b_0=1[/math], dostaniemy

[math] \displaystyle \sum_{k=0}^K a_k y[n-k] = x[n] [/math]

w funkcji przejścia licznik będzie stały

[math] \displaystyle Y[z]=H[z]X[z]=\frac{1}{a_0+a_1 z^{-1}+\dots +a_{K} z^{-K}}X[z] [/math]


Operacja splotu działa tu na sekwencji wyjściowej:

[math] y[n] = x[n] - a[1]*y[n-1] - \dots - a[n_a]*y[n-K] [/math]


Taki filtr ten nazwać można filtrem rekursywnym lub autoregresyjnym (AR).

W praktyce filtry IIR są zwykle implementowane jako połączenie członów AR i MA, czyli:

[math] \begin{array}{ll} y[n] = b[0]*x[n] &+ b[1]*x[n-1] + \dots + b[L]*x[n-L]\\ &- a[1]*y[n-1] - \dots - a[K]*y[n-K] \end{array} [/math]

Tę wersję filtru nazywamy filtrem o nieskończonej odpowiedzi impulsowej (Infinite Impulse Response IIR) bo potencjalnie raz wzbudzony może dowolnie długo produkować niezerowe wyjście. Faza filtrowanego sygnału zaburzana jest nieliniowo (nonlinear phase filter)

Liniowe i nieliniowe przesunięcie fazy

Jeśli współczynniki filtra FIR tworzą sekwencję symetryczną bądź antysymetryczną, oparty na nich filtr o skończonej odpowiedzi impulsowej będzie liniowo przesuwał fazę filtrowanego sygnału (linear phase filter) — cały sygnał skutkiem filtrowania jest przesunięty w czasie o ok. połowę długości filtra FIR.

Rzędem filtru nazywamy maksymane opóźnienie w próbkach potrzebne do wytworzenia nowej próbki wyjściowej. Dla filtrów FIR jest on równy liczbie [math]L[/math]. Dla filtrów IIR jest to większa z liczb [math]L, K[/math].


Phase1.png Phase2.png Phase3.png




Stosując transformatę [math]Z[/math] możemy równanie z dziedziny czasu przenieść do dziedziny częstości. Filtrowanie odpowiada przemnożeniu transformaty sygnału przez transformatę funkcji przenoszenia filtru:


[math] \displaystyle Y[z]=H[z]X[z]=\frac{b[0]+b[1]z^{-1}+\dots +b[n_b]z^{-n_b}}{a[0]+a[1]z^{-1}+\dots +a[n_a]z^{-n_a}}X[z][/math]


Występująca tu funkcja [math]H(z)[/math] nosi nazwę transmitancji lub funkcja przenoszenia. Znając funkcję [math]H[/math] łatwo możemy przewidzieć co się stanie z widmem sygnału po przefiltrowaniu. Weźmy [math] z = e^{i\omega}[/math]. Wówczas transmitancja jest funkcją częstości [math]\omega[/math]. Konkretnej częstości [math]\omega_k[/math] przypisuje ona liczbę zespoloną, którą można wyrazić jako [math]A_k e^{i \phi_k}[/math].

[math] \displaystyle Y[e^{i\omega}]=H[e^{i\omega}]X[e^{i\omega}]=\frac{b[0]+b[1]e^{-i\omega}+\dots +b[n_b]e^{-i\omega n_b}}{a[0]+a[1]e^{-i\omega}+\dots +a[n_a]e^{-i\omega n_a}}X[e^{i\omega}] [/math]

W dziedzinie częstości sygnał wyrażony jest przez współczynniki Fourierowskie. Dla konkretnej częstości współczynnik taki [math]X_k = |X_k| e^{i \theta_k}[/math] (liczba zespolona) mówi z jaką amplitudą i jaką fazą exponens zespolony o danej częstości ([math]z_k = e^{i\omega_k}[/math]) wchodzi w skład sygnału.

Działanie filtru na sygnał w dziedzinie częstości polega na przemnożeniu składowej sygnału o częstości [math]f_k[/math] przez liczbę [math]A_k e^{i \phi_k}[/math]:

[math]Y(f_k) = A_k e^{i \phi_k} |X_k| e^{i \theta_k} = A_k |X_k| e^{i ( \phi_k +\theta_k)} e^{i 2\pi f_k} [/math]

W wyniku filtrowania sinusoidalna składowa sygnału o danej częstości może zmienić amplitudę i fazę ale co warto zauważyć nie zmienia częstości. Zera i bieguny filtra to odpowiednio miejsca zerowe licznika i mianownika funkcji przenoszenia.