X - Paweł Tomaszewicz
Transkrypt
X - Paweł Tomaszewicz
Warszawa, dn. 1 czerwca 2005r. Wojciech Klepacki Michał Kubiak Grzegorz Tyszka Łukasz Zgierski Opiekun: dr inż. Paweł Tomaszewicz UKŁADY CYFROWE dokumentacja projektu IDENTYFIKACJA UŻYTKOWNIKA NA PODSTAWIE GŁOSU Z UŻYCIEM WSPÓŁCZYNNIKÓW PREDYKCJI LINIOWEJ (LPC) Streszczenie W projekcie wykorzystujemy przydatność reprezentacji LPC sygnału mowy do rozpoznawania mówcy w oparciu o hasło, metodą klasyfikacji minimalnoodległościowej. Zaprojektowany układ operuje na próbkach mowy zapisanych w pliku wave poddanych uprzednio filtracji preemfazowej, oblicza współczynniki autokorelacji i predykcji liniowej, a następnie na ich podstawie dokonuje klasyfikacji i ewentualnego przyporządkowania testowej próbki konkretnemu użytkownikowi zarejestrowanemu w systemie. 1. Wstęp Zagadnienia rozpoznawania w stosunku do mowy dzielą się na dwie kategorie. Pierwsza dotyczy rozpoznawania mówcy (speaker identification, speaker verification), natomiast druga - rozpoznawania mowy (speech recognition). Są to zupełnie różne kategorie zadań. W zadaniach weryfikacji i identyfikacji mówcy rozpoznawany jest głos konkretnej osoby, najlepiej w sytuacji wypowiadania dowolnych słów lub na podstawie mowy ciągłej. W zadaniu rozpoznawania mowy dąży się do tego, aby uniezależnić się od mówcy, a skupić się na rozpoznawaniu słów. Pomimo przeciwstawności tych zadań dostępna wiedza ogólna o sygnale mowy pozwala często na stosowanie tych samych lub podobnych metod wyodrębnienia pożądanych parametrów w obydwu kategoriach. Liniowe kodowanie predykcyjne jest często wykorzystywanym narzędziem do opisu cech sygnału mowy ze względu na stosunkowo szybki sposób ich wyznaczania, a przede wszystkim na małą liczbę współczynników potrzebną do opisu tego typu sygnału (do dobrego opisu wystarcza 12 współczynników – taką też ilość założyliśmy w naszym projekcie). Istnieją rozmaite metody modelowania sygnału mowy przy użyciu LPC. Można wśród nich wymienić takie jak: kwantyzacja wektorowa (Vector Quantization – VQ), analiza przebiegu czasowego (Dynamic Time Warping – DTW), analiza współczynników cepstralnych, a także modelowanie stochastyczne z użyciem liniowej kombinacji rozkładów normalnych (Gaussian Mixture Model – GMM) i ukrytych modeli Markowa (Hidden Markov Model – HMM). Coraz powszechniejsze stają się obecnie algorytmy rozpoznawania mówcy stworzone na bazie sztucznych sieci neuronowych (Artificial Neural Network – ANN). Większość z powyższych metod analizuje próbkę sygnału mowy okienkując ją przesuwającymi się oknami (zazwyczaj Hamminga) o długości 20-30ms, a następnie budują matematyczny model danego mówcy w oparciu o jego najbardziej charakterystyczne cechy. W pierwszej fazie pracy nad projektem powstała konieczność wyboru odpowiedniej metody. Głównym zagadnieniem było zapewnienie wystarczającej skuteczności idącej w parze ze stopniem skomplikowania algorytmu adekwatnym do możliwości czasowych i sprzętowych. Z powyższych powodów, jako punkt wyjścia potraktowaliśmy artykuł dr inż. Leszka Grada Badanie możliwości rozpoznawania mówcy na podstawie reprezentacji LPC sygnału mowy opublikowany w Biuletynie Instytutu Automatyki i Robotyki WAT (nr 13/2000). Jest tam zawarty opis eksperymentu potwierdzającego użyteczność liczenia współczynników LPC z całej badanej próbki sygnału mowy (bez konieczności okienkowania) do rozpoznawania mówcy. Model mówcy tworzony jest poprzez zwykłe uśrednienie współczynników z kolejnych realizacji nagrania tego samego słowa, a decyzja podejmowana jest przy użyciu klasyfikatora minimalnoodległościowego. Przeprowadzenie odpowiednich symulacji w programie MATLAB potwierdziło skuteczność powyższej metody. Nasze zadanie sprowadziło się więc do problemów związanych ze sprzętową realizacją algorytmu, a wśród nich: • • • • • ustalenia sposobu przesyłania próbek sygnału do płytki laboratoryjnej (niemożność przesłania całego sygnału za jednym razem z powodu ograniczeń pamięci w układach FLEX10k), zaprojektowania automatu liczącego autokorelację za pomocą sum cząstkowych, zaprojektowania automatu realizującego rekursywny algorytm Durbina-Levinsona do liczenia współczynników LPC, zaprojektowania klasyfikatora minimalnoodległościowego (automat decyzyjny), przyjęcia najodpowiedniejszej reprezentacji liczb i opracowania dla nich operacji arytmetycznych (przejście z formatu zmiennoprzecinkowego na stałoprzecinkowy przy zachowaniu wystarczającej dokładności). Sposoby rozwiązań powyższych problemów wraz ze sposobem implementacji poszczególnych modułów projektu postaramy się omówić w dalszej części dokumentacji. 2. Krótkie omówienie istoty LPC (Linear Predictive Coding) Współczynniki predykcji liniowej są bardzo powszechnym opisem sygnału mowy stosowanym do jego kompresji. Wynika to z faktu, że niewielka liczba współczynników jest w stanie opisać z wystarczającą dokładnością ten rodzaj sygnału, co z kolei jest wynikiem tego, iż sygnał mowy charakteryzuje się dość dużą redundancją. Znaczy to w tym przypadku, że na podstawie przebiegu poprzednich próbek sygnału jesteśmy w stanie z dużym prawdopodobieństwem przewidzieć kolejną. Pojęcie współczynników predykcji zawdzięczamy odpowiedniemu podejściu do matematycznego modelowania ludzkiego traktu głosowego. Upraszczając nieco ów model możemy powiedzieć, że sygnał mowy generowany jest przez struny głosowe i trakt głosowy człowieka. Możemy wyróżnić jeden z dwóch stanów, w jakich znajdują się struny głosowe: • rytmicznie i energicznie rozchylają się na całej długości, okresowo pobudzając trakt głosowy silnymi impulsami powietrza z płuc • są na całej długości otwarte, wpuszczając do traktu głosowego równomierny strumień powietrza. Pierwszy przypadek dotyczy głosek dźwięcznych, kiedy w bardzo krótkich chwilach czasowych pobudzenie generowane przez struny głosowe możemy traktować jako oscylacyjne. Przypadek drugi modeluje się pobudzeniem losowym – szumem. Dalsze kształtowanie mowy ma miejsce w trakcie głosowym, który z sygnałowego punktu widzenia można traktować jako filtr IIR o pewnej transmitancji H(z). Ta właśnie transmitancja jest cechą osobniczą każdego mówcy. Analogicznie, budowa traktu głosowego jest odmienna i niepowtarzalna u poszczególnych ludzi. Współczynniki LPC są właśnie współczynnikami takiego filtra IIR, zatem na ich podstawie można identyfikować konkretnego mówcę. Mowa dźwięczna Pobudzenie okresowe Filtr traktu głosowego Pobudzenie losowe H ( z) = 1 1+ a1 z −1 + a 2 z − 2 + ... + a 12 z − 12 Mowa bezdźwięczna Współczynniki LPC Rys.1 Model generacji sygnału mowy mowa 3. Opis wykorzystanej przez nas metody rozpoznawania mówcy Metoda identyfikacji użytkownika bazuje na przetwarzaniu sygnału zastosowanym we wspomnianym wcześniej eksperymencie przeprowadzonym na WAT. Celem doświadczenia było otrzymanie odpowiedzi na pytanie, czy LPC zastosowane do całej próbki sygnału mowy daje wystarczający opis, aby można było na jego podstawie identyfikować mówcę. Proces rozpoznawania przeprowadzamy mając do dyspozycji wstępnie obrobione pliki wave (bez kompresji) zapisane z dokładnością 8 bitów na próbkę oraz częstotliwości próbkowania 8kHz. Przez wstępną obróbkę rozumiemy odszumienie i normalizację próbki (przeprowadzone za pomocą programu Cool Edit Pro), a następnie poddanie jej wstępnej filtracji preemfazowej (niewielkiemu uwydatnieniu wyższych częstotliwości) za pomocą filtru FIR o transmitancji H ( z ) = 1 − 0.9375z −1 (za pomocą programu MATLAB). Wszystkie nagrywane osoby mówiły ten sam tekst, aby mieć pewność, iż decyzja algorytmu zależy przede wszystkim od mówcy, a nie od wypowiadanego tekstu. Arbitralnie dobraną sekwencją mówioną było pojedyncze słowo „metoda” nagrywane ośmiokrotnie dla jednej osoby. Z tak przygotowanego pliku dźwiękowego policzonych zostało 13 współczynników autokorelacji, a następnie rekursywnym algorytmem Durbina-Levinsona wyliczyliśmy 12 współczynników LPC. Załóżmy, że poniższe wyrażenie opisuje pojedynczy wektor współczynników LPC wypowiedzi osoby X: a(1) a(2) aX = a(3) ... a( p) (1) gdzie p=12 i oznacza ilość współczynników predykcji. Następna równość będzie definiowała macierz utworzoną z powyższych wektorów obliczonych z n=8 powtórzeń hasła przez osobę X: A X [ = a 1X a 2X ... a nX ] (2) czyli: AX A X (1,1) X A ( 2 ,1) = ... X A ( p ,1) A X (1, 2 ) ... A X ( 2,2 ) ... X A ( p ,2 ) ... ... ... A X (1, n ) A X (2, n ) ... X A ( p , n ) (3) Policzmy teraz wektor wartości średnich współczynników jako uśrednienie wierszy macierzy: a X (i ) = n 1 n ∑ j =1 A X (i, j ) i = 1 , 2 ,..., p (4) Wyznaczymy teraz odchylenia dla powtórzeń hasła wypowiadanych przez inne osoby od powyższego uśrednionego wektora osoby X: i = 1 , 2 ,..., ∆YX (i ) = a Y (i ) − a X (i ) (5) p Decyzję podejmujemy na podstawie wyboru wektora użytkownika zarejestrowanego, którego odległość od wektora testowanego jest najmniejsza. Odległość tę wyznaczamy sumując odległości, jak poniżej: ∆ YX = p ∑ j =1 ∆ YX ( i ) (6) Wszystkie powyższe przekształcenia zostały przez nas przesymulowane w pakiecie MATLAB i dały tam pomyślny rezultat. Na podstawie samych współczynników LPC i powyższych przekształceń byliśmy w stanie określić z dużą skutecznością, kto jest mówcą. 4. Wyniki symulacji w programie MATLAB Jako wynik symulacji przedstawimy graficznie wyniki porównań dwu wybranych osób, które ten sam tekst nagrywały w tych samych warunkach. Dla każdej z tych osób zostały przeprowadzone obliczenia opisane w poprzednim punkcie. Każda pojedyncza linia wykresu ilustruje pojedynczą realizację wypowiedzi słowa „metoda”. Kolor linii jest przypisany do jednego z użytkowników: czerwony — użytkownik X, zielony — użytkownik Y. 0.35 odleglosc od uzytkownika X 0.3 0.25 0.2 0.15 0.1 0.05 0 0 2 4 6 8 10 numer wspolczynnika LPC 12 14 Powyższy wykres ilustruje porównanie dwóch użytkowników względem użytkownika „czerwonego”. Właśnie czerwony wykres przedstawia odległości opisane wzorem (5) współczynników właściwego użytkownika od jego uśrednionego wektora LPC. opisane wzorem (5). Zielony wykres przedstawia natomiast odległości użytkownika Y (innego) od użytkownika X. Łatwo zauważyć, iż „zielone” odległości są znacznie większe, co wskazywałoby na fakt, że to właśnie użytkownik X jest tym właściwym. Decyzja zatem wypadłaby poprawnie. Jak widać poniżej, decyzja przebiegałaby poprawnie również w drugą stronę, tzn. nawet wtedy, gdy użytkownikiem, dla którego uśrednilibyśmy współczynniki byłby użytkownik Y. 0.35 odleglosc od uzytkownika Y 0.3 0.25 0.2 0.15 0.1 0.05 0 0 2 4 6 8 10 numer wspolczynnika LPC 12 14 Skuteczność metody widać nawet, gdy do porównań weźmiemy próbki, które nie były uprzednio wykorzystywane do liczenia średniej: 0.4 odleglosc od uzytkownika X 0.35 0.3 0.25 0.2 0.15 0.1 0.05 0 0 2 4 6 8 10 numer wspolczynnika LPC 12 14 I analogicznie, gdy mierzymy odległości od użytkownika Y: 0.35 uzytkownik X uzytkownik y odleglosc od uzytkownika Y 0.3 0.25 0.2 0.15 0.1 0.05 0 0 2 4 6 8 10 numer wspolczynnika LPC 12 14 Chociaż w tym przypadku nie ma aż tak znaczących różnic w porównaniach, to jednak przy zsumowaniu wszystkich delt, wartości wyrażenia (6) są właściwe. ∆ Y Y ∆ Y X = 1 . 529 = 1 . 6284 Podobne wyniki otrzymaliśmy symulując skuteczność metody dla pozostałych dwóch osób i wynik w większości prób okazał się pomyślny. Na podstawie powyższych obliczeń uznaliśmy metodę za najbardziej odpowiednią do sprzętowej implementacji (mieliśmy na względzie dużą skuteczność a zarazem względną prostotę rozwiązania). W tym momencie głównym założeniem projektowym stało się dla nas powtórzenie skuteczności metody w implementacji sprzętowej — zaczęliśmy dążyć do tego, aby powtórzyć wyniki symulacji w programie MATLAB. ZAGADNIENIA ZWIĄZANE ZE SPRZĘTOWĄ IMPLEMENTACJĄ OPISANEJ METODY 5. Ogólna budowa układu Zaprojektowany przez nas układ spełnia dokładnie funkcjonalność wcześniej opisanej metody, zatem składa się z odpowiednich modułów odpowiedzialnych przede wszystkim za obliczenie współczynników LPC, a następnie podjęcie decyzji w stosunku do mówcy. Urządzenie składa się z następujących modułów: • automatu głównego, zarządzającego pracą poszczególnych automatów, • automatu odbiorczego – pobierającego dane wysyłane z komputera poprzez port USB, a następnie wypełniającego pamięć RAM otrzymanymi danymi (do tego i poprzedniego automatu posłużył nam za punkt wyjścia program EchoRAM napisany przez dr inż. M. Rawskiego), • automatu realizującego obliczenie funkcji autokorelacji, • automatu realizującego algorytm Durbina-Levinsona, obliczający współczynniki LPC, • automatu podejmującego decyzję na podstawie klasyfikacji minimalnoodległościowej, • pamięci RAM przechowującej części wczytanej próbki, współczynniki autokorelacji i współczynniki LPC, • pamięci ROM, w której znajdują się wzorcowe próbki poszczególnych użytkowników. Decyzja o wyborze konkretnego użytkownika zostaje zwrócona poprzez wyświetlenie się na wyświetlaczu odpowiedniej cyfry przypisanej danemu mówcy. dane[7..0] automat odbiorczy RAM z próbkami automat autokorelacji RAM ze współczynnika mi autokorelacji automat LPC RAM ze współczynnika mi LPC automat sterujący ROM ze wzorcami automat decyzyjny decyzja[1..0] 6. Opis automatu liczącego funkcję autokorelacji Automat autokorelacji (Moore’a) realizuje algorytm liczący wartość poniższego wyrażenia mając do dyspozycji całą próbkę sygnału mowy: r (k ) = N − 1 ∑ s (n )s (n + k ), (7) n = 0 k = 0 , 1 , 2 ,..., Do liczenia tej funkcji zakładamy stałą długość próbki dźwiękowej, która wynosi 1s (rozmiar 1 kB). W razie zbyt krótkiej sekwencji, pozostałym próbkom przypisywana jest już po części softwarowej wartość 0. I podobnie, jeśli plik jest za duży, zostaje „przycięty” do 1kB. Ze względu na niewystarczający rozmiar pamięci w układzie FPGA, zaistniała konieczność porcjowania danych. Z tego faktu wynika, iż nie możemy policzyć autokorelacji od razu z całej próbki. W tym celu należało rozbić tę sumę na kilka sum częściowych i liczyć funkcję autokorelacji osobno dla każdej z nich. Obliczone współczynniki są aktualizowane po obliczeniu każdej następnej sumy częściowej. Ponadto trzeba było za każdym razem przesyłać o 13 próbek więcej w każdej paczce, aby nie wyjść poza zakres sumowania, co powodowałoby błędne wyniki. Automat pracuje na porcjach próbek zapisanych wcześniej w pamięci RAM przez automat odbiorczy. Rozmiar RAMu – 256 bajtów, a każda próbka zajmuje 1 bajt. Współczynniki autokorelacji reprezentowane są na 32 bitach i zapisywane w pamięci RAM. Liczonych jest 13 współczynników, zatem do policzenia każdej sumy cząstkowej należy przesłać 13 bajtów nadmiarowych. W przypadku wcześniejszego skończenia się danych, automat i tak odbierze zera, które zerując kolejne iloczyny, nie spowodują błędnego wyniku. 7. Automat obliczający współczynniki LPC Na wstępie opisu metody zastosowanej do obliczania LPC, warto podać zależność wiążącą te współczynniki ze współczynnikami autokorelacji: r (0) r (1) M r ( p − 1) r (1) r (0) L L M O r ( p − 2) L r ( p − 1) a1 r (1) a r (2) r ( p − 2) 2 , ⋅ = − M M M r ( 0 ) a p r ( p ) macierz współczynników autokorelacji wektor ze współczynnikami LPC Ra = − r wektor ze współczynnikami autokorelacji Obliczenie współczynników LPC według powyższego wzoru jest możliwe, aczkolwiek wiąże się z rozwiązaniem równania macierzowego i wymaga odwracania macierzy. Jest to zabieg bardzo mało wydajny i nieodpowiedni do sprzętowej implementacji. Wydajnym algorytmem, który pozwala uniknąć procesu odwracania macierzy jest iteracyjny algorytm Durbina-Levinsona, stosowany w koderach mowy czasu rzeczywistego. Szczegółowy opis algorytmu (z którego korzystaliśmy) można znaleźć w książce Tomasza Zielińskiego Od teorii do cyfrowego przetwarzania sygnałów. Przedstawimy tu tylko poszczególne kroki algorytmu: E 0 = r0 Dla i = 1,2,3,...,p: 1. 2. • γi = ri + a(i−1)2ri−1 + a(i−1)2ri−2 +K+ a(i−1)(i−1) r1 Ei−1 • a ii = − γ • dla j = 1,2,3,... ,i-1: i ( ) Ei = 1−γ i2 Ei−1 a ij = a ( i −1) j − γ i a ( i −1)( i − j ) Algorytm Durbina-Levinsona jest realizowany za pomocą automatu Moore’a. Automat ten pracuje na dwóch pamięciach RAM., z których pierwsza, w której zostały zapisane próbki autokorelacji, jest używana tylko do odczytu. Kolejna stanowi akumulator, gdzie gromadzone są wyliczone współczynniki predykcji. Odczyt z RAMu „LPC” jest także wykonywany przez opisywany automat, gdyż wyliczone dotychczas współczynniki są aktualizowane w każdej iteracji. Implementacja całego algorytmu pracuje na liczbach stałoprzecinkowych reprezentowanych na 32 bitach (1 bit znaku + 15 bitów części całkowitej + 16 bitów części ułamkowej). Na tylu bitach zapisywane są zarówno dane wejściowe (współczynniki autokorelacji), jak i wyjściowe. Dzięki przyjęciu stałej 32 bitowej reprezentacji możliwe stało się wykorzystanie prostych i szybkich modułów mnożących i dzielących, pracujących na zwykłych liczbach całkowitych. Z opisanej reprezentacji wynika, iż wartości autokorelacji (które są w rzeczywistości zawsze całkowite), są „widziane” przez automat LPC jako ułamki. Nie stanowi to jednak problemu, gdyż odpowiada to w istocie podzieleniu wszystkich tych współczynników przez stałą, co zmienia wynik LPC w sposób nieliniowy, jednak nie ma wpływu na decyzję – dla dwóch różnych mówców obliczone w ten sposób współczynniki będą nadal się różnić. 8. Automat decyzyjny Jako układ decyzyjny wykorzystujemy nieco uproszczoną wersję klasyfikatora minimalnoodległościowego. Uproszczenie polega na tym, że nie badamy różnicy w sensie odległości Euklidesowej dwóch wektorów w przestrzeni p-wymiarowej, ale po prostu sumujemy moduły różnic poszczególnych współrzędnych, zgodnie ze wzorem (6). Decyzja na podstawie tego właśnie wyrażenia okazała się podczas symulacji wystarczająca, a ponadto nie wymuszało to konieczności podnoszenia różnic do kwadratu. Automat wykonuje wyrażenie (6) dla wszystkich wektorów zapisanych w pamięci ROM układu porównując każdy z nich z wektorem aktualnie badanym. Jako decyzja, wskazywany jest użytkownik zarejestrowany w systemie, którego wektor okazał się najbliższy wektorowi testowanemu. 9. Opis przyjętej reprezentacji liczb Specyfika algorytmu wymagała przyjęcia odpowiedniej reprezentacji liczb — takiej, aby za jej pomocą dało się w prosty i dokładny sposób przedstawić ułamki ze znakiem, a ponadto zaimplementować mało skomplikowane dzielenie i mnożenie bez utraty zbyt dużej ilości informacji. Reprezentacją która spełniła te kryteria, okazał się zapis liczb ułamkowych na 32 bitach (znakowany format 16.16). Jak już wcześniej wspomnieliśmy, 16 bitów zajmuje część ułamkowa, 15 bitów – część całkowita + 1 bit znaku. Do zakodowania liczb ujemnych użyliśmy kodu U2, który jest w pełni funkcjonalny nawet przy tym zapisie liczb. Dziesiętnie nasza reprezentacja jest właściwie przeskalowaniem ułamka przez czynnik 2^16. Dla wygody pracy z algorytmem, ważne było, aby liczby po wykonaniu nań operacji mnożenia lub też dzielenia pozostawały w tej samej reprezentacji. Największy problem powstał przy dzieleniu, ponieważ wykorzystując samo dzielenie całkowite, dostawaliśmy zerowy wynik w przypadku dzielenia mniejszej liczby przez większą. a) mnożenie Przy mnożeniu czynimy założenie, że iloczyn nie przekroczy maksymalnej liczby dającej zapisać się w znakowanym formacie 16.16. Stąd wykorzystując układ wykonujący mnożenie całkowite dało się zaimplementować mnożenie przebiegające według poniższego schematu: 0 31 część całkowita mnożna część ułamkowa 0 31 część całkowita 63 część odrzucana mnożnik część ułamkowa 32 część całkowita 0 31 część ułamkowa część odrzucana iloczyn b) dzielenie W celu zapewnienia poprawnego wyniku dzielenia dla ułamków, przy jednoczesnym wykorzystaniu algorytmu dzielenia całkowitego stosujemy operację przesunięcia bitów dzielnej w lewo o 16 pozycji (przy jednoczesnym wypełnieniu pozostałych pozycji zerami), a następnie wykonania zwykłego dzielenia liczb całkowitych. 32 0 31 część całkowita część ułamkowa wypełnienie zerami dzielna 0 31 część całkowita dzielnik część ułamkowa 0 31 część całkowita iloraz część ułamkowa Dodawanie i odejmowanie liczb w opisanej reprezentacji przebiega analogicznie do liczb całkowitych, zatem wykorzystujemy do ich realizacji zwykłe sumatory. Opisane przedstawienie liczb pozwala na opisanie ułamków z dokładnością (rozdzielczością) 2^(-16). Podsumowując, reprezentacje wszystkich używanych danych możemy przedstawić w tabeli: rodzaj danych próbka sygnału rozmiar reprezentacja znak 8 bitów całkowite dodatnie nie współczynnik autokorelacji 32 bity 16.16 tak współczynnik LPC decyzja 32 bity 16.16 tak 2 bity całkowite nie 10. Wyniki i opis symulacji w Waveform Editor programu Quartus II Po zakodowaniu każdego z modułów w języku AHDL, dokonaliśmy symulacji. Każdy moduł był testowany oddzielnie, jak również we współpracy z innymi modułami. Implementacje algorytmów były testowane na przykładowych danych. Analizując przebieg działania tego algorytmu zwracaliśmy uwagę, czy automat zwraca poprawne wyniki pośrednie, czy dobrze wypełnia pamięć RAM, czy rejestry posiadają prawidłową zawartość, a przede wszystkim sprawdzaliśmy, czy automat znajduje się w ściśle zdeterminowanym i założonym przez nas stanie. Całe projektowanie automatów także wykonywaliśmy w oparciu o wyniki symulacji w Waveform Editor. Wpierw rysowaliśmy sam graf stanów automatu, kodowaliśmy jego przejścia w AHDL (bez dodawania jakichkolwiek instrukcji) i dopiero na samym końcu uzupełnialiśmy go o układy arytmetyczne, pamięci i inne bardziej skomplikowane instrukcje. Niekiedy powstawała konieczność dodania dodatkowych stanów, które umożliwiały wykonanie złożonych operacji (np. zapis lub odczyt z RAMu). Symulacje pozwoliły nam także na dobór optymalnych elementów i ich parametrów. Dobrym przykładem jest tu pamięć RAM, której wejście danych oraz wejście adresowe zdecydowaliśmy się synchronizować zegarem. Wszystkie symulacje przeprowadzone w programie Quartus II wypadły pomyślnie. Algorytmy dawały poprawny wynik a wszystkie dołączone elementy i urządzenia (pamięci, rejestry itd.) były obsługiwane poprawnie. Pomyślnie wypadła także symulacja działania głównego automatu – napisane przez nas moduły na symulacji właściwie współpracowały z automatem odbierającym dane, którego kod omawiany był na wykładzie. 11. Omówienie części softwarowej projektu Jednym z założeń projektu jest to, iż plik dźwiękowy, który poddajemy weryfikacji jest już wstępnie przetworzony (poddany odpowiednim filtracjom itp.). Stąd część softwarowa w naszym projekcie ogranicza się właściwie tylko do przesłania w odpowiedni sposób danych do płytki laboratoryjnej. Także w tej kwestii przyszedł nam z pomocą prezentowany na wykładzie program EchoRAM dr M. Rawskiego, w którym dokonaliśmy kilku drobnych modyfikacji mających na celu dostosowanie przesyłania danych do założeń naszego projektu. Polegały one głównie na przyjęciu stałej długości pliku (zatem stałej liczby bloków wysyłanych), a także na wyłączeniu kodu odpowiadającego za odbiór danych z płytki (nie transmitujemy nic z powrotem do komputera). Ważny element części softwarowej to także kod odpowiedzialny za ucięcie nagłówka pliku wave i taki sposób przesyłania danych, aby automat autokorelacji mógł poprawnie policzyć wszystkie sumy cząstkowe. Jest to realizowane poprzez przesyłanie za każdym razem o 13 bitów więcej (chodzi o to, aby nie wyjść poza zakres sumowania). 12. Podsumowanie, problemy wynikłe w trakcie prac i przyczyny niepowodzenia. Mimo starań, konsultacji i ilości czasu jaki poświęciliśmy na określenie stopnia trudności projektu (i w efekcie stwierdzenia czy jesteśmy w stanie go zrealizować) oraz określenie potencjalnych trudności - nie byliśmy w stanie przewidzieć prawdziwego stopnia trudności projektu. Wspomniane problemy z ograniczeniem pamięci na układach FLEX10k można było (przynajmniej teoretycznie) dość łatwo rozwiązać przez podział danych na pakiety, konieczność zastosowania nowej reprezentacji dla liczb i arytmetyki dla tej reprezentacji kosztowała nieco wysiłku ale rozwiązanie sprowadzało się do wykorzystania najprostszych możliwości języka AHDL, oprócz wymienionych wyżej problemów, rozwiązaliśmy wiele mniejszych i mniej znaczących. Największym problemem okazało się podstawowe założenie – zmodyfikowania automatu OpRAM dr Rawskiego i wykorzystania go jako szkieletu i podstawy dla naszego projektu. Niestety, w trakcie symulacji, odpowiednia częstotliwość działania naszych modułów, określona na około 2,7 MHz okazała się kompletnie niewłaściwa i uniemożliwiała poprawne działanie automatu OpRAM. Podjęliśmy próby rozwiązania tego problemu poprzez stworzenie dzielnikowanych zegarów, dla odpowiednich grup automatów (jedna grupa dla automatu mainAut, rcvAut i trsAut o częstotliwości 25 MHz czyli dwukrotnie podzielony zegar na płytce; druga grupa – przewidziana dla stworzonych przez nas modułów miała być taktowana zegarem nie szybszym niż 2,7 Mhz), dbając o odpowiedni czas trwania sygnałów startujących odpowiednie automaty oraz o taktowanie pamięci RAM i liczników adresowych odpowiednimi zegarami. Mimo 10 dni spędzonych w laboratorium nie udało nam się przygotować głównego automatu do połączenia z przygotowanymi przez nas modułami i ostatecznego ukończenia pracy. Głównym powodem niepowodzenia w laboratorium, podczas pracy z płytką były rozbieżności w wynikach symulacji (przeprowadzanej przy kilkakrotnym sprawdzeniu ustawień) i działaniu płytki. Nie byliśmy w stanie wytłumaczyć działania zakodowanej płytki i określić źródeł rozbieżności pomiędzy teoretycznymi wynikami i praktycznymi próbami. Konkluzja Podsumowując prace nad projektem, możemy stwierdzić, iż mimo ostatecznego efektu, nie uważamy semestru spędzonego z Układami Cyfrowymi za stracony – przedmiot i wybrany przez nas projekt pozwolił nam na poznanie zasad projektowania i kodowania układów cyfrowych, sposobów rozwiązywania najczęstszych problemów oraz metod analizy mowy. Zdobyta wiedza z pewnością okaże się użyteczna w przyszłości. Pewien niedosyt pozostawia jedynie fakt, że na jedynym przedmiocie, na którym istniała możliwość stworzenia niemal od podstaw projektu działającego w rzeczywistości (co daje miłą odskocznię po czystym programowaniu) nie udało nam się wyjść poza sferę projektowania i symulacji. Bibliografia [1] [2] [3] [4] [5] [6] [7] prof. Tadeusz Łuba, dr Mariusz Rawski, dr Paweł Tomaszewicz i dr Bogdan Zwierzchowski: Synteza Układów Cyfrowych, WKiŁ Warszawa 2003. artykuł dr inż. Leszka Grada Badanie możliwości rozpoznawania mówcy na podstawie reprezentacji LPC sygnału mowy opublikowany w Biuletynie Instytutu Automatyki i Robotyki WAT (nr 13/2000). Tomasz Zieliński: Od teorii do cyfrowego przetwarzania sygnałów, Wydz. Elektrotechniki, Automatyki, Informatyki i Elektroniki AGH, Kraków 2002. prof. dr hab. inż. Ryszard Tadeusiewicz: Sygnał Mowy, WKiŁ Warszawa 1988. J. Żurada, M. Barski, W. Jędruch: Sztuczne sieci neuronowe, Wydawnictwo Naukowe PWN Warszawa 1996. Richard G. Lyons: Wprowadzenie do cyfrowego przetwarzania sygnałów, WKiŁ Warszawa 2003. Bogumiła Mrozek, Zbigniew Mrozek: MATLAB i Simulink. Poradnik użytkownika, Helion 2004. Materiały znalezione na stronach WWW załączamy w katalogu z dokumentacją.