Cyfrowe przetwarzanie sygnałów w praktycznych zastosowaniach (2)

Cyfrowe przetwarzanie sygnałów w praktycznych zastosowaniach (2)

W poprzednim artykule opisałem podstawowe sposoby realizacji algorytmów DSP. Zaprezentowałem przykłady układów elektronicznych oraz podstawowe rozwiązania programowe, na których bazują procedury przetwarzania dźwięku. Ponadto podałem sposoby projektowania prostych filtrów. W tym odcinku kontynuuję tematykę filtrów oraz wskażę inne komponenty, które również można stosować w technice AUDIO. Omówię też sposoby projektowania filtrów za pomocą S- i Z-transformaty oraz sposoby przeliczania transmitancji wyrażonej w dziedzinie S na jej odpowiednik w dziedzinie Z.

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.

 
Rysunek 1. Schemat obwodu RLC

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.

Rysunek 2. Schemat blokowy algorytmu filtru pasmowo-zaporowego
Listing 1. Kod realizujący działanie filtra pasmowo-zaporowego

#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.

Rysunek 3. Odpowiedź filtru środkowozaporowego na pobudzenie falą prostokątną o częstotliwości równej częstotliwości rezonansowej filtru f=f0=100 Hz, częstotliwość próbkowania fp=10 kHz, Uwe=1 V, Q=10

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.

Rysunek 4. Algorytm generatora wytwarzającego sygnał prostokątny

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.

Listing 2. Przykładowa klasa w języku C++ służąca 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.

Rysunek 5. Algorytm generatora sygnału nieliniowego wytwarzanego przy użyciu tablicy wartości funkcji

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.

Rysunek 6. Algorytm wytwarzania pojedynczego impulsu trójkątnego

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.

Rysunek 7. Algorytm różniczkowania numerycznego

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.

Rysunek 8. Regulacja głośności

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.

Rysunek 9. Układ płynnego przełączania dźwięku

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.

Listing 3. Fragment kodu reprezentujący funkcję powolnej zmiany amplitudy przy skokowej zmianie poziomu wejściowego

#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.

Rysunek 10. Modulacja dźwięku generatorem

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.

Rysunek 11. Schemat obrazujący ideę detektora amplitudy

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.

Rysunek 12. Algorytm detektora amplitudy z ustawianą stałą czasową dla rosnącego i malejącego poziomu sygnału mierzonego

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).

Rysunek 13. Algorytm filtru modulowanego

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:

 

Rysunek 14. Struktura filtru cyfrowego

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.

Rysunek 15. Algorytm filtru cyfrowego będący jego implementacją w języku wysokiego rzędu

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.

Rysunek 16. Struktura filtru FIR

Struktura filtru FIR pokazana jest na rysunku 16.

Tomasz Krogulski
krogul70@gmail.com

Artykuł ukazał się w
Elektronika Praktyczna
kwiecień 2023

Elektronika Praktyczna Plus lipiec - grudzień 2012

Elektronika Praktyczna Plus

Monograficzne wydania specjalne

Elektronik kwiecień 2024

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Świat Radio maj - czerwiec 2024

Świat Radio

Magazyn krótkofalowców i amatorów CB

Automatyka, Podzespoły, Aplikacje kwiecień 2024

Automatyka, Podzespoły, Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna kwiecień 2024

Elektronika Praktyczna

Międzynarodowy magazyn elektroników konstruktorów

Elektronika dla Wszystkich maj 2024

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów