Wykład 13
Transformata falkowa cd.
przygotowała Klaudia Wrzask

Off[General::"spell"]
Off[General::"spell1"]

Wstęp - motywacja

Fale to funkcje oscylujące w czasie, w przestrzeni lub w obu tych dziedzinach.
W oparciu o pojęcie fali powstała analiza harmoniczna Fouriera. Umożliwia ona reprezentację sygnału w postaci sumy funkcji sinusoidalnych. Ta metoda jest użyteczna przede wszystkim do analizy częstotliwościowej szeregów czasowych stacjonarnych (czyli o częstotliwosciach nie zmieniających się w czasie).

Falki to małe fale (z fr. les ondelettes, ang. wavelets) o energii skoncentrowanej w stosunkowo krótkim przedziale czasowym.
Funkcja ψ  całkowalną z kwadratem nazywamy falką jeśli spełniony jest warunek:

  (∫_(-∞)^∞) ψ(t) dt=0
 
oznacza to, że wartość średnia funkcji ψ całym przedziale jest równa zero.

Analiza falkowa polega na dekompozycji sygnału przy użyciu falek otrzymanych poprzez translację (przesunięcie) i dylatację (skalowanie) falki podstawowej (mother wavelet). Falki są szczególnie przydatne do analizy czasowo-częstotliwościowej sygnałów niestacjonarnych (czyli takich w których czestotliwosci zmieniaja się w czasie).


Historia:
1. Wprowadzenie pojęcia falek (Morlet, 1982)
2. Odwrotna transformata falkowa (Grossman, 1982)
3. Matematyczne podstawy teorii falek (Meyer, 1985)
4. Konstrukcja rodziny gładkich falek ortonormalnych o zwartym nośniku  (Daubechies, 1988)
5. Algorytm dekompozycji i rekonstrukcji falkowej przy użyciu analizy wielorozdzielczej (Mallat, 1989)
....

Własności analizy Fouriera:
✔ funkcjami bazowymi są funkcje sinusoidalne
✔ baza ta jest globalna, ponieważ funkcje sinusoidalne są określone na całym zbiorze liczb rzeczywistych
✔ analiza nie jest zlokalizowana w czasie, w związku z czym lokalna zmiana w sygnale będzie zmieniała wyniki analizy sygnału w całym paśmie częstotliwości
✔ tego typu analiza daje informację jedynie o częstotliwości, zaniedbując informację o czasie
✔ nie pozwala na otrzymanie widma częstotliwościowego lokalnie w czasie

Własności transformaty oknowej Gabora:
✔ funkcjami bazowymi są funkcje sinusoidalne o rożnych częstotliwościach pomnożone przez okno Gaussa
✔ ze względu na stałą szerokość okna funkcje bazowe są dobrze zlokalizowane w czasie
✔ baza, względem ktorej szereg czasowy jest rozwijany, charakteryzuje się lokalnością
✔ rozdzielczość czasowo-częstotliwościowa analizy jest stała
✔ ta metoda analizy zawodzi dla sygnałow, ktore posiadają zarówno składowe wysokoczęstotliwościowe, o krótkim zakresie czasowym, jak i składowe długookresowe.

Poniżej funkcja Gabora (sinus w Gaussianie)

gabor[t_]:=Sin[4 Pi t] Exp[-(t^2)/2]
Plot[gabor[t],{t,-6,6},PlotRange->All]

Własności transformaty falkowej:
✔ funkcje bazowe otrzymane poprzez translację (przesuwanie) i dylatację (skalowanie, ściskanie) falki podstawowej 
✔ funkcje bazowe są dobrze zlokalizowane w czasie
✔ baza jest lokalna
✔ liczba oscylacji jest stała dla wszystkich funkcji bazowych
✔ szerokość funkcji bazowej maleje wraz z rosnącą częstotliwością
✔ rozdzielczość czasowo-częstotliwościowa analizy jest zmienna
✔ zastosowanie transformaty falkowej umożliwia analizę sygnałów posiadających zarówno krotkotrwałe składowe wysokoczęstotliwościowe jak i składowe długookresowe.

Poniżej przykład falki Mexican hat wavelet (falka Marra)

mexicanhat[t_]:=(1-t^2)Exp[-(t^2)/2]
Plot[mexicanhat[t],{t,-6,6}, PlotRange->All]

✔ Wartość średnia falki Mexican hat w całym przedziale czasowym jest oczywiscie równa zero:.

(∫_(-∞)^∞)mexicanhat[t]\[DifferentialD]t

Podsumowując:
✔ Transformata falkowa jest przekształceniem podobnym do transformaty Fouriera pod tym względem, że oba należą do przekształceń całkowych. 
✔ Oba przekształcenia opierają się na wykorzystaniu operacji iloczynu badanego sygnału f(t) i pozostałej części, zwanej "jądrem przekształcenia" (jadro przekształcenia brzmi poważnie - jest to po prostu funkcja stojaca pod całką). Tu właśnie pojawia się różnica pomiędzy transformacją falkową a Fouriera. W odróżnieniu od transformacji Fouriera, gdzie jako jądro wykorzystuje się funkcje sinusoidalne (czyli okresowe reprezentujące jedną częstotliwość), w przypadku transformaty falkowej jądrem jest właśnie falka. 
✔ Falka nie jest to jednak dowolną funkcja. Jest ona obarczona kilkoma warunkami, między innymi musi zapewniać możliwość skalowania oraz przesuwania w dziedzinie czasu. We wzorach opisujących falki występować więc będą odpowiednio: współczynniki skalowanie i translacji.

Własności falek

W analizie sygnału z wykorzystaniem transformacji falkowej sygnał aproksymowany jest sumą ograniczonych w czasie przebiegów impulsowych, występujących w różnych chwilach czasowych i mających różne pasmo częstotliwościowe. Im kształt funkcji bazowych będzie bardziej dopasowany do analizowanego sygnału, tym mniejsza liczba tych funkcji wystarczy do jego aproksymacji.

Wf(a,b)=(1/(Sqrt[a]))(∫_(-∞)^∞)(SuperStar[ψ])(((t-b)/a))f(t)dt

ψ - funkcja analizująca, falka podstawowa: należy do przestrzeni funkcji całkowalnych z kwadratem
f - analizowany sygnał: należy do przestrzeni funkcji całkowalnych z kwadratem
a - współczynnik skalowania
b - współczynniki translacji

Cechą charakterystyczną analizy falkowej sygnału jest możliwość dowolnego wyboru falki podstawowej. Dla większości zastosowań najważniejszym kryterium wyboru tej falki jest uzyskanie jak najoszczędniejszej reprezentacji sygnału, tzn. takiej, dla ktorej liczba odpowiednich współczynnikow falkowych byłaby jak najmniejsza.

1. Warunek dopuszczalności
✔ Jeżeli nie jest spelniony, nie będziemy w stanie znaleźć transformacji odwrotnej

(∫_0^∞)((|ψ(ω)((|)^2))/ω)dω<∞

2. Regularność (gładkość)
✔ Regularność falki podstawowej wpływa na błąd wprowadzony do analizy poprzez eliminację progową lub dyskretyzację wspołczynnikow falkowych.

3. Liczba momentow znikających (zerowych)
Funkcja ma q momentow znikających, jeżeli:

  (∫_(-∞)^∞) (t^k)ψ(t) dt=0

dla k = 0, 1, . . . , q-1, co oznacza, że spełnia ona warunek dopuszczalności i jest ortogonalna do wszystkich wielomianow stopnia (k - 1), gdzie k = 1, 2, . . . , q - 1.
✔ Zastosowanie funkcji analizującej o momentach znikających wysokiego rzędu eliminuje najbardziej regularną (wielomianową) część sygnału. Umożliwia to wykrywanie w sygnale zmian wysokiego rzędu oraz osobliwości w jego pochodnych wysokiego rzędu.
✔ Z wyborem konkretnej falki związany jest kompromis między liczbą momentow znikających a długością nośnika.
✔ W analizie wielorozdzielczej opartej na funkcji analizującej posiadającej q momentow znikających, wielomiany stopnia mniejszego niż (q-1) są zastępowane przez funkcję skalującą.

4. Szerokość
✔ Rozdzielczość falki jest określona poprzez równowagę pomiędzy jej szerokością w dziedzinie czasu i szerokością w dziedzinie częstotliwości czyli jej transformatą Fouriera.
✔ Funkcja wąska (w czasie) będzie mieć wysoką rozdzielczość czasową, ale niską rozdzielczość częstotliwościową, podczas gdy funkcja szeroka będzie mieć niską rozdzielczść czasową, ale wysoką rozdzielczość częstotliwościową. (Patrz zasada nieoznaczoności wcześniejsze wykłady)

5. Kształt
✔ Funkcja falkowa powinna odzwierciedlać swoim kształtem cechy charakterystyczne analizowanego szeregu czasowego
✔ Dla szeregow czasowych z gwałtownymi skokami odpowiedni będzie wybor funkcji falkowej typu schodkowej, takiej jak np. falka Haara
✔ Dla szeregow zmieniających się łagodnie bardziej odpowiednia będzie gładka funkcja analizująca, taka jak tłumiona sinusoida.

6. Ortogonalność
Zbior falek  (Subscript[{(Subscript[ψ, j,k])}, j,k∈Z]) nazywamy ortogonalnym, jeżeli każde dwie rożne falki należące do tego zbioru są ze sobą ortogonalne, to znaczy ich iloczyn skalarny wynosi 0. 
✔ Wybór ortogonalnego zbioru falek pozwala na najbardziej oszczędną reprezentację sygnału.



7. Funkcja skalująca
✔ Każda falka posiada swoją unikalną funkcję skalującą. 
✔ Jedną z cech, która odróżnia funkcję skalującą od falki, jest niezerowa wartość średnia.

Przykłady falek

Falki Haara z wcześniejszego wykładu

Dekompozycję Haara na pierwszym poziomie rozdzielczości można opisać poprzez trzanformację:
(({{(Subscript[x, 1])}, {({{⋮}, {(Subscript[x, 2n])}})}}))->(1/2)(({{(Subscript[x, 1])+(Subscript[x, 2])}, {({{(Subscript[x, 3])+(Subscript[x, 4])}, {({{⋮}, {({{(Subscript[x, 2n-1])+(Subscript[x, 2n])}, {({{(Subscript[x, 1])-(Subscript[x, 2])}, {({{(Subscript[x, 3])-(Subscript[x, 4])}, {({{⋮}, {(Subscript[x, 2n-1])-(Subscript[x, 2n])}})}})}})}})}})}})}}))

Pierwsza połowa listy otrzymanej w taki sposób to ogóły sygnału wejściowego, druga połowa to szczegóły.

Poniżej na rysunku przedstawiona jest funkcja skalująca Haara

ϕ[x_]:=UnitStep[x(1-x)]
Plot[ϕ[x],{x,-0.5,1.5}]

Plot[WaveletPhi[HaarWavelet[],x],{x,-1,2},Exclusions->None]

Funkcja ϕ[x,j,k]=ϕ[(2^j)x-k] to funkcja skalująca o skali j i translacji (przesunięciu) k. Podstawowa funkcja skalująca jest zatem postaci ϕ[x, 0, 0]. Funkcję ϕ[x,j,k] nazywamy także matką falką.

Poniżej przykładowa konstrukcja funkcji sinus przy pomocy funkcji skalujących o skali 5.

ϕ[x_,j_,k_]:=ϕ[2^j x-k];
xp=Table[x,{x,0,1,1/(2^5-1)}];
yp=N[Table[Sin[2 Pi xp]]];
ys=Table[ϕ[t,5,k],{k,0,2^5-1}];
Plot[yp.ys,{t,0,1},Exclusions->None]

Funkcję ψ[x]=ϕ[2x]-ϕ[2x-1] nazywamy podstawową falką Haara. Została ona skonstruowana przy pomocy funkcji skalującej.

ψ[x_]:=ϕ[2 x]-ϕ[2 x-1]
Plot[ψ[x],{x,-1,2}]

Plot[WaveletPsi[HaarWavelet[],x],{x,-1,2},Exclusions->None]

✔ Wartość średnia falki Haara w całym przedziale jest oczywiscie równa zero:

(∫_(-∞)^∞)ψ[t]\[DifferentialD]t
(∫_(-∞)^∞)WaveletPsi[HaarWavelet[],t]\[DifferentialD]t

Funkcja ψ[x,j,k]=ψ[(2^j)x-k] to falka Haara o skali j i translacji k. Podstawowa falka Haara jest zatem postaci ψ[x,0,0].

Poniżej dwie przykładowe falki Haara:

ψ[x_,j_,k_]:=ψ[(2^j) x-k]
Plot[ψ[x,1,1],{x,0,1.5}]
Plot[ψ[x,2,2],{x,0,1.5}]

Poniżej procedura na współczynniki transformaty Haara do i-tego poziomu rozdzielczości: {0} - ogół; {1} - szczegół, {0,1} - szczegół na kolejnym poziomie rozdzielczości, itd.

yp;
THaar=DiscreteWaveletTransform[yp]
THaar["TreeView"]
THaar["WaveletIndex"]

THaarVal=Flatten[THaar[{{0,0,0,0,0},{0,0,0,0,1},{0,0,0,1},{0,0,1},{0,1},{1}},"Values"]]
Dimensions[THaarVal]

Wykonujemy dekompozycję funkcji przy pomocy współczynników rozwinięcia transformaty Haara i funkcji Haara. (przemnażamy odpowiednie współczynniki Haara przez odpowiednie funkcje Haara)

funkcje=Flatten[Table[{ϕ[t],Table[ψ[t,j,k],{j,0,4},{k,0,2^j-1}]}]];
Dimensions[funkcje]

Plot[THaarVal.funkcje,{t,0,1}]

Falka Daubechies

(({{(Subscript[x, 1])}, {({{⋮}, {(Subscript[x, 2n])}})}}))->(1/(Sqrt[2]))(({{(Subscript[h, 4])(Subscript[x, 1])+(Subscript[h, 3])(Subscript[x, 2])+(Subscript[h, 2])(Subscript[x, 3])+(Subscript[h, 1])(Subscript[x, 4])}, {({{(Subscript[h, 4])(Subscript[x, 3])+(Subscript[h, 3])(Subscript[x, 4])+(Subscript[h, 2])(Subscript[x, 5])+(Subscript[h, 1])(Subscript[x, 6])}, {({{⋮}, {({{(Subscript[h, 4])(Subscript[x, 2n-1])+(Subscript[h, 3])(Subscript[x, 2n])+(Subscript[h, 2])(Subscript[x, 1])+(Subscript[h, 1])(Subscript[x, 2])}, {({{(Subscript[g, 4])(Subscript[x, 1])+(Subscript[g, 3])(Subscript[x, 2])+(Subscript[g, 2])(Subscript[x, 3])+(Subscript[g, 1])(Subscript[x, 4])}, {({{(Subscript[g, 4])(Subscript[x, 3])+(Subscript[g, 3])(Subscript[x, 4])+(Subscript[g, 2])(Subscript[x, 5])+(Subscript[g, 1])(Subscript[x, 6])}, {({{⋮}, {(Subscript[g, 4])(Subscript[x, 2n-1])+(Subscript[g, 3])(Subscript[x, 2n])+(Subscript[g, 2])(Subscript[x, 1])+(Subscript[g, 1])(Subscript[x, 2])}})}})}})}})}})}})}}))

((Subscript[h, 1]),(Subscript[h, 2]),(Subscript[h, 3]),(Subscript[h, 4]))=(1/(4 (Sqrt[2])))(1+(Sqrt[3]),3+(Sqrt[3]),3-(Sqrt[3]),1-(Sqrt[3]))
((Subscript[g, 1]),(Subscript[g, 2]),(Subscript[g, 3]),(Subscript[g, 4]))=(1/(4 (Sqrt[2])))(1-(Sqrt[3]),-(3-(Sqrt[3])),3+(Sqrt[3]),-(1+(Sqrt[3])))

Powyższe współczynniki filtrów zostały wyznaczone z warunków:
(∑_(k=0)^n)(Subscript[h, k])=(Sqrt[2])
(Subscript[g, j])=(((-1))^j)(Subscript[h, n-j])
(∑_(k=0)^n)(Subscript[g, k])=0
(∑_(k=0)^n)(Subscript[h, k])(Subscript[h, k+2m])=(Subscript[δ, 0m])

✔ Falka Daubechies to jedna z najpopularniejszych, której konstrukcję, pani Daubechies podała w swej pracy "Ten Lectures on Wavelets" (Academic Press, London 1992). Falka Daubechies pierwszego rzędu to falka Haara.

h=(({1+(Sqrt[3]),3+(Sqrt[3]),3-(Sqrt[3]),1-(Sqrt[3])})/(4 (Sqrt[2])));
g=Table[(((-1))^k) h[[4-k]],{k,0,3}];

D4={h,g};
H2={{(1/(Sqrt[2])),(1/(Sqrt[2]))},{-(1/(Sqrt[2])),(1/(Sqrt[2]))}};

odd[y_]:=Transpose[Partition[y,2]][[1]]
even[y_]:=Transpose[Partition[y,2]][[2]]
knit[{o_,e_}]:=Flatten[Transpose[{o,e}]]

✔ Dekompozycja sygnału przy pomocy współczynników filtrów

dec[cf_List][data_List]:=
Module[{k,y,dodd,deven},
deven=even[data];
dodd=odd[data];
y=0;
Do[y+=cf[[2 k+1]] dodd+cf[[2 k+2]] deven;deven=RotateLeft[deven];dodd=RotateLeft[dodd],{k,0,((Length[cf])/2)-1}];
y]

✔ Rekonstrukcja sygnału

rec[cf_List][data_List]:=
Module[{k,y,d},
d=data;
y=0;
Do[y+={{cf[[2 k+1]]},{cf[[2 k+2]]}}.{d};d=RotateRight[d],{k,0,((Length[cf])/2)-1}];Flatten[Transpose[y]]]

✔ Transformata falkowa

Wave[{cf1_,cf2_}][data_]:={dec[cf1][data],dec[cf2][data]}
invWave[{cf1_,cf2_}][{c_,d_}]:=rec[cf1][c]+rec[cf2][d]
Clear[WT,cd,a,f,normSq,norm,onezero,CountNonZero]

WT[cf_][cd_,newlevel_]:=Module[{n,newcd},
	n=newlevel+1-Length[cd];
		newcd=cd;
		Which[n>0, Do[ newcd=Join[Wave[cf][newcd[[1]]],Drop[newcd,1]], {n}],
			n<0, Do[ newcd=Join[{invWave[cf][{newcd[[1]],newcd[[2]]}]},Drop[newcd,2]], {-n}]];
		newcd]

Sprawdzenie metody

A=Array[a,{8}]

{a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8]}

Wave[D4][A]

invWave[D4][Wave[D4][A]]//Simplify

Takiej falki nie da sie zapisać analitycznie, można jedynie narysować rekurencyjnie.
Konstrukcja funkcji skalującej i falki na podstawie filtrów:
ϕ(t)=(Sqrt[2])(∑_j)(Subscript[h, j])ϕ(2t-j)
ψ(t)=(Sqrt[2])(∑_j)(Subscript[g, j])ϕ(2t-j)

(Subscript[ϕ, 0])[t_]:=UnitStep[t(1-t)];
(Subscript[ϕ, i_])[t_,j_,n_]:=(Subscript[ϕ, i])[2^n t-j];

(Subscript[ϕ, 0])[t,j,1]

Do[
(Subscript[ϕ, i_])[t_]:=
Sum[h[[j]] (Subscript[ϕ, i-1])[t,j,1],{j,1,4}];
(Subscript[ψ, i_])[t_]:=
Sum[g[[j]] (Subscript[ϕ, i-1])[t,j,1],{j,1,4}];
{i,1,5}]

Plot[(Subscript[ϕ, 5])[t],{t,0,5}]

Plot[(Subscript[ψ, 5])[t],{t,0,5},PlotRange->All]

W Mathematice

WaveletFilterCoefficients[DaubechiesWavelet[2],{"PrimalLowpass","PrimalHighpass"},WorkingPrecision->∞]
Plot[WaveletPhi[DaubechiesWavelet[2],x],{x,0,5},PlotRange->All]
Plot[WaveletPsi[DaubechiesWavelet[2],x],{x,0,5},PlotRange->All]

WaveletFilterCoefficients[DaubechiesWavelet[1],{"PrimalLowpass","PrimalHighpass"},WorkingPrecision->∞]
Plot[WaveletPhi[DaubechiesWavelet[1],x],{x,0,3},PlotRange->All]
Plot[WaveletPsi[DaubechiesWavelet[1],x],{x,0,3},PlotRange->All]

WaveletFilterCoefficients[DaubechiesWavelet[4],{"PrimalLowpass","PrimalHighpass"},WorkingPrecision->10]
Plot[WaveletPhi[DaubechiesWavelet[4],x],{x,-1,6},PlotRange->All]
Plot[WaveletPsi[DaubechiesWavelet[4],x],{x,-6,6},PlotRange->All]

Falki Coiflets

Falki Coiflets zostały stworzone przez panią Daubechies na prośbę R. Coifman'a. Była to próba eliminacji zjawiska występowania nieliniowego przesunięcia fazowego pomiędzy sygnałem na wejściu i sygnałem na wyjściu (powód: niesymetryczny filtr i niesymetryczna odpowiadająca mu falka). Falki te posiadają stosunkowo małą asymetrie (jak na ortogonalną falkę o zwartym nośniku).

WaveletFilterCoefficients[CoifletWavelet[1],{"PrimalLowpass","PrimalHighpass"},WorkingPrecision->10]
Plot[WaveletPhi[CoifletWavelet[1],x],{x,-2,3},PlotRange->All]
Plot[WaveletPsi[CoifletWavelet[1],x],{x,-2,3},PlotRange->All]

Falki Symlets

Prawie symetryczne falki zaproponowane przez Daubechies jako modyfikacja falek db

WaveletFilterCoefficients[SymletWavelet[4],{"PrimalLowpass","PrimalHighpass"},WorkingPrecision->10]
Plot[WaveletPhi[SymletWavelet[4],x],{x,0,7}]
Plot[WaveletPsi[SymletWavelet[4],x],{x,-4,4},PlotRange->All]

Falki biortogonalne

Dla falek biortogonalnych istnieją dwie pary falek - jedna służąca do dekompozycji (analizy) i druga do syntezy.

WaveletFilterCoefficients[BiorthogonalSplineWavelet[2,4],{"PrimalLowpass","PrimalHighpass"},WorkingPrecision->10]
Plot[WaveletPhi[BiorthogonalSplineWavelet[2,4],x],{x,-4,4},PlotRange->All]
Plot[WaveletPsi[BiorthogonalSplineWavelet[2,4],x],{x,-4,4},PlotRange->All]
Plot[WaveletPhi[ReverseBiorthogonalSplineWavelet[2,4],x],{x,-4,4},PlotRange->All]
Plot[WaveletPsi[ReverseBiorthogonalSplineWavelet[2,4],x],{x,-4,4},PlotRange->All]

Falka Cohen–Daubechies–Feauveau typu "9/7" - ze standardu Jpeg2000

WaveletFilterCoefficients[CDFWavelet[],{"PrimalLowpass","PrimalHighpass"},WorkingPrecision->10]
Plot[WaveletPhi[CDFWavelet[],x],{x,-4,4},PlotRange->All]
Plot[WaveletPsi[CDFWavelet[],x],{x,-4,4},PlotRange->All]

Grafika w Mathematice - import, pobieranie danych

Poniżej import obrazka z podaną ścieżką:

lenna=Import["c:/Users/wrzask/Desktop/PO/lenna.jpg"]
datalenna=Import["c:/Users/wrzask/Desktop/PO/lenna.jpg","Data"];
pixellenna=datalenna[[All,All,1]];
Dimensions[datalenna]

Image[datalenna/255,ColorSpace->"RGB"]

Poniżej dekompozycja Haara na pięciu poziomach rozdzielczości

dwtHaarImage=DiscreteWaveletTransform[lenna,Automatic,5]
WaveletImagePlot[dwtHaarImage,ImageSize->Large]

Poniżej dekompozycja grafiki przy pomocy falek Daubechies na pięciu poziomach rozdzielczości

dwtDW2Image=DiscreteWaveletTransform[lenna,DaubechiesWavelet[2],5]
WaveletImagePlot[dwtDW2Image,ImageSize->Large]

dwtDW4Image=DiscreteWaveletTransform[lenna,DaubechiesWavelet[4],5]
WaveletImagePlot[dwtDW4Image,ImageSize->Large]

Poniżej dekompozycja grafiki przy pomocy falek biortogonalnych na pięciu poziomach rozdzielczości

dwtBSWImage=DiscreteWaveletTransform[lenna,BiorthogonalSplineWavelet[2,4],5]
WaveletImagePlot[dwtBSWImage,ImageSize->Large]

Grafika z szumem

Poniżej metodą ImageEffect dodałam szum; mamy do wyboru 
          {“Noise”,a}	
	{“GaussianNoise”,σ}	
	{“SaltPepperNoise”,f}	
	{“PoissonNoise”,a}
Operujemy tutaj na grafice - nie na danych.

lennanoise=ImageEffect[lenna,{"GaussianNoise",0.1}]

Odszumianie grafiki:
Krok 1 Wykonujemy transformatę falkową (zazwyczaj do ostatniego poziomu rozdzielczości) (tutaj mamy szeroki wybór falek)
Krok 2 Używamy metody progowej na wspołczynnikach transformaty (a tutaj szeroki wybór metod progowych)
Krok 3 Wykonujemy odwrotną transformatę falkową

Do progowego odcinania szumów użyłam WaveletThreshold[], mamy do wyboru różne metody progowe

dwd=DiscreteWaveletTransform[lennanoise,CoifletWavelet[1],8];
thr=WaveletThreshold[dwd,{"SmoothGarrote",0.5,2}]
InverseWaveletTransform[thr]

Zadanie na laboratorium

Zadanie nr 14 - 5p.
Należy:
1. Wybrać dowolną grafikę
2. Przeprowadzić dyskretną transformatę falkową przy użyciu trzech falek na sześciu poziomach rozdzielczości, wynik zaprezentować w formie graficznej.
3. Przy użyciu ImageEffect[], zaszumić grafikę dowolną metodą.
4. Przeprowadzić transformatę falkową grafiki (dowolną falką).
5. Przy użyciu WaveletThreshold[] odciąć współczynniki metodą progową (wypróbować trzy metody progowe lub jedną z trzema różnymi progami)
6. Przyprowadzić odwrotna transformatę dla trzech przykładów.
7. Opisać krótko wnioski z ćwiczenia.

Możliwe ćwiczenia do zrealizowania (dodatkowe)

1. Porównanie transformat falkowych Haara, Daubechies lub/i transformat falkowych ze standardu jpeg2000 (można użyć funkcji Mathematici CDFWavelet[]) przy filtrowaniu i kompresji sygnału. 

2. Można rozszerzyć zadanie 14 na testy większej ilości grafik, transfomat falkowych i metod progowych

Pytanie na kolokwium

1. Porównanie własności transformaty Fouriera, oknowej i falkowej -  pp 
2. Jakie znasz rodzaje falek, opisz szczegółowo jedną z nich - pr