/* 
 * Copyright Denny Hermawanto - 2006
 * Mail: d_3_nny@yahoo.com
 *
 * Haar wavelet for noise reduction
 * The original noisy data is saved in c:\sinusplusnoise.txt and denoised data 
 * saved in c:\reconstruction.txt
 */
import java.io.*;

class Haarwavelet{

	private void GenerateSinWave(){
		sindata = new float[180];
		for(int i=0;i<180;i++){
			sindata[i] = (float) Math.sin((2*i)/(180/Math.PI));
		}
	}

	private void GenerateNoiseData(){
		noisedata = new float[180];
		for(int i=0;i<180;i++){
			noisedata[i] = (float) (((Math.random()*Integer.MAX_VALUE)%100)-((Math.random()*Integer.MAX_VALUE))%100) / (float)500.;
		}
	}

	private void AddNoiseToSinus(){
		sinnoisedata = new float[180];
		for(int i=0;i<180;i++){
			sinnoisedata[i] = sindata[i] + noisedata[i];
		}
		WriteToTextFile(sinnoisedata,"c:\\sinusplusnoise.txt");
	}

	private void PrintSin(){
		for(int i=0;i<180;i++){
			System.out.println(i+":"+sindata[i]);
		}
	}

	private void PrintNoise(){
		for(int i=0;i<180;i++){
			System.out.println(i+":"+noisedata[i]);
		}
	}


	private void PrintSinNoise(){
		for(int i=0;i<180;i++){
			System.out.println(i+":"+sinnoisedata[i]);
		}
	}

	private void WriteToTextFile(float[] arrayname,String filename){
		try{
			out = new BufferedWriter(new FileWriter(filename));
		}
		catch(IOException ioe){
			System.out.println("Error open file");
		}
		try{
			out.flush();
			for(int i=0;i<arrayname.length;i++){
				out.write(Double.toString(arrayname[i]));
				out.newLine();
			}
			out.close();
		}
		catch(IOException ioe){
			System.out.println("Error writing");
		}
	}

	private void WaveletProcess(){
		a = new float[90];
		d = new float[90];

		for(int i=0;i<90;i++){
			a[i] = (sinnoisedata[i*2] + sinnoisedata[i*2+1]) / 2;
			d[i] = sinnoisedata[i*2] - a[i];
		}

		for(int i=0;i<90;i++){
			d[i] = 0;
		}

		for(int i=0;i<90;i++){
			sinnoisedata[i*2] = d[i] + a[i];
			sinnoisedata[i*2+1] = a[i] - d[i];
		}
		WriteToTextFile(sinnoisedata,"c:\\reconstruction.txt");
	}

	private void RunWavelet(){
		GenerateSinWave();
		GenerateNoiseData();
		AddNoiseToSinus();
		WaveletProcess();
	}

	public static void main(String[] args){
		new Haarwavelet().RunWavelet();
	}

	//variables
	private float[] sindata;
	private float[] noisedata;
	private float[] sinnoisedata;
	private float[] a;
	private float[] d;
	private BufferedWriter out;
}