## L414
## Joan Ginés i Ametllé

'''
Haar wavelets algorithms: first steps
'''
from math import *
from numpy import * 
from matplotlib.pyplot import *

def trend(f):
    r2 = sqrt(2)
    N = len(f)
    J = range(N//2)
    return [(f[2*j]+f[2*j+1])/r2 for j in J]
    
def fluct(f):
    r2 = sqrt(2)
    N = len(f)
    J = range(N//2)
    return [(f[2*j]-f[2*j+1])/r2 for j in J]
    
def haar(f, r=1):
    if r < 1: return f
    if r == 1: return trend(f) + fluct(f)
    N = len(f); m = N // 2**(r-1)
    h = haar(f,r-1); a = h[:m]
    return trend(a) + fluct(a) + h[m:]
    
def energy(f):
    return sum(t**2 for t in f)
    
# define function f
def f(x): return 10*x**2 * (1-x)**3 *cos(40*atan(1)*x)

# haar transform level 1
X = arange(0, 1, 0.001)
H1 = haar(f(X))
E1 = energy(H1)

close('all')
for r in range(2,6):
    Hr = haar(f(X),r)
    Er = energy(Hr)
    if abs(Er-E1) < 1e-10:
        print('Haar transform at level', r, 'is equal than at level 1')
    else:
        print('Haar transform at level', r, 'is different than at level 1')

