celp codec java程序

语言压缩技术celp下的java解码程序。

celp技术是所有 voip技术的基础,几乎所有的voip语音通讯技术都使用了机遇celp压缩算法的扩展算法。

package com.demo;


import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.URL;
import javax.sound.sampled.*;
import javax.swing.*;

public class CelpDec extends JApplet
	implements ActionListener, Runnable
{

	private byte buf[];
	private double k[];
	private double temp[];
	private double grid[];
	private short data[];
	private int mode[];
	private int p[];
	private int c[];
	private double pg[];
	private double cg[];
	private short num;
	private short datanum;
	private double K0[];
	private double K1[];
	private double K2[];
	private double K3[];
	private double K4[];
	private double K5[];
	private double K6[];
	private double K7_9[][];
	private double Pitch_Gain[];
	private double Code_Gain[];
	private double codebook[][];
	private double shift_code[];
	private int pitch;
	private int bit_count;
	private int a;
	private double current[];
	private int frames;
	private int frame_num;
	private URL urls[];
	private JPanel buttonPanel;
	private JTextArea title;
	private Button Man;
	private Button Woman;
	private Button Speech;
	private JTextArea board;
	private String files[] = {
		"d://man.cps", "d://woman.cps"
	};
	private DataInputStream datain;
	private SourceDataLine soundout;
	private boolean eof;
	private Thread decodeThread;
	private byte type;

	public CelpDec()
	{
		buf = new byte[18];
		k = new double[10];
		temp = new double[240];
		grid = new double[10];
		data = new short[240];
		mode = new int[5];
		p = new int[5];
		c = new int[5];
		pg = new double[5];
		cg = new double[5];
		current = new double[48];
		frames = 0;
		frame_num = 872;
		urls = new URL[2];
		buttonPanel = new JPanel();
		title = new JTextArea();
		Man = new Button("Man");
		Woman = new Button("Woman");
		Speech=new Button("Speech");
		board = new JTextArea();
		eof = true;
		type = 0;
	}

	public void run()
	{
		do
		{
			while (!eof && datanum == 18) 
			{
				read();
				excite();
				lattic();
				output();
				frames++;
			}
			soundout.drain();
			soundout.stop();
			if (datanum != 18)
			{
				Man.setEnabled(true);
				Woman.setEnabled(true);
				frames = 0;
				try
				{
					datain.close();
					datain = new DataInputStream(urls[type].openStream());
					board.setText("Push a button");
				}
				catch (Exception e)
				{
					board.setText(e.toString());
				}
				parameter_init();
				eof = true;
			}
			while (eof) ;
		} while (true);
	}

	private void table_init()
	{
		K0 = (new double[] {
			0.0D, 0.99218726160000004D, 0.98828089240000005D, 0.98437452309999995D, 0.98046815389999997D, 0.97656178469999999D, 0.97265541550000001D, 0.96874904630000003D, 0.95312356939999998D, 0.94531083100000002D, 
			0.93749809260000005D, 0.92968535419999998D, 0.92187261570000001D, 0.90624713889999997D, 0.89843440050000001D, 0.88280892359999996D, 0.86718344680000004D, 0.81249427780000005D, 0.7499923704D, 0.67186498610000001D, 
			0.57029938660000001D, 0.45310831019999998D, 0.31247901849999998D, 0.1640369884D, -0.15622425000000001D, -0.31247901849999998D, -0.44529557180000001D, -0.57029938660000001D, -0.66405224770000004D, -0.7499923704D, 
			-0.81249427780000005D, -0.86718344680000004D
		});
		K1 = (new double[] {
			0.0D, 0.6484267708D, 0.60155034029999999D, 0.53904843290000004D, 0.4843592639D, 0.41404461809999998D, 0.34372997220000001D, 0.27341532639999999D, 0.1952879421D, 0.1171605579D, 
			-0.046845912000000003D, -0.12497329629999999D, -0.21091341899999999D, -0.28122806480000001D, -0.3593554491D, -0.42967009490000002D, -0.49217200230000002D, -0.5468611713D, -0.60936307869999995D, -0.65623950929999997D, 
			-0.70311593979999998D, -0.74217963190000003D, -0.77343058570000001D, -0.80468153939999998D, -0.83593249309999995D, -0.85937070829999995D, -0.88280892359999996D, -0.89843440050000001D, -0.91405987730000005D, -0.92968535419999998D, 
			-0.94531083100000002D, -0.99218726160000004D
		});
		K2 = (new double[] {
			0.0D, 0.8749961852D, 0.76561784720000003D, 0.65623950929999997D, 0.55467390969999997D, 0.44529557180000001D, 0.33591723379999999D, 0.2343516343D, 0.12497329629999999D, -0.085909604200000003D, 
			-0.1952879421D, -0.2968535417D, -0.40623187960000001D, -0.51561021760000003D, -0.6249885556D, -0.72655415509999999D
		});
		K3 = (new double[] {
			0.0D, 0.6484267708D, 0.53904843290000004D, 0.42967009490000002D, 0.32029175700000001D, 0.21091341899999999D, 0.101535081D, -0.1171605579D, -0.2265388958D, -0.34372997220000001D, 
			-0.45310831019999998D, -0.56248664820000005D, -0.67186498610000001D, -0.78124332409999997D, -0.89062166200000004D, -0.99218726160000004D
		});
		K4 = (new double[] {
			0.0D, 0.6484267708D, 0.55467390969999997D, 0.46873378700000001D, 0.37498092589999998D, 0.28122806480000001D, 0.18747520370000001D, 0.101535081D, -0.085909604200000003D, -0.17966246529999999D, 
			-0.26560258799999997D, -0.3593554491D, -0.45310831019999998D, -0.5468611713D, -0.64061403240000003D, -0.72655415509999999D
		});
		K5 = (new double[] {
			0.0D, 0.50779747919999996D, 0.4218573565D, 0.33591723379999999D, 0.24216437269999999D, 0.15622425000000001D, 0.070284127299999999D, -0.1093478195D, -0.1952879421D, -0.28122806480000001D, 
			-0.36716818750000002D, -0.46092104859999999D, -0.5468611713D, -0.63280129399999996D, -0.72655415509999999D, -0.81249427780000005D
		});
		K6 = (new double[] {
			0.0D, 0.4218573565D, 0.2343516343D, -0.14841151159999999D, -0.33591723379999999D, -0.52342295599999999D, -0.70311593979999998D, -0.81249427780000005D
		});
		K7_9 = (new double[][] {
			new double[] {
				0.0D, 0.0D, 0.0D
			}, new double[] {
				-0.31363872189999997D, 0.054689169000000003D, -0.20645771660000001D
			}, new double[] {
				-0.53071687980000004D, -0.036500137299999999D, -0.099246192799999994D
			}, new double[] {
				-0.55073702199999996D, 0.33539841910000001D, 0.27210303050000001D
			}, new double[] {
				-0.27835932489999998D, 0.51298562579999996D, 0.084292123199999999D
			}, new double[] {
				-0.22013000890000001D, 0.017365031900000001D, -0.037537766700000003D
			}, new double[] {
				-0.14966277049999999D, 0.19660023800000001D, -0.14307077239999999D
			}, new double[] {
				-0.30442213200000001D, -0.016266365599999999D, 0.14130069889999999D
			}, new double[] {
				-0.1252784814D, 0.11590929899999999D, 0.1894283883D
			}, new double[] {
				-0.52110354930000002D, -0.2937101352D, -0.20682393869999999D
			}, new double[] {
				-0.25925473799999998D, -0.28870509960000001D, -0.048249763500000001D
			}, new double[] {
				-0.0481276894D, -0.22635578479999999D, -0.31324198130000003D
			}, new double[] {
				-0.29203161719999998D, -0.21326334420000001D, -0.29142124699999999D
			}, new double[] {
				-0.0763573107D, -0.10190130310000001D, 0.107760857D
			}, new double[] {
				0.086458937299999997D, -0.247871334D, 0.079989013299999995D
			}, new double[] {
				-0.1102023377D, -0.14441358679999999D, -0.0821558275D
			}, new double[] {
				-0.1204870754D, 0.49531540880000002D, -0.2416760765D
			}, new double[] {
				0.054414502400000002D, 0.50758384960000003D, -0.082461012599999994D
			}, new double[] {
				0.015076143700000001D, 0.1768547624D, -0.4007080294D
			}, new double[] {
				0.22943815419999999D, 0.3003936888D, -0.30826746420000001D
			}, new double[] {
				0.24668111209999999D, 0.305978576D, 0.024719992699999999D
			}, new double[] {
				0.0020142215999999998D, 0.28287606430000001D, 0.2187566759D
			}, new double[] {
				0.1196020386D, 0.1234778893D, -0.082369457100000001D
			}, new double[] {
				-0.018158513099999999D, 0.18378246409999999D, 0.027222510500000002D
			}, new double[] {
				0.47944578389999998D, 0.13202307199999999D, -0.14926602980000001D
			}, new double[] {
				0.48933378090000001D, -0.17654957730000001D, 0.0044557023999999999D
			}, new double[] {
				0.25205236980000001D, -0.063692129299999997D, -0.32184820089999999D
			}, new double[] {
				0.19183935060000001D, -0.33011871700000001D, -0.14102603229999999D
			}, new double[] {
				-0.0096438489999999995D, 0.011017181900000001D, -0.19840083010000001D
			}, new double[] {
				0.087527085199999993D, -0.1025421918D, -0.089541306799999998D
			}, new double[] {
				0.25946836760000003D, -0.015259254700000001D, -0.043855098100000003D
			}, new double[] {
				0.1064180425D, 0.039124729099999998D, 0.1074861904D
			}
		});
		Pitch_Gain = (new double[] {
			-3.9598339999999999D, -3.1899649999999999D, -2.39873D, -1.6899040000000001D, -1.2173119999999999D, -0.88914700000000002D, -0.60615300000000005D, -0.32962999999999998D, 0.39042900000000003D, 0.65291200000000005D, 
			0.88304199999999999D, 1.072519D, 1.434013D, 2.0404100000000001D, 2.8552070000000001D, 3.9337080000000002D
		});
		Code_Gain = (new double[] {
			0.0D, 0.013825D, 0.031220000000000001D, 0.047455999999999998D, 0.066133999999999998D, 0.088260000000000005D, 0.112522D, 0.140324D, 0.172155D, 0.20740400000000001D, 
			0.25437199999999999D, 0.31913200000000003D, 0.41209099999999999D, 0.554338D, 0.80159899999999995D, 0.95291000000000003D
		});
		codebook = (new double[][] {
			new double[] {
				0.12024659710000001D, -0.0148934872D, -0.34725019839999999D, -0.18250625649999999D, -0.1751815907D, -0.31734114629999999D, 0.2686931575D, 0.0941829946D, 0.054324604800000002D, -0.12818165170000001D, 
				0.0260025636D, -0.095159616700000005D, 0.1159738754D, 0.0024415552999999999D, -0.041079167399999998D, -0.139412806D, 0.1290972349D, -0.015686992600000001D, -0.1700543246D, 0.00054934989999999996D, 
				0.1958737716D, 0.0253921748D, 0.0824024904D, 0.222486724D, -0.029481779900000001D, 0.051089544000000001D, -0.033571385000000002D, 0.049075260900000001D, 0.1516205823D, 0.10443752670000001D, 
				-0.19172312759999999D, -0.10010376610000001D, 0.027955807799999999D, 0.046206433499999998D, -0.24244643839999999D, 0.1014466215D, -0.1976438992D, 0.1467985107D, -0.16694134159999999D, -0.30995544159999999D, 
				0.0322285296D, -0.039003845400000001D, 0.092718061399999996D, -0.1157907587D, -0.0272843802D, 0.18183482879999999D, -0.051699932900000002D, 0.092107672599999996D
			}, new double[] {
				0.0469389001D, 0.093999877900000001D, -0.0690960142D, -0.0754440579D, 0.2057620704D, -0.21876335229999999D, -0.17969846789999999D, 0.039309039900000002D, 0.1785997681D, -0.0147103705D, 
				0.050234999699999998D, 0.1046816822D, -0.15534395409999999D, 0.033205151699999998D, 0.049014222099999998D, 0.12348165780000001D, -0.098638832900000001D, -0.015992187000000001D, -0.0078129769000000009D, 0.0498687664D, 
				0.23152047849999999D, -0.0676921199D, -0.010925959799999999D, -0.028871391100000001D, -0.18281145090000001D, -0.0351583959D, -0.1417322835D, -0.027345418999999999D, 0.2655801746D, -0.2691204297D, 
				-0.081670023800000005D, -0.21760361349999999D, -0.1034609046D, -0.069279130800000005D, -0.15583226519999999D, -0.085881706599999996D, -0.1879997558D, 0.038637612199999997D, 0.1100531038D, 0.25239577610000002D, 
				-0.0415064396D, 0.28456326679999999D, -0.049746688599999998D, 0.1583958982D, -0.0954037722D, -0.23152047849999999D, 0.0518830495D, 0.32558139530000002D
			}, new double[] {
				0.018983092199999999D, 0.1221998413D, -0.1895867668D, 0.20319843739999999D, -0.30452298109999998D, -0.30995544159999999D, -0.15827382039999999D, -0.073796008100000005D, 0.0382713789D, -0.1342855399D, 
				-0.12006348040000001D, 0.15577122630000001D, -0.082646645899999996D, 0.075505096699999996D, 0.098455716299999996D, -0.1971555881D, -0.1912958555D, 0.049319416499999998D, 0.0083623268000000001D, 0.0153817982D, 
				0.0061038882000000001D, -0.1752426296D, 0.073246658100000001D, -0.1038271379D, 0.12543490199999999D, -0.010315571000000001D, -0.033510346099999998D, -0.2058231093D, -0.23115424530000001D, 0.0570103156D, 
				0.096929744200000001D, -0.021180491999999999D, -0.16785692490000001D, 0.3481657816D, 0.15082707679999999D, 0.0073246657999999996D, 0.0227675029D, 0.088506378600000005D, -0.19331013859999999D, 0.1073063541D, 
				-0.0297259354D, 0.15290239880000001D, 0.21168284200000001D, -0.031251907500000002D, -0.093023255799999996D, -0.13562839530000001D, 0.097234938699999995D, -0.14283098329999999D
			}, new double[] {
				0.29463468230000001D, 0.20014649330000001D, 0.069523286300000001D, -0.0565220045D, 0.11402063110000001D, -0.020142831D, -0.084599890100000005D, -0.0067142770000000003D, -0.134224501D, 0.0280168467D, 
				-0.071598608300000005D, -0.25428798139999997D, -0.051455777299999998D, -0.19910883230000001D, 0.24568149910000001D, -0.094732344499999996D, -0.16034914240000001D, -0.129585546D, 0.092412866999999996D, 0.0504791552D, 
				-0.024537630500000001D, -0.0058597325999999996D, 0.1953244217D, 0.0133675151D, 0.2132698529D, -0.021790880799999999D, -0.060062259700000002D, -0.037233717899999998D, -0.0078129769000000009D, -0.098089483000000005D, 
				0.17652444610000001D, -0.041628517400000002D, 0.26112433619999997D, -0.0809985961D, -0.1936763718D, -0.0061649271000000002D, -0.0771531466D, -0.020875297599999999D, 0.064151864700000005D, 0.1566868095D, 
				-0.1544894098D, 0.073979124699999996D, 0.14099981689999999D, -0.34456448760000002D, 0.16694134159999999D, 0.2535555149D, 0.22450100710000001D, 0.0100714155D
			}, new double[] {
				-0.26710614659999998D, 0.1085881707D, -0.26808276869999997D, -0.0073246657999999996D, 0.0028688274000000001D, 0.16401147529999999D, 0.11463102D, 0.058963559800000002D, -0.13013489589999999D, -0.095770005500000005D, 
				0.12842580719999999D, -0.1143258256D, 0.14362448880000001D, -0.049380455400000002D, 0.0184337423D, 0.042483061699999998D, 0.078740157500000005D, -0.045412927999999998D, 0.073246658100000001D, 0.1467985107D, 
				0.36513459069999998D, 0.2097906366D, -0.1872672893D, 0.0429103339D, -0.025209058199999999D, -0.014954525999999999D, -0.034975279300000002D, -0.023438930600000001D, -0.10816089850000001D, -0.14142708909999999D, 
				0.2183360801D, 0.2928645547D, 0.0195324422D, -0.071537569400000001D, 0.29707623760000001D, -0.16950497470000001D, -0.0061649271000000002D, 0.10071415490000001D, -0.039125923200000003D, 0.0895440396D, 
				-0.080937557199999996D, 0.1953244217D, 0.25215162060000001D, -0.0272843802D, -0.0985167552D, 0.1189037417D, -0.0051272660999999997D, 0.16718549720000001D
			}
		});
	}

	private void parameter_init()
	{
		for (num = 0; num < 10; num++)
			grid[num] = 0.0D;

		datanum = 18;
		shift_code = new double[175];
		for (num = 0; num < 48; num++)
		{
			shift_code[num] = codebook[0][num] * 0.078125D;
			shift_code[num + 48] = codebook[1][num] * 0.078125D;
			shift_code[num + 96] = codebook[2][num] * 0.078125D;
		}

		for (num = 0; num < 31; num++)
			shift_code[num + 144] = codebook[3][num] * 0.078125D;

		pitch = 0;
		frames = 0;
	}

	private void stream_init()
	{
		AudioFormat audioFormat = new AudioFormat(8000F, 16, 1, true, false);
		javax.sound.sampled.DataLine.Info dataLineInfo = new javax.sound.sampled.DataLine.Info(javax.sound.sampled.SourceDataLine.class, audioFormat);
		try
		{
			soundout = (SourceDataLine)AudioSystem.getLine(dataLineInfo);
			soundout.open(audioFormat);
		}
		catch (LineUnavailableException e)
		{
			board.setText(e.toString());
		}
		try
		{
			//urls[0] = new URL(getCodeBase(), files[0]);
			//urls[1] = new URL(getCodeBase(), files[1]);
			urls[0] = new URL(getCodeBase(), files[0]);
			urls[1] = new URL(getCodeBase(), files[1]);			
		}
		catch (Exception e)
		{
			board.setText(e.toString());
		}
		try
		{
			//datain = new DataInputStream(urls[type].openStream());
			switch(type){
			case 0:{
				datain = new DataInputStream(new java.io.FileInputStream(new java.io.File("d://man.cps")));
				break;
			}
			case 1:{
				datain = new DataInputStream(new java.io.FileInputStream(new java.io.File("d://women.cps")));
				break;
			}
			case 2:{
				datain = new DataInputStream(new java.io.FileInputStream(new java.io.File("d://man.cps")));
				break;
			}
			}
					//urls[type].openStream());
		}
		catch (Exception e) {e.printStackTrace(); }
	}

	private void panal_init()
	{
		setLayout(null);
		getContentPane().setBackground(Color.DARK_GRAY);
		Font f = new Font("Roman", 0, 12);
		Man.addActionListener(this);
		Woman.addActionListener(this);
		Speech.addActionListener(this);
		title.setBounds(50, 10, 380, 30);
		board.setBounds(50, 100, 250, 50);
		Man.setBounds(300, 70, 60, 25);
		Woman.setBounds(300, 120, 60, 25);
		Speech.setBounds(300, 160, 60, 25);
		title.setEditable(false);
		title.setText("声音解码");
		title.setBackground(Color.DARK_GRAY);
		title.setForeground(Color.WHITE);
		//title.setFont(new Font("Arial", 1, 30));
		board.setEditable(false);
		board.setText("点击要播放的按钮");
		board.setBackground(Color.DARK_GRAY);
		board.setForeground(Color.lightGray);
		//board.setFont(new Font("Arial", 1, 26));
		Man.setFont(f);
		Woman.setFont(f);
		Speech.setFont(f);
		add(board);
		add(title);
		add(Man);
		add(Woman);
		add(Speech);
	}

	public void init()
	{
		table_init();
		parameter_init();
		stream_init();
		panal_init();
		soundout.start();
		decodeThread = new Thread(this);
		decodeThread.start();
	}

	private int getbit(int len)
	{
		bit_count -= len;
		int num = a >>> bit_count;
		a = a % (1 << bit_count);
		return num;
	}

	private void read()
	{
		try
		{
			datanum = (short)datain.read(buf, 0, 18);
		}
		catch (IOException e)
		{
			datanum = 0;
		}
		int buf1[] = new int[18];
		for (int j = 0; j < 18; j++)
			if (buf[j] < 0)
				buf1[j] = buf[j] + 256;
			else
				buf1[j] = buf[j];

		for (int j = 0; j < 6; j++)
		{
			buf1[j] = buf1[j * 3] << 16;
			buf1[j] += buf1[j * 3 + 1] << 8;
			buf1[j] += buf1[j * 3 + 2];
		}

		if (datanum == 18)
		{
			bit_count = 24;
			a = buf1[0];
			k[0] = K0[getbit(5)];
			k[1] = K1[getbit(5)];
			k[2] = K2[getbit(4)];
			k[3] = K3[getbit(4)];
			k[4] = K4[getbit(4)];
			a = a << 24;
			a += buf1[1];
			bit_count = 26;
			k[5] = K5[getbit(4)];
			k[6] = K6[getbit(3)];
			int num1 = getbit(5);
			k[7] = K7_9[num1][0];
			k[8] = K7_9[num1][1];
			k[9] = K7_9[num1][2];
			mode[0] = getbit(1);
			if (mode[0] == 1)
			{
				p[0] = getbit(7);
				c[0] = getbit(6);
			} else
			{
				p[0] = getbit(3);
				c[0] = getbit(10);
			}
			a = buf1[2];
			bit_count = 24;
			pg[0] = Pitch_Gain[getbit(4)];
			cg[0] = Code_Gain[getbit(4)];
			mode[1] = getbit(1);
			if (mode[1] == 1)
			{
				p[1] = getbit(7);
				c[1] = getbit(6);
			} else
			{
				p[1] = getbit(3);
				c[1] = getbit(10);
			}
			a = a << 24;
			a += buf1[3];
			bit_count = 26;
			pg[1] = Pitch_Gain[getbit(4)];
			cg[1] = Code_Gain[getbit(4)];
			mode[2] = getbit(1);
			if (mode[2] == 1)
			{
				p[2] = getbit(7);
				c[2] = getbit(6);
			} else
			{
				p[2] = getbit(3);
				c[2] = getbit(10);
			}
			a = a << 24;
			a += buf1[4];
			bit_count = 28;
			pg[2] = Pitch_Gain[getbit(4)];
			cg[2] = Code_Gain[getbit(4)];
			mode[3] = getbit(1);
			if (mode[3] == 1)
			{
				p[3] = getbit(7);
				c[3] = getbit(6);
			} else
			{
				p[3] = getbit(3);
				c[3] = getbit(10);
			}
			a = a << 24;
			a += buf1[5];
			bit_count = 30;
			pg[3] = Pitch_Gain[getbit(4)];
			cg[3] = Code_Gain[getbit(4)];
			mode[4] = getbit(1);
			if (mode[4] == 1)
			{
				p[4] = getbit(7);
				c[4] = getbit(6);
			} else
			{
				p[4] = getbit(3);
				c[4] = getbit(10);
			}
			pg[4] = Pitch_Gain[getbit(4)];
			cg[4] = Code_Gain[getbit(4)];
		}
	}

	void excite()
	{
		double count = 0.0D;
		for (int i = 0; i < 5; i++)
		{
			int j;
			for (j = 0; j < 48; j++)
				current[j] = 0.0D;

			if (mode[i] == 1)
			{
				for (j = 0; j < 48; j++)
					temp[i * 48 + j] = shift_code[j + p[i]] * pg[i];

label0:
				switch (c[i] % 4)
				{
				default:
					break;

				case 0: // '\0'
				{
					c[i] /= 4;
					for (int n = 0; n < 4; n++)
					{
						int bit = c[i] % 2;
						if (bit == 1)
							for (j = 0; j < 48; j++)
								current[j] += codebook[n][j];

						else
							for (j = 0; j < 48; j++)
								current[j] -= codebook[n][j];

						c[i] /= 2;
					}

					break;
				}

				case 1: // '\001'
				{
					c[i] /= 4;
					int n = 0;
					do
					{
						if (n >= 4)
							break label0;
						int bit = c[i] % 2;
						if (bit == 1)
							for (j = 0; j < 48; j++)
								current[j] += codebook[n][47 - j];

						else
							for (j = 0; j < 48; j++)
								current[j] -= codebook[n][47 - j];

						c[i] /= 2;
						n++;
					} while (true);
				}

				case 2: // '\002'
				{
					c[i] /= 4;
					int n = 0;
					do
					{
						if (n >= 4)
							break label0;
						int bit = c[i] % 2;
						int sign = 1;
						if (bit == 1)
							for (j = 0; j < 48; j++)
							{
								current[j] += codebook[n][j] * (double)sign;
								sign = -sign;
							}

						else
							for (j = 0; j < 48; j++)
							{
								current[j] -= codebook[n][j] * (double)sign;
								sign = -sign;
							}

						c[i] /= 2;
						n++;
					} while (true);
				}

				case 3: // '\003'
				{
					c[i] /= 4;
					int n = 0;
					do
					{
						if (n >= 4)
							break label0;
						int bit = c[i] % 2;
						int sign = 1;
						if (bit == 1)
							for (j = 0; j < 48; j++)
							{
								current[j] += codebook[n][47 - j] * (double)sign;
								sign = -sign;
							}

						else
							for (j = 0; j < 48; j++)
							{
								current[j] -= codebook[n][47 - j] * (double)sign;
								sign = -sign;
							}

						c[i] /= 2;
						n++;
					} while (true);
				}
				}
				pitch = p[i];
				for (j = 0; j < 48; j++)
					current[j] /= 2D;

			} else
			{
				pitch = (pitch + p[i]) - 4;
				if (pitch < 0)
					pitch = 0;
				if (pitch > 127)
					pitch = 127;
				System.out.println(pitch);
				for (j = 0; j < 48; j++)
					temp[i * 48 + j] = shift_code[j + pitch] * pg[i];

				count = 0.0D;
label1:
				switch (c[i] % 4)
				{
				default:
					break;

				case 0: // '\0'
				{
					c[i] /= 4;
					for (int n = 0; n < 5; n++)
					{
						int bit = c[i] % 3;
						c[i] /= 3;
						switch (bit)
						{
						case 0: // '\0'
						default:
							break;

						case 2: // '\002'
							count++;
							for (j = 0; j < 48; j++)
								current[j] += codebook[n][j];

							break;

						case 1: // '\001'
							count++;
							for (j = 0; j < 48; j++)
								current[j] -= codebook[n][j];

							break;
						}
					}

					break;
				}

				case 3: // '\003'
				{
					c[i] /= 4;
					int n = 0;
					do
					{
						if (n >= 5)
							break label1;
						int bit = c[i] % 3;
						c[i] /= 3;
						int sign = 1;
						switch (bit)
						{
						case 0: // '\0'
						default:
							break;

						case 2: // '\002'
							count++;
							for (j = 0; j < 48; j++)
							{
								current[j] += codebook[n][47 - j] * (double)sign;
								sign = -sign;
							}

							break;

						case 1: // '\001'
							count++;
							for (j = 0; j < 48; j++)
							{
								current[j] -= codebook[n][47 - j] * (double)sign;
								sign = -sign;
							}

							break;
						}
						n++;
					} while (true);
				}

				case 1: // '\001'
				{
					c[i] /= 4;
					int n = 0;
					do
					{
						if (n >= 5)
							break label1;
						int bit = c[i] % 3;
						c[i] /= 3;
						switch (bit)
						{
						case 0: // '\0'
						default:
							break;

						case 2: // '\002'
							count++;
							for (j = 0; j < 48; j++)
								current[j] += codebook[n][47 - j];

							break;

						case 1: // '\001'
							count++;
							for (j = 0; j < 48; j++)
								current[j] -= codebook[n][47 - j];

							break;
						}
						n++;
					} while (true);
				}

				case 2: // '\002'
				{
					c[i] /= 4;
					int n = 0;
					do
					{
						if (n >= 5)
							break label1;
						int bit = c[i] % 3;
						c[i] /= 3;
						int sign = 1;
						switch (bit)
						{
						case 0: // '\0'
						default:
							break;

						case 2: // '\002'
							count++;
							for (j = 0; j < 48; j++)
							{
								current[j] += codebook[n][j] * (double)sign;
								sign = -sign;
							}

							break;

						case 1: // '\001'
							count++;
							for (j = 0; j < 48; j++)
							{
								current[j] -= codebook[n][j] * (double)sign;
								sign = -sign;
							}

							break;
						}
						n++;
					} while (true);
				}
				}
				count = Math.sqrt(count);
				for (j = 0; j < 48; j++)
					current[j] /= count;

			}
			for (j = 0; j < 48; j++)
				temp[i * 48 + j] += current[j] * cg[i];

			for (j = 0; j < 100; j++)
				shift_code[j] = shift_code[j + 48];

			for (; j < 148; j++)
				shift_code[j] = temp[(j - 100) + 48 * i];

			if (mode[i] == 0)
				p[i] = pitch;
			if (p[i] <= 121)
			{
				for (j = 0; j < 27; j++)
					shift_code[j + 148] = shift_code[j + p[i]];

				continue;
			}
			for (j = 0; j + p[i] < 148; j++)
				shift_code[j + 148] = shift_code[j + p[i]];

			p[i] -= j;
			for (; j < 27; j++)
				shift_code[j + 148] = shift_code[j + p[i]];

		}

	}

	private void lattic()
	{
		for (short i = 0; i < 240; i++)
		{
			for (short j = 9; j >= 0; j--)
			{
				temp[i] += k[j] * grid[j];
				grid[j] -= temp[i] * k[j];
			}

			for (short j = 9; j > 0; j--)
				grid[j] = grid[j - 1];

			grid[0] = temp[i];
		}

	}

	void output()
	{
		byte buffer[] = new byte[480];
		for (short i = 0; i < 240; i++)
		{
			if (temp[i] >= 1.0D)
				temp[i] = 1.0D;
			else
			if (temp[i] <= -1D)
				temp[i] = -1D;
			data[i] = (short)(int)(temp[i] * 32767D);
			buffer[i * 2] = (byte)(data[i] & 0xff);
			buffer[i * 2 + 1] = (byte)(data[i] >>> 8);
		}

		soundout.write(buffer, 0, 480);
	}

	private void initDatainStream(){
		try{
		switch(type){
		case 0:{
			datain = new DataInputStream(new java.io.FileInputStream(new java.io.File("d://man.cps")));
			break;
		}
		case 1:{
			datain = new DataInputStream(new java.io.FileInputStream(new java.io.File("d://woman.cps")));
			break;
		}
		case 2:{
			datain = new DataInputStream(new java.io.FileInputStream(new java.io.File("d://man.cps")));
			break;
		}
		}
		}catch(Exception e){
			e.printStackTrace();
		}
		
	}
	
	public void actionPerformed(ActionEvent action)
	{
		java.util.Properties p;
		Man.setEnabled(false);
		Woman.setEnabled(false);
		if (action.getSource() == Man)
			type = 0;
		else
		if (action.getSource() == Woman)
			type = 1;
		else	
		if (action.getSource() == Speech)
			type = 2;
		
		board.setText("Now decoding...");
		initDatainStream();
		try
		{
		//	datain = new DataInputStream(urls[type].openStream());
		}
		catch (Exception e)
		{
			board.setText(e.toString());
		}
		parameter_init();
		eof = false;
		soundout.start();
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值