Files
rtphone/src/libs/libg729/util.c
2018-06-05 11:05:37 +03:00

146 lines
3.3 KiB
C

/*
ITU-T G.729A Speech Coder ANSI-C Source Code
Version 1.1 Last modified: September 1996
Copyright (c) 1996,
AT&T, France Telecom, NTT, Universite de Sherbrooke
All rights reserved.
*/
/*-------------------------------------------------------------------*
* Function Set zero() *
* ~~~~~~~~~~ *
* Set vector x[] to zero *
*-------------------------------------------------------------------*/
#include "typedef.h"
#include "basic_op.h"
#include "ld8a.h"
#include "tab_ld8a.h"
void
Set_zero (Word16 x[], Word16 L)
{
Word16 i;
for (i = 0; i < L; i++)
x[i] = 0;
return;
}
/*-------------------------------------------------------------------*
* Function Copy: *
* ~~~~~ *
* Copy vector x[] to y[] *
*-------------------------------------------------------------------*/
void
Copy (Word16 x[], Word16 y[], Word16 L)
{
Word16 i;
for (i = 0; i < L; i++)
y[i] = x[i];
return;
}
/* Random generator */
Word16
Random_16 (Word16* seed)
{
/* seed = seed*31821 + 13849; */
*seed = extract_l (L_add (L_shr (L_mult (*seed, 31821), 1), 13849L));
return (*seed);
}
/*----------------------------------------------------------------------------
* Store_Param - converts encoder parameter vector into frame
* Restore_Params - converts serial received frame to encoder parameter vector
*
* The transmitted parameters are:
*
* LPC: 1st codebook 7+1 bit
* 2nd codebook 5+5 bit
*
* 1st subframe:
* pitch period 8 bit
* parity check on 1st period 1 bit
* codebook index1 (positions) 13 bit
* codebook index2 (signs) 4 bit
* pitch and codebook gains 4+3 bit
*
* 2nd subframe:
* pitch period (relative) 5 bit
* codebook index1 (positions) 13 bit
* codebook index2 (signs) 4 bit
* pitch and codebook gains 4+3 bit
*----------------------------------------------------------------------------
*/
void
Store_Params(Word16 * parm, void *to)
{
int i, j;
unsigned char mask, *to_b;
Word16 value, val_mask;
to_b = (unsigned char *)to;
mask = 0x80;
for (i = 0; i < PRM_SIZE; i++) {
value = parm[i];
val_mask = 1 << (bitsno[i] - 1);
for (j = 0; j < bitsno[i]; j++) {
if (value & val_mask)
*to_b |= mask;
else
*to_b &= ~mask;
value = value << 1;
mask = mask >> 1;
if (mask == 0) {
mask = 0x80;
to_b++;
}
}
}
return;
}
void Restore_Params(const void *from, Word16 * parm)
{
int i, j;
unsigned char mask, *from_b;
Word16 value;
mask = 0x80;
from_b = (unsigned char *)from;
for (i = 0; i < PRM_SIZE; i++) {
value = 0;
for (j = 0; j < bitsno[i]; j++) {
value = value << 1;
if (mask & (*from_b))
value += 1;
mask = mask >> 1;
if (mask == 0) {
mask = 0x80;
from_b++;
}
}
parm[i] = value;
}
return;
}