mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-05 12:16:00 +00:00
Include iLBC source code for distribution with Asterisk
This patch includes the iLBC source code for distribution with Asterisk. Clarification regarding the iLBC source code was provided by Google, and the appropriate licenses have been included in the codecs/ilbc folder. Review: https://reviewboard.asterisk.org/r/1675 Review: https://reviewboard.asterisk.org/r/1649 (closes issue: ASTERISK-18943) Reporter: Leif Madsen Tested by: Matt Jordan ........ Merged revisions 351450 from http://svn.asterisk.org/svn/asterisk/branches/1.8 ........ Merged revisions 351451 from http://svn.asterisk.org/svn/asterisk/branches/10 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@351452 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
114
codecs/ilbc/FrameClassify.c
Normal file
114
codecs/ilbc/FrameClassify.c
Normal file
@@ -0,0 +1,114 @@
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
FrameClassify.c
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#include "iLBC_define.h"
|
||||
|
||||
/*---------------------------------------------------------------*
|
||||
* Classification of subframes to localize start state
|
||||
*--------------------------------------------------------------*/
|
||||
|
||||
int FrameClassify( /* index to the max-energy sub-frame */
|
||||
iLBC_Enc_Inst_t *iLBCenc_inst,
|
||||
/* (i/o) the encoder state structure */
|
||||
float *residual /* (i) lpc residual signal */
|
||||
) {
|
||||
float max_ssqEn, fssqEn[NSUB_MAX], bssqEn[NSUB_MAX], *pp;
|
||||
int n, l, max_ssqEn_n;
|
||||
const float ssqEn_win[NSUB_MAX-1]={(float)0.8,(float)0.9,
|
||||
(float)1.0,(float)0.9,(float)0.8};
|
||||
const float sampEn_win[5]={(float)1.0/(float)6.0,
|
||||
(float)2.0/(float)6.0, (float)3.0/(float)6.0,
|
||||
(float)4.0/(float)6.0, (float)5.0/(float)6.0};
|
||||
|
||||
/* init the front and back energies to zero */
|
||||
|
||||
memset(fssqEn, 0, NSUB_MAX*sizeof(float));
|
||||
memset(bssqEn, 0, NSUB_MAX*sizeof(float));
|
||||
|
||||
/* Calculate front of first seqence */
|
||||
|
||||
n=0;
|
||||
pp=residual;
|
||||
for (l=0; l<5; l++) {
|
||||
fssqEn[n] += sampEn_win[l] * (*pp) * (*pp);
|
||||
pp++;
|
||||
}
|
||||
for (l=5; l<SUBL; l++) {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
fssqEn[n] += (*pp) * (*pp);
|
||||
pp++;
|
||||
}
|
||||
|
||||
/* Calculate front and back of all middle sequences */
|
||||
|
||||
for (n=1; n<iLBCenc_inst->nsub-1; n++) {
|
||||
pp=residual+n*SUBL;
|
||||
for (l=0; l<5; l++) {
|
||||
fssqEn[n] += sampEn_win[l] * (*pp) * (*pp);
|
||||
bssqEn[n] += (*pp) * (*pp);
|
||||
pp++;
|
||||
}
|
||||
for (l=5; l<SUBL-5; l++) {
|
||||
fssqEn[n] += (*pp) * (*pp);
|
||||
bssqEn[n] += (*pp) * (*pp);
|
||||
pp++;
|
||||
}
|
||||
for (l=SUBL-5; l<SUBL; l++) {
|
||||
fssqEn[n] += (*pp) * (*pp);
|
||||
bssqEn[n] += sampEn_win[SUBL-l-1] * (*pp) * (*pp);
|
||||
pp++;
|
||||
}
|
||||
}
|
||||
|
||||
/* Calculate back of last seqence */
|
||||
|
||||
n=iLBCenc_inst->nsub-1;
|
||||
pp=residual+n*SUBL;
|
||||
for (l=0; l<SUBL-5; l++) {
|
||||
bssqEn[n] += (*pp) * (*pp);
|
||||
pp++;
|
||||
}
|
||||
for (l=SUBL-5; l<SUBL; l++) {
|
||||
bssqEn[n] += sampEn_win[SUBL-l-1] * (*pp) * (*pp);
|
||||
pp++;
|
||||
}
|
||||
|
||||
/* find the index to the weighted 80 sample with
|
||||
most energy */
|
||||
|
||||
if (iLBCenc_inst->mode==20) l=1;
|
||||
else l=0;
|
||||
|
||||
max_ssqEn=(fssqEn[0]+bssqEn[1])*ssqEn_win[l];
|
||||
max_ssqEn_n=1;
|
||||
for (n=2; n<iLBCenc_inst->nsub; n++) {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
l++;
|
||||
if ((fssqEn[n-1]+bssqEn[n])*ssqEn_win[l] > max_ssqEn) {
|
||||
max_ssqEn=(fssqEn[n-1]+bssqEn[n]) *
|
||||
ssqEn_win[l];
|
||||
max_ssqEn_n=n;
|
||||
}
|
||||
}
|
||||
|
||||
return max_ssqEn_n;
|
||||
}
|
||||
|
Reference in New Issue
Block a user