Zapisz jako PDF
Transkrypt
Zapisz jako PDF
Spis treści 1 Wstęp 2 Opis plików dekompozycji 2.1 Matching Pursuit 2.2 Mapy czas–częstość 3 Opis pliku .b 3.1 Początek 3.2 Nagłówek 3.3 Dane 3.4 Podsumowanie 4 Wskazówki 4.1 Rysowanie atomów 4.2 Wyliczanie mapy czas-częstość 5 Przykładowe pliki Wstęp Projekt będzie polegać na napisaniu programu, który wczyta pliki generowane przez dekompozycję Matching Pursuit i następnie narysuje mapę czas-częstość danego sygnału oraz sam sygnał. Efekt powinien wyglądać mniej-więcej jak na rysunku %i 1. Przykładowe pliki po dekompozycji są zalinkowane na końcu. Pytania proszę kierować na adres Piotra Milanowskiego lub z zapytaniem przyjść na zajęcia/konsultacje. UWAGA!!!! Poniżej przedstawione są poprawki do projektu: W sekcji nagłówka: po identyfikatorze nagłówka i rozmiarze nagłówka, jest odpowiedni identyfikator pola nagłówka (adres, data, informacja o sygnale i dekompozycji) a następnie rozmiar pola W FORMACIE uchar (1 bajt) (a nie jak w zadaniu projektu uint32). Rozmiar ten dotyczy tylko pól adres i data; pola informacja o sygnale i dekompozycji zajmują odpowiednio 10 i 13 bajtów (float32, float32, uint16 = 4+4+2 bajty i float32, float32, float32, char = 4+4+4+1 bajty) (Błąd dostrzeżony przez Wojciecha Raszkę) Nie wszystkie parametry atomów są przedstawione w jednostkach SI: pozycja w czasie i skala są zapisane w punktach (do sekund konwertujemy dzieląc przez częstość próbkowania) częstotliwość zapisana w formie znormalizowanej (do hertzów konwertujemy mnożąc przez częstość próbkowania i dzieląc przez 2π) amplituda zapisana jest w punktach (konwersja do mikrowoltów polega na podzieleniu przez liczbę punktów na mikrowolt) modulus i faza nie wymagają konwersji Plik 1351_raw_st4_106_5_book.b zawiera błędny nagłówek. Proszę testować na pliku 1351_raw_st4_11_17_book.b. Dane są zapisane w formacie BIG ENDIAN. Oznacza to, że korzystając z funkcji struct.unpack trzeba do napisu oznaczającego format danych dodać na początku symbol '>'. Na przykład chcąc przeformatować napis na floaty: struct.unpack(">f", napis) Implementacja delty diracka na mapie M(t,f) czas częstość to: np.ones(#rozdzielczosć w częstotliwości), gdzie to dane odczytane z pliku (modulus, amplituda, pozycja w czasie) Implementacja delty diracka na mapie M(t,f) czas częstość to: np.ones(#rozdzielczosć w czasie), gdzie to dane odczytane z pliku (modulus, amplituda, pozycja w częstości) Do narysowania atomu typu delta Diracka należy wszystkie odczytane parametry atomu wstawić do wzoru Gabora%i 1. Kilka z nich będzie 0, ale proszę się tym nie przejmować. Rozmiar atomu jest podany w formacie uchar Przykład działania programu. Górny rysunek to mapa czas-częstość sygnału widocznego na dolnym rysunku. Opis plików dekompozycji Matching Pursuit Sama metoda dekompozycji Matching Pursuit powinna być dobrze znana po zajęciach z Analizy Sygnałów; nie będzie więc tutaj omawiana w szczegółach. Wystarczające będzie przypomnienie, że sygnał dekomponowany jest na sumę funkcji Gabora, tj. na funkcje o wzorze: gdzie oznacza zbiór parametrów funkcji, odpowiednio: przesunięcia w czasie ( ), częstotliwości ( ), pewnej miary szerokości w czasie ( ) i fazy ( ). Parametr funkcję. normalizuje Mapy czas–częstość Mając sygnał w postaci sumy funkcji gabora, można przedstawić gestość jego energii w przestrzeni czas-częstość. Jeśli mamy sygnał w postaci: to gęstość energii wynosi: gdzie a to transformata Wigner-Villa: to pewien współczynnik i-tej funkcji gabora wyznaczony przy dekompozycji. Transformata Wigner-Villa funkcji Gabora wnosi: Opis pliku .b Wynik działania algorytmu MP zapisywany jest do plików z rozszerzeniem .b. Są to pliki binarne; każdy można podizelić na 3 części opisane poniżej. Początek Pierwsze 6 bajtów pliku to litery (w ASCII) oznaczające wersję programu dekomponującego. Następnie może być komentarz: kolejny bajt pliku to idetyfikator (uchar); jeśli wartość tego bajtu to 1, następne 4 bajty (uint32) to długość komentarza. Potem jest komentarz o zadanej długości. Nagłówek Następny bajt to kolejny identyfikator. Jeśli jego wartość wynosi 2, mamy do czynienia z nagłówkiem. Następne 4 bajty (uint32) określają rozmiar nagłówka (w bajtach). W sekcji nagłówka mogą być następujące pola, każde poprzedzone odpowiednim identyfikatorem (uchar) i rozmiarem pola (uint32): identyfikator 3: adres www - napis o zadanym rozmiarze identyfikator 4: data - napis o zadanym rozmiarze identyfikator 5: informacja o sygnale - kolejno częstość próbkowania (4 bajty - float32), liczba punktów na mikrowolt (4 bajty - float32), liczba kanałów (2 bajty - uint16) identyfikator 6: informacja o dekompozycji - kolejno wyjaśniony procent energii (4 bajty float32), maksymalna liczba iteracji (4 bajty - uint32), rozmiar słownika (4 bajty - uint32), typ słownika (1 bajt - char) Dane Identyfikator danych to 7. Następnie jest długość tego segmentu danych (uint32). Potem liczba określająca numer epoki i rozmiar epoki (odpowiednio uint16 i uint32). Teraz może być albo sygnał przed dekompozycją (identyfikator 8) albo atomy (identyfikator 9). W przypadku sygnału, po identyfikatorze jest rozmiar pola, a następnie numer kanału (uint16). Następnie jest sygnał zapisany w formacie float32 i ma rozmiar określony przez rozmiar epoki. W przypadku atomów, kolejnym bajtem po identyfikatorze i rozmiarze jest numer kanału (uint16) Następnie po kolei są atomy. Każdy zaczyna się od identyfikatora określającego typ atomu (dirac: 10, gauss: 11, sinus: 12, gabor: 13). Potem jest liczba (uchar) określająca rozmiar atomu. Następnie są parametry atomu, każdy w formacie float32: modulus (współczynnik przy dekompozycji %i 2), amplituda (współczynnik normujący w %i 3), pozycja w czasie, skala, pozycja w częstości i faza. Należy zauważyć, że w zależności od typu atomu, nie wszystkie parametry będą zapisane. Dla delty Diraca są tylko pierwsze trzy (modulus, amplituda, pozycja w czasie); dla funkcji Gaussa pierwsze cztery (modulus, amplituda, pozycja w czasie i skala); dla funcji sinus modulus, amplituda, pozycja w częstości i faza. Tylko dla funkcji Gabora zapisane są wszystkie parametry. Podsumowanie Podsumowując każdy segment informacji zaczyna się od identyfikatora i długości danego segmentu. Identyfikatory to: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Komentarz Nagłówek Adres www Data Informacje o sygnale Informacje o dekompozycji Dane Początkowy sygnał Atomy Delta Diraca Funkcja Gaussa Sinus 13. Funkcja Gabora Wskazówki Rysowanie atomów Na mapie czas-częstość funkcja delta Diraca to pionowa linia o stałym czasie i przebiegająca wszystkie częstości. Jej wartość to odczytana z pliku wartość modulus podniesiona do kwadratu razy amplituda podniesiona do kwadratu. Podobnie sinus: na mapie czas-częstość to pozioma linia o stałej częstotliwości i przebiegająca wszystkie czasy. Gausa można narysować korzystając z równania %i 3 przyjmując jako częstotliwość i fazę 0. Wyliczanie mapy czas-częstość Za pomocą równań %i 2 i %i 3 można wyznaczyć gęstość energii sygnału. Do wyznaczenia mapy pojedynczego atomu (korzystając z %i 3) można wykorzystać fakt, że mnoży się tu funkcję zależną tylko od czasu (nazwijmy ją ) przez funkcję zależną tylko od częstotliwości ( najpierw policzyć wartości funkcji ). Można więc dla zadanych chwil czasowych, następnie wartości funkcji dla zadanych częstotliwości i przemnożyć te dwa wektory albo korzystając z funkcji liczącej iloczyn zewnętrzny, albo korzystając z reguł broadcastingu numpy. Przykładowe pliki Plik:1351 raw st4 106 5 book.b Plik:1351 raw st4 11 17 book.b