📄 dec_acelp.c
字号:
/*
*===================================================================
* 3GPP AMR Wideband Floating-point Speech Codec
*===================================================================
*/
#include <memory.h>
#include "typedef.h"
#include "dec_util.h"
#define NEW_28bits /* for amr_wbplus */
#define L_SUBFR 64 /* Subframe size */
#define PRED_ORDER 4
#define MEAN_ENER 30 /* average innovation energy */
extern const Word16 D_ROM_ph_imp_low[];
extern const Word16 D_ROM_ph_imp_mid[];
/*
* D_ACELP_add_pulse
*
* Parameters:
* pos I: position of pulse
* nb_pulse I: number of pulses
* track I: track
* code O: fixed codebook
*
* Function:
* Add pulses to fixed codebook
*
* Returns:
* void
*/
static void D_ACELP_add_pulse(Word32 pos[], Word32 nb_pulse,
Word32 track, Word16 code[])
{
Word32 i, k;
for(k = 0; k < nb_pulse; k++)
{
/* i = ((pos[k] & (16-1))*NB_TRACK) + track; */
i = ((pos[k] & (16 - 1)) << 2) + track;
if((pos[k] & 16) == 0)
{
code[i] = (Word16)(code[i] + 512);
}
else
{
code[i] = (Word16)(code[i] - 512);
}
}
return;
}
/*
* D_ACELP_decode_1p_N1
*
* Parameters:
* index I: pulse index
* N I: number of bits for position
* offset I: offset
* pos O: position of the pulse
*
* Function:
* Decode 1 pulse with N+1 bits
*
* Returns:
* void
*/
static void D_ACELP_decode_1p_N1(Word32 index, Word32 N,
Word32 offset, Word32 pos[])
{
Word32 i, pos1, mask;
mask = ((1 << N) - 1);
/*
* Decode 1 pulse with N+1 bits
*/
pos1 = ((index & mask) + offset);
i = ((index >> N) & 1);
if(i == 1)
{
pos1 += 16;
}
pos[0] = pos1;
return;
}
/*
* D_ACELP_decode_2p_2N1
*
* Parameters:
* index I: pulse index
* N I: number of bits for position
* offset I: offset
* pos O: position of the pulse
*
* Function:
* Decode 2 pulses with 2*N+1 bits
*
* Returns:
* void
*/
static void D_ACELP_decode_2p_2N1(Word32 index, Word32 N,
Word32 offset, Word32 pos[])
{
Word32 i, pos1, pos2;
Word32 mask;
mask = ((1 << N) - 1);
/*
* Decode 2 pulses with 2*N+1 bits
*/
pos1 = (((index >> N) & mask) + offset);
i = (index >> (2 * N)) & 1;
pos2 = ((index & mask) + offset);
if((pos2 - pos1) < 0)
{
if(i == 1)
{
pos1 += 16;
}
else
{
pos2 += 16;
}
}
else
{
if(i == 1)
{
pos1 += 16;
pos2 += 16;
}
}
pos[0] = pos1;
pos[1] = pos2;
return;
}
/*
* D_ACELP_decode_3p_3N1
*
* Parameters:
* index I: pulse index
* N I: number of bits for position
* offset I: offset
* pos O: position of the pulse
*
* Function:
* Decode 3 pulses with 3*N+1 bits
*
* Returns:
* void
*/
static void D_ACELP_decode_3p_3N1(Word32 index, Word32 N,
Word32 offset, Word32 pos[])
{
Word32 j, mask, idx;
/*
* Decode 3 pulses with 3*N+1 bits
*/
mask = ((1 << ((2 * N) - 1)) - 1);
idx = index & mask;
j = offset;
if(((index >> ((2 * N) - 1)) & 1) == 1)
{
j += (1 << (N - 1));
}
D_ACELP_decode_2p_2N1(idx, N - 1, j, pos);
mask = ((1 << (N + 1)) - 1);
idx = (index >> (2 * N)) & mask;
D_ACELP_decode_1p_N1(idx, N, offset, pos + 2);
return;
}
/*
* D_ACELP_decode_4p_4N1
*
* Parameters:
* index I: pulse index
* N I: number of bits for position
* offset I: offset
* pos O: position of the pulse
*
* Function:
* Decode 4 pulses with 4*N+1 bits
*
* Returns:
* void
*/
static void D_ACELP_decode_4p_4N1(Word32 index, Word32 N,
Word32 offset, Word32 pos[])
{
Word32 j, mask, idx;
/*
* Decode 4 pulses with 4*N+1 bits
*/
mask = ((1 << ((2 * N) - 1)) - 1);
idx = index & mask;
j = offset;
if(((index >> ((2 * N) - 1)) & 1) == 1)
{
j += (1 << (N - 1));
}
D_ACELP_decode_2p_2N1(idx, N - 1, j, pos);
mask = ((1 << ((2 * N) + 1)) - 1);
idx = (index >> (2 * N)) & mask;
D_ACELP_decode_2p_2N1(idx, N, offset, pos + 2);
return;
}
/*
* D_ACELP_decode_4p_4N
*
* Parameters:
* index I: pulse index
* N I: number of bits for position
* offset I: offset
* pos O: position of the pulse
*
* Function:
* Decode 4 pulses with 4*N bits
*
* Returns:
* void
*/
static void D_ACELP_decode_4p_4N(Word32 index, Word32 N,
Word32 offset, Word32 pos[])
{
Word32 j, n_1;
/*
* Decode 4 pulses with 4*N bits
*/
n_1 = N - 1;
j = offset + (1 << n_1);
switch((index >> ((4 * N) - 2)) & 3)
{
case 0:
if(((index >> ((4 * n_1) + 1)) & 1) == 0)
{
D_ACELP_decode_4p_4N1(index, n_1, offset, pos);
}
else
{
D_ACELP_decode_4p_4N1(index, n_1, j, pos);
}
break;
case 1:
D_ACELP_decode_1p_N1((index >> ((3 * n_1) + 1)), n_1, offset, pos);
D_ACELP_decode_3p_3N1(index, n_1, j, pos + 1);
break;
case 2:
D_ACELP_decode_2p_2N1((index >> ((2 * n_1) + 1)), n_1, offset, pos);
D_ACELP_decode_2p_2N1(index, n_1, j, pos + 2);
break;
case 3:
D_ACELP_decode_3p_3N1((index >> (n_1 + 1)), n_1, offset, pos);
D_ACELP_decode_1p_N1(index, n_1, j, pos + 3);
break;
}
return;
}
/*
* D_ACELP_decode_5p_5N
*
* Parameters:
* index I: pulse index
* N I: number of bits for position
* offset I: offset
* pos O: position of the pulse
*
* Function:
* Decode 5 pulses with 5*N bits
*
* Returns:
* void
*/
static void D_ACELP_decode_5p_5N(Word32 index, Word32 N,
Word32 offset, Word32 pos[])
{
Word32 j, n_1;
Word32 idx;
/*
* Decode 5 pulses with 5*N bits
*/
n_1 = N - 1;
j = offset + (1 << n_1);
idx = (index >> ((2 * N) + 1));
if(((index >> ((5 * N) - 1)) & 1) == 0)
{
D_ACELP_decode_3p_3N1(idx, n_1, offset, pos);
D_ACELP_decode_2p_2N1(index, N, offset, pos + 3);
}
else
{
D_ACELP_decode_3p_3N1(idx, n_1, j, pos);
D_ACELP_decode_2p_2N1(index, N, offset, pos + 3);
}
return;
}
/*
* D_ACELP_decode_6p_6N_2
*
* Parameters:
* index I: pulse index
* N I: number of bits for position
* offset I: offset
* pos O: position of the pulse
*
* Function:
* Decode 6 pulses with 6*N-2 bits
*
* Returns:
* void
*/
static void D_ACELP_decode_6p_6N_2(Word32 index, Word32 N,
Word32 offset, Word32 pos[])
{
Word32 j, n_1, offsetA, offsetB;
n_1 = N - 1;
j = offset + (1 << n_1);
offsetA = offsetB = j;
if(((index >> ((6 * N) - 5)) & 1) == 0)
{
offsetA = offset;
}
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -