WOJSKOWA AKADEMIA TECHNICZNA
WYDZIAŁ MECHATRONIKI I LOTNICTWA
CYFROWE UKŁADY REGULACJI
PROJEKT CYFROWYCH FILTRÓW DOLNOPRZEPUSTOWYCH O NIESKOŃCZONEJ ODPOWIEDZI IMPULSOWEJ W OPARCIU O FILTRY ANALOGOWE
Prowadzący: dr inż. Marek Jaworowicz
Autorzy: Wojciech Żerek
Mateusz Zając
Grupa: A9U1S1
1. Sformułowanie zadania
Celem zadania jest zaprojektowanie cyfrowych filtrów NOI (nieskończona odpowiedź impulsowa) w dwóch wariantach:
na podstawie filtru analogowego Butterwortha II rzędu;
na podstawie filtru analogowego Czebyszewa I rodzaju.
Zaprojektowane filtry cyfrowe powinny charakteryzwać się następującymi parametrami:
fodc = 1.3 [Hz] częstotliwość odcięcia
fp = 24.7 [Hz] częstotliwość próbkowania
ΔA(ω) = 3 [dB] nierównomierność charakterystyki amplitudowej w paśmie przenoszenia (dot. filtru na podst. f. Czebyszewa)
λzap = 65 [dB] tłumienie w paśmie zaporowym
Należy opracować:
obliczenia analityczne cyfrowego filtru NOI na podstawie f. Butterwortha II rzędu;
modele numeryczne obu filtrów (transmitancje, równania różnicowe, schematy strukturalne);
charakterystyki czasowe i częstotliwościowe wyznaczonych filtrów;
aplikację realizującą wyznaczone filtry w języku C++;
wnioski.
2. Obliczenia analityczne cyfrowego filtru NOI na podstawie analogowego filtru Butterwortha II rzędu
Analogowy filtr Butterwortha II rzędu charakteryzuje sie następującą transmitancją:
$$G_{\text{BII}}\left( s \right) = \ \frac{1}{s^{2} + \sqrt{2s} + 1}$$
Do dyskretyzacji wykorzystuje się metodę biliniową w postaci:
$$s = \frac{A}{\omega_{\text{ao}}}*\frac{1 - z^{- 1}}{1 + z^{- 1}}$$
gdzie:
ωao = 1
$$\frac{A}{\omega_{\text{ao}}} = ctg(\omega_{\text{do}}*\frac{\text{Tp}}{2})$$
ωao - pulsacja odcięcia dla filtru analogowego
ωdo - pulsacja odcięcia dla filtru cyfrowego
Tp - okres dyskretyzacji
Po podstawieniu zadanych wartości obliczamy kolejno:
$$\omega_{\text{do}} = 2*3.1416*\ f_{\text{odc}} = 8.1682\ \lbrack\frac{\text{rad}}{s}\rbrack$$
$$s = ctg\left( 8.1682*\frac{1}{2*24.7} \right)*\frac{1 - z^{- 1}}{1 + z^{- 1}} = ctg\left( 0.1653 \right)*\frac{1 - z^{- 1}}{1 + z^{- 1}}$$
$$s = 5.9944*\frac{1 - z^{- 1}}{1 + z^{- 1}}$$
Transmitancja dyskretnego filtru NOI przyjmuje zatem postać:
$G_{\text{BII}}\left( s \right) = \ \frac{1}{s^{2} + \sqrt{2s} + 1} = \ \frac{1}{({5.9944*\frac{1 - z^{- 1}}{1 + z^{- 1}})}^{2} + \sqrt{2}*5.9944*\frac{1 - z^{- 1}}{1 + z^{- 1}} + 1}$
$$G_{\text{BII}}\left( z \right) = \frac{z^{- 2} + {2z}^{- 1} + 1}{{28.4554z}^{- 2} - {69.8656z}^{- 1} + 45.4102} = \frac{Y(z)}{X(z)}$$
Równanie różnicowe filtru ma postać:
$$Y\left\lbrack n \right\rbrack = \frac{1}{45.4102}X\left\lbrack n \right\rbrack + \frac{2}{45.4102}X\left\lbrack n - 1 \right\rbrack + \frac{1}{45.4102}X\left\lbrack n - 2 \right\rbrack + \frac{69.8656}{45.4102}Y\left\lbrack n - 1 \right\rbrack - \frac{28.4554}{45.4102}Y\left\lbrack n - 2 \right\rbrack$$
3. Modele numeryczne filtrów
Modele numeryczne (transmitancje, schematy strukturalne) zostały wykonane przy pomocy narzędzia "Filter Design & Analysis Tool" (fdatool), które wchodzi w skład programu Matlab. Narzędzie to pozwala w łatwy sposób projektować oraz analizować szeroki wachlarz filtrów cyfrowych.
3.1 Model cyfrowego filtru NOI na podstawie analogowego filtru Butterwortha II rzędu
Dobór parametrów projektowanego filtru dokonywany jest w oknie, które przedstawione jest na zrzucie ekranu:
Program generuje również wspołczynniki transmitancji zaprojektowanego filtru, która przedstawia się następująco:
$$G_{FD1} = 0.022*\frac{z^{- 2} + {2z}^{- 1} + 1}{{0.6265z}^{- 2} - {1.5384z}^{- 1} + 1}$$
Na podstawie transmitancji obliczamy równanie różnicowe:
Y[n] = 0.022 * X[n] + 0.044 * X[n−1] + 0.022 * X[n−2] + 1.5384 * Y[n−1] − 0.6265 * Y[n−2]
Schemat strukturalny zaprojektowanego filtru:
Dodatkowo już w oknie projektowania filtru widzimy, że program automatycznie bada jego stabilność. W naszym przypadku zaprojektowany filtr jest stabilny.
3.2 Model cyfrowego filtru NOI na podstawie analogowego filtru Czebyszewa I rodzaju (I rzędu)
W przypadku filtru tworzonego na bazie analogowego filtru Czebyszewa I rodzaju proces projektowania przebiega analogicznie do poprzedniego przykładu:
Transmitancja zaprojektowanego filtru:
$$G_{FD2} = 0.1433*\frac{z^{- 1} + 1}{- {0.7134z}^{- 1} + 1}$$
Równanie różnicowe na podstawie otrzymanej transmitancji:
Y[n] = 0.1433 * X[n] + 0.1433 * X[n−1] + 0.7134 * Y[n−1]
Schemat strukturalny:
Drugi zaprojektowany filtr również jest stabilny.
4. Charakterystyki czasowe i częstotliwościowe zaprojektowanych filtrów
Charakterystyki czasowe i częstotliwościowe oraz wykresy zer/biegunów dla dwóch zaprojektowanych filtrów również zostały sporządzone przy pomocy narzędzia "fdatool". Sporządono następujące charakterystyki (dla każdego z dwóch filtrów):
wykres stabilności;
odpowiedź skokowa;
odpowiedź impulsowa;
charakterystyka amplitudowa;
charakterystyka fazowa.
Wykres stabilności dla filtru na podstawie filtru Butterwortha II rzędu:
Wykres stabilności dla filtru na podstawie filtru Czebyszewa I rodzaju:
Odpowiedź skokowa dla filtru na podstawie filtru Butterwortha II rzędu:
Odpowiedź skokowa dla filtru na podstawie filtru Czebyszewa I rodzaju:
Odpowiedź impulsowa dla filtru na podstawie filtru Butterwortha II rzędu:
Odpowiedź impulsowa dla filtru na podstawie filtru Czebyszewa I rodzaju:
Charakterystyka amplitudowa dla filtru na podstawie filtru Butterwortha II rzędu:
Charakterystyka amplitudowa dla filtru na podstawie filtru Czebyszewa I rodzaju:
Charakterystyka fazowa dla filtru na podstawie filtru Butterwortha II rzędu:
Charakterystyka fazowa dla filtru na podstawie filtru Czebyszewa I rodzaju:
5. Implementacja cyfrowych filtrów NOI w języku C++
5.1 Program realizujący cyfrowy filtr dolnoprzepustowy NOI na podstawie analogowego filtru Butterwortha II rzędu
#include <iostream>
#include <fstream>
#define K 0.022 // wzmocnienie filtru
#define Tp 0.04 // okres probkowania
#define n 100 // liczba probek
using namespace std;
unsigned Wymuszenie (unsigned arg) { // funkcja do implementacji wymuszen
unsigned wartosc;
if ( arg == 0 ) { // implementacja skoku jednostkowego
wartosc = 0;
}
else {
wartosc = 1;
}
return wartosc;
}
int main() {
double X[n], Y[n]; // zadeklarowanie dwoch tablic na probki wejsciowe i wyjsciowe
for ( int i = 0; i < n; i++ ) { // zerowanie tablic
X[i] = 0;
Y[i] = 0;
}
for ( int i = 0; i < n; i++ ) { // filtr
X[i] = Wymuszenie(i);
if ( i == 1 ) {
Y[i] = K*X[i];
}
if ( i == 2 ) {
Y[i] = K*X[i] + 2*K*X[i-1] + 1.5384*Y[i-1];
}
if ( i > 2 ) {
Y[i] = K*X[i] + 2*K*X[i-1] + K*X[i-2] + 1.5384*Y[i-1] - 0.6265*Y[i-2];
}
}
fstream plik; //zapis do pliku .txt
double t = 0;
plik.open( "output_butterworth.txt", ios::out | ios::trunc );
plik << "Czas" << "\t" << "X[nTp]" << "\t" << "Y[nTp]" << endl;
for ( int i = 0; i < n; i++) {
plik << t << "\t" << X[i] << "\t" << Y[i] << endl;
t += Tp;
}
plik.close();
return 0;
}
5.2 Program realizujący cyfrowy filtr dolnoprzepustowy NOI na podstawie analogowego filtru Czebyszewa I rodzaju
#include <iostream>
#include <fstream>
#define K 0.1443 // wzmocnienie filtru
#define Tp 0.04 // okres probkowania
#define n 100 // liczba probek
using namespace std;
unsigned Wymuszenie (unsigned arg) { // funkcja do implementacji wymuszen
unsigned wartosc;
if ( arg == 0 ) { // implementacja skoku jednostkowego
wartosc = 0;
}
else {
wartosc = 1;
}
return wartosc;
}
int main() {
double X[n], Y[n]; // zadeklarowanie dwoch tablic na probki wejsciowe i wyjsciowe
for ( int i = 0; i < n; i++ ) { // zerowanie tablic
X[i] = 0;
Y[i] = 0;
}
for ( int i = 0; i < n; i++ ) { // filtr
X[i] = Wymuszenie(i);
if ( i == 1 ) {
Y[i] = K*X[i];
}
if ( i > 1 ) {
Y[i] = K*X[i] + K*X[i-1] + 0.7134*Y[i-1];
}
}
fstream plik; //zapis do pliku .txt
double t = 0;
plik.open( "output_czebyszew.txt", ios::out | ios::trunc );
plik << "Czas" << "\t" << "X[nTp]" << "\t" << "Y[nTp]" << endl;
for ( int i = 0; i < n; i++) {
plik << t << "\t" << X[i] << "\t" << Y[i] << endl;
t += Tp;
}
plik.close();
return 0;
}
6. Wnioski
Na podstawie wykresów stabilności widzimy, że zarówno w przypadku pierwszego, jak i drugiego zaprojektowanego filtru bieguny transmitancji leżą wewnątrz okręgu jednostkowego. Filtry te są zatem stabilne, co potwierdza informację wygenerowaną w oknie programu podczas fazy projektowania.
Na podstawie charakterystyk skokowych widzimy, że w przypadku filtru Butterwortha występuje niewielkie przeregulowanie, podczas gdy w filtrze Czebyszewa nie występuje ono wcale. Z uwagi na takie same parametry filtrów może to być spowodowane bardziej złożoną strukturą filtru Butterwortha.
Na podstawie charakterystyk impulsowych możemy zauważyć, że filtr cyfrowy na podstawie filtru Czebyszewa I rodzaju jest szybszy w działaniu od filtru Butterwortha. Różnica ta, podobnie jak w powyższym przypadku, również może byc spowodowana stopniem złożenia struktury filtru.
Narzędzie "fdatool" stanowi bardzo użyteczną pomoc przy projektowaniu filtrów cyfrowych. Umożliwia szybkie dobranie parametrów filtrów oraz ułatwia ich analizę dzięki generowanym charakterystykom i transmitancjom.
Załączniki:
plik "FD_BUTTERWORTH.cpp" z kodem programu realizującym filtr dolnoprzepustowy NOI na podstawie analogowego filtru Butterwortha II rzędu
plik "FD_CZEBYSZEW.cpp" z kodem programu realizującym filtr dolnoprzepustowy NOI na podstawie analogowego filtru Czebyszewa I rodzaju