import Wavelet;

public class HaarWavelet implements Wavelet
{
	public static void FWT(int data[], int depth)
	{
		for(int skip = 2; skip <= (2 << (depth - 1)); skip <<= 1)
		{
			fwt_odd(data, skip);
			fwt_even(data, skip);
		}
	}
	
	public static void IFWT(int data[], int depth)
	{
		for(int skip = (2 << (depth - 1)); skip >= 2; skip >>= 1)
		{
			iwt_even(data, skip);
			iwt_odd(data, skip);
		}
	}

	//by default, do haar wavelet
	public static void fwt_even(int data[], int skip)
	{
		for(int el = 0; el < data.length - skip / 2; el += skip)
		{
			//add half of odd coefficient to get average
			data[el] += data[el + skip / 2] / 2;
		}
	}

	public static void fwt_odd(int data[], int skip)
	{
		for(int el = skip / 2; el < data.length; el += skip)
		{
			//difference 
			data[el] -= data[el - skip / 2];
		}
	}

	public static void iwt_even(int data[], int skip)
	{
		for(int el = 0; el < data.length - skip / 2; el += skip)
		{
			//add half of odd coefficient to get average
			data[el] -= data[el + skip / 2] / 2;
		}
	}

	public static void iwt_odd(int data[], int skip)
	{
		for(int el = skip / 2; el < data.length; el += skip)
		{
			//difference 
			data[el] += data[el - skip / 2];
		}
	}
}

