mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-06 12:36:58 +00:00
Merged revisions 110880 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4 ................ r110880 | kpfleming | 2008-03-26 09:42:35 -0700 (Wed, 26 Mar 2008) | 10 lines Merged revisions 110869 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.2 ........ r110869 | kpfleming | 2008-03-26 08:53:46 -0700 (Wed, 26 Mar 2008) | 2 lines due to licensing restrictions, we cannot distribute the source code for iLBC encoding and decoding... so remove it, and add instructions on how the user can obtain it themselves ........ ................ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@110881 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -1,152 +0,0 @@
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
LPC_decode.c
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#include <math.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "helpfun.h"
|
||||
#include "lsf.h"
|
||||
#include "iLBC_define.h"
|
||||
#include "LPCdecode.h"
|
||||
#include "constants.h"
|
||||
|
||||
/*---------------------------------------------------------------*
|
||||
* interpolation of lsf coefficients for the decoder
|
||||
*--------------------------------------------------------------*/
|
||||
|
||||
void LSFinterpolate2a_dec(
|
||||
float *a, /* (o) lpc coefficients for a sub-frame */
|
||||
float *lsf1, /* (i) first lsf coefficient vector */
|
||||
|
||||
|
||||
float *lsf2, /* (i) second lsf coefficient vector */
|
||||
float coef, /* (i) interpolation weight */
|
||||
int length /* (i) length of lsf vectors */
|
||||
){
|
||||
float lsftmp[LPC_FILTERORDER];
|
||||
|
||||
interpolate(lsftmp, lsf1, lsf2, coef, length);
|
||||
lsf2a(a, lsftmp);
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------*
|
||||
* obtain dequantized lsf coefficients from quantization index
|
||||
*--------------------------------------------------------------*/
|
||||
|
||||
void SimplelsfDEQ(
|
||||
float *lsfdeq, /* (o) dequantized lsf coefficients */
|
||||
int *index, /* (i) quantization index */
|
||||
int lpc_n /* (i) number of LPCs */
|
||||
){
|
||||
int i, j, pos, cb_pos;
|
||||
|
||||
/* decode first LSF */
|
||||
|
||||
pos = 0;
|
||||
cb_pos = 0;
|
||||
for (i = 0; i < LSF_NSPLIT; i++) {
|
||||
for (j = 0; j < dim_lsfCbTbl[i]; j++) {
|
||||
lsfdeq[pos + j] = lsfCbTbl[cb_pos +
|
||||
(long)(index[i])*dim_lsfCbTbl[i] + j];
|
||||
}
|
||||
pos += dim_lsfCbTbl[i];
|
||||
cb_pos += size_lsfCbTbl[i]*dim_lsfCbTbl[i];
|
||||
}
|
||||
|
||||
if (lpc_n>1) {
|
||||
|
||||
/* decode last LSF */
|
||||
|
||||
pos = 0;
|
||||
cb_pos = 0;
|
||||
for (i = 0; i < LSF_NSPLIT; i++) {
|
||||
for (j = 0; j < dim_lsfCbTbl[i]; j++) {
|
||||
lsfdeq[LPC_FILTERORDER + pos + j] =
|
||||
lsfCbTbl[cb_pos +
|
||||
(long)(index[LSF_NSPLIT + i])*
|
||||
dim_lsfCbTbl[i] + j];
|
||||
}
|
||||
pos += dim_lsfCbTbl[i];
|
||||
cb_pos += size_lsfCbTbl[i]*dim_lsfCbTbl[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
|
||||
|
||||
* obtain synthesis and weighting filters form lsf coefficients
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void DecoderInterpolateLSF(
|
||||
float *syntdenum, /* (o) synthesis filter coefficients */
|
||||
float *weightdenum, /* (o) weighting denumerator
|
||||
coefficients */
|
||||
float *lsfdeq, /* (i) dequantized lsf coefficients */
|
||||
int length, /* (i) length of lsf coefficient vector */
|
||||
iLBC_Dec_Inst_t *iLBCdec_inst
|
||||
/* (i) the decoder state structure */
|
||||
){
|
||||
int i, pos, lp_length;
|
||||
float lp[LPC_FILTERORDER + 1], *lsfdeq2;
|
||||
|
||||
lsfdeq2 = lsfdeq + length;
|
||||
lp_length = length + 1;
|
||||
|
||||
if (iLBCdec_inst->mode==30) {
|
||||
/* sub-frame 1: Interpolation between old and first */
|
||||
|
||||
LSFinterpolate2a_dec(lp, iLBCdec_inst->lsfdeqold, lsfdeq,
|
||||
lsf_weightTbl_30ms[0], length);
|
||||
memcpy(syntdenum,lp,lp_length*sizeof(float));
|
||||
bwexpand(weightdenum, lp, LPC_CHIRP_WEIGHTDENUM,
|
||||
lp_length);
|
||||
|
||||
/* sub-frames 2 to 6: interpolation between first
|
||||
and last LSF */
|
||||
|
||||
pos = lp_length;
|
||||
for (i = 1; i < 6; i++) {
|
||||
LSFinterpolate2a_dec(lp, lsfdeq, lsfdeq2,
|
||||
lsf_weightTbl_30ms[i], length);
|
||||
memcpy(syntdenum + pos,lp,lp_length*sizeof(float));
|
||||
bwexpand(weightdenum + pos, lp,
|
||||
LPC_CHIRP_WEIGHTDENUM, lp_length);
|
||||
pos += lp_length;
|
||||
}
|
||||
}
|
||||
else {
|
||||
pos = 0;
|
||||
for (i = 0; i < iLBCdec_inst->nsub; i++) {
|
||||
LSFinterpolate2a_dec(lp, iLBCdec_inst->lsfdeqold,
|
||||
lsfdeq, lsf_weightTbl_20ms[i], length);
|
||||
memcpy(syntdenum+pos,lp,lp_length*sizeof(float));
|
||||
bwexpand(weightdenum+pos, lp, LPC_CHIRP_WEIGHTDENUM,
|
||||
lp_length);
|
||||
pos += lp_length;
|
||||
}
|
||||
}
|
||||
|
||||
/* update memory */
|
||||
|
||||
|
||||
|
||||
if (iLBCdec_inst->mode==30)
|
||||
memcpy(iLBCdec_inst->lsfdeqold, lsfdeq2,
|
||||
length*sizeof(float));
|
||||
else
|
||||
memcpy(iLBCdec_inst->lsfdeqold, lsfdeq,
|
||||
length*sizeof(float));
|
||||
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user