语言压缩技术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(); } }