<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl">
	<id>http://brain.fuw.edu.pl/edu/index.php?action=history&amp;feed=atom&amp;title=TI%2FZadanie_zaliczeniowe</id>
	<title>TI/Zadanie zaliczeniowe - Historia wersji</title>
	<link rel="self" type="application/atom+xml" href="http://brain.fuw.edu.pl/edu/index.php?action=history&amp;feed=atom&amp;title=TI%2FZadanie_zaliczeniowe"/>
	<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=TI/Zadanie_zaliczeniowe&amp;action=history"/>
	<updated>2026-05-03T19:47:34Z</updated>
	<subtitle>Historia wersji tej strony wiki</subtitle>
	<generator>MediaWiki 1.34.1</generator>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=TI/Zadanie_zaliczeniowe&amp;diff=1836&amp;oldid=prev</id>
		<title>Jarekz: Utworzono nową stronę &quot;==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...&quot;</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=TI/Zadanie_zaliczeniowe&amp;diff=1836&amp;oldid=prev"/>
		<updated>2015-05-23T10:56:13Z</updated>

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