PRZETWARZANIE SYGNAŁÓW
Laboratorium #6

Filtracja sygnałów w języku Python

M. Kociński, P. Strumiłło, A. Borowska-Terka

Zakład Elektroniki Medycznej
Instytut Elektroniki


In [1]:
import funkcje_do_lab6_pl as f6
f6.hide()
Out[1]:
W celu przejrzystości instrukcji, kod Ipython notebook jest domyślnie ukryty. Aby zobaczyć/ukryć kod, kliknij tutaj.

CEL: Zapoznanie się z podstawowymi właściwościami filtrów o Skończonej Odpowiedzi Impulsowej (SOI) i Nieskończonej Odpowiedzi Impulsowej (NOI), z ich projektowaniem w środowisku Pythonowym i ich praktycznymi zastosowaniami.

ZADANIA:

WPROWADZENIE:
Równanie różnicowe filtru cyfrowego przyczynowego jest postaci:

In [2]:
f6.fig('equation.png')
Out[2]:
które jest równoważne równaniu różnicowemu:

a[0]y[n] = -a[1]y[n-1]-a[2]y[n-2]-...-a[N]y[n-N]+b[0]x[n]+...+b[M]x[n-M]

gdzie:
a(n) - współczynniki autoregresji filtra,
b(n) - współczynniki ruchomej średniej filtra.
Dla filtra SOI wszystkie współczynniki autoregresji przyjmują wartość zero, z wyjątkiem a[0]=1.
Uzasadnij nazwy dla współczynników a[k] i b[k].

ZADANIE 1:
Napisz równania różnicowe i wykreść schematy blokowe następujących filtrów (domyślnie zakładamy, że a[0]=1; w przypadku gdy a[0]≠1 musimy podzielić wszystkie wartości współczynników przez a[0]≠0):
b[0] =4, b[1]=2;
b[0] =2, a[1]=-0.5;
b[0] =0.5, a[3]=1;
b[0] =1, b[1]=2, a[1]=0.5, a[3]=-1.

I. Filtry SOI
Zalety filtrów SOI:
1) są dostępne proste, liniowe metody do projektowania filtrów,
2) łatwo osiągalna faza liniowa(symetria współczynników),
3) są zawsze stabilne,
4) charakteryzują się krótkim stanem przejściowym (skończona odpowiedź impulsowa).

Wady: duża liczba współczynników filtru (tj. filtr o dużym rzędzie) jest wymagana aby uzyskać charakterystyki o odpowiedniej stromości .

ZADANIE 2:
Dany jest filtr SOI: b[0]=0.5, b[1]=0.5. Napisz skrypt pokazujący, że odpowiedź impulsowa tego filtru jest równa jego współczynnikom ruchomej średniej.

Wskazówka: zdefiniuj sygnał x=[1, 0, 0, ..., 0] o długości N=100 próbek i częstotliwości fs=11.400Hz i użyj funkcji lfilter z pakietu scipy.signal w celu wyznaczenia odpowiedzi impulsowej filtru.

OCZEKIWANE WYNIKI:

In [3]:
%pylab inline
pylab.rcParams['figure.figsize'] = (14.0, 7.0)
f6.task2()
Populating the interactive namespace from numpy and matplotlib

ZADANIE 3:
Oblicz charakterystykę częstotliwościową filtru zdefiniowanego w zadaniu 2 za pomocą dwóch następujących metod:
a. przez obliczenie transformaty Fouriera odpowiedzi impulsowej uzyskanej w zadaniu 2. Wykreśl amplitudę i fazę widma filtra,
b.za pomocą polecenia freqz z pakietu scipy.signal. Jakiego typu charakterystyki częstotliwościowe filtra uzyskałeś? Czy faza jest liniowa? Jaka jest praktyczna konsekwencja liniowości fazy?
c. W środowisku Python odsłuchaj plik wave voice_noise.wav (patrz laboratorium 3). Z paczki sygnałów udostępnonej na stronie przedmiotu Przetwarzanie sygnałów wczytaj plik wave voice_noise.wav do obszaru roboczego Pythona, wiedząc, że sygnał jest próbkowany z częstotliwością fs = 11,4kHz. Dokonaj filtracji sygnału głosowego za pomocą filtra z zadania 2. Uzyskany wynik zapisz do pliku voice_filtered.wav. Teraz odsłuchaj plik wave voice_filtered.wav.

ZADANIE 3a - OCZEKIWANE WYNIKI:

In [4]:
f6.task3a()

ZADANIE 3b - OCZEKIWANE WYNIKI:

In [5]:
f6.task3b()

ZADANIE 3c - OCZEKIWANE WYNIKI:

Plik wave voice_noise.wav:

In [6]:
from IPython.display import Audio
sampling_rate, data=f6.sound(f6.noise_voice)
Audio(data=data, rate=sampling_rate)
Out[6]:
In [7]:
f6.task3c()

Wynik filtracji zapisany do pliku voice_filtered.wav:

In [8]:
from IPython.display import Audio
sampling_rate, data=f6.sound(f6.noise_voice_filtered)
Audio(data=data, rate=sampling_rate)
Out[8]:

ZADANIE 4:
Powtórz zadanie 2 dla filtra SOI o współczynnikach b [0] = 0.5, b [1] = - 0,5.

OCZEKIWANE WYNIKI:

In [9]:
f6.task4()

ZADANIE 5:
Oblicz odpowiedź impulsową filtru, który jest kaskadowym połączeniem filtrów z zadania 2 i zadania 4. Jaka jest charakterystyka częstotliwościowa uzyskanego filtru?


II. Filtry NOI
Zalety filtrów NOI:
1) zadane charakterystyki częstotliwościowe można uzyskiwać dla filtrów NOI o rzędzie znacznie mniejszym niż dla filtrów SOI.

Wady:
1) trudności z zapewnieniem dokładnie liniowej fazy,
2) mogą być niestabilne.


ZADANIE 6:

Dany jest filtr NOI:
y(k ) = x(k )+ alfa*y(k −1)
gdzie: alfa = a[1] - jest pewnym parametrem.
Napisz funkcję wykreślającą odpowiedzi impulsowe filtra dla różnych wartości parametru alfa. Jaka jest odpowiedź impulsowa filtru dla parametru alfa przyjmującego wartości: alfa=0.9, alfa=-0.9, alfa=1.1, alfa=-1.1, alfa=1.
Skomentuj otrzymane wyniki. Jaki zakres wartości parametru alfa filtr jest stabilny?

OCZEKIWANE WYNIKI:

In [10]:
f6.task6()

ZADANIE 7:
Wczytaj sygnał audio male_voice.wav próbkowany z częstotliwością fs=11.4kHz. Użyj następujących współczynników filtru NOI b[0]=1, a[0]=1, a[1000]=-0.7 do filtrowania tego sygnału. Zapisz wynik w pliku wave. Odtwórz plik i skomentuj uzyskany efekt.

Plik male_voice.wav:

In [11]:
f6.task7()
sampling_rate, data=f6.sound(f6.male_voice)
Audio(data=data, rate=sampling_rate)
Out[11]:

OCZEKIWANE WYNIKI:

Wynik filtracji zapisany do pliku male_voice_filtered.wav:

In [12]:
sampling_rate, data=f6.sound(f6.male_voice_filtered)
Audio(data=data, rate=sampling_rate)
Out[12]:

ZADANIE 8:
Zapoznaj sie z dokumentacją scipy.signal dostępną na stronie:
http://docs.scipy.org/doc/scipy/reference/signal.html
i znajdź sekcję Filter design. Następnie wybierz funkcję firwin do projektowania filtru o skończonej odpowiedzi impulsowej dla zadanych charakterystyk, np. polecenie b = firwin (40,0.7) wyliczy M = 40 autoregresyjnych współczynników filtra określających filtr dolnoprzepustowy o częstotliwości odcięcia fc=0.7*(fs/2). Użyj komendy freqz w celu wykreślenia charakterystyki częstotliwościowe tego filtra.
Prześledź przykłady z sekcji scipy.signal.firwin i zdefiniuj filtry: górnoprzepustowy, przepustowy i zaporowy. Wykreśle charakterystyki częstotliwościowe tych filtrów.

OCZEKIWANE WYNIKI:

In [13]:
f6.task8()