Filtr pasmowo-zaporowy
Filtry tego typu mają szerokie zastosowanie, oprócz specjalizowanych aplikacji, w układach redukcji zakłóceń. Na przykład można go zastosować do usuwania przydźwięku sieci w urządzeniach audio. Wtedy filtr ten pracuje z częstotliwością rezonansową 50 Hz. Podobnie jak poprzednie filtry jest zaprojektowany na zasadzie przekształcenia zwykłego układu elektronicznego RLC na postać cyfrową. Ponieważ chodzi nam o to, aby w stanie rezonansu wzmocnienie układu wynosiło 1, w naszym przypadku mamy do czynienia z obwodem szeregowo-równoległym RLC, pokazanym na rysunku 1.
Wartością wejściową naszego układu jest napięcie wejściowe, natomiast wyjściową natężenie prądu płynącego przez rezystor. Oto równania dla tego obwodu:
Najwygodniej jest przyjąć R=1, czyli:
Zatem nasze równania w postaci rekurencyjnej mają następującą postać:
Realizacja cyfrowa powyższych równań została pokazana na diagramie na rysunku 2.
#define STALA_PI 3.141592
#define FP 96000
#define Q 30
#define K_C (2*STALA_PI*100/Q/FP)
#define K_L ((2*STALA_PI*100*Q)/FP)
double Filtr(double w){
volatile double register wy;
static double U_C = 0, U_L=0;
wy = w - U_C;
U_C += (wy-I_L) * K_C;
I_L += U_C * K_L;
return wy;
}
Przykład programu implementującego powyższy filtr znajduje się na listingu 1, natomiast na rysunku 3 pokazany jest przebieg sygnału wyjściowego w funkcji czasu po przyłożeniu na wejście fali prostokątnej o częstotliwości równej częstotliwości rezonansowej.
Współczynniki KC i KL możemy wyznaczyć, posługując się wzorami na dobroć równoległego obwodu rezonansowego:
czyli:
gdzie fp - częstotliwość próbkowania.
Pozostałe układy DSP
Teraz przeanalizujemy pozostałe algorytmy DSP, które generalnie nie służą do filtrowania sygnałów, ale znajdą wiele praktycznych zastosowań.
Generatory
Stosując technikę cyfrowego przetwarzania sygnału, można w bardzo prosty sposób tworzyć układy wytwarzające przebiegi przemienne w czasie. Jednym z łatwiejszych w realizacji algorytmów, ponieważ nie wymaga użycia nieliniowych funkcji matematycznych, jest generator sygnału trójkątnego lub piłokształtnego. Schemat takiego algorytmu pokazany jest na rysunku 4.
Zasada jego działania polega na cyklicznym zwiększaniu amplitudy lub zmniejszaniu (po przekroczeniu wartości progowej). Dla generatora przebiegu trójkątnego zmienną Δ można wyliczyć ze wzoru:
gdzie:
- MAX - wartość maksymalna generatora,
- fg - częstotliwość generatora,
- fp - częstotliwość próbkowania.
Jeśli chcemy zbudować program tworzący sygnał zmieniający się nieliniowo, musimy do tego celu użyć nieliniowej funkcji matematycznej. Jednak w większości przypadków nie musimy jej wyliczać algorytmami arytmetycznymi. Możemy bowiem użyć tablicy wartości. To rozwiązanie powoduje zmniejszenie dokładności wyliczonej wartości, jednak bardzo przyspiesza działanie programu. Na listingu 2 zaprezentowałem przykładową klasę w języku C++ służącą do wytwarzania przebiegu o regulowanej amplitudzie i częstotliwości.
class EModulacjaLFO : public EModulacjaBaza{
public:
EModulacjaLFO();
enum T_Ksztalt{
KTrojkat,
KProstokat,
KSinus,
KPila
};
void EModulacjaLFO::UstawPar(double f, double a){
DAlfa = f * 2.0F * STALA_PI / FP;
F = f;
Amp = a;
DA = f / FP * 2 * a;
Glebokosc = a;
}
void EModulacjaLFO::PrzetwarzanieImp(){
if (Ksztalt == KSinus){
Alfa += DAlfa;
if (Alfa > (2 * STALA_PI))
Alfa -= (2 * STALA_PI);
Wartosc = (double)((sin(Alfa) + 1)/2.0F*Glebokosc);
} else if (Ksztalt == KPila){
if (Kierunek){
Wartosc += DA/0.2F;
if (Wartosc >= Glebokosc) Kierunek = false;
} else {
Wartosc -= DA/1.8F;
if (Wartosc <= 0) Kierunek = true;
}
} else {
if (Kierunek){
WT += DA;
if (WT >= Glebokosc) Kierunek = false;
} else {
WT -= DA;
if (WT <= 0) Kierunek = true;
}
if (Ksztalt == KProstokat){
Wartosc = WT > 0.5F*Glebokosc ? Glebokosc : 0;
} else
Wartosc = WT;
}
}
T_Ksztalt Ksztalt = KTrojkat;
double F;
double Amp;
private:
double DA;
double Glebokosc;
double Alfa = 0;
double DAlfa;
double WT = 0;
bool Kierunek = false;
};
Do wytwarzania przebiegu czasowego służy procedura PrzetwarzanieImp. Kształt przebiegu wytwarzanego przez tę funkcję zależy od zmiennej Ksztalt i może mieć kształt sinusoidalny, piłokształtny, trójkątny lub prostokątny. Za pomocą funkcji UstawPar możemy zmieniać parametry generatora, a konkretnie - wartość amplitudy i częstotliwości.
W programie, w którym były użyte powyższe funkcje, generowany sygnał był używany do modulowania różnych wartości, tak więc amplituda sygnału wyjściowego zmienia się od 0 do ustawianej wartości maksymalnej.
Oprócz układów wytwarzających przebieg okresowy można też zaprojektować algorytm, na którego wyjściu występuje pojedynczy impuls o określonym kształcie. Zasada jest taka sama jak w rozwiązaniach omawianych poprzednio, z tą różnicą, że po osiągnięciu przez licznik końcowej wartości odliczanie zostaje zakończone. Przykładowy algorytm wytwarzający impuls prostokątny pokazano na rysunku 6.
Układy całkujące i różniczkujące
Stosując technikę cyfrową, można również w prosty sposób zaprojektować układ różniczkujący i całkujący. Jeśli chodzi o całkowanie, to zostało ono omówione w poprzednich częściach cyklu i polega na zwykłym dodawaniu. Całkowanie możemy wykonać w następujący sposób:
dla
gdzie fp - częstotliwość próbkowania.
W przypadku różniczkowania możemy opracować algorytm na podstawie samej definicji pochodnej:
dla
Równanie reprezentujące algorytm będzie wyglądało następująco:
gdzie fp - częstotliwość próbkowania.
Schemat blokowy reprezentujący algorytm różniczkowania jest pokazany na rysunku 7.
Modulatory
Modulacja amplitudy sygnału bazuje na operacji mnożenia. W technice analogowej trzeba stosować specjalne układy, które są dość skomplikowane i zazwyczaj nieliniowe. Natomiast podczas przetwarzania cyfrowego wystarczy zwykła operacja mnożenia, która zazwyczaj jest dostępna w asemblerach procesorów, których używa się do obróbki sygnałów lub w układach FPGA. Najprostszym blokiem modulacji dźwięku jest regulacja głośności. Polega na mnożeniu sygnału akustycznego przez wartość zmieniającą się w zakresie 0...1. Działanie tego zadania pokazano na rysunku 8.
Innym zastosowaniem modulatora jest płynne włączanie lub wyłączanie dźwięku. Do przełączania dźwięku należy zastosować taki układ, gdyż bezpośrednie włączanie lub wyłączanie może wywoływać słyszalny trzask. Schemat tego rozwiązania obrazuje rysunek 9.
Zadaniem układu formowania amplitudy jest jej powolna zmiana przy skokowej zmianie poziomu wejściowego. Fragment kodu reprezentujący tę funkcję pokazano na listingu 3.
#define WSP_T_WYCISZANIE (double)(10/FP);
if (Wyciszenie){
WspWyciszanie -= WspWyciszanie * WSP_T_WYCISZANIE;
} else {
WspWyciszanie += (1-WspWyciszanie) * WSP_T_WYCISZANIE;
}
WartoscSygnalu *= WspWyciszanie;
Trzecim przykładem, który chcę zaprezentować w tym punkcie, jest modulacja dźwięku za pomocą generatora. Rozwiązanie to jest często stosowane jako efekt muzyczny. Schemat jego działania pokazano na rysunku 10.
Detektory amplitudy
Nieraz w układach przetwarzających sygnał zmienny zachodzi potrzeba pomiaru wartości amplitudy. Mogą to być detektory sygnału akustycznego lub na przykład układy do pomiaru napięć wyjściowych w falownikach. W zasadzie, aby dokonać pomiaru amplitudy takiego sygnału, wystarczy obliczyć wartość bezwzględną i zastosować filtr dolnoprzepustowy w celu odfiltrowania składowej zmiennej. Jednak jeśli chcielibyśmy wyznaczyć wartość maksymalną, można zastosować układ z rysunku 11. Jest on prosty do realizacji za pomocą algorytmów cyfrowych, w których można łatwo zrealizować diody idealne.
W zaprezentowanym układzie możemy dobrać stałe czasowe filtru dolnoprzepustowego dla rosnącego i malejącego poziomu mierzonego sygnału. Jeśli chcemy zaprojektować układ mierzący maksymalną amplitudę to R2 powinno być dużo większe od R1. Algorytm tego detektora pokazuje rysunek 12.
Filtry modulowane
Opisane w artykule filtry mogą być z łatwością przestrajane, dzięki czemu są stosowane do regulacji barwy tonu. Natomiast modulowane za pomocą generatorów tworzą ciekawe efekty dźwiękowe. Na rysunku 13 znajduje się algorytm modulowanego filtru środkowoprzepustowego. W pokazanym przeze mnie przykładzie filtr jest modulowany sygnałem zmiennym, ale do modulacji można też użyć pojedynczego impulsu lub podawać wartość z manualnego regulatora (np. pedału gitarowego).
S- i Z-transformata
Teraz wyjaśnię w skrócie zastosowanie S- i Z-transformaty w projektowaniu filtrów cyfrowych. Ponieważ chcę to zagadnienie omówić od strony praktycznej, teraz dla formalności podam tylko wzory teoretyczne definiujące przekształcenie Z i S i od razu przejdę do ich użycia w algorytmach DSP.
Ogólny wzór na transformacje w dziedzinie s nazywaną także jako przekształcenie Laplace’a:
Wzór definiujący transformację Z wygląda następująco:
Transformacja Z służy do projektowania filtrów cyfrowych, natomiast za pomocą transformaty Laplace’a możemy opisać dowolny liniowy układ elektroniczny. Przekształcenie to pozwala także wyznaczyć charakterystykę częstotliwościową i odpowiedź impulsową. Aby wyznaczyć charakterystykę częstotliwościową dla funkcji przenoszenia opisanej w dziedzinie S wystarczy pod S - podstawić jω, natomiast dla z przekształcenia pod Z-ejω/fp, gdzie fp to częstotliwość próbkowania.
Zastosowanie zmiennej s jest bardzo proste. Wystarczy w równaniu, wszędzie tam, gdzie występuje różniczkowanie, pomnożyć przez zmienną s, a tam, gdzie występuje całkowanie, podzielić przez S.
Biorąc pod uwagę definicję pojemności i indukcyjności, możemy w obwodzie elektronicznym zastąpić reaktancję dla tych wartości w następujący sposób:
Analizę układu elektronicznego wykonuje się przy użyciu zwykłych praw dla obwodów elektrycznych takich, jak prawo Ohma czy Kirchhoffa, z tym że występowanie pojemności zastępuje się wyrażeniem i traktuje się je w obliczeniach jako rezystancję (reaktancję).
Na przykład dla szeregowego obwodu rezonansowego RLC można napisać następujące równanie:
W artykule zamieściłem opis transformaty Laplace’a, ponieważ większość filtrów projektuje się przy jej użyciu, a następnie przekształca się na transformację Z, na podstawie której można stworzyć gotowy algorytm DSP.
Metoda dopasowania transformacji Z
Omówię teraz dwie metody zamiany filtru zaprojektowanego przy użyciu transformacji S na transformację w dziedzinie Z. Do tego muszę wprowadzić pojęcia zer i biegunów występujących w opisie transmitancji w dziedzinie S. Zera są to po prostu miejsca zerowe licznika, natomiast bieguny to wartości zmiennej S, dla których zeruje się mianownik:
W opisywanej metodzie transformuje się zera i bieguny transmitancji filtru analogowego w taki sposób, że zamienia się czynniki:
Dla tej metody przybliżona zgodność charakterystyk filtru analogowego i cyfrowego występuje tylko w zakresie częstotliwości f<fp/10.
Metoda transformacji biliniowej
W tej metodzie przekształcamy bezpośrednio wyrażenie, w którym występuje zmienna s na zmienną z według wzoru:
Metoda ta wprowadza błąd częstotliwości. Rzeczywista częstotliwość, dla której to przekształcenie jest prawdziwe, wynosi:
Projektowanie algorytmu DSP na podstawie funkcji opisującej filtr w dziedzinie Z
Aby zamienić opis filtru w dziedzinie Z na algorytm cyfrowy, najlepiej funkcje przenoszenia filtru opisać wzorem:
Na podstawie tak wyrażonej funkcji przenoszenia możemy opracować algorytm cyfrowy, który łatwo zaimplementować w języku programowania wysokiego poziomu. Graf takiego algorytmu pokazany jest na rysunku 14, natomiast sam algorytm na rysunku 15.
Zaprezentowany filtr należy do grupy filtrów tzw. IIR. Oznacza to, że jego odpowiedź impulsowa nigdy nie osiąga wartości zerowej (w dziedzinie czasu). Uproszczonym rodzajem tego filtru jest filtr typu FIR, który nie spełnia tego warunku. Różnicą w opisie pomiędzy strukturami FIR i IIR jest to, że wartości zmiennych pamiętających (Z-1) filtru typu IIR dla nowego cyklu przetwarzania zależą od poprzednich wartości.
Struktura filtru FIR pokazana jest na rysunku 16.
Tomasz Krogulski
krogul70@gmail.com