?? g729a_dec_ld8a.c
字號:
#include "../Common/typedef.h"
#include "../Include/G729A_basic_op.h"
#include "../Include/G729A_ld8a.h"
static Word16 G729A_old_exc[G729A_L_FRAME+G729A_PIT_MAX+G729A_L_INTERPOL];
static Word16 *G729A_exc;
static Word16 G729A_lsp_old[G729A_M]={
30000, 26000, 21000, 15000, 8000, 0, -8000,-15000,-21000,-26000};
static Word16 G729A_mem_syn[G729A_M];
static Word16 G729A_sharp;
static Word16 G729A_old_T0;
static Word16 G729A_gain_code;
static Word16 G729A_gain_pitch;
void G729AInit_Decod_ld8a(void)
{
G729A_exc = G729A_old_exc + G729A_PIT_MAX + G729A_L_INTERPOL;
G729ASet_zero(G729A_old_exc, G729A_PIT_MAX+G729A_L_INTERPOL);
G729ASet_zero(G729A_mem_syn, G729A_M);
G729A_sharp = G729A_SHARPMIN;
G729A_old_T0 = 60;
G729A_gain_code = 0;
G729A_gain_pitch = 0;
G729ALsp_decw_reset();
return;
}
void G729ADecod_ld8a(Word16 parm[], Word16 synth[], Word16 A_t[], Word16 *T2)
{
Word16 *Az;
Word16 lsp_new[G729A_M];
Word16 code[G729A_L_SUBFR];
Word16 i, j, i_subfr;
Word16 T0, T0_frac, index;
Word16 bfi;
Word16 bad_pitch;
extern Word16 G729A_bad_lsf;
bfi = *parm++;
G729AD_lsp(parm, lsp_new, G729Aadd_s(bfi, G729A_bad_lsf));
parm += 2;
G729AInt_qlpc(G729A_lsp_old, lsp_new, A_t);
G729ACopy(lsp_new, G729A_lsp_old, G729A_M);
Az = A_t;
for (i_subfr = 0; i_subfr < G729A_L_FRAME; i_subfr += G729A_L_SUBFR)
{
index = *parm++;
if(i_subfr == 0)
{
i = *parm++;
bad_pitch = G729Aadd_s(bfi, i);
if( bad_pitch == 0)
{
G729ADec_lag3(index, G729A_PIT_MIN, G729A_PIT_MAX, i_subfr, &T0, &T0_frac);
G729A_old_T0 = T0;
}
else
{
T0 = G729A_old_T0;
T0_frac = 0;
G729A_old_T0 = _sadd( G729A_old_T0, 1);
G729A_old_T0 = _min2(G729A_old_T0, G729A_PIT_MAX);
}
}
else
{
if( bfi == 0)
{
G729ADec_lag3(index, G729A_PIT_MIN, G729A_PIT_MAX, i_subfr, &T0, &T0_frac);
G729A_old_T0 = T0;
}
else
{
T0 = G729A_old_T0;
T0_frac = 0;
G729A_old_T0 = _sadd( G729A_old_T0, 1);
G729A_old_T0 = _min2(G729A_old_T0, G729A_PIT_MAX);
}
}
*T2++ = T0;
G729APred_lt_3(&G729A_exc[i_subfr], T0, T0_frac, G729A_L_SUBFR);
if(bfi != 0)
{
parm[0] = G729ARandom() & (Word16)0x1fff;
parm[1] = G729ARandom() & (Word16)0x000f;
}
G729ADecod_ACELP(parm[1], parm[0], code);
parm +=2;
j = G729Ashl_s(G729A_sharp, 1);
if(G729Asub_s(T0, G729A_L_SUBFR) <0 )
{
for (i = T0; i < G729A_L_SUBFR; i++)
{
code[i] = _sadd(code[i], _smpy(code[i-T0], j)>>16);
}
}
index = *parm++;
G729ADec_gain(index, code, G729A_L_SUBFR, bfi, &G729A_gain_pitch, &G729A_gain_code);
G729A_sharp = G729A_gain_pitch;
if (G729Asub_s(G729A_sharp, G729A_SHARPMAX) > 0) { G729A_sharp = G729A_SHARPMAX; }
if (G729Asub_s(G729A_sharp, G729A_SHARPMIN) < 0) { G729A_sharp = G729A_SHARPMIN; }
for (i = 0; i < G729A_L_SUBFR; i++)
{
L_temp = G729AL_mult(G729A_exc[i+i_subfr], G729A_gain_pitch);
L_temp = G729AL_mac(L_temp, code[i], G729A_gain_code);
L_temp = G729AL_shl(L_temp, 1);
G729A_exc[i+i_subfr] = G729Around(L_temp);
}
G729AOverflow = 0;
G729ASyn_filt(Az, &G729A_exc[i_subfr], &synth[i_subfr], G729A_L_SUBFR, G729A_mem_syn, 0);
if(G729AOverflow != 0)
{
for(i=0; i<G729A_PIT_MAX+G729A_L_INTERPOL+G729A_L_FRAME; i++)
G729A_old_exc[i] = G729Ashr_s(G729A_old_exc[i], 2);
G729ASyn_filt(Az, &G729A_exc[i_subfr], &synth[i_subfr], G729A_L_SUBFR, G729A_mem_syn, 1);
}
else
G729ACopy(&synth[i_subfr+G729A_L_SUBFR-G729A_M], G729A_mem_syn, G729A_M);
Az += G729A_MP1;
}
G729ACopy(&G729A_old_exc[G729A_L_FRAME], &G729A_old_exc[0], G729A_PIT_MAX+G729A_L_INTERPOL);
return;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -