>
This MAPLE 6 worksheet simultaneously displays a continuous function along
with its Haar approximation. The insequence command is used
to update the approximation.
Author: Dr. E. Rowe
Department of Mathematics
North Carolina A & T State Univ.
Greensboro, NC 27411
rowee@ncat.edu
Date: 13 Nov. 2000
>
>
Example: Continuous function: The associated function f is approximated at
f(n) = y_ n, n = 0, 1, 2, ..., 2^m. We assume that f belongs Haar's multiresolution
space V _ 0 .
> restart:
>
> with(plots):
Warning, the name changecoords has been redefined
>
>
>
Build the father wavelet - also called the scaling function.
> phi := t -> piecewise(0 <= t and t <= 1,1);#scaling funciton
>
>
>
Next we build the mother wavelet.
> psi := t -> piecewise(0 <= t and t < 0.5, 1,
> 0.5 <= t and t < 1, -1);
> plot(psi(t), t = -1..2);
>
Enter the number of subspaces on which to perform the
approximation: This is the same as the number of
offspring generations.
> nGens := 4; nGensP1 := nGens + 1;
>
>
Build the signal:
>
>
> f := t -> sin(20*t)*(log(t))^2;
> #f(10^(-15)); #This is just to check function near origin.
> #evalf(%);
> plot(f(t), t=0..1);
>
> for n from 0 to nGens do
> for k from 0 to (2^n - 1) do
> psi||n||k := psi(2^n * t - k):
> psi||n||k := unapply(psi||n||k,t);
> od:
> od:
>
> with(LinearAlgebra): #NAG's Linear Algebra Package!
Next we build the matrix corresponding to the Haar
wavelets.
>
> M := Matrix(2^nGensP1,2^nGensP1);
> for i from 1 to 2^nGensP1 do
> M[i,1] := 1:
> od:
>
> mColumn := 1:
> for i from 0 to nGens do
> genSize := 2^i:
> for j from 1 to genSize do
> mColumn := mColumn + 1;
> for k from 1 to 2^nGensP1 do #Evaluate psi.i.j at left endpoint.
> M[k,mColumn] := psi||i||(j-1)((k-1)/2^nGensP1):
> od:
> od:
> od:
>
> M: evalm(%): #Evaluate entries of matrix.
>
>
Sample signal:
>
> b := Vector(2^nGensP1);
>
> b[1] := 0:#Warning: this signal (i.e., f) starts out at zero!
> for i from 2 to 2^nGensP1 do
> b[i] := evalf(f((i-1)/2^nGensP1));
> od:
> coef := LinearSolve(M, b): #Get coefficients of wavelet functions.
> myApprox := proc(n::integer,coef::Vector,phi,psi,t)
> #
> #
> if n = -1 then
> coef[1]*phi(t);
> elif n = 0 then
> coef[1]*phi(t) + coef[2]*psi(t);
> elif n = 1 then
> coef[1]*phi(t) + coef[2]*psi(t)
> + coef[3]*psi(2*t) + coef[4]*psi(2*t - 1);
> else
> indx := 2^n: indxj := indx - 1:
> myApprox(n-1,coef,phi,psi,t) +
> add(coef[indx + j + 1]*psi(2^n*t - j),j=0..indxj);
> fi;
> end:
Warning, `indx` is implicitly declared local to procedure `myApprox`
Warning, `indxj` is implicitly declared local to procedure `myApprox`
Display original signal and Haar approximation.
>
> display([seq(
> display(array([plot(f(t),t=0..1, title=`Signal`),
> plot(myApprox(i,coef,phi,psi,t), t=0..1.05, title=`Haar Approx.`)])),i=-1..nGens)], insequence=true);
>
>