Pliki dołączone do zasobu:

Pliki źródłowe Matlab.7z


Opis zasobu:

Sygnał prostokątny może być rozłożony w szereg Fouriera. Zawiera on sinusoidę o podstawowej częstotliwości (takiej samej jak częstotliwość sygnału prostokątnego) oraz sinusoidy o nieparzystej wielokrotności tej częstotliwości (harmoniczne) o odpowiednich amplitudach. Przybliżenie sygnału prostokątnego zrekonstruowanego z czterech sinusoid jest przedstawione na rys. 6.12 (kolor czarny).

Rys. 6.12. Sygnał prostokątny zrekonstruowany z czterech sygnałów sinusoidalnych

 

W pierwszym ćwiczeniu spróbujemy przefiltrować sygnał prostokątny w taki sposób, aby pozostawić tylko cztery pierwsze harmoniczne. W prezentowanym przykładzie sygnał prostokątny ma częstotliwość 10 Hz. Aby pozostawić cztery pierwsze (nieparzyste) harmoniczne należy skonstruować filtr dolnoprzepustowy o częstotliwości odcięcia 80 Hz (czyli filtr przepuści sinusoidy o częstotliwości 10 Hz, 30 Hz, 50 Hz, 70 Hz, ale zablokuje 90 Hz i wyższe harmoniczne). Na początku zaprojektujmy filtr o skończonej odpowiedzi impulsowej (funkcja firpm() w Matlabie). Charakterystyka amplitudowa i fazowa tego filtru jest przedstawiona na rys. 6.14. Należy zwrócić uwagę, że charakterystyka fazowa jest liniowa w paśmie przepustowym. Filtr nie zniekształca więc sygnału. Sygnał oryginalny oraz przefiltrowany są zaprezentowane na rys. 6.13. Sygnał przefiltrowany jest przesunięty w stosunku do oryginalnego, ale nie zniekształcony. Filtry o skończonej odpowiedzi impulsowej mają duży rząd (w tym przypadku 500). Powoduje to, że aż 500 próbek sygnału musi przejść przez filtr, żeby on w pełni zadziałał. Stąd czas odpowiedzi takich filtrów jest stosunkowo długi.

Rys. 6.13. Sygnał oryginalny (zielony) oraz przefiltrowany (czerwony) z użyciem filtru o skończonej odpowiedzi impulsowej

 

 

Rys. 6.14. Charakterystyka amplitudowa i fazowa filtru o skończonej odpowiedzi impulsowej

 

Skrypt Matlaba realizujący filtr SOI jest przedstawiony na Listingu 6.5.

clear;<br> clc;<br> close all;<br>  <br> % Częstotliwość próbkowania<br> Fs=2000;<br>  <br> %parametry sygnału<br> fsyg=10;<br> ok=1/fsyg;<br> A=1;<br> faza=0;<br> sks=0;<br>  <br> T=1/Fs;<br> % Czas analizy<br> t=0:T:((5*ok)-T);<br>  <br> y=A*square(2*pi*fsyg*t+faza)+sks;<br> %y=A*sawtooth(2*pi*fsyg*t+faza, 0)+sks;<br>  <br> % Projekt filtru SOI - funkcja firpm()<br> a=1;<br> N=500;<br> Ho=[1 1 0 0];<br> fo=[0 75 85 (Fs/2)]/(Fs/2);<br> b=firpm(N,fo,Ho);<br>  <br> figure(1)<br> freqz(b,a,512,Fs);<br>  <br> yf = filter(b,a,y);<br>  <br> figure(2)<br> subplot(211)<br> plot(t,y,'-g');<br> hold on<br> plot(t,yf,'-r');<br>  <br> axis tight<br> grid on;<br> xlabel('Czas')<br> ylabel('Amplituda')<br> title('Sygnal')
 

Listing 6.5. Skrypt Matlaba realizujący filtr SOI

 

W drugim ćwiczeniu zróbmy to samo, ale z użyciem filtru o nieskończonej odpowiedzi impulsowej. Do zaprojektowania filtru użyjmy funkcji ellip(). Charakterystyka amplitudowa i fazowa tego filtru jest przedstawiona na rys. 6.16. Jeśli chodzi o charakterystykę amplitudową, to jest ona bardzo podobna do charakterystyki filtru o skończonej odpowiedzi impulsowej (ćwiczenie 1). Jednak charakterystyka fazowa jest nieliniowa w paśmie przepustowym. Chociaż na rysunku ta nieliniowość może wydawać się niewielka, ma ona znaczny wpływ na sygnał filtrowany. Sygnał oryginalny oraz przefiltrowany są zaprezentowane na rys. 6.16. Widać zniekształcenie sygnału przefiltrowanego. Jest ono spowodowane nieliniowym przesunięciem poszczególnych harmonicznych sygnału, które są później dodawane do siebie tworząc sygnał przefiltrowany. Filtry o nieskończonej odpowiedzi impulsowej mają znacznie mniejsze rzędy niż filtry o skończonej odpowiedzi impulsowej (w tym przypadku 8). Stąd też czas odpowiedzi takiego filtru jest bardzo krótki.

 

Rys. 6.15. Charakterystyka amplitudowa i fazowa filtru o skończonej odpowiedzi impulsowej

 

Rys. 6.16. Sygnał oryginalny (zielony) oraz przefiltrowany (czerwony) z użyciem filtru o nieskończonej odpowiedzi impulsowej

 

Skrypt Matlaba realizujący filtr NOI jest przedstawiony na Listingu 6.6.

clear;<br> clc;<br> close all;<br>  <br> % Częstotliwość próbkowania<br> Fs=2000;<br>  <br> %parametry sygnału<br> fsyg=10;<br> ok=1/fsyg;<br> A=1;<br> faza=0;<br> sks=0;<br>  <br> T=1/Fs;<br> % Czas analizy<br> t=0:T:((5*ok)-T);<br>  <br> y=A*square(2*pi*fsyg*t+faza)+sks;<br> %y=A*sawtooth(2*pi*fsyg*t+faza, 0)+sks;<br>  <br> % Projekt filtru NOI - funkcja ellip()<br> N=8;<br> Rp=0.1;<br> Rs=50;<br> wn=[80]/(Fs/2);<br> [b,a]=ellip(N,Rp,Rs,wn);

figure(1)<br> freqz(b,a,512,Fs);<br>  <br> yf = filter(b,a,y);<br>  <br> figure(2)<br> subplot(211)<br> plot(t,y,'-g');<br> hold on<br> plot(t,yf,'-r');<br>  <br> axis tight<br> grid on;<br> xlabel('Czas')<br> ylabel('Amplituda')<br> title('Sygnal')
 

Listing 6.6. Skrypt Matlaba realizujący filtr NOI

W ćwiczeniu 3 zajmiemy się bardziej praktycznym przypadkiem. Mamy sygnał EKG, na który nakładają się zakłócenia od sieci (60 Hz) (rys. 6.18 – kolor niebieski). Zaprojektujmy filtr cyfrowy, który usunąłby te zakłócenia. Ponieważ zależy nam na szybkim zadziałaniu filtru, zastosujmy filtr eliptyczny (NOI). Wprowadzone przez ten filtr zniekształcenia fazowe w tym przypadku nie powinny mieć większego znaczenia. Najpierw wyznaczmy widmo sygnału EKG (rys. 6.17 – góra). Widać zakłócenia od sieci energetycznej – prążek 60 Hz. Zaprojektujmy filtr pasmowo-przepustowy tak by zablokować częstotliwości wokół 60 Hz (pasma przepustowe 0-55 Hz, 65-fs/2 Hz). Charakterystyki amplitudowa i fazowa tego filtru są przedstawione na rys. 6.19. Następnie przefiltrujmy sygnał. Rezultat działania takiego filtru jest przedstawiony na rys. 6.18 – kolor czerwony. Widać wyraźnie, że zakłócenia od sieci zostały odfiltrowane. Widmo sygnału po filtracji jest przedstawione na rys. 6.17 – dół. Tu też widać, że częstotliwości wokół 60 Hz zostały usunięte z sygnału.

Rys. 6.17. Widmo sygnału EKG przed i po filtracji

 

Rys. 6.18. Sygnał EKG przed i po filtracji

 

Rys. 6.19. Charakterystyka amplitudowa i fazowa zaprojektowanego filtru eliptycznego

 

Skrypt Matlaba użyty do filtracji sygnału EKG jest przedstawiony na Listingu 6.7.

clear;<br> close all;<br>  <br> load ekg.mat<br> ekg=ekg-mean(ekg);<br>  <br> fp=960;<br> f=linspace(0,fp,3600);<br> t=linspace(0,(3600/fp),3600);<br>  <br> % Projekt filtru ellip<br> Rp=0.1;<br> Rs=50;<br> wp=[45 75]/(fp/2);<br> ws=[50 65]/(fp/2);<br> [N,wn]=ellipord(wp,ws,Rp,Rs);<br> [b,a]=ellip(N,Rp,Rs,wn,'stop');<br>  <br> figure(1);<br> freqz(b,a,512,fp);<br>  <br> % Filtracja sygnału<br> sf=filter(b,a,ekg);<br>  <br> figure(2);<br> hold on<br> plot(t,ekg);<br> plot(t(100:3600),sf(100:3600),'r');<br> grid;<br> hold off<br> title('Sygnal przed i po filtracji');<br> xlabel('Czas [s]');ylabel('Amplituda');<br>  <br>  <br> w=fft(ekg);<br> wlin=abs(w);<br> wlog=20*log10(wlin/max(wlin));<br> wf=fft(sf);<br> wflin=abs(wf);<br> wflog=20*log10(wflin/max(wflin));<br>  <br> figure(3);<br> subplot(211);<br> plot(f(1:1800),wlog(1:1800));<br> ylim([-100 10]);<br> grid;<br> title('Widmo sygnalu przed filtracja');<br> xlabel('Czestotliwosc [Hz]');ylabel('Amplituda');<br> subplot(212);<br> plot(f(1:1800),wflog(1:1800));<br> ylim([-100 10]);<br> grid;<br> title('Widmo sygnalu po filtracji');<br> xlabel('Czestotliwosc [Hz]');ylabel('Amplituda');
 

Listing 6.7. Skrypt Matlaba użyty do filtracji sygnału EKG

 

Jako dodatkowe ćwiczenie proszę zaprojektować analogiczny filtr, ale o skończonej odpowiedzi impulsowej i porównać otrzymane rezultaty.

Ostatnia modyfikacja: środa, 17 listopada 2021, 11:58