from math import sqrt, sin
import matplotlib.pyplot as plt
import numpy as np


def trend(x):
	return [(x[2*i]+x[2*i + 1])/sqrt(2.0) for i in range(len(x)//2)]

def fluct(x):
	return [(x[2*i]-x[2*i + 1])/sqrt(2.0) for i in range(len(x)//2)]


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(x):
	return sum(f*f for f in x)


def plot(x, title):
	plt.figure(title)
	plt.plot(range(len(x)), x)


def main():
	L = [ 0.3*sin( x*0.05 + 3.0) for x in range(1000) ]
	for i in range(0, 3):
		hl = haar(L,i)
		plot(hl, 'haar transform of level '+str(i))


if __name__ == "__main__":
	main()
