/* * JBoss, Home of Professional Open Source * Copyright 2011, Red Hat, Inc. and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.restcomm.media.codec.g729; public class LspDec { /* static memory */ float freq_prev[][] = new float[LD8KConstants.MA_NP][LD8KConstants.M]; /* previous LSP vector */ float freq_prev_reset[] = new float[]{ /* previous LSP vector(init) */ (float)0.285599, (float)0.571199, (float)0.856798, (float)1.142397, (float)1.427997, (float)1.713596, (float)1.999195, (float)2.284795, (float)2.570394, (float)2.855993 }; /* PI*(float)(j+1)/(float)(M+1) */ /* static memory for frame erase operation */ static int prev_ma; /* previous MA prediction coef.*/ static float prev_lsp[] = new float[LD8KConstants.M]; /* previous LSP vector */ /*---------------------------------------------------------------------------- * Lsp_decw_reset - set the previous LSP vectors *---------------------------------------------------------------------------- */ void lsp_decw_reset() { int i; for(i=0; i<LD8KConstants.MA_NP; i++) Util.copy (freq_prev_reset, freq_prev[i], LD8KConstants.M ); prev_ma = 0; Util.copy (freq_prev_reset, prev_lsp, LD8KConstants.M ); return; } /*---------------------------------------------------------------------------- * lsp_iqua_cs - LSP main quantization routine *---------------------------------------------------------------------------- */ public void lsp_iqua_cs( int prm[], int prms, /* input : codes of the selected LSP */ float lsp_q[], /* output: Quantized LSP parameters */ int erase /* input : frame erase information */ ) { int mode_index; int code0; int code1; int code2; float buf[] = new float[LD8KConstants.M]; if(erase==0) /* Not frame erasure */ { mode_index = (prm[prms+0] >> LD8KConstants.NC0_B) & 1; code0 = prm[prms+0] & (short)(LD8KConstants.NC0 - 1); code1 = (prm[prms+1] >> LD8KConstants.NC1_B) & (short)(LD8KConstants.NC1 - 1); code2 = prm[prms+1] & (short)(LD8KConstants.NC1 - 1); LspGetq.lsp_get_quant(TabLD8k.lspcb1, TabLD8k.lspcb2, code0, code1, code2, TabLD8k.fg[mode_index], freq_prev, lsp_q, TabLD8k.fg_sum[mode_index]); Util.copy(lsp_q, prev_lsp, LD8KConstants.M ); prev_ma = mode_index; } else /* Frame erased */ { Util.copy(prev_lsp, lsp_q, LD8KConstants.M ); /* update freq_prev */ LspGetq.lsp_prev_extract(prev_lsp, buf, TabLD8k.fg[prev_ma], freq_prev, TabLD8k.fg_sum_inv[prev_ma]); LspGetq.lsp_prev_update(buf, freq_prev); } return; } /*---------------------------------------------------------------------------- * d_lsp - decode lsp parameters *---------------------------------------------------------------------------- */ public void d_lsp( int index[], int is, /* input : indexes */ float lsp_q[], /* output: decoded lsp */ int bfi /* input : frame erase information */ ) { int i; lsp_iqua_cs(index, is, lsp_q,bfi); /* decode quantized information */ /* Convert LSFs to LSPs */ for (i=0; i<LD8KConstants.M; i++ ) lsp_q[i] = (float)Math.cos(lsp_q[i]); return; } }