Danych Meteorologicznych Sylwester Arabas (ćwiczenia do wykładu dra Krzysztofa Markowicza) Instytut Geofizyki, Wydział Fizyki Uniwersytetu Warszawskiego 18. stycznia 2010 r.
Zadanie 14.1 : polecenie znalezienie funkcji bazowych Daubechies 1 jednowymiarowej dyskretnej transformaty falkowej (dla kilku różnych rzędów: 4, 6, 8,... 20) wykreślenie wszystkich funkcji bazowych dla sygnału 16-elementowego sprawdzenie ortogonalności tej bazy sprawdzenie dwukierunkowości transformaty 1 Ingrid Daubechies żyjąca belgijska uczona, współtwórczyni analizy falkowej, wynalazczyni bazy ortogonalnych falek noszących jej nazwisko (1988) oraz współwynazalczyni biortogonalnych falek CDF będących podstawą algorytmu kompresji obrazów JPEG2000
Zadanie zad14 1.pro 1 pro zad14_1 2 3 n = 16 ; długość sygnalu / liczba falek 4 eps = 1e-6 ; epsilon 5!P.MULTI = [0, 4, n / 4] ; wiele wykresów na jednym arkuszu 6 7 for c = 4, 20, 2 do begin 8 print, strtrim(n, 2), '-elementowa baza Daubechies rzedu ', strtrim(c, 2) 9 for i = 0, n - 1 do begin 10 x1 = fltarr(n) & x1[i] = 1 ; utworzenie wektorów typu [0,0,0,0,1,0,0,0] 11 v1 = wtn(x1, c, /inverse) ; wektor współczynników rozkładu -> sygnał 12 plot, v1 ; wykres 13 v1inv = wtn(v1, c) ; sygnał -> wektor współczynników rozkładu 14 wh = where(abs(v1inv) lt eps, cnt) 15 if cnt gt 0 then v1inv[wh] = 0 ; sprawdzamy z dokładnością do epsilon 16 wh = where(abs(v1inv) gt 1 - eps, cnt) 17 if cnt gt 0 then v1inv[wh] = 1 ; sprawdzamy z dokładnością do epsilon 18 if ~array_equal(x1, v1inv) then message, 'x!= wtn(wtn(x), /inv)!!!' 19 for j = 0, n - 1 do begin ; sprawdzanie ortogonalności 20 x2 = fltarr(n) & x2[j] = 1 ; utworzenie wektorów typu [0,0,0,0,1,0,0,0] 21 v2 = wtn(x2, c, /inverse) ; wektor współczynników rozkładu -> sygnał 22 v1v2 = total(v1 * v2) ; iloczyn skalarny 23 if i eq j and v1v2 lt 1 - eps then message, 'i eq j and v1v2 < 1 - eps!!!' 24 if i ne j and v1v2 gt 0 + eps then message, 'i ne j and v1v2 > 0 + eps!!!' 25 endfor ; j 26 endfor ; i 27 tmp = '' & read, tmp, prompt='naciśnij ENTER, żeby kontynuować...' 28 endfor ; c 29 30 end ; pro
Zadanie
Zadanie znalezienie funkcji bazowych Daubechies dwuwymiarowej dyskretnej transformaty falkowej (dla kilku różnych rzędów: 4, 6, 8,... 20) wykreślenie wszystkich funkcji bazowych dla sygnału (obrazu) 8x8-elementowego sprawdzenie ortogonalności tej bazy sprawdzenie dwukierunkowości transformaty
Zadanie zad14 2.pro 1 pro zad14_2 2 3 n = 8 ; długość (sygnał n x n) 4 eps = 1e-6 ; epsilon 5!P.MULTI = [0, n, n] ; wiele wykresów na jednym arkuszu 6 7 for c = 4, 20, 2 do begin 8 print, strtrim(n*n, 2), '-elementowa baza Daubechies (2D) rzedu ', strtrim(c, 2) 9 for i = 0, n * n - 1 do begin 10 x1 = fltarr(n,n) & x1[i] = 1 ; utworzenie wektorów typu [0,0,0,0,1,0,0,0] 11 v1 = wtn(x1, c, /inverse) ; wektor współczynników rozkładu -> sygnał (obraz) 12 surface, v1 ; wykres,,powierzchniowy'' 13 v1inv = wtn(v1, c) ; sygnał (obraz) -> wektor współczynników rozkładu 14 wh = where(abs(v1inv) lt eps, cnt) 15 if cnt gt 0 then v1inv[wh] = 0 ; sprawdzamy z dokładnością do epsilon 16 wh = where(abs(v1inv) gt 1 - eps, cnt) 17 if cnt gt 0 then v1inv[wh] = 1 ; sprawdzamy z dokładnością do epsilon 18 if ~array_equal(x1, v1inv) then message, 'x!= wtn(wtn(x), /inv)!!!' 19 for j = 0, n * n - 1 do begin ; sprawdzanie ortogonalności 20 x2 = fltarr(n,n) & x2[j] = 1 ; utworzenie wektorów typu [0,0,0,0,1,0,0,0] 21 v2 = wtn(x2, c, /inverse) ; wektor współczynników rozkładu -> sygnał (obraz) 22 v1v2 = total(v1 * v2) ; iloczyn skalarny 23 if i eq j and v1v2 lt 1 - eps then message, 'i eq j and v1v2 < 1 - eps!!!' 24 if i ne j and v1v2 gt 0 + eps then message, 'i ne j and v1v2 > 0 + eps!!!' 25 endfor ; j 26 endfor ; i 27 tmp = '' & read, tmp, prompt='naciśnij ENTER, żeby kontynuować...' 28 endfor ; c 29 30 end ; pro
Zadanie
Zadanie Skompresowanie obrazów radarowych z zadania 12.1 poprzez rozkład w bazie falek ortogonalnych Daubechies i obciecie rozkładu przy pomocy kryterium na wartość bezwzględną współczynników rozkładu, t.j.: kompresja wyznaczenie transformaty falkowej oraz pominięcie współczynników o najniższej (co do wartości bezwzględnej) wartości dekompresja wyznaczenie transformaty odwrotnej na podstawie obciętej listy współczynników (ich liczb falkowych i wartości) Podanie stopnia kompresji.
Zadanie zad14 3 1 pro zad14_3, file, thrshld 2 3 ; odczyt danych + dostosowanie rozmiaru do 2^n x 2^n 4 f = h5f_open(file) 5 d = h5d_open(f, 'image1/data') 6 data = (h5d_read(d))[72:327, 72:327] 7 h5d_close, d 8 h5f_close, f 9 10 ; okna 11 window, 0, xsize=2*(size(data))[1], ysize=(size(data))[2] ; obrazy 12 window, 1, xsize=1*(size(data))[1], ysize=(size(data))[2] ; transformaty 13 window, 2 ; histogram 14 15 wset, 0 & loadct, 17 & tv, bytscl(data) 16 17 trans = wtn(data, 4, /col) 18 wset, 2 & loadct, 0 & plot, histogram(abs(trans)), psym=10, $ 19 xtitle='number falki', ytitle='modul amplitudy', /ylog, /xlog 20 wset, 1 & loadct, 17 & tv, trans 21 22 compr = wtn(trans, 4, /inv, /col) 23 compr[where(abs(compr) lt thrshld, cnt, ncomplement=ccnt)] = 0. 24 print, 'stopień kompresji: ', 4. * n_elements(data) / (ccnt * 4 + ccnt) 25 wset, 0 & loadct, 17 & tv, bytscl(compr), 256, 0 26 27 end
Zadanie
Dyskretna Transformacja Falkowa (DWT) w u zwraca dyskretną transformatę falkową argumentu (rzeczywiste współczynniki rozkładu w bazie ortogonalnej Daubechies) lub transformatę odwrotną; tablica przekazana w argumencie rzutowana jest na typ zmiennoprzecinkowy; funkcja może też obliczać transformaty tablic wielowymiarowych (np. analiza obrazów); obliczenia wykonywane są przez bibliotekę GSL sposób użycia (rząd falek 2, 4... 20): trnsfrmt = wtn(sgnł, rząd falek) sgnł = fft(trnsfrmt, rząd falek, /inverse) wybrane argumenty nazwane i flagi /overwrite zapis wyniku do tablicy przekazanej w argumencie (algorytm in-situ) /inverse transformacja odwrotna długości wymiarów sygnału muszą być potęgami 2
- składnia analogiczna do CONTOUR > surface, hanning(20, 20)