📄 dec_ld8e.c
字号:
/* Version 1.1 Last modified: February 1998 */
/* -------------------------------------------------------------------- */
/* Decod_ld8e and Init_Decod_ld8e. */
/* */
/* (C) Original Copyright 1995, AT&T, France Telecom, NTT, */
/* Universite de Sherbrooke. */
/* All rights reserved. */
/* */
/* */
/* Modified to perform higher bit-rate extension of G729 at 11.8 kb/s */
/* Bit rate : 11.8 kb/s */
/* */
/* (C) Copyright : France Telecom, Universite de Sherbrooke. */
/* All rights reserved. */
/* */
/* -------------------------------------------------------------------- */
/*-----------------------------------------------------------------*
* Functions Init_Decod_ld8e and Decod_ld8e *
*-----------------------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "typedef.h"
#include "basic_op.h"
#include "ld8k.h"
#include "ld8e.h"
/*---------------------------------------------------------------*
* Decoder constant parameters (defined in "ld8k.h") *
*---------------------------------------------------------------*
* L_FRAME : Frame size. *
* L_SUBFR : Sub-frame size. *
* M : LPC order. *
* MP1 : LPC order+1 *
* PIT_MIN : Minimum pitch lag. *
* PIT_MAX : Maximum pitch lag. *
* L_INTERPOL : Length of filter for interpolation *
* PRM_SIZE : Size of vector containing analysis parameters *
*---------------------------------------------------------------*/
/*--------------------------------------------------------*
* Static memory allocation. *
*--------------------------------------------------------*/
/* Excitation vector */
static Word16 old_exc[L_FRAME+PIT_MAX+L_INTERPOL];
static Word16 *exc;
/* Lsp (Line spectral pairs) */
static Word16 lsp_old[M]= { 30000, 26000, 21000, 15000, 8000, 0,
-8000,-15000,-21000,-26000};
/* Filter's memory */
static Word16 mem_syn[M_BWD];
static Word16 sharp; /* pitch sharpening of previous frame */
static Word16 prev_T0; /* integer delay of previous frame */
static Word16 prev_T0_frac; /* integer delay of previous frame */
static Word16 gain_code; /* Code gain */
static Word16 gain_pitch; /* Pitch gain */
/* for the backward analysis */
static Word32 rexp[M_BWDP1];
static Word16 A_bwd_mem[M_BWDP1];
static Word16 A_t_bwd_mem[2*M_BWDP1];
static Word16 prev_voicing, prev_bfi, prev_mode, C_fe_fix, C_int ;
static Word16 prev_filter[M_BWDP1]; /* Previous selected filter */
static Word16 prev_pitch;
static Word16 stat_pitch;
static Word16 pitch_sta, frac_sta;
/* Last backward A(z) for case of unstable filter */
static Word16 old_A_bwd[M_BWDP1];
static Word16 old_rc_bwd[2];
static Word16 gain_pit_mem;
static Word16 gain_cod_mem;
static Word16 c_muting;
static int count_bfi;
static int stat_bwd;
static Word16 freq_prev[MA_NP][M]; /* Q13 */
/* static memory for frame erase operation */
static Word16 prev_ma; /* previous MA prediction coef.*/
static Word16 prev_lsp[M]; /* previous LSP vector */
/*-----------------------------------------------------------------*
* Function Init_Decod_ld8e *
* ~~~~~~~~~~~~~~~ *
* *
* ->Initialization of variables for the decoder section. *
* *
*-----------------------------------------------------------------*/
void Init_Decod_ld8e(void)
{
/* Initialize static pointer */
exc = old_exc + PIT_MAX + L_INTERPOL;
/* Static vectors to zero */
Set_zero(old_exc, PIT_MAX+L_INTERPOL);
Set_zero(mem_syn, M_BWD);
sharp = SHARPMIN;
prev_T0 = 60;
prev_T0_frac = 0;
gain_code = 0;
gain_pitch = 0;
Lsp_decw_resete(freq_prev, prev_lsp, &prev_ma);
Set_zero(A_bwd_mem, M_BWDP1);
Set_zero(A_t_bwd_mem, M_BWDP1);
A_bwd_mem[0] = 4096;
A_t_bwd_mem[0] = 4096;
prev_voicing = 0;
prev_bfi = 0;
prev_mode = 0;
C_fe_fix = 0; /* Q12 */
C_int = 4506; /* Filter interpolation parameter */
Set_zero(prev_filter, M_BWDP1);
prev_filter[0] = 4096;
prev_pitch = 30;
stat_pitch = 0;
Set_zero(old_A_bwd, M_BWDP1);
old_A_bwd[0]= 4096;
Set_zero(old_rc_bwd, 2);
gain_pit_mem = 0;
gain_cod_mem = 0;
c_muting = 32767;
count_bfi = 0;
stat_bwd = 0;
return;
}
/*-----------------------------------------------------------------*
* Function Decod_ld8e *
* ~~~~~~~~~~ *
* ->Main decoder routine. *
* *
*-----------------------------------------------------------------*/
void Decod_ld8e (
Word16 parm[], /* (i) : vector of synthesis parameters
parm[0] = bad frame indicator (bfi) */
Word16 rate, /* input : rate selector/frame =0 8kbps,= 1 11.8 kbps*/
Word16 voicing, /* (i) : voicing decision from previous frame */
Word16 synth_buf[], /* (i/o) : synthesis speech */
Word16 Az_dec[], /* (o) : decoded LP filter in 2 subframes */
Word16 *T0_first, /* (o) : decoded pitch lag in first subframe */
Word16 *bwd_dominant, /* (o) : */
Word16 *m_pst /* (o) : LPC order for postfilter */
)
{
/* Scalars */
Word16 i, j, i_subfr;
Word16 T0, T0_frac, index;
Word16 bfi;
Word16 mode; /* Backward / Forward mode indication */
Word16 g_p, g_c; /* fixed and adaptive codebook gain */
Word16 bad_pitch; /* bad pitch indicator */
Word16 tmp, tmp1, tmp2;
Word16 sat_filter;
Word32 L_temp;
Word32 energy;
/* Tables */
Word16 A_t_bwd[2*M_BWDP1]; /* LPC Backward filter */
Word16 A_t_fwd[2*MP1]; /* LPC Forward filter */
Word16 rc_bwd[M_BWD]; /* LPC backward reflection coefficients */
Word32 r_bwd[M_BWDP1]; /* Autocorrelations (backward) */
Word16 r_l_bwd[M_BWDP1]; /* Autocorrelations low (backward) */
Word16 r_h_bwd[M_BWDP1]; /* Autocorrelations high (backward) */
Word16 lsp_new[M]; /* LSPs */
Word16 code[L_SUBFR]; /* ACELP codevector */
Word16 *pA_t; /* Pointer on A_t */
Word16 stationnary;
Word16 m_aq;
Word16 *synth;
extern Flag Overflow;
/* Test bad frame indicator (bfi) */
bfi = *parm++;
/* Decoding the Backward/Forward LPC decision */
/* ------------------------------------------ */
if( rate == 0) mode = 0;
else {
if (bfi != 0) {
mode = prev_mode; /* Frame erased => mode = previous mode */
*parm++ = mode;
}
else {
mode = *parm++;
}
if(prev_bfi != 0) voicing = prev_voicing;
}
if( bfi == 0) {
c_muting = 32767;
count_bfi = 0;
}
/* -------------------- */
/* Backward LP analysis */
/* -------------------- */
if (rate == 1) {
/* LPC recursive Window as in G728 */
autocorr_hyb_window(synth_buf, r_bwd, rexp); /* Autocorrelations */
Lag_window_bwd(r_bwd, r_h_bwd, r_l_bwd); /* Lag windowing */
/* Fixed Point Levinson (as in G729) */
Levinsone(M_BWD, r_h_bwd, r_l_bwd, &A_t_bwd[M_BWDP1], rc_bwd,
old_A_bwd, old_rc_bwd );
/* Tests saturation of A_t_bwd */
sat_filter = 0;
for (i=M_BWDP1; i<2*M_BWDP1; i++) if (A_t_bwd[i] >= 32767) sat_filter = 1;
if (sat_filter == 1) Copy(A_t_bwd_mem, &A_t_bwd[M_BWDP1], M_BWDP1);
else Copy(&A_t_bwd[M_BWDP1], A_t_bwd_mem, M_BWDP1);
/* Additional bandwidth expansion on backward filter */
Weight_Az(&A_t_bwd[M_BWDP1], GAMMA_BWD, M_BWD, &A_t_bwd[M_BWDP1]);
}
/*--------------------------------------------------*
* Update synthesis signal for next frame. *
*--------------------------------------------------*/
Copy(&synth_buf[L_FRAME], &synth_buf[0], MEM_SYN_BWD);
if(mode == 1) {
if ((C_fe_fix != 0)) {
/* Interpolation of the backward filter after a bad frame */
/* A_t_bwd(z) = C_fe . A_bwd_mem(z) + (1 - C_fe) . A_t_bwd(z) */
/* ---------------------------------------------------------- */
tmp = sub(4096, C_fe_fix);
pA_t = A_t_bwd + M_BWDP1;
for (i=0; i<M_BWDP1; i++) {
L_temp = L_mult(pA_t[i], tmp);
L_temp = L_shr(L_temp, 13);
tmp1 = extract_l(L_temp);
L_temp = L_mult(A_bwd_mem[i], C_fe_fix);
L_temp = L_shr(L_temp, 13);
tmp2 = extract_l(L_temp);
pA_t[i] = add(tmp1, tmp2);
}
}
}
/* Memorize the last good backward filter when the frame is erased */
if ((bfi != 0)&&(prev_bfi == 0))
for (i=0; i<M_BWDP1; i++) A_bwd_mem[i] = A_t_bwd[i+M_BWDP1];
/* ---------------------------- */
/* LPC decoding in forward mode */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -