package org.mobicents.media.server.impl.codec.g729;
public class LspGetq {
/*----------------------------------------------------------------------------
* lsp_get_quant - reconstruct quantized LSP parameter and check the stabilty
*----------------------------------------------------------------------------
*/
public static void lsp_get_quant(
float lspcb1[][], /*input : first stage LSP codebook */
float lspcb2[][], /*input : Second stage LSP codebook */
int code0, /*input : selected code of first stage */
int code1, /*input : selected code of second stage*/
int code2, /*input : selected code of second stage*/
float fg[][], /*input : MA prediction coef. */
float freq_prev[][], /*input : previous LSP vector */
float lspq[], /*output: quantized LSP parameters */
float fg_sum[] /*input : present MA prediction coef. */
)
{
int j;
float buf[] = new float[LD8KConstants.M];
for(j=0; j<LD8KConstants.NC; j++)
buf[j] = lspcb1[code0][j] + lspcb2[code1][j];
for(j=LD8KConstants.NC; j<LD8KConstants.M; j++)
buf[j] = lspcb1[code0][j] + lspcb2[code2][j];
/* check */
lsp_expand_1_2(buf, LD8KConstants.GAP1);
lsp_expand_1_2(buf, LD8KConstants.GAP2);
/* reconstruct quantized LSP parameters */
lsp_prev_compose(buf, lspq, fg, freq_prev, fg_sum);
lsp_prev_update(buf, freq_prev);
lsp_stability( lspq ); /* check the stabilty */
return;
}
/*----------------------------------------------------------------------------
* lsp_expand_1 - check for lower (0-4)
*----------------------------------------------------------------------------
*/
public static void lsp_expand_1(
float buf[], /* in/out: lsp vectors */
float gap
)
{
int j;
float diff, tmp;
for(j=1; j<LD8KConstants.NC; j++) {
diff = buf[j-1] - buf[j];
tmp = (diff + gap) * (float)0.5;
if(tmp > 0) {
buf[j-1] -= tmp;
buf[j] += tmp;
}
}
return;
}
/*----------------------------------------------------------------------------
* lsp_expand_2 - check for higher (5-9)
*----------------------------------------------------------------------------
*/
public static void lsp_expand_2(
float buf[], /*in/out: lsp vectors */
float gap
)
{
int j;
float diff, tmp;
for(j=LD8KConstants.NC; j<LD8KConstants.M; j++) {
diff = buf[j-1] - buf[j];
tmp = (diff + gap) * (float)0.5;
if(tmp > 0) {
buf[j-1] -= tmp;
buf[j] += tmp;
}
}
return;
}
/*----------------------------------------------------------------------------
* lsp_expand_1_2 - ..
*----------------------------------------------------------------------------
*/
public static void lsp_expand_1_2(
float buf[], /*in/out: LSP parameters */
float gap /*input */
)
{
int j;
float diff, tmp;
for(j=1; j<LD8KConstants.M; j++) {
diff = buf[j-1] - buf[j];
tmp = (diff + gap) * (float)0.5;
if(tmp > 0) {
buf[j-1] -= tmp;
buf[j] += tmp;
}
}
return;
}
/*
Functions which use previous LSP parameter (freq_prev).
*/
/*
compose LSP parameter from elementary LSP with previous LSP.
*/
public static void lsp_prev_compose(
float lsp_ele[], /* (i) Q13 : LSP vectors */
float lsp[], /* (o) Q13 : quantized LSP parameters */
float fg[][], /* (i) Q15 : MA prediction coef. */
float freq_prev[][], /* (i) Q13 : previous LSP vector */
float fg_sum[] /* (i) Q15 : present MA prediction coef. */
)
{
int j, k;
for(j=0; j<LD8KConstants.M; j++) {
lsp[j] = lsp_ele[j] * fg_sum[j];
for(k=0; k<LD8KConstants.MA_NP; k++) lsp[j] += freq_prev[k][j]*fg[k][j];
}
return;
}
/*
extract elementary LSP from composed LSP with previous LSP
*/
public static void lsp_prev_extract(
float lsp[], /* (i) Q13 : unquantized LSP parameters */
float lsp_ele[], /* (o) Q13 : target vector */
float fg[][], /* (i) Q15 : MA prediction coef. */
float freq_prev[][], /* (i) Q13 : previous LSP vector */
float fg_sum_inv[] /* (i) Q12 : inverse previous LSP vector */
)
{
int j, k;
/*----- compute target vectors for each MA coef.-----*/
for( j = 0 ; j < LD8KConstants.M ; j++ ) {
lsp_ele[j]=lsp[j];
for ( k = 0 ; k < LD8KConstants.MA_NP ; k++ )
lsp_ele[j] -= freq_prev[k][j] * fg[k][j];
lsp_ele[j] *= fg_sum_inv[j];
}
return;
}
/*
update previous LSP parameter
*/
public static void lsp_prev_update(
float lsp_ele[], /* input : LSP vectors */
float freq_prev[][] /* input/output: previous LSP vectors */
)
{
int k;
for ( k = LD8KConstants.MA_NP-1 ; k > 0 ; k-- )
Util.copy(freq_prev[k-1], freq_prev[k], LD8KConstants.M);
Util. copy(lsp_ele, freq_prev[0], LD8KConstants.M);
return;
}
/*----------------------------------------------------------------------------
* lsp_stability - check stability of lsp coefficients
*----------------------------------------------------------------------------
*/
public static void lsp_stability(
float buf[] /*in/out: LSP parameters */
)
{
int j;
float diff, tmp;
for(j=0; j<LD8KConstants.M-1; j++) {
diff = buf[j+1] - buf[j];
if( diff < (float)0. ) {
tmp = buf[j+1];
buf[j+1] = buf[j];
buf[j] = tmp;
}
}
if( buf[0] < LD8KConstants.L_LIMIT ) {
buf[0] = LD8KConstants.L_LIMIT;
System.out.println("warning LSP Low \n");
}
for(j=0; j<LD8KConstants.M-1; j++) {
diff = buf[j+1] - buf[j];
if( diff < LD8KConstants.GAP3 ) {
buf[j+1] = buf[j]+ LD8KConstants.GAP3;
}
}
if( buf[LD8KConstants.M-1] > LD8KConstants.M_LIMIT ) {
buf[LD8KConstants.M-1] = LD8KConstants.M_LIMIT;
System.out.println("warning LSP High \n");
}
return;
}
}