Zadanie: Filtr adaptywny
Transkrypt
Zadanie: Filtr adaptywny
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?