## L414_dominguez
'''
Haar wavelets algorithms: continued
'''
from math import sqrt

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 == 0: 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)
    
## lab

from math import *
from numpy import * 
from matplotlib.pyplot import *

def f(x): return 10*x**2 * (1-x)**3 *cos(40*atan(1)*x)

X = arange(0, 1, 0.0001) 

close('all') 
#plot(f(X)) 
plot(haar(f(X), 0))
plot(haar(f(X), 1))
plot(haar(f(X), 2))
plot(haar(f(X), 3))

print("energy(haar(f(X), 0)) = " + str(energy(haar(f(X), 0))))
print("energy(haar(f(X), 1)) = " + str(energy(haar(f(X), 1))))
print("energy(haar(f(X), 2)) = " + str(energy(haar(f(X), 2))))
print("energy(haar(f(X), 3)) = " + str(energy(haar(f(X), 3))))
