Spis treści 1 Zadanie: Filtr adaptywny 1.1 Przygotuj sygnały: 1.2 Symulacja sieci 1.3 Wykresy 1.4 Szkielet rozwiązania: 1.5 Pytania Zadanie: Filtr adaptywny W tym zadaniu symulujemy działanie filtra, który może się adaptować do zmiennych warunków pracy. Jako przykład rozważymy redukcję szumu zniekształconego przez otoczenie. Załóżmy, że chcemy przekazywać głos pilota z kokpitu. Głos ten jest zniekształcony przez szum silników. W metodzie tej musimy mieć dwa mikrofony: jeden z nich rejestruje czysty odgłos silników, a drugi ten odgłos po przejściu drogi do okolic gdzie rejestrowany jest głos pilota. Można zastosować sieć neuronową do modelowania zniekształcenia szumu i ten zniekształcony szum odjąć od sygnału rejestrowanego przez mikrofon pilota. Schemat
Przygotuj sygnały: częstość próbkowania niech będzie 100Hz czysty sygnał niech będzie reprezentowany przez sinusa o częstości 10Hz i trwający 2 s czysty szum niech będzie modelowany jako sygnał o tej samej długości co czysty sygnał, ale jego próbki to zmienne losowe z rozkładu normalnego szum zniekształcony niech będzie sumą osłabionego o 70% szumu i echa (sygnał opóźniony o jedną próbkę i amplitudzie zmniejszonej o 80%) sygnał zaburzony szumem to suma sinusa i szumu zniekształconego Symulacja sieci Konstruujemy sieć liniową o dwóch wejściach i jednym wyjściu Przygotowujemy pusty zbiór uczący i przekazujemy go do obiektu typu BackpropTrainer, któremu przekazujemy sieć, ciąg uczący oraz parametry uczenia: współczynnik uczenia i bezwładność. Główna pętla symulacji iteruje się po kolejnych próbkach czasu: 1. Do bufora pobieramy wycinek czystego szumu z chwili bieżącej i tylu poprzednich jaki jest rozmiar wejścia. 2. Nadpisujemy zbiór uczący próbką zawierającą bieżący bufor i aktualną wartość zniekształconego szumu. 3. Uczymy sieć na tym jedno-przykładowym zbiorze uczącym. 4. Obliczamy sygnał jaki sieć zwróciłaby dla aktualnego bufora. 5. Jako "oczyszczony sygnał" traktujemy różnicę między sygnałem zaburzonym i aktualnym wyjściem sieci. 6. Zbieramy we wcześniej przygotowanych tablicach: aktualne wagi sieci kolejno otrzymane próbki "oczyszczonego sygnału" Wykresy Na subplotach przedstaw: sygnał czysty na tle sygnału zaburzonego ewolucję wag sygnał oczyszczony na tle sygnału zaburzonego Szkielet rozwiązania: # -*- coding: utf-8 -*- # demostracja redukcji szumu znieksztalconego przez otoczenie import numpy as np import pylab as py
# przygotowujemy dane wejsciowe Fs = 100. # częstość próbkowania niech będzie 100Hz dt = 1/Fs f = 10. # 2 sek. wektor czasu t=np.arange(,2,dt) # to jest czysty sygnal: csinus o częstości 10Hz i trwający 2 s sygnal=... # to jest oryginalny szum: czysty szum niech będzie modelowany jako sygnał o tej samej długości co czysty sygnał, ale jego próbki to zmienne losowe z rozkładu normalnego szum =... # ciag wzorcow: na wejscie podajemy czysta postac szumu X = szum # szum ten jest modyfikowany na drodze od swojego zrodla do mikrofonu # np zmniejsza sie jego amplituda do 30% Z = 0.3*X # i dodaje sie echo z amplitudą 20% Z[2:] = Z[2:] + 0.2*X[1:-1]; # zmodyfikowany szum (obcinamy efekty brzegowe) Z = Z[2:-1]; t=t[2:-1]; sygnal = sygnal[2:-1] X = X[2:-1] # do mikrofonu efektywnie trafia sygnal i znieksztalcony szum zaszum_sygnal = sygnal + Z #0.3*szum; # narysuj na 3 subplotach: # - czysty sygnał # - czysty szum # - to co trafia do mikrofonu # tu zaczynamy rysunek, który będzdie obrazował c dzieje się w trakcie symulacji py.figure(1) py.subplot(3,1,1) py.plot(t,sygnal,t,zaszum_sygnal) py.title('stan poczatkowy') # pomysl zastosowania tu sieci polega na tym, aby sieć modelowala to co # dzieje sie z szumem na drodze od zrodla do mikrofonu: # zmodyfikowany_szum = F(szum). # Znajac czysty szum,
# odwzorowanie modyfikujace szum i zaszumiony sygnal mozemy odtworzyc # czysty sygnal # sygnal = zaszum_sygnal - F(szum) # importujemy moduły do konstrukcji sieci from pybrain.structure import FeedForwardNetwork, LinearLayer, FullConnection from pybrain.supervised.trainers import BackpropTrainer from pybrain.datasets import SupervisedDataSet #Konstruujemy sieć liniową o dwóch wejściach i jednym wyjściu # wytwarzamy pustą sieć siec =... # tworzymy węzły wejściowe i wyjściowe N_wej =... warstwawejsciowa =... warstwawyjsciowa =... # dodajemy węzły do sieci # warstwy wejściowej...(warstwawejsciowa) # warstwy wyjściowej...(warstwawyjsciowa) # łączymy węzły wej_do_wyj =... siec.addconnection(...) # inicjujemy strukturę sieci siec.... #Przygotowujemy pusty zbiór uczący CU = SupervisedDataSet(...) # przekazujemy go do obiektu typu BackpropTrainer trainer = BackpropTrainer(...,...,learningrate=0.01, momentum=0.9,verbose = True) # przygotowujemy tablice na zbieranie historii wag w = np.zeros((len(t),n_wej) ) b = np.zeros(len(t)) # i na poprawiony sygnal oraz wyjście sieci syg_poprawiony = np.zeros(len(t)) wyj = np.zeros(len(t)) # Główna pętla symulacji iteruje się po kolejnych próbkach czasu for i in range(n_wej,len(t)): # Do bufora pobieramy wycinek czystego szumu z chwili bieżącej bufor_wyjściowy =... #aktualną wartość zniekształconego szumu [i] bufor_wejsciowy =...# wycinek czystego szumu z chwili bieżącej i tylu poprzednich jaki jest rozmiar wejścia i to odwrócony w czasie [i:i-n_wej:-1] # Nadpisujemy zbiór uczący próbką zawierającą bieżący bufor i aktualną
wartość zniekształconego szumu CU = SupervisedDataSet(N_wej, 1) CU.addSample(...) #Uczymy sieć na tym jedno-przykładowym zbiorze uczącym trainer.trainondataset(cu) # zapamiętujemy parametry w tablicy w[i,...] =... # Obliczamy sygnał jaki sieć zwróciłaby dla aktualnego bufora: wyj[i] =... #Jako "oczyszczony sygnał" traktujemy różnicę między sygnałem zaburzonym i aktualnym wyjściem sieci. syg_poprawiony[i] =... py.subplot(3,1,2) py.plot(w) # rysujemy ewolucję wag py.title('wagi') py.subplot(3,1,3) py.plot(syg_poprawiony,'r') # sygnał oczyszczony na tle sygnału zaburzonego py.plot(zaszum_sygnal,'g') py.show() Pytania Czy jest związek między stanem wag i oczyszczaniem sygnału? O czym on świadczy? Dodaj do symulacji zmianę zaburzenia sygnału, np. w połowie symulacji niech dwukrotnie wzrośnie udział echa. Czy układ podąża za zmianą? Spróbuj w punkcie 2 głównej pętli zamienić pożądaną wartość z aktualnej wartości zniekształconego szumu na aktualną wartość sygnału zaburzonego. Czy sieć nadal jest w stanie odfiltrować zaburzenia? Jeśli tak to dlaczego?