mirror of
https://github.com/signalwire/freeswitch.git
synced 2026-07-05 03:41:53 +00:00
svn:eol-style properties, and make eol-style consistent in some files.
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@5738 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
+1319
-1319
File diff suppressed because it is too large
Load Diff
+109
-109
@@ -1,109 +1,109 @@
|
||||
|
||||
/******************************************************************
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/******************************************************************
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,26 +1,26 @@
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
FrameClassify.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
|
||||
|
||||
#ifndef __iLBC_FRAMECLASSIFY_H
|
||||
#define __iLBC_FRAMECLASSIFY_H
|
||||
|
||||
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 */
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
FrameClassify.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
|
||||
|
||||
#ifndef __iLBC_FRAMECLASSIFY_H
|
||||
#define __iLBC_FRAMECLASSIFY_H
|
||||
|
||||
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 */
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
+151
-151
@@ -1,151 +1,151 @@
|
||||
|
||||
/******************************************************************
|
||||
|
||||
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 "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));
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/******************************************************************
|
||||
|
||||
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 "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));
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,44 +1,44 @@
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
LPC_decode.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifndef __iLBC_LPC_DECODE_H
|
||||
#define __iLBC_LPC_DECODE_H
|
||||
|
||||
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 */
|
||||
);
|
||||
|
||||
void SimplelsfDEQ(
|
||||
float *lsfdeq, /* (o) dequantized lsf coefficients */
|
||||
int *index, /* (i) quantization index */
|
||||
int lpc_n /* (i) number of LPCs */
|
||||
);
|
||||
|
||||
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 */
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
LPC_decode.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifndef __iLBC_LPC_DECODE_H
|
||||
#define __iLBC_LPC_DECODE_H
|
||||
|
||||
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 */
|
||||
);
|
||||
|
||||
void SimplelsfDEQ(
|
||||
float *lsfdeq, /* (o) dequantized lsf coefficients */
|
||||
int *index, /* (i) quantization index */
|
||||
int lpc_n /* (i) number of LPCs */
|
||||
);
|
||||
|
||||
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 */
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
+227
-227
@@ -1,227 +1,227 @@
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
LPCencode.c
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#include <string.h>
|
||||
|
||||
|
||||
|
||||
#include "iLBC_define.h"
|
||||
#include "helpfun.h"
|
||||
#include "lsf.h"
|
||||
#include "constants.h"
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* lpc analysis (subrutine to LPCencode)
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void SimpleAnalysis(
|
||||
float *lsf, /* (o) lsf coefficients */
|
||||
float *data, /* (i) new data vector */
|
||||
iLBC_Enc_Inst_t *iLBCenc_inst
|
||||
/* (i/o) the encoder state structure */
|
||||
){
|
||||
int k, is;
|
||||
float temp[BLOCKL_MAX], lp[LPC_FILTERORDER + 1];
|
||||
float lp2[LPC_FILTERORDER + 1];
|
||||
float r[LPC_FILTERORDER + 1];
|
||||
|
||||
is=LPC_LOOKBACK+BLOCKL_MAX-iLBCenc_inst->blockl;
|
||||
memcpy(iLBCenc_inst->lpc_buffer+is,data,
|
||||
iLBCenc_inst->blockl*sizeof(float));
|
||||
|
||||
/* No lookahead, last window is asymmetric */
|
||||
|
||||
for (k = 0; k < iLBCenc_inst->lpc_n; k++) {
|
||||
|
||||
is = LPC_LOOKBACK;
|
||||
|
||||
if (k < (iLBCenc_inst->lpc_n - 1)) {
|
||||
window(temp, lpc_winTbl,
|
||||
iLBCenc_inst->lpc_buffer, BLOCKL_MAX);
|
||||
} else {
|
||||
window(temp, lpc_asymwinTbl,
|
||||
iLBCenc_inst->lpc_buffer + is, BLOCKL_MAX);
|
||||
}
|
||||
|
||||
autocorr(r, temp, BLOCKL_MAX, LPC_FILTERORDER);
|
||||
window(r, r, lpc_lagwinTbl, LPC_FILTERORDER + 1);
|
||||
|
||||
levdurb(lp, temp, r, LPC_FILTERORDER);
|
||||
bwexpand(lp2, lp, LPC_CHIRP_SYNTDENUM, LPC_FILTERORDER+1);
|
||||
|
||||
a2lsf(lsf + k*LPC_FILTERORDER, lp2);
|
||||
}
|
||||
is=LPC_LOOKBACK+BLOCKL_MAX-iLBCenc_inst->blockl;
|
||||
memmove(iLBCenc_inst->lpc_buffer,
|
||||
iLBCenc_inst->lpc_buffer+LPC_LOOKBACK+BLOCKL_MAX-is,
|
||||
is*sizeof(float));
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
|
||||
|
||||
* lsf interpolator and conversion from lsf to a coefficients
|
||||
* (subrutine to SimpleInterpolateLSF)
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void LSFinterpolate2a_enc(
|
||||
float *a, /* (o) lpc coefficients */
|
||||
float *lsf1,/* (i) first set of lsf coefficients */
|
||||
float *lsf2,/* (i) second set of lsf coefficients */
|
||||
float coef, /* (i) weighting coefficient to use between
|
||||
lsf1 and lsf2 */
|
||||
long length /* (i) length of coefficient vectors */
|
||||
){
|
||||
float lsftmp[LPC_FILTERORDER];
|
||||
|
||||
interpolate(lsftmp, lsf1, lsf2, coef, length);
|
||||
lsf2a(a, lsftmp);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* lsf interpolator (subrutine to LPCencode)
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void SimpleInterpolateLSF(
|
||||
float *syntdenum, /* (o) the synthesis filter denominator
|
||||
resulting from the quantized
|
||||
interpolated lsf */
|
||||
float *weightdenum, /* (o) the weighting filter denominator
|
||||
resulting from the unquantized
|
||||
interpolated lsf */
|
||||
float *lsf, /* (i) the unquantized lsf coefficients */
|
||||
float *lsfdeq, /* (i) the dequantized lsf coefficients */
|
||||
float *lsfold, /* (i) the unquantized lsf coefficients of
|
||||
the previous signal frame */
|
||||
float *lsfdeqold, /* (i) the dequantized lsf coefficients of
|
||||
the previous signal frame */
|
||||
int length, /* (i) should equate LPC_FILTERORDER */
|
||||
iLBC_Enc_Inst_t *iLBCenc_inst
|
||||
/* (i/o) the encoder state structure */
|
||||
){
|
||||
int i, pos, lp_length;
|
||||
float lp[LPC_FILTERORDER + 1], *lsf2, *lsfdeq2;
|
||||
|
||||
lsf2 = lsf + length;
|
||||
lsfdeq2 = lsfdeq + length;
|
||||
lp_length = length + 1;
|
||||
|
||||
if (iLBCenc_inst->mode==30) {
|
||||
/* sub-frame 1: Interpolation between old and first
|
||||
set of lsf coefficients */
|
||||
|
||||
LSFinterpolate2a_enc(lp, lsfdeqold, lsfdeq,
|
||||
lsf_weightTbl_30ms[0], length);
|
||||
memcpy(syntdenum,lp,lp_length*sizeof(float));
|
||||
LSFinterpolate2a_enc(lp, lsfold, lsf,
|
||||
|
||||
|
||||
lsf_weightTbl_30ms[0], length);
|
||||
bwexpand(weightdenum, lp, LPC_CHIRP_WEIGHTDENUM, lp_length);
|
||||
|
||||
/* sub-frame 2 to 6: Interpolation between first
|
||||
and second set of lsf coefficients */
|
||||
|
||||
pos = lp_length;
|
||||
for (i = 1; i < iLBCenc_inst->nsub; i++) {
|
||||
LSFinterpolate2a_enc(lp, lsfdeq, lsfdeq2,
|
||||
lsf_weightTbl_30ms[i], length);
|
||||
memcpy(syntdenum + pos,lp,lp_length*sizeof(float));
|
||||
|
||||
LSFinterpolate2a_enc(lp, lsf, lsf2,
|
||||
lsf_weightTbl_30ms[i], length);
|
||||
bwexpand(weightdenum + pos, lp,
|
||||
LPC_CHIRP_WEIGHTDENUM, lp_length);
|
||||
pos += lp_length;
|
||||
}
|
||||
}
|
||||
else {
|
||||
pos = 0;
|
||||
for (i = 0; i < iLBCenc_inst->nsub; i++) {
|
||||
LSFinterpolate2a_enc(lp, lsfdeqold, lsfdeq,
|
||||
lsf_weightTbl_20ms[i], length);
|
||||
memcpy(syntdenum+pos,lp,lp_length*sizeof(float));
|
||||
LSFinterpolate2a_enc(lp, lsfold, lsf,
|
||||
lsf_weightTbl_20ms[i], length);
|
||||
bwexpand(weightdenum+pos, lp,
|
||||
LPC_CHIRP_WEIGHTDENUM, lp_length);
|
||||
pos += lp_length;
|
||||
}
|
||||
}
|
||||
|
||||
/* update memory */
|
||||
|
||||
if (iLBCenc_inst->mode==30) {
|
||||
memcpy(lsfold, lsf2, length*sizeof(float));
|
||||
memcpy(lsfdeqold, lsfdeq2, length*sizeof(float));
|
||||
}
|
||||
else {
|
||||
memcpy(lsfold, lsf, length*sizeof(float));
|
||||
memcpy(lsfdeqold, lsfdeq, length*sizeof(float));
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* lsf quantizer (subrutine to LPCencode)
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void SimplelsfQ(
|
||||
float *lsfdeq, /* (o) dequantized lsf coefficients
|
||||
(dimension FILTERORDER) */
|
||||
int *index, /* (o) quantization index */
|
||||
float *lsf, /* (i) the lsf coefficient vector to be
|
||||
|
||||
|
||||
quantized (dimension FILTERORDER ) */
|
||||
int lpc_n /* (i) number of lsf sets to quantize */
|
||||
){
|
||||
/* Quantize first LSF with memoryless split VQ */
|
||||
SplitVQ(lsfdeq, index, lsf, lsfCbTbl, LSF_NSPLIT,
|
||||
dim_lsfCbTbl, size_lsfCbTbl);
|
||||
|
||||
if (lpc_n==2) {
|
||||
/* Quantize second LSF with memoryless split VQ */
|
||||
SplitVQ(lsfdeq + LPC_FILTERORDER, index + LSF_NSPLIT,
|
||||
lsf + LPC_FILTERORDER, lsfCbTbl, LSF_NSPLIT,
|
||||
dim_lsfCbTbl, size_lsfCbTbl);
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* lpc encoder
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void LPCencode(
|
||||
float *syntdenum, /* (i/o) synthesis filter coefficients
|
||||
before/after encoding */
|
||||
float *weightdenum, /* (i/o) weighting denumerator
|
||||
coefficients before/after
|
||||
encoding */
|
||||
int *lsf_index, /* (o) lsf quantization index */
|
||||
float *data, /* (i) lsf coefficients to quantize */
|
||||
iLBC_Enc_Inst_t *iLBCenc_inst
|
||||
/* (i/o) the encoder state structure */
|
||||
){
|
||||
float lsf[LPC_FILTERORDER * LPC_N_MAX];
|
||||
float lsfdeq[LPC_FILTERORDER * LPC_N_MAX];
|
||||
int change=0;
|
||||
|
||||
SimpleAnalysis(lsf, data, iLBCenc_inst);
|
||||
SimplelsfQ(lsfdeq, lsf_index, lsf, iLBCenc_inst->lpc_n);
|
||||
change=LSF_check(lsfdeq, LPC_FILTERORDER, iLBCenc_inst->lpc_n);
|
||||
SimpleInterpolateLSF(syntdenum, weightdenum,
|
||||
lsf, lsfdeq, iLBCenc_inst->lsfold,
|
||||
iLBCenc_inst->lsfdeqold, LPC_FILTERORDER, iLBCenc_inst);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
LPCencode.c
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#include <string.h>
|
||||
|
||||
|
||||
|
||||
#include "iLBC_define.h"
|
||||
#include "helpfun.h"
|
||||
#include "lsf.h"
|
||||
#include "constants.h"
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* lpc analysis (subrutine to LPCencode)
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void SimpleAnalysis(
|
||||
float *lsf, /* (o) lsf coefficients */
|
||||
float *data, /* (i) new data vector */
|
||||
iLBC_Enc_Inst_t *iLBCenc_inst
|
||||
/* (i/o) the encoder state structure */
|
||||
){
|
||||
int k, is;
|
||||
float temp[BLOCKL_MAX], lp[LPC_FILTERORDER + 1];
|
||||
float lp2[LPC_FILTERORDER + 1];
|
||||
float r[LPC_FILTERORDER + 1];
|
||||
|
||||
is=LPC_LOOKBACK+BLOCKL_MAX-iLBCenc_inst->blockl;
|
||||
memcpy(iLBCenc_inst->lpc_buffer+is,data,
|
||||
iLBCenc_inst->blockl*sizeof(float));
|
||||
|
||||
/* No lookahead, last window is asymmetric */
|
||||
|
||||
for (k = 0; k < iLBCenc_inst->lpc_n; k++) {
|
||||
|
||||
is = LPC_LOOKBACK;
|
||||
|
||||
if (k < (iLBCenc_inst->lpc_n - 1)) {
|
||||
window(temp, lpc_winTbl,
|
||||
iLBCenc_inst->lpc_buffer, BLOCKL_MAX);
|
||||
} else {
|
||||
window(temp, lpc_asymwinTbl,
|
||||
iLBCenc_inst->lpc_buffer + is, BLOCKL_MAX);
|
||||
}
|
||||
|
||||
autocorr(r, temp, BLOCKL_MAX, LPC_FILTERORDER);
|
||||
window(r, r, lpc_lagwinTbl, LPC_FILTERORDER + 1);
|
||||
|
||||
levdurb(lp, temp, r, LPC_FILTERORDER);
|
||||
bwexpand(lp2, lp, LPC_CHIRP_SYNTDENUM, LPC_FILTERORDER+1);
|
||||
|
||||
a2lsf(lsf + k*LPC_FILTERORDER, lp2);
|
||||
}
|
||||
is=LPC_LOOKBACK+BLOCKL_MAX-iLBCenc_inst->blockl;
|
||||
memmove(iLBCenc_inst->lpc_buffer,
|
||||
iLBCenc_inst->lpc_buffer+LPC_LOOKBACK+BLOCKL_MAX-is,
|
||||
is*sizeof(float));
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
|
||||
|
||||
* lsf interpolator and conversion from lsf to a coefficients
|
||||
* (subrutine to SimpleInterpolateLSF)
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void LSFinterpolate2a_enc(
|
||||
float *a, /* (o) lpc coefficients */
|
||||
float *lsf1,/* (i) first set of lsf coefficients */
|
||||
float *lsf2,/* (i) second set of lsf coefficients */
|
||||
float coef, /* (i) weighting coefficient to use between
|
||||
lsf1 and lsf2 */
|
||||
long length /* (i) length of coefficient vectors */
|
||||
){
|
||||
float lsftmp[LPC_FILTERORDER];
|
||||
|
||||
interpolate(lsftmp, lsf1, lsf2, coef, length);
|
||||
lsf2a(a, lsftmp);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* lsf interpolator (subrutine to LPCencode)
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void SimpleInterpolateLSF(
|
||||
float *syntdenum, /* (o) the synthesis filter denominator
|
||||
resulting from the quantized
|
||||
interpolated lsf */
|
||||
float *weightdenum, /* (o) the weighting filter denominator
|
||||
resulting from the unquantized
|
||||
interpolated lsf */
|
||||
float *lsf, /* (i) the unquantized lsf coefficients */
|
||||
float *lsfdeq, /* (i) the dequantized lsf coefficients */
|
||||
float *lsfold, /* (i) the unquantized lsf coefficients of
|
||||
the previous signal frame */
|
||||
float *lsfdeqold, /* (i) the dequantized lsf coefficients of
|
||||
the previous signal frame */
|
||||
int length, /* (i) should equate LPC_FILTERORDER */
|
||||
iLBC_Enc_Inst_t *iLBCenc_inst
|
||||
/* (i/o) the encoder state structure */
|
||||
){
|
||||
int i, pos, lp_length;
|
||||
float lp[LPC_FILTERORDER + 1], *lsf2, *lsfdeq2;
|
||||
|
||||
lsf2 = lsf + length;
|
||||
lsfdeq2 = lsfdeq + length;
|
||||
lp_length = length + 1;
|
||||
|
||||
if (iLBCenc_inst->mode==30) {
|
||||
/* sub-frame 1: Interpolation between old and first
|
||||
set of lsf coefficients */
|
||||
|
||||
LSFinterpolate2a_enc(lp, lsfdeqold, lsfdeq,
|
||||
lsf_weightTbl_30ms[0], length);
|
||||
memcpy(syntdenum,lp,lp_length*sizeof(float));
|
||||
LSFinterpolate2a_enc(lp, lsfold, lsf,
|
||||
|
||||
|
||||
lsf_weightTbl_30ms[0], length);
|
||||
bwexpand(weightdenum, lp, LPC_CHIRP_WEIGHTDENUM, lp_length);
|
||||
|
||||
/* sub-frame 2 to 6: Interpolation between first
|
||||
and second set of lsf coefficients */
|
||||
|
||||
pos = lp_length;
|
||||
for (i = 1; i < iLBCenc_inst->nsub; i++) {
|
||||
LSFinterpolate2a_enc(lp, lsfdeq, lsfdeq2,
|
||||
lsf_weightTbl_30ms[i], length);
|
||||
memcpy(syntdenum + pos,lp,lp_length*sizeof(float));
|
||||
|
||||
LSFinterpolate2a_enc(lp, lsf, lsf2,
|
||||
lsf_weightTbl_30ms[i], length);
|
||||
bwexpand(weightdenum + pos, lp,
|
||||
LPC_CHIRP_WEIGHTDENUM, lp_length);
|
||||
pos += lp_length;
|
||||
}
|
||||
}
|
||||
else {
|
||||
pos = 0;
|
||||
for (i = 0; i < iLBCenc_inst->nsub; i++) {
|
||||
LSFinterpolate2a_enc(lp, lsfdeqold, lsfdeq,
|
||||
lsf_weightTbl_20ms[i], length);
|
||||
memcpy(syntdenum+pos,lp,lp_length*sizeof(float));
|
||||
LSFinterpolate2a_enc(lp, lsfold, lsf,
|
||||
lsf_weightTbl_20ms[i], length);
|
||||
bwexpand(weightdenum+pos, lp,
|
||||
LPC_CHIRP_WEIGHTDENUM, lp_length);
|
||||
pos += lp_length;
|
||||
}
|
||||
}
|
||||
|
||||
/* update memory */
|
||||
|
||||
if (iLBCenc_inst->mode==30) {
|
||||
memcpy(lsfold, lsf2, length*sizeof(float));
|
||||
memcpy(lsfdeqold, lsfdeq2, length*sizeof(float));
|
||||
}
|
||||
else {
|
||||
memcpy(lsfold, lsf, length*sizeof(float));
|
||||
memcpy(lsfdeqold, lsfdeq, length*sizeof(float));
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* lsf quantizer (subrutine to LPCencode)
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void SimplelsfQ(
|
||||
float *lsfdeq, /* (o) dequantized lsf coefficients
|
||||
(dimension FILTERORDER) */
|
||||
int *index, /* (o) quantization index */
|
||||
float *lsf, /* (i) the lsf coefficient vector to be
|
||||
|
||||
|
||||
quantized (dimension FILTERORDER ) */
|
||||
int lpc_n /* (i) number of lsf sets to quantize */
|
||||
){
|
||||
/* Quantize first LSF with memoryless split VQ */
|
||||
SplitVQ(lsfdeq, index, lsf, lsfCbTbl, LSF_NSPLIT,
|
||||
dim_lsfCbTbl, size_lsfCbTbl);
|
||||
|
||||
if (lpc_n==2) {
|
||||
/* Quantize second LSF with memoryless split VQ */
|
||||
SplitVQ(lsfdeq + LPC_FILTERORDER, index + LSF_NSPLIT,
|
||||
lsf + LPC_FILTERORDER, lsfCbTbl, LSF_NSPLIT,
|
||||
dim_lsfCbTbl, size_lsfCbTbl);
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* lpc encoder
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void LPCencode(
|
||||
float *syntdenum, /* (i/o) synthesis filter coefficients
|
||||
before/after encoding */
|
||||
float *weightdenum, /* (i/o) weighting denumerator
|
||||
coefficients before/after
|
||||
encoding */
|
||||
int *lsf_index, /* (o) lsf quantization index */
|
||||
float *data, /* (i) lsf coefficients to quantize */
|
||||
iLBC_Enc_Inst_t *iLBCenc_inst
|
||||
/* (i/o) the encoder state structure */
|
||||
){
|
||||
float lsf[LPC_FILTERORDER * LPC_N_MAX];
|
||||
float lsfdeq[LPC_FILTERORDER * LPC_N_MAX];
|
||||
int change=0;
|
||||
|
||||
SimpleAnalysis(lsf, data, iLBCenc_inst);
|
||||
SimplelsfQ(lsfdeq, lsf_index, lsf, iLBCenc_inst->lpc_n);
|
||||
change=LSF_check(lsfdeq, LPC_FILTERORDER, iLBCenc_inst->lpc_n);
|
||||
SimpleInterpolateLSF(syntdenum, weightdenum,
|
||||
lsf, lsfdeq, iLBCenc_inst->lsfold,
|
||||
iLBCenc_inst->lsfdeqold, LPC_FILTERORDER, iLBCenc_inst);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,29 +1,29 @@
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
LPCencode.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifndef __iLBC_LPCENCOD_H
|
||||
#define __iLBC_LPCENCOD_H
|
||||
|
||||
void LPCencode(
|
||||
float *syntdenum, /* (i/o) synthesis filter coefficients
|
||||
before/after encoding */
|
||||
float *weightdenum, /* (i/o) weighting denumerator coefficients
|
||||
before/after encoding */
|
||||
int *lsf_index, /* (o) lsf quantization index */
|
||||
float *data, /* (i) lsf coefficients to quantize */
|
||||
iLBC_Enc_Inst_t *iLBCenc_inst
|
||||
/* (i/o) the encoder state structure */
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
LPCencode.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifndef __iLBC_LPCENCOD_H
|
||||
#define __iLBC_LPCENCOD_H
|
||||
|
||||
void LPCencode(
|
||||
float *syntdenum, /* (i/o) synthesis filter coefficients
|
||||
before/after encoding */
|
||||
float *weightdenum, /* (i/o) weighting denumerator coefficients
|
||||
before/after encoding */
|
||||
int *lsf_index, /* (o) lsf quantization index */
|
||||
float *data, /* (i) lsf coefficients to quantize */
|
||||
iLBC_Enc_Inst_t *iLBCenc_inst
|
||||
/* (i/o) the encoder state structure */
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
@@ -1,75 +1,75 @@
|
||||
|
||||
/******************************************************************
|
||||
|
||||
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
StateConstructW.c
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#include <math.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "iLBC_define.h"
|
||||
#include "constants.h"
|
||||
#include "filter.h"
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* decoding of the start state
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void StateConstructW(
|
||||
int idxForMax, /* (i) 6-bit index for the quantization of
|
||||
max amplitude */
|
||||
int *idxVec, /* (i) vector of quantization indexes */
|
||||
float *syntDenum, /* (i) synthesis filter denumerator */
|
||||
float *out, /* (o) the decoded state vector */
|
||||
int len /* (i) length of a state vector */
|
||||
){
|
||||
float maxVal, tmpbuf[LPC_FILTERORDER+2*STATE_LEN], *tmp,
|
||||
numerator[LPC_FILTERORDER+1];
|
||||
float foutbuf[LPC_FILTERORDER+2*STATE_LEN], *fout;
|
||||
int k,tmpi;
|
||||
|
||||
/* decoding of the maximum value */
|
||||
|
||||
maxVal = state_frgqTbl[idxForMax];
|
||||
maxVal = (float)pow(10,maxVal)/(float)4.5;
|
||||
|
||||
/* initialization of buffers and coefficients */
|
||||
|
||||
memset(tmpbuf, 0, LPC_FILTERORDER*sizeof(float));
|
||||
memset(foutbuf, 0, LPC_FILTERORDER*sizeof(float));
|
||||
for (k=0; k<LPC_FILTERORDER; k++) {
|
||||
numerator[k]=syntDenum[LPC_FILTERORDER-k];
|
||||
}
|
||||
numerator[LPC_FILTERORDER]=syntDenum[0];
|
||||
tmp = &tmpbuf[LPC_FILTERORDER];
|
||||
fout = &foutbuf[LPC_FILTERORDER];
|
||||
|
||||
/* decoding of the sample values */
|
||||
|
||||
for (k=0; k<len; k++) {
|
||||
tmpi = len-1-k;
|
||||
/* maxVal = 1/scal */
|
||||
|
||||
|
||||
tmp[k] = maxVal*state_sq3Tbl[idxVec[tmpi]];
|
||||
}
|
||||
|
||||
/* circular convolution with all-pass filter */
|
||||
|
||||
memset(tmp+len, 0, len*sizeof(float));
|
||||
ZeroPoleFilter(tmp, numerator, syntDenum, 2*len,
|
||||
LPC_FILTERORDER, fout);
|
||||
for (k=0;k<len;k++) {
|
||||
out[k] = fout[len-1-k]+fout[2*len-1-k];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/******************************************************************
|
||||
|
||||
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
StateConstructW.c
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#include <math.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "iLBC_define.h"
|
||||
#include "constants.h"
|
||||
#include "filter.h"
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* decoding of the start state
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void StateConstructW(
|
||||
int idxForMax, /* (i) 6-bit index for the quantization of
|
||||
max amplitude */
|
||||
int *idxVec, /* (i) vector of quantization indexes */
|
||||
float *syntDenum, /* (i) synthesis filter denumerator */
|
||||
float *out, /* (o) the decoded state vector */
|
||||
int len /* (i) length of a state vector */
|
||||
){
|
||||
float maxVal, tmpbuf[LPC_FILTERORDER+2*STATE_LEN], *tmp,
|
||||
numerator[LPC_FILTERORDER+1];
|
||||
float foutbuf[LPC_FILTERORDER+2*STATE_LEN], *fout;
|
||||
int k,tmpi;
|
||||
|
||||
/* decoding of the maximum value */
|
||||
|
||||
maxVal = state_frgqTbl[idxForMax];
|
||||
maxVal = (float)pow(10,maxVal)/(float)4.5;
|
||||
|
||||
/* initialization of buffers and coefficients */
|
||||
|
||||
memset(tmpbuf, 0, LPC_FILTERORDER*sizeof(float));
|
||||
memset(foutbuf, 0, LPC_FILTERORDER*sizeof(float));
|
||||
for (k=0; k<LPC_FILTERORDER; k++) {
|
||||
numerator[k]=syntDenum[LPC_FILTERORDER-k];
|
||||
}
|
||||
numerator[LPC_FILTERORDER]=syntDenum[0];
|
||||
tmp = &tmpbuf[LPC_FILTERORDER];
|
||||
fout = &foutbuf[LPC_FILTERORDER];
|
||||
|
||||
/* decoding of the sample values */
|
||||
|
||||
for (k=0; k<len; k++) {
|
||||
tmpi = len-1-k;
|
||||
/* maxVal = 1/scal */
|
||||
|
||||
|
||||
tmp[k] = maxVal*state_sq3Tbl[idxVec[tmpi]];
|
||||
}
|
||||
|
||||
/* circular convolution with all-pass filter */
|
||||
|
||||
memset(tmp+len, 0, len*sizeof(float));
|
||||
ZeroPoleFilter(tmp, numerator, syntDenum, 2*len,
|
||||
LPC_FILTERORDER, fout);
|
||||
for (k=0;k<len;k++) {
|
||||
out[k] = fout[len-1-k]+fout[2*len-1-k];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,27 +1,27 @@
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
StateConstructW.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifndef __iLBC_STATECONSTRUCTW_H
|
||||
#define __iLBC_STATECONSTRUCTW_H
|
||||
|
||||
void StateConstructW(
|
||||
int idxForMax, /* (i) 6-bit index for the quantization of
|
||||
max amplitude */
|
||||
int *idxVec, /* (i) vector of quantization indexes */
|
||||
float *syntDenum, /* (i) synthesis filter denumerator */
|
||||
float *out, /* (o) the decoded state vector */
|
||||
int len /* (i) length of a state vector */
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
StateConstructW.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifndef __iLBC_STATECONSTRUCTW_H
|
||||
#define __iLBC_STATECONSTRUCTW_H
|
||||
|
||||
void StateConstructW(
|
||||
int idxForMax, /* (i) 6-bit index for the quantization of
|
||||
max amplitude */
|
||||
int *idxVec, /* (i) vector of quantization indexes */
|
||||
float *syntDenum, /* (i) synthesis filter denumerator */
|
||||
float *out, /* (o) the decoded state vector */
|
||||
int len /* (i) length of a state vector */
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
+193
-193
@@ -1,193 +1,193 @@
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
StateSearchW.c
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#include <math.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "iLBC_define.h"
|
||||
#include "constants.h"
|
||||
#include "filter.h"
|
||||
#include "helpfun.h"
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* predictive noise shaping encoding of scaled start state
|
||||
* (subrutine for StateSearchW)
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void AbsQuantW(
|
||||
iLBC_Enc_Inst_t *iLBCenc_inst,
|
||||
/* (i) Encoder instance */
|
||||
float *in, /* (i) vector to encode */
|
||||
float *syntDenum, /* (i) denominator of synthesis filter */
|
||||
float *weightDenum, /* (i) denominator of weighting filter */
|
||||
int *out, /* (o) vector of quantizer indexes */
|
||||
int len, /* (i) length of vector to encode and
|
||||
vector of quantizer indexes */
|
||||
int state_first /* (i) position of start state in the
|
||||
80 vec */
|
||||
){
|
||||
float *syntOut;
|
||||
float syntOutBuf[LPC_FILTERORDER+STATE_SHORT_LEN_30MS];
|
||||
float toQ, xq;
|
||||
int n;
|
||||
int index;
|
||||
|
||||
/* initialization of buffer for filtering */
|
||||
|
||||
memset(syntOutBuf, 0, LPC_FILTERORDER*sizeof(float));
|
||||
|
||||
|
||||
|
||||
/* initialization of pointer for filtering */
|
||||
|
||||
syntOut = &syntOutBuf[LPC_FILTERORDER];
|
||||
|
||||
/* synthesis and weighting filters on input */
|
||||
|
||||
if (state_first) {
|
||||
AllPoleFilter (in, weightDenum, SUBL, LPC_FILTERORDER);
|
||||
} else {
|
||||
AllPoleFilter (in, weightDenum,
|
||||
iLBCenc_inst->state_short_len-SUBL,
|
||||
LPC_FILTERORDER);
|
||||
}
|
||||
|
||||
/* encoding loop */
|
||||
|
||||
for (n=0; n<len; n++) {
|
||||
|
||||
/* time update of filter coefficients */
|
||||
|
||||
if ((state_first)&&(n==SUBL)){
|
||||
syntDenum += (LPC_FILTERORDER+1);
|
||||
weightDenum += (LPC_FILTERORDER+1);
|
||||
|
||||
/* synthesis and weighting filters on input */
|
||||
AllPoleFilter (&in[n], weightDenum, len-n,
|
||||
LPC_FILTERORDER);
|
||||
|
||||
} else if ((state_first==0)&&
|
||||
(n==(iLBCenc_inst->state_short_len-SUBL))) {
|
||||
syntDenum += (LPC_FILTERORDER+1);
|
||||
weightDenum += (LPC_FILTERORDER+1);
|
||||
|
||||
/* synthesis and weighting filters on input */
|
||||
AllPoleFilter (&in[n], weightDenum, len-n,
|
||||
LPC_FILTERORDER);
|
||||
|
||||
}
|
||||
|
||||
/* prediction of synthesized and weighted input */
|
||||
|
||||
syntOut[n] = 0.0;
|
||||
AllPoleFilter (&syntOut[n], weightDenum, 1,
|
||||
LPC_FILTERORDER);
|
||||
|
||||
/* quantization */
|
||||
|
||||
toQ = in[n]-syntOut[n];
|
||||
sort_sq(&xq, &index, toQ, state_sq3Tbl, 8);
|
||||
out[n]=index;
|
||||
syntOut[n] = state_sq3Tbl[out[n]];
|
||||
|
||||
/* update of the prediction filter */
|
||||
|
||||
|
||||
|
||||
AllPoleFilter(&syntOut[n], weightDenum, 1,
|
||||
LPC_FILTERORDER);
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* encoding of start state
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void StateSearchW(
|
||||
iLBC_Enc_Inst_t *iLBCenc_inst,
|
||||
/* (i) Encoder instance */
|
||||
float *residual,/* (i) target residual vector */
|
||||
float *syntDenum, /* (i) lpc synthesis filter */
|
||||
float *weightDenum, /* (i) weighting filter denuminator */
|
||||
int *idxForMax, /* (o) quantizer index for maximum
|
||||
amplitude */
|
||||
int *idxVec, /* (o) vector of quantization indexes */
|
||||
int len, /* (i) length of all vectors */
|
||||
int state_first /* (i) position of start state in the
|
||||
80 vec */
|
||||
){
|
||||
float dtmp, maxVal;
|
||||
float tmpbuf[LPC_FILTERORDER+2*STATE_SHORT_LEN_30MS];
|
||||
float *tmp, numerator[1+LPC_FILTERORDER];
|
||||
float foutbuf[LPC_FILTERORDER+2*STATE_SHORT_LEN_30MS], *fout;
|
||||
int k;
|
||||
float qmax, scal;
|
||||
|
||||
/* initialization of buffers and filter coefficients */
|
||||
|
||||
memset(tmpbuf, 0, LPC_FILTERORDER*sizeof(float));
|
||||
memset(foutbuf, 0, LPC_FILTERORDER*sizeof(float));
|
||||
for (k=0; k<LPC_FILTERORDER; k++) {
|
||||
numerator[k]=syntDenum[LPC_FILTERORDER-k];
|
||||
}
|
||||
numerator[LPC_FILTERORDER]=syntDenum[0];
|
||||
tmp = &tmpbuf[LPC_FILTERORDER];
|
||||
fout = &foutbuf[LPC_FILTERORDER];
|
||||
|
||||
/* circular convolution with the all-pass filter */
|
||||
|
||||
memcpy(tmp, residual, len*sizeof(float));
|
||||
memset(tmp+len, 0, len*sizeof(float));
|
||||
ZeroPoleFilter(tmp, numerator, syntDenum, 2*len,
|
||||
LPC_FILTERORDER, fout);
|
||||
for (k=0; k<len; k++) {
|
||||
fout[k] += fout[k+len];
|
||||
}
|
||||
|
||||
/* identification of the maximum amplitude value */
|
||||
|
||||
maxVal = fout[0];
|
||||
|
||||
|
||||
for (k=1; k<len; k++) {
|
||||
|
||||
if (fout[k]*fout[k] > maxVal*maxVal){
|
||||
maxVal = fout[k];
|
||||
}
|
||||
}
|
||||
maxVal=(float)fabs(maxVal);
|
||||
|
||||
/* encoding of the maximum amplitude value */
|
||||
|
||||
if (maxVal < 10.0) {
|
||||
maxVal = 10.0;
|
||||
}
|
||||
maxVal = (float)log10(maxVal);
|
||||
sort_sq(&dtmp, idxForMax, maxVal, state_frgqTbl, 64);
|
||||
|
||||
/* decoding of the maximum amplitude representation value,
|
||||
and corresponding scaling of start state */
|
||||
|
||||
maxVal=state_frgqTbl[*idxForMax];
|
||||
qmax = (float)pow(10,maxVal);
|
||||
scal = (float)(4.5)/qmax;
|
||||
for (k=0; k<len; k++){
|
||||
fout[k] *= scal;
|
||||
}
|
||||
|
||||
/* predictive noise shaping encoding of scaled start state */
|
||||
|
||||
AbsQuantW(iLBCenc_inst, fout,syntDenum,
|
||||
weightDenum,idxVec, len, state_first);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
StateSearchW.c
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#include <math.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "iLBC_define.h"
|
||||
#include "constants.h"
|
||||
#include "filter.h"
|
||||
#include "helpfun.h"
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* predictive noise shaping encoding of scaled start state
|
||||
* (subrutine for StateSearchW)
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void AbsQuantW(
|
||||
iLBC_Enc_Inst_t *iLBCenc_inst,
|
||||
/* (i) Encoder instance */
|
||||
float *in, /* (i) vector to encode */
|
||||
float *syntDenum, /* (i) denominator of synthesis filter */
|
||||
float *weightDenum, /* (i) denominator of weighting filter */
|
||||
int *out, /* (o) vector of quantizer indexes */
|
||||
int len, /* (i) length of vector to encode and
|
||||
vector of quantizer indexes */
|
||||
int state_first /* (i) position of start state in the
|
||||
80 vec */
|
||||
){
|
||||
float *syntOut;
|
||||
float syntOutBuf[LPC_FILTERORDER+STATE_SHORT_LEN_30MS];
|
||||
float toQ, xq;
|
||||
int n;
|
||||
int index;
|
||||
|
||||
/* initialization of buffer for filtering */
|
||||
|
||||
memset(syntOutBuf, 0, LPC_FILTERORDER*sizeof(float));
|
||||
|
||||
|
||||
|
||||
/* initialization of pointer for filtering */
|
||||
|
||||
syntOut = &syntOutBuf[LPC_FILTERORDER];
|
||||
|
||||
/* synthesis and weighting filters on input */
|
||||
|
||||
if (state_first) {
|
||||
AllPoleFilter (in, weightDenum, SUBL, LPC_FILTERORDER);
|
||||
} else {
|
||||
AllPoleFilter (in, weightDenum,
|
||||
iLBCenc_inst->state_short_len-SUBL,
|
||||
LPC_FILTERORDER);
|
||||
}
|
||||
|
||||
/* encoding loop */
|
||||
|
||||
for (n=0; n<len; n++) {
|
||||
|
||||
/* time update of filter coefficients */
|
||||
|
||||
if ((state_first)&&(n==SUBL)){
|
||||
syntDenum += (LPC_FILTERORDER+1);
|
||||
weightDenum += (LPC_FILTERORDER+1);
|
||||
|
||||
/* synthesis and weighting filters on input */
|
||||
AllPoleFilter (&in[n], weightDenum, len-n,
|
||||
LPC_FILTERORDER);
|
||||
|
||||
} else if ((state_first==0)&&
|
||||
(n==(iLBCenc_inst->state_short_len-SUBL))) {
|
||||
syntDenum += (LPC_FILTERORDER+1);
|
||||
weightDenum += (LPC_FILTERORDER+1);
|
||||
|
||||
/* synthesis and weighting filters on input */
|
||||
AllPoleFilter (&in[n], weightDenum, len-n,
|
||||
LPC_FILTERORDER);
|
||||
|
||||
}
|
||||
|
||||
/* prediction of synthesized and weighted input */
|
||||
|
||||
syntOut[n] = 0.0;
|
||||
AllPoleFilter (&syntOut[n], weightDenum, 1,
|
||||
LPC_FILTERORDER);
|
||||
|
||||
/* quantization */
|
||||
|
||||
toQ = in[n]-syntOut[n];
|
||||
sort_sq(&xq, &index, toQ, state_sq3Tbl, 8);
|
||||
out[n]=index;
|
||||
syntOut[n] = state_sq3Tbl[out[n]];
|
||||
|
||||
/* update of the prediction filter */
|
||||
|
||||
|
||||
|
||||
AllPoleFilter(&syntOut[n], weightDenum, 1,
|
||||
LPC_FILTERORDER);
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* encoding of start state
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void StateSearchW(
|
||||
iLBC_Enc_Inst_t *iLBCenc_inst,
|
||||
/* (i) Encoder instance */
|
||||
float *residual,/* (i) target residual vector */
|
||||
float *syntDenum, /* (i) lpc synthesis filter */
|
||||
float *weightDenum, /* (i) weighting filter denuminator */
|
||||
int *idxForMax, /* (o) quantizer index for maximum
|
||||
amplitude */
|
||||
int *idxVec, /* (o) vector of quantization indexes */
|
||||
int len, /* (i) length of all vectors */
|
||||
int state_first /* (i) position of start state in the
|
||||
80 vec */
|
||||
){
|
||||
float dtmp, maxVal;
|
||||
float tmpbuf[LPC_FILTERORDER+2*STATE_SHORT_LEN_30MS];
|
||||
float *tmp, numerator[1+LPC_FILTERORDER];
|
||||
float foutbuf[LPC_FILTERORDER+2*STATE_SHORT_LEN_30MS], *fout;
|
||||
int k;
|
||||
float qmax, scal;
|
||||
|
||||
/* initialization of buffers and filter coefficients */
|
||||
|
||||
memset(tmpbuf, 0, LPC_FILTERORDER*sizeof(float));
|
||||
memset(foutbuf, 0, LPC_FILTERORDER*sizeof(float));
|
||||
for (k=0; k<LPC_FILTERORDER; k++) {
|
||||
numerator[k]=syntDenum[LPC_FILTERORDER-k];
|
||||
}
|
||||
numerator[LPC_FILTERORDER]=syntDenum[0];
|
||||
tmp = &tmpbuf[LPC_FILTERORDER];
|
||||
fout = &foutbuf[LPC_FILTERORDER];
|
||||
|
||||
/* circular convolution with the all-pass filter */
|
||||
|
||||
memcpy(tmp, residual, len*sizeof(float));
|
||||
memset(tmp+len, 0, len*sizeof(float));
|
||||
ZeroPoleFilter(tmp, numerator, syntDenum, 2*len,
|
||||
LPC_FILTERORDER, fout);
|
||||
for (k=0; k<len; k++) {
|
||||
fout[k] += fout[k+len];
|
||||
}
|
||||
|
||||
/* identification of the maximum amplitude value */
|
||||
|
||||
maxVal = fout[0];
|
||||
|
||||
|
||||
for (k=1; k<len; k++) {
|
||||
|
||||
if (fout[k]*fout[k] > maxVal*maxVal){
|
||||
maxVal = fout[k];
|
||||
}
|
||||
}
|
||||
maxVal=(float)fabs(maxVal);
|
||||
|
||||
/* encoding of the maximum amplitude value */
|
||||
|
||||
if (maxVal < 10.0) {
|
||||
maxVal = 10.0;
|
||||
}
|
||||
maxVal = (float)log10(maxVal);
|
||||
sort_sq(&dtmp, idxForMax, maxVal, state_frgqTbl, 64);
|
||||
|
||||
/* decoding of the maximum amplitude representation value,
|
||||
and corresponding scaling of start state */
|
||||
|
||||
maxVal=state_frgqTbl[*idxForMax];
|
||||
qmax = (float)pow(10,maxVal);
|
||||
scal = (float)(4.5)/qmax;
|
||||
for (k=0; k<len; k++){
|
||||
fout[k] *= scal;
|
||||
}
|
||||
|
||||
/* predictive noise shaping encoding of scaled start state */
|
||||
|
||||
AbsQuantW(iLBCenc_inst, fout,syntDenum,
|
||||
weightDenum,idxVec, len, state_first);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,48 +1,48 @@
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
StateSearchW.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifndef __iLBC_STATESEARCHW_H
|
||||
#define __iLBC_STATESEARCHW_H
|
||||
|
||||
void AbsQuantW(
|
||||
iLBC_Enc_Inst_t *iLBCenc_inst,
|
||||
/* (i) Encoder instance */
|
||||
float *in, /* (i) vector to encode */
|
||||
float *syntDenum, /* (i) denominator of synthesis filter */
|
||||
float *weightDenum, /* (i) denominator of weighting filter */
|
||||
int *out, /* (o) vector of quantizer indexes */
|
||||
int len, /* (i) length of vector to encode and
|
||||
vector of quantizer indexes */
|
||||
int state_first /* (i) position of start state in the
|
||||
80 vec */
|
||||
);
|
||||
|
||||
void StateSearchW(
|
||||
iLBC_Enc_Inst_t *iLBCenc_inst,
|
||||
/* (i) Encoder instance */
|
||||
float *residual,/* (i) target residual vector */
|
||||
float *syntDenum, /* (i) lpc synthesis filter */
|
||||
float *weightDenum, /* (i) weighting filter denuminator */
|
||||
int *idxForMax, /* (o) quantizer index for maximum
|
||||
amplitude */
|
||||
int *idxVec, /* (o) vector of quantization indexes */
|
||||
int len, /* (i) length of all vectors */
|
||||
int state_first /* (i) position of start state in the
|
||||
|
||||
|
||||
80 vec */
|
||||
);
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
StateSearchW.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifndef __iLBC_STATESEARCHW_H
|
||||
#define __iLBC_STATESEARCHW_H
|
||||
|
||||
void AbsQuantW(
|
||||
iLBC_Enc_Inst_t *iLBCenc_inst,
|
||||
/* (i) Encoder instance */
|
||||
float *in, /* (i) vector to encode */
|
||||
float *syntDenum, /* (i) denominator of synthesis filter */
|
||||
float *weightDenum, /* (i) denominator of weighting filter */
|
||||
int *out, /* (o) vector of quantizer indexes */
|
||||
int len, /* (i) length of vector to encode and
|
||||
vector of quantizer indexes */
|
||||
int state_first /* (i) position of start state in the
|
||||
80 vec */
|
||||
);
|
||||
|
||||
void StateSearchW(
|
||||
iLBC_Enc_Inst_t *iLBCenc_inst,
|
||||
/* (i) Encoder instance */
|
||||
float *residual,/* (i) target residual vector */
|
||||
float *syntDenum, /* (i) lpc synthesis filter */
|
||||
float *weightDenum, /* (i) weighting filter denuminator */
|
||||
int *idxForMax, /* (o) quantizer index for maximum
|
||||
amplitude */
|
||||
int *idxVec, /* (o) vector of quantization indexes */
|
||||
int len, /* (i) length of all vectors */
|
||||
int state_first /* (i) position of start state in the
|
||||
|
||||
|
||||
80 vec */
|
||||
);
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
@@ -1,70 +1,70 @@
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
anaFilter.c
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#include <string.h>
|
||||
#include "iLBC_define.h"
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* LP analysis filter.
|
||||
|
||||
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void anaFilter(
|
||||
float *In, /* (i) Signal to be filtered */
|
||||
float *a, /* (i) LP parameters */
|
||||
int len,/* (i) Length of signal */
|
||||
float *Out, /* (o) Filtered signal */
|
||||
float *mem /* (i/o) Filter state */
|
||||
){
|
||||
int i, j;
|
||||
float *po, *pi, *pm, *pa;
|
||||
|
||||
po = Out;
|
||||
|
||||
/* Filter first part using memory from past */
|
||||
|
||||
for (i=0; i<LPC_FILTERORDER; i++) {
|
||||
pi = &In[i];
|
||||
pm = &mem[LPC_FILTERORDER-1];
|
||||
pa = a;
|
||||
*po=0.0;
|
||||
for (j=0; j<=i; j++) {
|
||||
*po+=(*pa++)*(*pi--);
|
||||
}
|
||||
for (j=i+1; j<LPC_FILTERORDER+1; j++) {
|
||||
|
||||
*po+=(*pa++)*(*pm--);
|
||||
}
|
||||
po++;
|
||||
}
|
||||
|
||||
/* Filter last part where the state is entierly
|
||||
in the input vector */
|
||||
|
||||
for (i=LPC_FILTERORDER; i<len; i++) {
|
||||
pi = &In[i];
|
||||
pa = a;
|
||||
*po=0.0;
|
||||
for (j=0; j<LPC_FILTERORDER+1; j++) {
|
||||
*po+=(*pa++)*(*pi--);
|
||||
}
|
||||
po++;
|
||||
}
|
||||
|
||||
/* Update state vector */
|
||||
|
||||
memcpy(mem, &In[len-LPC_FILTERORDER],
|
||||
LPC_FILTERORDER*sizeof(float));
|
||||
}
|
||||
|
||||
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
anaFilter.c
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#include <string.h>
|
||||
#include "iLBC_define.h"
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* LP analysis filter.
|
||||
|
||||
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void anaFilter(
|
||||
float *In, /* (i) Signal to be filtered */
|
||||
float *a, /* (i) LP parameters */
|
||||
int len,/* (i) Length of signal */
|
||||
float *Out, /* (o) Filtered signal */
|
||||
float *mem /* (i/o) Filter state */
|
||||
){
|
||||
int i, j;
|
||||
float *po, *pi, *pm, *pa;
|
||||
|
||||
po = Out;
|
||||
|
||||
/* Filter first part using memory from past */
|
||||
|
||||
for (i=0; i<LPC_FILTERORDER; i++) {
|
||||
pi = &In[i];
|
||||
pm = &mem[LPC_FILTERORDER-1];
|
||||
pa = a;
|
||||
*po=0.0;
|
||||
for (j=0; j<=i; j++) {
|
||||
*po+=(*pa++)*(*pi--);
|
||||
}
|
||||
for (j=i+1; j<LPC_FILTERORDER+1; j++) {
|
||||
|
||||
*po+=(*pa++)*(*pm--);
|
||||
}
|
||||
po++;
|
||||
}
|
||||
|
||||
/* Filter last part where the state is entierly
|
||||
in the input vector */
|
||||
|
||||
for (i=LPC_FILTERORDER; i<len; i++) {
|
||||
pi = &In[i];
|
||||
pa = a;
|
||||
*po=0.0;
|
||||
for (j=0; j<LPC_FILTERORDER+1; j++) {
|
||||
*po+=(*pa++)*(*pi--);
|
||||
}
|
||||
po++;
|
||||
}
|
||||
|
||||
/* Update state vector */
|
||||
|
||||
memcpy(mem, &In[len-LPC_FILTERORDER],
|
||||
LPC_FILTERORDER*sizeof(float));
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,26 +1,26 @@
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
anaFilter.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifndef __iLBC_ANAFILTER_H
|
||||
#define __iLBC_ANAFILTER_H
|
||||
|
||||
void anaFilter(
|
||||
float *In, /* (i) Signal to be filtered */
|
||||
float *a, /* (i) LP parameters */
|
||||
int len,/* (i) Length of signal */
|
||||
float *Out, /* (o) Filtered signal */
|
||||
float *mem /* (i/o) Filter state */
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
anaFilter.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifndef __iLBC_ANAFILTER_H
|
||||
#define __iLBC_ANAFILTER_H
|
||||
|
||||
void anaFilter(
|
||||
float *In, /* (i) Signal to be filtered */
|
||||
float *a, /* (i) LP parameters */
|
||||
int len,/* (i) Length of signal */
|
||||
float *Out, /* (o) Filtered signal */
|
||||
float *mem /* (i/o) Filter state */
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
+729
-729
File diff suppressed because it is too large
Load Diff
@@ -1,74 +1,74 @@
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
constants.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifndef __iLBC_CONSTANTS_H
|
||||
#define __iLBC_CONSTANTS_H
|
||||
|
||||
#include "iLBC_define.h"
|
||||
|
||||
|
||||
/* ULP bit allocation */
|
||||
|
||||
extern const iLBC_ULP_Inst_t ULP_20msTbl;
|
||||
extern const iLBC_ULP_Inst_t ULP_30msTbl;
|
||||
|
||||
/* high pass filters */
|
||||
|
||||
extern float hpi_zero_coefsTbl[];
|
||||
extern float hpi_pole_coefsTbl[];
|
||||
extern float hpo_zero_coefsTbl[];
|
||||
extern float hpo_pole_coefsTbl[];
|
||||
|
||||
/* low pass filters */
|
||||
extern float lpFilt_coefsTbl[];
|
||||
|
||||
/* LPC analysis and quantization */
|
||||
|
||||
extern float lpc_winTbl[];
|
||||
extern float lpc_asymwinTbl[];
|
||||
extern float lpc_lagwinTbl[];
|
||||
extern float lsfCbTbl[];
|
||||
extern float lsfmeanTbl[];
|
||||
extern int dim_lsfCbTbl[];
|
||||
extern int size_lsfCbTbl[];
|
||||
extern float lsf_weightTbl_30ms[];
|
||||
extern float lsf_weightTbl_20ms[];
|
||||
|
||||
/* state quantization tables */
|
||||
|
||||
extern float state_sq3Tbl[];
|
||||
extern float state_frgqTbl[];
|
||||
|
||||
/* gain quantization tables */
|
||||
|
||||
extern float gain_sq3Tbl[];
|
||||
extern float gain_sq4Tbl[];
|
||||
extern float gain_sq5Tbl[];
|
||||
|
||||
/* adaptive codebook definitions */
|
||||
|
||||
extern int search_rangeTbl[5][CB_NSTAGES];
|
||||
extern int memLfTbl[];
|
||||
extern int stMemLTbl;
|
||||
extern float cbfiltersTbl[CB_FILTERLEN];
|
||||
|
||||
|
||||
|
||||
/* enhancer definitions */
|
||||
|
||||
extern float polyphaserTbl[];
|
||||
extern float enh_plocsTbl[];
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
constants.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifndef __iLBC_CONSTANTS_H
|
||||
#define __iLBC_CONSTANTS_H
|
||||
|
||||
#include "iLBC_define.h"
|
||||
|
||||
|
||||
/* ULP bit allocation */
|
||||
|
||||
extern const iLBC_ULP_Inst_t ULP_20msTbl;
|
||||
extern const iLBC_ULP_Inst_t ULP_30msTbl;
|
||||
|
||||
/* high pass filters */
|
||||
|
||||
extern float hpi_zero_coefsTbl[];
|
||||
extern float hpi_pole_coefsTbl[];
|
||||
extern float hpo_zero_coefsTbl[];
|
||||
extern float hpo_pole_coefsTbl[];
|
||||
|
||||
/* low pass filters */
|
||||
extern float lpFilt_coefsTbl[];
|
||||
|
||||
/* LPC analysis and quantization */
|
||||
|
||||
extern float lpc_winTbl[];
|
||||
extern float lpc_asymwinTbl[];
|
||||
extern float lpc_lagwinTbl[];
|
||||
extern float lsfCbTbl[];
|
||||
extern float lsfmeanTbl[];
|
||||
extern int dim_lsfCbTbl[];
|
||||
extern int size_lsfCbTbl[];
|
||||
extern float lsf_weightTbl_30ms[];
|
||||
extern float lsf_weightTbl_20ms[];
|
||||
|
||||
/* state quantization tables */
|
||||
|
||||
extern float state_sq3Tbl[];
|
||||
extern float state_frgqTbl[];
|
||||
|
||||
/* gain quantization tables */
|
||||
|
||||
extern float gain_sq3Tbl[];
|
||||
extern float gain_sq4Tbl[];
|
||||
extern float gain_sq5Tbl[];
|
||||
|
||||
/* adaptive codebook definitions */
|
||||
|
||||
extern int search_rangeTbl[5][CB_NSTAGES];
|
||||
extern int memLfTbl[];
|
||||
extern int stMemLTbl;
|
||||
extern float cbfiltersTbl[CB_FILTERLEN];
|
||||
|
||||
|
||||
|
||||
/* enhancer definitions */
|
||||
|
||||
extern float polyphaserTbl[];
|
||||
extern float enh_plocsTbl[];
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
+215
-215
@@ -1,215 +1,215 @@
|
||||
|
||||
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
createCB.c
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#include "iLBC_define.h"
|
||||
#include "constants.h"
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* Construct an additional codebook vector by filtering the
|
||||
* initial codebook buffer. This vector is then used to expand
|
||||
* the codebook with an additional section.
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void filteredCBvecs(
|
||||
float *cbvectors, /* (o) Codebook vectors for the
|
||||
higher section */
|
||||
float *mem, /* (i) Buffer to create codebook
|
||||
vector from */
|
||||
int lMem /* (i) Length of buffer */
|
||||
){
|
||||
int j, k;
|
||||
float *pp, *pp1;
|
||||
float tempbuff2[CB_MEML+CB_FILTERLEN];
|
||||
float *pos;
|
||||
|
||||
memset(tempbuff2, 0, (CB_HALFFILTERLEN-1)*sizeof(float));
|
||||
memcpy(&tempbuff2[CB_HALFFILTERLEN-1], mem, lMem*sizeof(float));
|
||||
memset(&tempbuff2[lMem+CB_HALFFILTERLEN-1], 0,
|
||||
(CB_HALFFILTERLEN+1)*sizeof(float));
|
||||
|
||||
/* Create codebook vector for higher section by filtering */
|
||||
|
||||
/* do filtering */
|
||||
pos=cbvectors;
|
||||
memset(pos, 0, lMem*sizeof(float));
|
||||
for (k=0; k<lMem; k++) {
|
||||
pp=&tempbuff2[k];
|
||||
pp1=&cbfiltersTbl[CB_FILTERLEN-1];
|
||||
for (j=0;j<CB_FILTERLEN;j++) {
|
||||
(*pos)+=(*pp++)*(*pp1--);
|
||||
}
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* Search the augmented part of the codebook to find the best
|
||||
* measure.
|
||||
*----------------------------------------------------------------*/
|
||||
|
||||
void searchAugmentedCB(
|
||||
int low, /* (i) Start index for the search */
|
||||
int high, /* (i) End index for the search */
|
||||
int stage, /* (i) Current stage */
|
||||
int startIndex, /* (i) Codebook index for the first
|
||||
aug vector */
|
||||
float *target, /* (i) Target vector for encoding */
|
||||
float *buffer, /* (i) Pointer to the end of the buffer for
|
||||
augmented codebook construction */
|
||||
float *max_measure, /* (i/o) Currently maximum measure */
|
||||
int *best_index,/* (o) Currently the best index */
|
||||
float *gain, /* (o) Currently the best gain */
|
||||
float *energy, /* (o) Energy of augmented codebook
|
||||
vectors */
|
||||
float *invenergy/* (o) Inv energy of augmented codebook
|
||||
vectors */
|
||||
) {
|
||||
int icount, ilow, j, tmpIndex;
|
||||
float *pp, *ppo, *ppi, *ppe, crossDot, alfa;
|
||||
float weighted, measure, nrjRecursive;
|
||||
float ftmp;
|
||||
|
||||
/* Compute the energy for the first (low-5)
|
||||
noninterpolated samples */
|
||||
nrjRecursive = (float) 0.0;
|
||||
pp = buffer - low + 1;
|
||||
for (j=0; j<(low-5); j++) {
|
||||
nrjRecursive += ( (*pp)*(*pp) );
|
||||
pp++;
|
||||
}
|
||||
ppe = buffer - low;
|
||||
|
||||
|
||||
for (icount=low; icount<=high; icount++) {
|
||||
|
||||
/* Index of the codebook vector used for retrieving
|
||||
energy values */
|
||||
tmpIndex = startIndex+icount-20;
|
||||
|
||||
ilow = icount-4;
|
||||
|
||||
/* Update the energy recursively to save complexity */
|
||||
nrjRecursive = nrjRecursive + (*ppe)*(*ppe);
|
||||
ppe--;
|
||||
energy[tmpIndex] = nrjRecursive;
|
||||
|
||||
/* Compute cross dot product for the first (low-5)
|
||||
samples */
|
||||
crossDot = (float) 0.0;
|
||||
|
||||
|
||||
pp = buffer-icount;
|
||||
for (j=0; j<ilow; j++) {
|
||||
crossDot += target[j]*(*pp++);
|
||||
}
|
||||
|
||||
/* interpolation */
|
||||
alfa = (float) 0.2;
|
||||
ppo = buffer-4;
|
||||
ppi = buffer-icount-4;
|
||||
for (j=ilow; j<icount; j++) {
|
||||
weighted = ((float)1.0-alfa)*(*ppo)+alfa*(*ppi);
|
||||
ppo++;
|
||||
ppi++;
|
||||
energy[tmpIndex] += weighted*weighted;
|
||||
crossDot += target[j]*weighted;
|
||||
alfa += (float)0.2;
|
||||
}
|
||||
|
||||
/* Compute energy and cross dot product for the
|
||||
remaining samples */
|
||||
pp = buffer - icount;
|
||||
for (j=icount; j<SUBL; j++) {
|
||||
energy[tmpIndex] += (*pp)*(*pp);
|
||||
crossDot += target[j]*(*pp++);
|
||||
}
|
||||
|
||||
if (energy[tmpIndex]>0.0) {
|
||||
invenergy[tmpIndex]=(float)1.0/(energy[tmpIndex]+EPS);
|
||||
} else {
|
||||
invenergy[tmpIndex] = (float) 0.0;
|
||||
}
|
||||
|
||||
if (stage==0) {
|
||||
measure = (float)-10000000.0;
|
||||
|
||||
if (crossDot > 0.0) {
|
||||
measure = crossDot*crossDot*invenergy[tmpIndex];
|
||||
}
|
||||
}
|
||||
else {
|
||||
measure = crossDot*crossDot*invenergy[tmpIndex];
|
||||
}
|
||||
|
||||
/* check if measure is better */
|
||||
ftmp = crossDot*invenergy[tmpIndex];
|
||||
|
||||
if ((measure>*max_measure) && (fabs(ftmp)<CB_MAXGAIN)) {
|
||||
*best_index = tmpIndex;
|
||||
*max_measure = measure;
|
||||
*gain = ftmp;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* Recreate a specific codebook vector from the augmented part.
|
||||
*
|
||||
*----------------------------------------------------------------*/
|
||||
|
||||
void createAugmentedVec(
|
||||
int index, /* (i) Index for the augmented vector
|
||||
to be created */
|
||||
float *buffer, /* (i) Pointer to the end of the buffer for
|
||||
augmented codebook construction */
|
||||
float *cbVec/* (o) The construced codebook vector */
|
||||
) {
|
||||
int ilow, j;
|
||||
float *pp, *ppo, *ppi, alfa, alfa1, weighted;
|
||||
|
||||
ilow = index-5;
|
||||
|
||||
/* copy the first noninterpolated part */
|
||||
|
||||
pp = buffer-index;
|
||||
memcpy(cbVec,pp,sizeof(float)*index);
|
||||
|
||||
/* interpolation */
|
||||
|
||||
alfa1 = (float)0.2;
|
||||
alfa = 0.0;
|
||||
ppo = buffer-5;
|
||||
ppi = buffer-index-5;
|
||||
for (j=ilow; j<index; j++) {
|
||||
weighted = ((float)1.0-alfa)*(*ppo)+alfa*(*ppi);
|
||||
ppo++;
|
||||
ppi++;
|
||||
cbVec[j] = weighted;
|
||||
alfa += alfa1;
|
||||
}
|
||||
|
||||
/* copy the second noninterpolated part */
|
||||
|
||||
pp = buffer - index;
|
||||
memcpy(cbVec+index,pp,sizeof(float)*(SUBL-index));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
createCB.c
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#include "iLBC_define.h"
|
||||
#include "constants.h"
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* Construct an additional codebook vector by filtering the
|
||||
* initial codebook buffer. This vector is then used to expand
|
||||
* the codebook with an additional section.
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void filteredCBvecs(
|
||||
float *cbvectors, /* (o) Codebook vectors for the
|
||||
higher section */
|
||||
float *mem, /* (i) Buffer to create codebook
|
||||
vector from */
|
||||
int lMem /* (i) Length of buffer */
|
||||
){
|
||||
int j, k;
|
||||
float *pp, *pp1;
|
||||
float tempbuff2[CB_MEML+CB_FILTERLEN];
|
||||
float *pos;
|
||||
|
||||
memset(tempbuff2, 0, (CB_HALFFILTERLEN-1)*sizeof(float));
|
||||
memcpy(&tempbuff2[CB_HALFFILTERLEN-1], mem, lMem*sizeof(float));
|
||||
memset(&tempbuff2[lMem+CB_HALFFILTERLEN-1], 0,
|
||||
(CB_HALFFILTERLEN+1)*sizeof(float));
|
||||
|
||||
/* Create codebook vector for higher section by filtering */
|
||||
|
||||
/* do filtering */
|
||||
pos=cbvectors;
|
||||
memset(pos, 0, lMem*sizeof(float));
|
||||
for (k=0; k<lMem; k++) {
|
||||
pp=&tempbuff2[k];
|
||||
pp1=&cbfiltersTbl[CB_FILTERLEN-1];
|
||||
for (j=0;j<CB_FILTERLEN;j++) {
|
||||
(*pos)+=(*pp++)*(*pp1--);
|
||||
}
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* Search the augmented part of the codebook to find the best
|
||||
* measure.
|
||||
*----------------------------------------------------------------*/
|
||||
|
||||
void searchAugmentedCB(
|
||||
int low, /* (i) Start index for the search */
|
||||
int high, /* (i) End index for the search */
|
||||
int stage, /* (i) Current stage */
|
||||
int startIndex, /* (i) Codebook index for the first
|
||||
aug vector */
|
||||
float *target, /* (i) Target vector for encoding */
|
||||
float *buffer, /* (i) Pointer to the end of the buffer for
|
||||
augmented codebook construction */
|
||||
float *max_measure, /* (i/o) Currently maximum measure */
|
||||
int *best_index,/* (o) Currently the best index */
|
||||
float *gain, /* (o) Currently the best gain */
|
||||
float *energy, /* (o) Energy of augmented codebook
|
||||
vectors */
|
||||
float *invenergy/* (o) Inv energy of augmented codebook
|
||||
vectors */
|
||||
) {
|
||||
int icount, ilow, j, tmpIndex;
|
||||
float *pp, *ppo, *ppi, *ppe, crossDot, alfa;
|
||||
float weighted, measure, nrjRecursive;
|
||||
float ftmp;
|
||||
|
||||
/* Compute the energy for the first (low-5)
|
||||
noninterpolated samples */
|
||||
nrjRecursive = (float) 0.0;
|
||||
pp = buffer - low + 1;
|
||||
for (j=0; j<(low-5); j++) {
|
||||
nrjRecursive += ( (*pp)*(*pp) );
|
||||
pp++;
|
||||
}
|
||||
ppe = buffer - low;
|
||||
|
||||
|
||||
for (icount=low; icount<=high; icount++) {
|
||||
|
||||
/* Index of the codebook vector used for retrieving
|
||||
energy values */
|
||||
tmpIndex = startIndex+icount-20;
|
||||
|
||||
ilow = icount-4;
|
||||
|
||||
/* Update the energy recursively to save complexity */
|
||||
nrjRecursive = nrjRecursive + (*ppe)*(*ppe);
|
||||
ppe--;
|
||||
energy[tmpIndex] = nrjRecursive;
|
||||
|
||||
/* Compute cross dot product for the first (low-5)
|
||||
samples */
|
||||
crossDot = (float) 0.0;
|
||||
|
||||
|
||||
pp = buffer-icount;
|
||||
for (j=0; j<ilow; j++) {
|
||||
crossDot += target[j]*(*pp++);
|
||||
}
|
||||
|
||||
/* interpolation */
|
||||
alfa = (float) 0.2;
|
||||
ppo = buffer-4;
|
||||
ppi = buffer-icount-4;
|
||||
for (j=ilow; j<icount; j++) {
|
||||
weighted = ((float)1.0-alfa)*(*ppo)+alfa*(*ppi);
|
||||
ppo++;
|
||||
ppi++;
|
||||
energy[tmpIndex] += weighted*weighted;
|
||||
crossDot += target[j]*weighted;
|
||||
alfa += (float)0.2;
|
||||
}
|
||||
|
||||
/* Compute energy and cross dot product for the
|
||||
remaining samples */
|
||||
pp = buffer - icount;
|
||||
for (j=icount; j<SUBL; j++) {
|
||||
energy[tmpIndex] += (*pp)*(*pp);
|
||||
crossDot += target[j]*(*pp++);
|
||||
}
|
||||
|
||||
if (energy[tmpIndex]>0.0) {
|
||||
invenergy[tmpIndex]=(float)1.0/(energy[tmpIndex]+EPS);
|
||||
} else {
|
||||
invenergy[tmpIndex] = (float) 0.0;
|
||||
}
|
||||
|
||||
if (stage==0) {
|
||||
measure = (float)-10000000.0;
|
||||
|
||||
if (crossDot > 0.0) {
|
||||
measure = crossDot*crossDot*invenergy[tmpIndex];
|
||||
}
|
||||
}
|
||||
else {
|
||||
measure = crossDot*crossDot*invenergy[tmpIndex];
|
||||
}
|
||||
|
||||
/* check if measure is better */
|
||||
ftmp = crossDot*invenergy[tmpIndex];
|
||||
|
||||
if ((measure>*max_measure) && (fabs(ftmp)<CB_MAXGAIN)) {
|
||||
*best_index = tmpIndex;
|
||||
*max_measure = measure;
|
||||
*gain = ftmp;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* Recreate a specific codebook vector from the augmented part.
|
||||
*
|
||||
*----------------------------------------------------------------*/
|
||||
|
||||
void createAugmentedVec(
|
||||
int index, /* (i) Index for the augmented vector
|
||||
to be created */
|
||||
float *buffer, /* (i) Pointer to the end of the buffer for
|
||||
augmented codebook construction */
|
||||
float *cbVec/* (o) The construced codebook vector */
|
||||
) {
|
||||
int ilow, j;
|
||||
float *pp, *ppo, *ppi, alfa, alfa1, weighted;
|
||||
|
||||
ilow = index-5;
|
||||
|
||||
/* copy the first noninterpolated part */
|
||||
|
||||
pp = buffer-index;
|
||||
memcpy(cbVec,pp,sizeof(float)*index);
|
||||
|
||||
/* interpolation */
|
||||
|
||||
alfa1 = (float)0.2;
|
||||
alfa = 0.0;
|
||||
ppo = buffer-5;
|
||||
ppi = buffer-index-5;
|
||||
for (j=ilow; j<index; j++) {
|
||||
weighted = ((float)1.0-alfa)*(*ppo)+alfa*(*ppi);
|
||||
ppo++;
|
||||
ppi++;
|
||||
cbVec[j] = weighted;
|
||||
alfa += alfa1;
|
||||
}
|
||||
|
||||
/* copy the second noninterpolated part */
|
||||
|
||||
pp = buffer - index;
|
||||
memcpy(cbVec+index,pp,sizeof(float)*(SUBL-index));
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,56 +1,56 @@
|
||||
|
||||
/******************************************************************
|
||||
|
||||
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
createCB.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifndef __iLBC_CREATECB_H
|
||||
#define __iLBC_CREATECB_H
|
||||
|
||||
void filteredCBvecs(
|
||||
float *cbvectors, /* (o) Codebook vector for the
|
||||
higher section */
|
||||
float *mem, /* (i) Buffer to create codebook
|
||||
vectors from */
|
||||
int lMem /* (i) Length of buffer */
|
||||
);
|
||||
|
||||
void searchAugmentedCB(
|
||||
int low, /* (i) Start index for the search */
|
||||
int high, /* (i) End index for the search */
|
||||
int stage, /* (i) Current stage */
|
||||
int startIndex, /* (i) CB index for the first
|
||||
augmented vector */
|
||||
float *target, /* (i) Target vector for encoding */
|
||||
float *buffer, /* (i) Pointer to the end of the
|
||||
buffer for augmented codebook
|
||||
construction */
|
||||
float *max_measure, /* (i/o) Currently maximum measure */
|
||||
int *best_index,/* (o) Currently the best index */
|
||||
float *gain, /* (o) Currently the best gain */
|
||||
float *energy, /* (o) Energy of augmented
|
||||
codebook vectors */
|
||||
float *invenergy/* (o) Inv energy of aug codebook
|
||||
vectors */
|
||||
);
|
||||
|
||||
void createAugmentedVec(
|
||||
int index, /* (i) Index for the aug vector
|
||||
to be created */
|
||||
float *buffer, /* (i) Pointer to the end of the
|
||||
buffer for augmented codebook
|
||||
construction */
|
||||
float *cbVec /* (o) The construced codebook vector */
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/******************************************************************
|
||||
|
||||
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
createCB.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifndef __iLBC_CREATECB_H
|
||||
#define __iLBC_CREATECB_H
|
||||
|
||||
void filteredCBvecs(
|
||||
float *cbvectors, /* (o) Codebook vector for the
|
||||
higher section */
|
||||
float *mem, /* (i) Buffer to create codebook
|
||||
vectors from */
|
||||
int lMem /* (i) Length of buffer */
|
||||
);
|
||||
|
||||
void searchAugmentedCB(
|
||||
int low, /* (i) Start index for the search */
|
||||
int high, /* (i) End index for the search */
|
||||
int stage, /* (i) Current stage */
|
||||
int startIndex, /* (i) CB index for the first
|
||||
augmented vector */
|
||||
float *target, /* (i) Target vector for encoding */
|
||||
float *buffer, /* (i) Pointer to the end of the
|
||||
buffer for augmented codebook
|
||||
construction */
|
||||
float *max_measure, /* (i/o) Currently maximum measure */
|
||||
int *best_index,/* (o) Currently the best index */
|
||||
float *gain, /* (o) Currently the best gain */
|
||||
float *energy, /* (o) Energy of augmented
|
||||
codebook vectors */
|
||||
float *invenergy/* (o) Inv energy of aug codebook
|
||||
vectors */
|
||||
);
|
||||
|
||||
void createAugmentedVec(
|
||||
int index, /* (i) Index for the aug vector
|
||||
to be created */
|
||||
float *buffer, /* (i) Pointer to the end of the
|
||||
buffer for augmented codebook
|
||||
construction */
|
||||
float *cbVec /* (o) The construced codebook vector */
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
+258
-258
@@ -1,258 +1,258 @@
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
doCPLC.c
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#include <math.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "iLBC_define.h"
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* Compute cross correlation and pitch gain for pitch prediction
|
||||
* of last subframe at given lag.
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void compCorr(
|
||||
float *cc, /* (o) cross correlation coefficient */
|
||||
float *gc, /* (o) gain */
|
||||
float *pm,
|
||||
float *buffer, /* (i) signal buffer */
|
||||
int lag, /* (i) pitch lag */
|
||||
int bLen, /* (i) length of buffer */
|
||||
int sRange /* (i) correlation search length */
|
||||
){
|
||||
|
||||
|
||||
int i;
|
||||
float ftmp1, ftmp2, ftmp3;
|
||||
|
||||
/* Guard against getting outside buffer */
|
||||
if ((bLen-sRange-lag)<0) {
|
||||
sRange=bLen-lag;
|
||||
}
|
||||
|
||||
ftmp1 = 0.0;
|
||||
ftmp2 = 0.0;
|
||||
ftmp3 = 0.0;
|
||||
for (i=0; i<sRange; i++) {
|
||||
ftmp1 += buffer[bLen-sRange+i] *
|
||||
buffer[bLen-sRange+i-lag];
|
||||
ftmp2 += buffer[bLen-sRange+i-lag] *
|
||||
buffer[bLen-sRange+i-lag];
|
||||
ftmp3 += buffer[bLen-sRange+i] *
|
||||
buffer[bLen-sRange+i];
|
||||
}
|
||||
|
||||
if (ftmp2 > 0.0) {
|
||||
*cc = ftmp1*ftmp1/ftmp2;
|
||||
*gc = (float)fabs(ftmp1/ftmp2);
|
||||
*pm=(float)fabs(ftmp1)/
|
||||
((float)sqrt(ftmp2)*(float)sqrt(ftmp3));
|
||||
}
|
||||
else {
|
||||
*cc = 0.0;
|
||||
*gc = 0.0;
|
||||
*pm=0.0;
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* Packet loss concealment routine. Conceals a residual signal
|
||||
* and LP parameters. If no packet loss, update state.
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void doThePLC(
|
||||
float *PLCresidual, /* (o) concealed residual */
|
||||
float *PLClpc, /* (o) concealed LP parameters */
|
||||
int PLI, /* (i) packet loss indicator
|
||||
0 - no PL, 1 = PL */
|
||||
float *decresidual, /* (i) decoded residual */
|
||||
float *lpc, /* (i) decoded LPC (only used for no PL) */
|
||||
int inlag, /* (i) pitch lag */
|
||||
iLBC_Dec_Inst_t *iLBCdec_inst
|
||||
/* (i/o) decoder instance */
|
||||
){
|
||||
int lag=20, randlag;
|
||||
float gain, maxcc;
|
||||
float use_gain;
|
||||
float gain_comp, maxcc_comp, per, max_per;
|
||||
int i, pick, use_lag;
|
||||
|
||||
|
||||
float ftmp, randvec[BLOCKL_MAX], pitchfact, energy;
|
||||
|
||||
/* Packet Loss */
|
||||
|
||||
if (PLI == 1) {
|
||||
|
||||
iLBCdec_inst->consPLICount += 1;
|
||||
|
||||
/* if previous frame not lost,
|
||||
determine pitch pred. gain */
|
||||
|
||||
if (iLBCdec_inst->prevPLI != 1) {
|
||||
|
||||
/* Search around the previous lag to find the
|
||||
best pitch period */
|
||||
|
||||
lag=inlag-3;
|
||||
compCorr(&maxcc, &gain, &max_per,
|
||||
iLBCdec_inst->prevResidual,
|
||||
lag, iLBCdec_inst->blockl, 60);
|
||||
for (i=inlag-2;i<=inlag+3;i++) {
|
||||
compCorr(&maxcc_comp, &gain_comp, &per,
|
||||
iLBCdec_inst->prevResidual,
|
||||
i, iLBCdec_inst->blockl, 60);
|
||||
|
||||
if (maxcc_comp>maxcc) {
|
||||
maxcc=maxcc_comp;
|
||||
gain=gain_comp;
|
||||
lag=i;
|
||||
max_per=per;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* previous frame lost, use recorded lag and periodicity */
|
||||
|
||||
else {
|
||||
lag=iLBCdec_inst->prevLag;
|
||||
max_per=iLBCdec_inst->per;
|
||||
}
|
||||
|
||||
/* downscaling */
|
||||
|
||||
use_gain=1.0;
|
||||
if (iLBCdec_inst->consPLICount*iLBCdec_inst->blockl>320)
|
||||
use_gain=(float)0.9;
|
||||
else if (iLBCdec_inst->consPLICount*
|
||||
iLBCdec_inst->blockl>2*320)
|
||||
use_gain=(float)0.7;
|
||||
else if (iLBCdec_inst->consPLICount*
|
||||
iLBCdec_inst->blockl>3*320)
|
||||
use_gain=(float)0.5;
|
||||
else if (iLBCdec_inst->consPLICount*
|
||||
|
||||
|
||||
iLBCdec_inst->blockl>4*320)
|
||||
use_gain=(float)0.0;
|
||||
|
||||
/* mix noise and pitch repeatition */
|
||||
ftmp=(float)sqrt(max_per);
|
||||
if (ftmp>(float)0.7)
|
||||
pitchfact=(float)1.0;
|
||||
else if (ftmp>(float)0.4)
|
||||
pitchfact=(ftmp-(float)0.4)/((float)0.7-(float)0.4);
|
||||
else
|
||||
pitchfact=0.0;
|
||||
|
||||
|
||||
/* avoid repetition of same pitch cycle */
|
||||
use_lag=lag;
|
||||
if (lag<80) {
|
||||
use_lag=2*lag;
|
||||
}
|
||||
|
||||
/* compute concealed residual */
|
||||
|
||||
energy = 0.0;
|
||||
for (i=0; i<iLBCdec_inst->blockl; i++) {
|
||||
|
||||
/* noise component */
|
||||
|
||||
iLBCdec_inst->seed=(iLBCdec_inst->seed*69069L+1) &
|
||||
(0x80000000L-1);
|
||||
randlag = 50 + ((signed long) iLBCdec_inst->seed)%70;
|
||||
pick = i - randlag;
|
||||
|
||||
if (pick < 0) {
|
||||
randvec[i] =
|
||||
iLBCdec_inst->prevResidual[
|
||||
iLBCdec_inst->blockl+pick];
|
||||
} else {
|
||||
randvec[i] = randvec[pick];
|
||||
}
|
||||
|
||||
/* pitch repeatition component */
|
||||
pick = i - use_lag;
|
||||
|
||||
if (pick < 0) {
|
||||
PLCresidual[i] =
|
||||
iLBCdec_inst->prevResidual[
|
||||
iLBCdec_inst->blockl+pick];
|
||||
} else {
|
||||
PLCresidual[i] = PLCresidual[pick];
|
||||
}
|
||||
|
||||
/* mix random and periodicity component */
|
||||
|
||||
if (i<80)
|
||||
PLCresidual[i] = use_gain*(pitchfact *
|
||||
|
||||
|
||||
PLCresidual[i] +
|
||||
((float)1.0 - pitchfact) * randvec[i]);
|
||||
else if (i<160)
|
||||
PLCresidual[i] = (float)0.95*use_gain*(pitchfact *
|
||||
PLCresidual[i] +
|
||||
((float)1.0 - pitchfact) * randvec[i]);
|
||||
else
|
||||
PLCresidual[i] = (float)0.9*use_gain*(pitchfact *
|
||||
PLCresidual[i] +
|
||||
((float)1.0 - pitchfact) * randvec[i]);
|
||||
|
||||
energy += PLCresidual[i] * PLCresidual[i];
|
||||
}
|
||||
|
||||
/* less than 30 dB, use only noise */
|
||||
|
||||
if (sqrt(energy/(float)iLBCdec_inst->blockl) < 30.0) {
|
||||
gain=0.0;
|
||||
for (i=0; i<iLBCdec_inst->blockl; i++) {
|
||||
PLCresidual[i] = randvec[i];
|
||||
}
|
||||
}
|
||||
|
||||
/* use old LPC */
|
||||
|
||||
memcpy(PLClpc,iLBCdec_inst->prevLpc,
|
||||
(LPC_FILTERORDER+1)*sizeof(float));
|
||||
|
||||
}
|
||||
|
||||
/* no packet loss, copy input */
|
||||
|
||||
else {
|
||||
memcpy(PLCresidual, decresidual,
|
||||
iLBCdec_inst->blockl*sizeof(float));
|
||||
memcpy(PLClpc, lpc, (LPC_FILTERORDER+1)*sizeof(float));
|
||||
iLBCdec_inst->consPLICount = 0;
|
||||
}
|
||||
|
||||
/* update state */
|
||||
|
||||
if (PLI) {
|
||||
iLBCdec_inst->prevLag = lag;
|
||||
iLBCdec_inst->per=max_per;
|
||||
}
|
||||
|
||||
iLBCdec_inst->prevPLI = PLI;
|
||||
memcpy(iLBCdec_inst->prevLpc, PLClpc,
|
||||
(LPC_FILTERORDER+1)*sizeof(float));
|
||||
memcpy(iLBCdec_inst->prevResidual, PLCresidual,
|
||||
iLBCdec_inst->blockl*sizeof(float));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
doCPLC.c
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#include <math.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "iLBC_define.h"
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* Compute cross correlation and pitch gain for pitch prediction
|
||||
* of last subframe at given lag.
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void compCorr(
|
||||
float *cc, /* (o) cross correlation coefficient */
|
||||
float *gc, /* (o) gain */
|
||||
float *pm,
|
||||
float *buffer, /* (i) signal buffer */
|
||||
int lag, /* (i) pitch lag */
|
||||
int bLen, /* (i) length of buffer */
|
||||
int sRange /* (i) correlation search length */
|
||||
){
|
||||
|
||||
|
||||
int i;
|
||||
float ftmp1, ftmp2, ftmp3;
|
||||
|
||||
/* Guard against getting outside buffer */
|
||||
if ((bLen-sRange-lag)<0) {
|
||||
sRange=bLen-lag;
|
||||
}
|
||||
|
||||
ftmp1 = 0.0;
|
||||
ftmp2 = 0.0;
|
||||
ftmp3 = 0.0;
|
||||
for (i=0; i<sRange; i++) {
|
||||
ftmp1 += buffer[bLen-sRange+i] *
|
||||
buffer[bLen-sRange+i-lag];
|
||||
ftmp2 += buffer[bLen-sRange+i-lag] *
|
||||
buffer[bLen-sRange+i-lag];
|
||||
ftmp3 += buffer[bLen-sRange+i] *
|
||||
buffer[bLen-sRange+i];
|
||||
}
|
||||
|
||||
if (ftmp2 > 0.0) {
|
||||
*cc = ftmp1*ftmp1/ftmp2;
|
||||
*gc = (float)fabs(ftmp1/ftmp2);
|
||||
*pm=(float)fabs(ftmp1)/
|
||||
((float)sqrt(ftmp2)*(float)sqrt(ftmp3));
|
||||
}
|
||||
else {
|
||||
*cc = 0.0;
|
||||
*gc = 0.0;
|
||||
*pm=0.0;
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* Packet loss concealment routine. Conceals a residual signal
|
||||
* and LP parameters. If no packet loss, update state.
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void doThePLC(
|
||||
float *PLCresidual, /* (o) concealed residual */
|
||||
float *PLClpc, /* (o) concealed LP parameters */
|
||||
int PLI, /* (i) packet loss indicator
|
||||
0 - no PL, 1 = PL */
|
||||
float *decresidual, /* (i) decoded residual */
|
||||
float *lpc, /* (i) decoded LPC (only used for no PL) */
|
||||
int inlag, /* (i) pitch lag */
|
||||
iLBC_Dec_Inst_t *iLBCdec_inst
|
||||
/* (i/o) decoder instance */
|
||||
){
|
||||
int lag=20, randlag;
|
||||
float gain, maxcc;
|
||||
float use_gain;
|
||||
float gain_comp, maxcc_comp, per, max_per;
|
||||
int i, pick, use_lag;
|
||||
|
||||
|
||||
float ftmp, randvec[BLOCKL_MAX], pitchfact, energy;
|
||||
|
||||
/* Packet Loss */
|
||||
|
||||
if (PLI == 1) {
|
||||
|
||||
iLBCdec_inst->consPLICount += 1;
|
||||
|
||||
/* if previous frame not lost,
|
||||
determine pitch pred. gain */
|
||||
|
||||
if (iLBCdec_inst->prevPLI != 1) {
|
||||
|
||||
/* Search around the previous lag to find the
|
||||
best pitch period */
|
||||
|
||||
lag=inlag-3;
|
||||
compCorr(&maxcc, &gain, &max_per,
|
||||
iLBCdec_inst->prevResidual,
|
||||
lag, iLBCdec_inst->blockl, 60);
|
||||
for (i=inlag-2;i<=inlag+3;i++) {
|
||||
compCorr(&maxcc_comp, &gain_comp, &per,
|
||||
iLBCdec_inst->prevResidual,
|
||||
i, iLBCdec_inst->blockl, 60);
|
||||
|
||||
if (maxcc_comp>maxcc) {
|
||||
maxcc=maxcc_comp;
|
||||
gain=gain_comp;
|
||||
lag=i;
|
||||
max_per=per;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* previous frame lost, use recorded lag and periodicity */
|
||||
|
||||
else {
|
||||
lag=iLBCdec_inst->prevLag;
|
||||
max_per=iLBCdec_inst->per;
|
||||
}
|
||||
|
||||
/* downscaling */
|
||||
|
||||
use_gain=1.0;
|
||||
if (iLBCdec_inst->consPLICount*iLBCdec_inst->blockl>320)
|
||||
use_gain=(float)0.9;
|
||||
else if (iLBCdec_inst->consPLICount*
|
||||
iLBCdec_inst->blockl>2*320)
|
||||
use_gain=(float)0.7;
|
||||
else if (iLBCdec_inst->consPLICount*
|
||||
iLBCdec_inst->blockl>3*320)
|
||||
use_gain=(float)0.5;
|
||||
else if (iLBCdec_inst->consPLICount*
|
||||
|
||||
|
||||
iLBCdec_inst->blockl>4*320)
|
||||
use_gain=(float)0.0;
|
||||
|
||||
/* mix noise and pitch repeatition */
|
||||
ftmp=(float)sqrt(max_per);
|
||||
if (ftmp>(float)0.7)
|
||||
pitchfact=(float)1.0;
|
||||
else if (ftmp>(float)0.4)
|
||||
pitchfact=(ftmp-(float)0.4)/((float)0.7-(float)0.4);
|
||||
else
|
||||
pitchfact=0.0;
|
||||
|
||||
|
||||
/* avoid repetition of same pitch cycle */
|
||||
use_lag=lag;
|
||||
if (lag<80) {
|
||||
use_lag=2*lag;
|
||||
}
|
||||
|
||||
/* compute concealed residual */
|
||||
|
||||
energy = 0.0;
|
||||
for (i=0; i<iLBCdec_inst->blockl; i++) {
|
||||
|
||||
/* noise component */
|
||||
|
||||
iLBCdec_inst->seed=(iLBCdec_inst->seed*69069L+1) &
|
||||
(0x80000000L-1);
|
||||
randlag = 50 + ((signed long) iLBCdec_inst->seed)%70;
|
||||
pick = i - randlag;
|
||||
|
||||
if (pick < 0) {
|
||||
randvec[i] =
|
||||
iLBCdec_inst->prevResidual[
|
||||
iLBCdec_inst->blockl+pick];
|
||||
} else {
|
||||
randvec[i] = randvec[pick];
|
||||
}
|
||||
|
||||
/* pitch repeatition component */
|
||||
pick = i - use_lag;
|
||||
|
||||
if (pick < 0) {
|
||||
PLCresidual[i] =
|
||||
iLBCdec_inst->prevResidual[
|
||||
iLBCdec_inst->blockl+pick];
|
||||
} else {
|
||||
PLCresidual[i] = PLCresidual[pick];
|
||||
}
|
||||
|
||||
/* mix random and periodicity component */
|
||||
|
||||
if (i<80)
|
||||
PLCresidual[i] = use_gain*(pitchfact *
|
||||
|
||||
|
||||
PLCresidual[i] +
|
||||
((float)1.0 - pitchfact) * randvec[i]);
|
||||
else if (i<160)
|
||||
PLCresidual[i] = (float)0.95*use_gain*(pitchfact *
|
||||
PLCresidual[i] +
|
||||
((float)1.0 - pitchfact) * randvec[i]);
|
||||
else
|
||||
PLCresidual[i] = (float)0.9*use_gain*(pitchfact *
|
||||
PLCresidual[i] +
|
||||
((float)1.0 - pitchfact) * randvec[i]);
|
||||
|
||||
energy += PLCresidual[i] * PLCresidual[i];
|
||||
}
|
||||
|
||||
/* less than 30 dB, use only noise */
|
||||
|
||||
if (sqrt(energy/(float)iLBCdec_inst->blockl) < 30.0) {
|
||||
gain=0.0;
|
||||
for (i=0; i<iLBCdec_inst->blockl; i++) {
|
||||
PLCresidual[i] = randvec[i];
|
||||
}
|
||||
}
|
||||
|
||||
/* use old LPC */
|
||||
|
||||
memcpy(PLClpc,iLBCdec_inst->prevLpc,
|
||||
(LPC_FILTERORDER+1)*sizeof(float));
|
||||
|
||||
}
|
||||
|
||||
/* no packet loss, copy input */
|
||||
|
||||
else {
|
||||
memcpy(PLCresidual, decresidual,
|
||||
iLBCdec_inst->blockl*sizeof(float));
|
||||
memcpy(PLClpc, lpc, (LPC_FILTERORDER+1)*sizeof(float));
|
||||
iLBCdec_inst->consPLICount = 0;
|
||||
}
|
||||
|
||||
/* update state */
|
||||
|
||||
if (PLI) {
|
||||
iLBCdec_inst->prevLag = lag;
|
||||
iLBCdec_inst->per=max_per;
|
||||
}
|
||||
|
||||
iLBCdec_inst->prevPLI = PLI;
|
||||
memcpy(iLBCdec_inst->prevLpc, PLClpc,
|
||||
(LPC_FILTERORDER+1)*sizeof(float));
|
||||
memcpy(iLBCdec_inst->prevResidual, PLCresidual,
|
||||
iLBCdec_inst->blockl*sizeof(float));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,32 +1,32 @@
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
doCPLC.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifndef __iLBC_DOLPC_H
|
||||
#define __iLBC_DOLPC_H
|
||||
|
||||
void doThePLC(
|
||||
float *PLCresidual, /* (o) concealed residual */
|
||||
float *PLClpc, /* (o) concealed LP parameters */
|
||||
int PLI, /* (i) packet loss indicator
|
||||
0 - no PL, 1 = PL */
|
||||
float *decresidual, /* (i) decoded residual */
|
||||
float *lpc, /* (i) decoded LPC (only used for no PL) */
|
||||
int inlag, /* (i) pitch lag */
|
||||
iLBC_Dec_Inst_t *iLBCdec_inst
|
||||
/* (i/o) decoder instance */
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
doCPLC.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifndef __iLBC_DOLPC_H
|
||||
#define __iLBC_DOLPC_H
|
||||
|
||||
void doThePLC(
|
||||
float *PLCresidual, /* (o) concealed residual */
|
||||
float *PLClpc, /* (o) concealed LP parameters */
|
||||
int PLI, /* (i) packet loss indicator
|
||||
0 - no PL, 1 = PL */
|
||||
float *decresidual, /* (i) decoded residual */
|
||||
float *lpc, /* (i) decoded LPC (only used for no PL) */
|
||||
int inlag, /* (i) pitch lag */
|
||||
iLBC_Dec_Inst_t *iLBCdec_inst
|
||||
/* (i/o) decoder instance */
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
+664
-664
File diff suppressed because it is too large
Load Diff
@@ -1,33 +1,33 @@
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
enhancer.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifndef __ENHANCER_H
|
||||
#define __ENHANCER_H
|
||||
|
||||
#include "iLBC_define.h"
|
||||
|
||||
float xCorrCoef(
|
||||
float *target, /* (i) first array */
|
||||
float *regressor, /* (i) second array */
|
||||
int subl /* (i) dimension arrays */
|
||||
);
|
||||
|
||||
int enhancerInterface(
|
||||
float *out, /* (o) the enhanced recidual signal */
|
||||
float *in, /* (i) the recidual signal to enhance */
|
||||
iLBC_Dec_Inst_t *iLBCdec_inst
|
||||
/* (i/o) the decoder state structure */
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
enhancer.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifndef __ENHANCER_H
|
||||
#define __ENHANCER_H
|
||||
|
||||
#include "iLBC_define.h"
|
||||
|
||||
float xCorrCoef(
|
||||
float *target, /* (i) first array */
|
||||
float *regressor, /* (i) second array */
|
||||
int subl /* (i) dimension arrays */
|
||||
);
|
||||
|
||||
int enhancerInterface(
|
||||
float *out, /* (o) the enhanced recidual signal */
|
||||
float *in, /* (i) the recidual signal to enhance */
|
||||
iLBC_Dec_Inst_t *iLBCdec_inst
|
||||
/* (i/o) the decoder state structure */
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
+167
-167
@@ -1,167 +1,167 @@
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
filter.c
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
|
||||
|
||||
#include "iLBC_define.h"
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* all-pole filter
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void AllPoleFilter(
|
||||
float *InOut, /* (i/o) on entrance InOut[-orderCoef] to
|
||||
InOut[-1] contain the state of the
|
||||
filter (delayed samples). InOut[0] to
|
||||
InOut[lengthInOut-1] contain the filter
|
||||
input, on en exit InOut[-orderCoef] to
|
||||
InOut[-1] is unchanged and InOut[0] to
|
||||
InOut[lengthInOut-1] contain filtered
|
||||
samples */
|
||||
float *Coef,/* (i) filter coefficients, Coef[0] is assumed
|
||||
to be 1.0 */
|
||||
int lengthInOut,/* (i) number of input/output samples */
|
||||
int orderCoef /* (i) number of filter coefficients */
|
||||
){
|
||||
int n,k;
|
||||
|
||||
for(n=0;n<lengthInOut;n++){
|
||||
for(k=1;k<=orderCoef;k++){
|
||||
*InOut -= Coef[k]*InOut[-k];
|
||||
}
|
||||
InOut++;
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* all-zero filter
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void AllZeroFilter(
|
||||
float *In, /* (i) In[0] to In[lengthInOut-1] contain
|
||||
filter input samples */
|
||||
float *Coef,/* (i) filter coefficients (Coef[0] is assumed
|
||||
to be 1.0) */
|
||||
int lengthInOut,/* (i) number of input/output samples */
|
||||
int orderCoef, /* (i) number of filter coefficients */
|
||||
float *Out /* (i/o) on entrance Out[-orderCoef] to Out[-1]
|
||||
contain the filter state, on exit Out[0]
|
||||
to Out[lengthInOut-1] contain filtered
|
||||
samples */
|
||||
){
|
||||
int n,k;
|
||||
|
||||
for(n=0;n<lengthInOut;n++){
|
||||
*Out = Coef[0]*In[0];
|
||||
for(k=1;k<=orderCoef;k++){
|
||||
*Out += Coef[k]*In[-k];
|
||||
}
|
||||
|
||||
|
||||
Out++;
|
||||
In++;
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* pole-zero filter
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void ZeroPoleFilter(
|
||||
float *In, /* (i) In[0] to In[lengthInOut-1] contain
|
||||
filter input samples In[-orderCoef] to
|
||||
In[-1] contain state of all-zero
|
||||
section */
|
||||
float *ZeroCoef,/* (i) filter coefficients for all-zero
|
||||
section (ZeroCoef[0] is assumed to
|
||||
be 1.0) */
|
||||
float *PoleCoef,/* (i) filter coefficients for all-pole section
|
||||
(ZeroCoef[0] is assumed to be 1.0) */
|
||||
int lengthInOut,/* (i) number of input/output samples */
|
||||
int orderCoef, /* (i) number of filter coefficients */
|
||||
float *Out /* (i/o) on entrance Out[-orderCoef] to Out[-1]
|
||||
contain state of all-pole section. On
|
||||
exit Out[0] to Out[lengthInOut-1]
|
||||
contain filtered samples */
|
||||
){
|
||||
AllZeroFilter(In,ZeroCoef,lengthInOut,orderCoef,Out);
|
||||
AllPoleFilter(Out,PoleCoef,lengthInOut,orderCoef);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* downsample (LP filter and decimation)
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void DownSample (
|
||||
float *In, /* (i) input samples */
|
||||
float *Coef, /* (i) filter coefficients */
|
||||
int lengthIn, /* (i) number of input samples */
|
||||
float *state, /* (i) filter state */
|
||||
float *Out /* (o) downsampled output */
|
||||
){
|
||||
float o;
|
||||
float *Out_ptr = Out;
|
||||
float *Coef_ptr, *In_ptr;
|
||||
float *state_ptr;
|
||||
int i, j, stop;
|
||||
|
||||
/* LP filter and decimate at the same time */
|
||||
|
||||
for (i = DELAY_DS; i < lengthIn; i+=FACTOR_DS)
|
||||
{
|
||||
Coef_ptr = &Coef[0];
|
||||
In_ptr = &In[i];
|
||||
state_ptr = &state[FILTERORDER_DS-2];
|
||||
|
||||
|
||||
|
||||
o = (float)0.0;
|
||||
|
||||
stop = (i < FILTERORDER_DS) ? i + 1 : FILTERORDER_DS;
|
||||
|
||||
for (j = 0; j < stop; j++)
|
||||
{
|
||||
o += *Coef_ptr++ * (*In_ptr--);
|
||||
}
|
||||
for (j = i + 1; j < FILTERORDER_DS; j++)
|
||||
{
|
||||
o += *Coef_ptr++ * (*state_ptr--);
|
||||
}
|
||||
|
||||
*Out_ptr++ = o;
|
||||
}
|
||||
|
||||
/* Get the last part (use zeros as input for the future) */
|
||||
|
||||
for (i=(lengthIn+FACTOR_DS); i<(lengthIn+DELAY_DS);
|
||||
i+=FACTOR_DS) {
|
||||
|
||||
o=(float)0.0;
|
||||
|
||||
if (i<lengthIn) {
|
||||
Coef_ptr = &Coef[0];
|
||||
In_ptr = &In[i];
|
||||
for (j=0; j<FILTERORDER_DS; j++) {
|
||||
o += *Coef_ptr++ * (*Out_ptr--);
|
||||
}
|
||||
} else {
|
||||
Coef_ptr = &Coef[i-lengthIn];
|
||||
In_ptr = &In[lengthIn-1];
|
||||
for (j=0; j<FILTERORDER_DS-(i-lengthIn); j++) {
|
||||
o += *Coef_ptr++ * (*In_ptr--);
|
||||
}
|
||||
}
|
||||
*Out_ptr++ = o;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
filter.c
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
|
||||
|
||||
#include "iLBC_define.h"
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* all-pole filter
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void AllPoleFilter(
|
||||
float *InOut, /* (i/o) on entrance InOut[-orderCoef] to
|
||||
InOut[-1] contain the state of the
|
||||
filter (delayed samples). InOut[0] to
|
||||
InOut[lengthInOut-1] contain the filter
|
||||
input, on en exit InOut[-orderCoef] to
|
||||
InOut[-1] is unchanged and InOut[0] to
|
||||
InOut[lengthInOut-1] contain filtered
|
||||
samples */
|
||||
float *Coef,/* (i) filter coefficients, Coef[0] is assumed
|
||||
to be 1.0 */
|
||||
int lengthInOut,/* (i) number of input/output samples */
|
||||
int orderCoef /* (i) number of filter coefficients */
|
||||
){
|
||||
int n,k;
|
||||
|
||||
for(n=0;n<lengthInOut;n++){
|
||||
for(k=1;k<=orderCoef;k++){
|
||||
*InOut -= Coef[k]*InOut[-k];
|
||||
}
|
||||
InOut++;
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* all-zero filter
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void AllZeroFilter(
|
||||
float *In, /* (i) In[0] to In[lengthInOut-1] contain
|
||||
filter input samples */
|
||||
float *Coef,/* (i) filter coefficients (Coef[0] is assumed
|
||||
to be 1.0) */
|
||||
int lengthInOut,/* (i) number of input/output samples */
|
||||
int orderCoef, /* (i) number of filter coefficients */
|
||||
float *Out /* (i/o) on entrance Out[-orderCoef] to Out[-1]
|
||||
contain the filter state, on exit Out[0]
|
||||
to Out[lengthInOut-1] contain filtered
|
||||
samples */
|
||||
){
|
||||
int n,k;
|
||||
|
||||
for(n=0;n<lengthInOut;n++){
|
||||
*Out = Coef[0]*In[0];
|
||||
for(k=1;k<=orderCoef;k++){
|
||||
*Out += Coef[k]*In[-k];
|
||||
}
|
||||
|
||||
|
||||
Out++;
|
||||
In++;
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* pole-zero filter
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void ZeroPoleFilter(
|
||||
float *In, /* (i) In[0] to In[lengthInOut-1] contain
|
||||
filter input samples In[-orderCoef] to
|
||||
In[-1] contain state of all-zero
|
||||
section */
|
||||
float *ZeroCoef,/* (i) filter coefficients for all-zero
|
||||
section (ZeroCoef[0] is assumed to
|
||||
be 1.0) */
|
||||
float *PoleCoef,/* (i) filter coefficients for all-pole section
|
||||
(ZeroCoef[0] is assumed to be 1.0) */
|
||||
int lengthInOut,/* (i) number of input/output samples */
|
||||
int orderCoef, /* (i) number of filter coefficients */
|
||||
float *Out /* (i/o) on entrance Out[-orderCoef] to Out[-1]
|
||||
contain state of all-pole section. On
|
||||
exit Out[0] to Out[lengthInOut-1]
|
||||
contain filtered samples */
|
||||
){
|
||||
AllZeroFilter(In,ZeroCoef,lengthInOut,orderCoef,Out);
|
||||
AllPoleFilter(Out,PoleCoef,lengthInOut,orderCoef);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* downsample (LP filter and decimation)
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void DownSample (
|
||||
float *In, /* (i) input samples */
|
||||
float *Coef, /* (i) filter coefficients */
|
||||
int lengthIn, /* (i) number of input samples */
|
||||
float *state, /* (i) filter state */
|
||||
float *Out /* (o) downsampled output */
|
||||
){
|
||||
float o;
|
||||
float *Out_ptr = Out;
|
||||
float *Coef_ptr, *In_ptr;
|
||||
float *state_ptr;
|
||||
int i, j, stop;
|
||||
|
||||
/* LP filter and decimate at the same time */
|
||||
|
||||
for (i = DELAY_DS; i < lengthIn; i+=FACTOR_DS)
|
||||
{
|
||||
Coef_ptr = &Coef[0];
|
||||
In_ptr = &In[i];
|
||||
state_ptr = &state[FILTERORDER_DS-2];
|
||||
|
||||
|
||||
|
||||
o = (float)0.0;
|
||||
|
||||
stop = (i < FILTERORDER_DS) ? i + 1 : FILTERORDER_DS;
|
||||
|
||||
for (j = 0; j < stop; j++)
|
||||
{
|
||||
o += *Coef_ptr++ * (*In_ptr--);
|
||||
}
|
||||
for (j = i + 1; j < FILTERORDER_DS; j++)
|
||||
{
|
||||
o += *Coef_ptr++ * (*state_ptr--);
|
||||
}
|
||||
|
||||
*Out_ptr++ = o;
|
||||
}
|
||||
|
||||
/* Get the last part (use zeros as input for the future) */
|
||||
|
||||
for (i=(lengthIn+FACTOR_DS); i<(lengthIn+DELAY_DS);
|
||||
i+=FACTOR_DS) {
|
||||
|
||||
o=(float)0.0;
|
||||
|
||||
if (i<lengthIn) {
|
||||
Coef_ptr = &Coef[0];
|
||||
In_ptr = &In[i];
|
||||
for (j=0; j<FILTERORDER_DS; j++) {
|
||||
o += *Coef_ptr++ * (*Out_ptr--);
|
||||
}
|
||||
} else {
|
||||
Coef_ptr = &Coef[i-lengthIn];
|
||||
In_ptr = &In[lengthIn-1];
|
||||
for (j=0; j<FILTERORDER_DS-(i-lengthIn); j++) {
|
||||
o += *Coef_ptr++ * (*In_ptr--);
|
||||
}
|
||||
}
|
||||
*Out_ptr++ = o;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,73 +1,73 @@
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
filter.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifndef __iLBC_FILTER_H
|
||||
#define __iLBC_FILTER_H
|
||||
|
||||
void AllPoleFilter(
|
||||
float *InOut, /* (i/o) on entrance InOut[-orderCoef] to
|
||||
InOut[-1] contain the state of the
|
||||
filter (delayed samples). InOut[0] to
|
||||
InOut[lengthInOut-1] contain the filter
|
||||
input, on en exit InOut[-orderCoef] to
|
||||
InOut[-1] is unchanged and InOut[0] to
|
||||
InOut[lengthInOut-1] contain filtered
|
||||
samples */
|
||||
float *Coef,/* (i) filter coefficients, Coef[0] is assumed
|
||||
to be 1.0 */
|
||||
int lengthInOut,/* (i) number of input/output samples */
|
||||
int orderCoef /* (i) number of filter coefficients */
|
||||
);
|
||||
|
||||
|
||||
|
||||
void AllZeroFilter(
|
||||
float *In, /* (i) In[0] to In[lengthInOut-1] contain
|
||||
filter input samples */
|
||||
float *Coef,/* (i) filter coefficients (Coef[0] is assumed
|
||||
to be 1.0) */
|
||||
int lengthInOut,/* (i) number of input/output samples */
|
||||
int orderCoef, /* (i) number of filter coefficients */
|
||||
float *Out /* (i/o) on entrance Out[-orderCoef] to Out[-1]
|
||||
contain the filter state, on exit Out[0]
|
||||
to Out[lengthInOut-1] contain filtered
|
||||
samples */
|
||||
);
|
||||
|
||||
void ZeroPoleFilter(
|
||||
float *In, /* (i) In[0] to In[lengthInOut-1] contain filter
|
||||
input samples In[-orderCoef] to In[-1]
|
||||
contain state of all-zero section */
|
||||
float *ZeroCoef,/* (i) filter coefficients for all-zero
|
||||
section (ZeroCoef[0] is assumed to
|
||||
be 1.0) */
|
||||
float *PoleCoef,/* (i) filter coefficients for all-pole section
|
||||
(ZeroCoef[0] is assumed to be 1.0) */
|
||||
int lengthInOut,/* (i) number of input/output samples */
|
||||
int orderCoef, /* (i) number of filter coefficients */
|
||||
float *Out /* (i/o) on entrance Out[-orderCoef] to Out[-1]
|
||||
contain state of all-pole section. On
|
||||
exit Out[0] to Out[lengthInOut-1]
|
||||
contain filtered samples */
|
||||
);
|
||||
|
||||
void DownSample (
|
||||
float *In, /* (i) input samples */
|
||||
float *Coef, /* (i) filter coefficients */
|
||||
int lengthIn, /* (i) number of input samples */
|
||||
float *state, /* (i) filter state */
|
||||
float *Out /* (o) downsampled output */
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
filter.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifndef __iLBC_FILTER_H
|
||||
#define __iLBC_FILTER_H
|
||||
|
||||
void AllPoleFilter(
|
||||
float *InOut, /* (i/o) on entrance InOut[-orderCoef] to
|
||||
InOut[-1] contain the state of the
|
||||
filter (delayed samples). InOut[0] to
|
||||
InOut[lengthInOut-1] contain the filter
|
||||
input, on en exit InOut[-orderCoef] to
|
||||
InOut[-1] is unchanged and InOut[0] to
|
||||
InOut[lengthInOut-1] contain filtered
|
||||
samples */
|
||||
float *Coef,/* (i) filter coefficients, Coef[0] is assumed
|
||||
to be 1.0 */
|
||||
int lengthInOut,/* (i) number of input/output samples */
|
||||
int orderCoef /* (i) number of filter coefficients */
|
||||
);
|
||||
|
||||
|
||||
|
||||
void AllZeroFilter(
|
||||
float *In, /* (i) In[0] to In[lengthInOut-1] contain
|
||||
filter input samples */
|
||||
float *Coef,/* (i) filter coefficients (Coef[0] is assumed
|
||||
to be 1.0) */
|
||||
int lengthInOut,/* (i) number of input/output samples */
|
||||
int orderCoef, /* (i) number of filter coefficients */
|
||||
float *Out /* (i/o) on entrance Out[-orderCoef] to Out[-1]
|
||||
contain the filter state, on exit Out[0]
|
||||
to Out[lengthInOut-1] contain filtered
|
||||
samples */
|
||||
);
|
||||
|
||||
void ZeroPoleFilter(
|
||||
float *In, /* (i) In[0] to In[lengthInOut-1] contain filter
|
||||
input samples In[-orderCoef] to In[-1]
|
||||
contain state of all-zero section */
|
||||
float *ZeroCoef,/* (i) filter coefficients for all-zero
|
||||
section (ZeroCoef[0] is assumed to
|
||||
be 1.0) */
|
||||
float *PoleCoef,/* (i) filter coefficients for all-pole section
|
||||
(ZeroCoef[0] is assumed to be 1.0) */
|
||||
int lengthInOut,/* (i) number of input/output samples */
|
||||
int orderCoef, /* (i) number of filter coefficients */
|
||||
float *Out /* (i/o) on entrance Out[-orderCoef] to Out[-1]
|
||||
contain state of all-pole section. On
|
||||
exit Out[0] to Out[lengthInOut-1]
|
||||
contain filtered samples */
|
||||
);
|
||||
|
||||
void DownSample (
|
||||
float *In, /* (i) input samples */
|
||||
float *Coef, /* (i) filter coefficients */
|
||||
int lengthIn, /* (i) number of input samples */
|
||||
float *state, /* (i) filter state */
|
||||
float *Out /* (o) downsampled output */
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
+106
-106
@@ -1,106 +1,106 @@
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
gainquant.c
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
#include "constants.h"
|
||||
#include "filter.h"
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* quantizer for the gain in the gain-shape coding of residual
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
float gainquant(/* (o) quantized gain value */
|
||||
float in, /* (i) gain value */
|
||||
float maxIn,/* (i) maximum of gain value */
|
||||
int cblen, /* (i) number of quantization indices */
|
||||
int *index /* (o) quantization index */
|
||||
){
|
||||
int i, tindex;
|
||||
float minmeasure,measure, *cb, scale;
|
||||
|
||||
/* ensure a lower bound on the scaling factor */
|
||||
|
||||
scale=maxIn;
|
||||
|
||||
if (scale<0.1) {
|
||||
scale=(float)0.1;
|
||||
}
|
||||
|
||||
/* select the quantization table */
|
||||
|
||||
if (cblen == 8) {
|
||||
cb = gain_sq3Tbl;
|
||||
} else if (cblen == 16) {
|
||||
cb = gain_sq4Tbl;
|
||||
} else {
|
||||
cb = gain_sq5Tbl;
|
||||
}
|
||||
|
||||
/* select the best index in the quantization table */
|
||||
|
||||
minmeasure=10000000.0;
|
||||
tindex=0;
|
||||
for (i=0; i<cblen; i++) {
|
||||
measure=(in-scale*cb[i])*(in-scale*cb[i]);
|
||||
|
||||
if (measure<minmeasure) {
|
||||
tindex=i;
|
||||
minmeasure=measure;
|
||||
}
|
||||
}
|
||||
*index=tindex;
|
||||
|
||||
/* return the quantized value */
|
||||
|
||||
|
||||
|
||||
return scale*cb[tindex];
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* decoder for quantized gains in the gain-shape coding of
|
||||
* residual
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
float gaindequant( /* (o) quantized gain value */
|
||||
int index, /* (i) quantization index */
|
||||
float maxIn,/* (i) maximum of unquantized gain */
|
||||
int cblen /* (i) number of quantization indices */
|
||||
){
|
||||
float scale;
|
||||
|
||||
/* obtain correct scale factor */
|
||||
|
||||
scale=(float)fabs(maxIn);
|
||||
|
||||
if (scale<0.1) {
|
||||
scale=(float)0.1;
|
||||
}
|
||||
|
||||
/* select the quantization table and return the decoded value */
|
||||
|
||||
if (cblen==8) {
|
||||
return scale*gain_sq3Tbl[index];
|
||||
} else if (cblen==16) {
|
||||
return scale*gain_sq4Tbl[index];
|
||||
}
|
||||
else if (cblen==32) {
|
||||
return scale*gain_sq5Tbl[index];
|
||||
}
|
||||
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
gainquant.c
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
#include "constants.h"
|
||||
#include "filter.h"
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* quantizer for the gain in the gain-shape coding of residual
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
float gainquant(/* (o) quantized gain value */
|
||||
float in, /* (i) gain value */
|
||||
float maxIn,/* (i) maximum of gain value */
|
||||
int cblen, /* (i) number of quantization indices */
|
||||
int *index /* (o) quantization index */
|
||||
){
|
||||
int i, tindex;
|
||||
float minmeasure,measure, *cb, scale;
|
||||
|
||||
/* ensure a lower bound on the scaling factor */
|
||||
|
||||
scale=maxIn;
|
||||
|
||||
if (scale<0.1) {
|
||||
scale=(float)0.1;
|
||||
}
|
||||
|
||||
/* select the quantization table */
|
||||
|
||||
if (cblen == 8) {
|
||||
cb = gain_sq3Tbl;
|
||||
} else if (cblen == 16) {
|
||||
cb = gain_sq4Tbl;
|
||||
} else {
|
||||
cb = gain_sq5Tbl;
|
||||
}
|
||||
|
||||
/* select the best index in the quantization table */
|
||||
|
||||
minmeasure=10000000.0;
|
||||
tindex=0;
|
||||
for (i=0; i<cblen; i++) {
|
||||
measure=(in-scale*cb[i])*(in-scale*cb[i]);
|
||||
|
||||
if (measure<minmeasure) {
|
||||
tindex=i;
|
||||
minmeasure=measure;
|
||||
}
|
||||
}
|
||||
*index=tindex;
|
||||
|
||||
/* return the quantized value */
|
||||
|
||||
|
||||
|
||||
return scale*cb[tindex];
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* decoder for quantized gains in the gain-shape coding of
|
||||
* residual
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
float gaindequant( /* (o) quantized gain value */
|
||||
int index, /* (i) quantization index */
|
||||
float maxIn,/* (i) maximum of unquantized gain */
|
||||
int cblen /* (i) number of quantization indices */
|
||||
){
|
||||
float scale;
|
||||
|
||||
/* obtain correct scale factor */
|
||||
|
||||
scale=(float)fabs(maxIn);
|
||||
|
||||
if (scale<0.1) {
|
||||
scale=(float)0.1;
|
||||
}
|
||||
|
||||
/* select the quantization table and return the decoded value */
|
||||
|
||||
if (cblen==8) {
|
||||
return scale*gain_sq3Tbl[index];
|
||||
} else if (cblen==16) {
|
||||
return scale*gain_sq4Tbl[index];
|
||||
}
|
||||
else if (cblen==32) {
|
||||
return scale*gain_sq5Tbl[index];
|
||||
}
|
||||
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,31 +1,31 @@
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
gainquant.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifndef __iLBC_GAINQUANT_H
|
||||
#define __iLBC_GAINQUANT_H
|
||||
|
||||
float gainquant(/* (o) quantized gain value */
|
||||
float in, /* (i) gain value */
|
||||
float maxIn,/* (i) maximum of gain value */
|
||||
int cblen, /* (i) number of quantization indices */
|
||||
int *index /* (o) quantization index */
|
||||
);
|
||||
|
||||
float gaindequant( /* (o) quantized gain value */
|
||||
int index, /* (i) quantization index */
|
||||
float maxIn,/* (i) maximum of unquantized gain */
|
||||
int cblen /* (i) number of quantization indices */
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
gainquant.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifndef __iLBC_GAINQUANT_H
|
||||
#define __iLBC_GAINQUANT_H
|
||||
|
||||
float gainquant(/* (o) quantized gain value */
|
||||
float in, /* (i) gain value */
|
||||
float maxIn,/* (i) maximum of gain value */
|
||||
int cblen, /* (i) number of quantization indices */
|
||||
int *index /* (o) quantization index */
|
||||
);
|
||||
|
||||
float gaindequant( /* (o) quantized gain value */
|
||||
int index, /* (i) quantization index */
|
||||
float maxIn,/* (i) maximum of unquantized gain */
|
||||
int cblen /* (i) number of quantization indices */
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
+180
-180
@@ -1,180 +1,180 @@
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
getCBvec.c
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#include "iLBC_define.h"
|
||||
#include "constants.h"
|
||||
#include <string.h>
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* Construct codebook vector for given index.
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void getCBvec(
|
||||
float *cbvec, /* (o) Constructed codebook vector */
|
||||
float *mem, /* (i) Codebook buffer */
|
||||
int index, /* (i) Codebook index */
|
||||
int lMem, /* (i) Length of codebook buffer */
|
||||
int cbveclen/* (i) Codebook vector length */
|
||||
){
|
||||
int j, k, n, memInd, sFilt;
|
||||
float tmpbuf[CB_MEML];
|
||||
int base_size;
|
||||
int ilow, ihigh;
|
||||
float alfa, alfa1;
|
||||
|
||||
/* Determine size of codebook sections */
|
||||
|
||||
base_size=lMem-cbveclen+1;
|
||||
|
||||
if (cbveclen==SUBL) {
|
||||
base_size+=cbveclen/2;
|
||||
}
|
||||
|
||||
/* No filter -> First codebook section */
|
||||
|
||||
|
||||
|
||||
if (index<lMem-cbveclen+1) {
|
||||
|
||||
/* first non-interpolated vectors */
|
||||
|
||||
k=index+cbveclen;
|
||||
/* get vector */
|
||||
memcpy(cbvec, mem+lMem-k, cbveclen*sizeof(float));
|
||||
|
||||
} else if (index < base_size) {
|
||||
|
||||
k=2*(index-(lMem-cbveclen+1))+cbveclen;
|
||||
|
||||
ihigh=k/2;
|
||||
ilow=ihigh-5;
|
||||
|
||||
/* Copy first noninterpolated part */
|
||||
|
||||
memcpy(cbvec, mem+lMem-k/2, ilow*sizeof(float));
|
||||
|
||||
/* interpolation */
|
||||
|
||||
alfa1=(float)0.2;
|
||||
alfa=0.0;
|
||||
for (j=ilow; j<ihigh; j++) {
|
||||
cbvec[j]=((float)1.0-alfa)*mem[lMem-k/2+j]+
|
||||
alfa*mem[lMem-k+j];
|
||||
alfa+=alfa1;
|
||||
}
|
||||
|
||||
/* Copy second noninterpolated part */
|
||||
|
||||
memcpy(cbvec+ihigh, mem+lMem-k+ihigh,
|
||||
(cbveclen-ihigh)*sizeof(float));
|
||||
|
||||
}
|
||||
|
||||
/* Higher codebbok section based on filtering */
|
||||
|
||||
else {
|
||||
|
||||
/* first non-interpolated vectors */
|
||||
|
||||
if (index-base_size<lMem-cbveclen+1) {
|
||||
float tempbuff2[CB_MEML+CB_FILTERLEN+1];
|
||||
float *pos;
|
||||
float *pp, *pp1;
|
||||
|
||||
memset(tempbuff2, 0,
|
||||
CB_HALFFILTERLEN*sizeof(float));
|
||||
memcpy(&tempbuff2[CB_HALFFILTERLEN], mem,
|
||||
lMem*sizeof(float));
|
||||
memset(&tempbuff2[lMem+CB_HALFFILTERLEN], 0,
|
||||
(CB_HALFFILTERLEN+1)*sizeof(float));
|
||||
|
||||
|
||||
|
||||
k=index-base_size+cbveclen;
|
||||
sFilt=lMem-k;
|
||||
memInd=sFilt+1-CB_HALFFILTERLEN;
|
||||
|
||||
/* do filtering */
|
||||
pos=cbvec;
|
||||
memset(pos, 0, cbveclen*sizeof(float));
|
||||
for (n=0; n<cbveclen; n++) {
|
||||
pp=&tempbuff2[memInd+n+CB_HALFFILTERLEN];
|
||||
pp1=&cbfiltersTbl[CB_FILTERLEN-1];
|
||||
for (j=0; j<CB_FILTERLEN; j++) {
|
||||
(*pos)+=(*pp++)*(*pp1--);
|
||||
}
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
|
||||
/* interpolated vectors */
|
||||
|
||||
else {
|
||||
float tempbuff2[CB_MEML+CB_FILTERLEN+1];
|
||||
|
||||
float *pos;
|
||||
float *pp, *pp1;
|
||||
int i;
|
||||
|
||||
memset(tempbuff2, 0,
|
||||
CB_HALFFILTERLEN*sizeof(float));
|
||||
memcpy(&tempbuff2[CB_HALFFILTERLEN], mem,
|
||||
lMem*sizeof(float));
|
||||
memset(&tempbuff2[lMem+CB_HALFFILTERLEN], 0,
|
||||
(CB_HALFFILTERLEN+1)*sizeof(float));
|
||||
|
||||
k=2*(index-base_size-
|
||||
(lMem-cbveclen+1))+cbveclen;
|
||||
sFilt=lMem-k;
|
||||
memInd=sFilt+1-CB_HALFFILTERLEN;
|
||||
|
||||
/* do filtering */
|
||||
pos=&tmpbuf[sFilt];
|
||||
memset(pos, 0, k*sizeof(float));
|
||||
for (i=0; i<k; i++) {
|
||||
pp=&tempbuff2[memInd+i+CB_HALFFILTERLEN];
|
||||
pp1=&cbfiltersTbl[CB_FILTERLEN-1];
|
||||
for (j=0; j<CB_FILTERLEN; j++) {
|
||||
(*pos)+=(*pp++)*(*pp1--);
|
||||
}
|
||||
pos++;
|
||||
}
|
||||
|
||||
ihigh=k/2;
|
||||
ilow=ihigh-5;
|
||||
|
||||
|
||||
|
||||
/* Copy first noninterpolated part */
|
||||
|
||||
memcpy(cbvec, tmpbuf+lMem-k/2,
|
||||
ilow*sizeof(float));
|
||||
|
||||
/* interpolation */
|
||||
|
||||
alfa1=(float)0.2;
|
||||
alfa=0.0;
|
||||
for (j=ilow; j<ihigh; j++) {
|
||||
cbvec[j]=((float)1.0-alfa)*
|
||||
tmpbuf[lMem-k/2+j]+alfa*tmpbuf[lMem-k+j];
|
||||
alfa+=alfa1;
|
||||
}
|
||||
|
||||
/* Copy second noninterpolated part */
|
||||
|
||||
memcpy(cbvec+ihigh, tmpbuf+lMem-k+ihigh,
|
||||
(cbveclen-ihigh)*sizeof(float));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
getCBvec.c
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#include "iLBC_define.h"
|
||||
#include "constants.h"
|
||||
#include <string.h>
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* Construct codebook vector for given index.
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void getCBvec(
|
||||
float *cbvec, /* (o) Constructed codebook vector */
|
||||
float *mem, /* (i) Codebook buffer */
|
||||
int index, /* (i) Codebook index */
|
||||
int lMem, /* (i) Length of codebook buffer */
|
||||
int cbveclen/* (i) Codebook vector length */
|
||||
){
|
||||
int j, k, n, memInd, sFilt;
|
||||
float tmpbuf[CB_MEML];
|
||||
int base_size;
|
||||
int ilow, ihigh;
|
||||
float alfa, alfa1;
|
||||
|
||||
/* Determine size of codebook sections */
|
||||
|
||||
base_size=lMem-cbveclen+1;
|
||||
|
||||
if (cbveclen==SUBL) {
|
||||
base_size+=cbveclen/2;
|
||||
}
|
||||
|
||||
/* No filter -> First codebook section */
|
||||
|
||||
|
||||
|
||||
if (index<lMem-cbveclen+1) {
|
||||
|
||||
/* first non-interpolated vectors */
|
||||
|
||||
k=index+cbveclen;
|
||||
/* get vector */
|
||||
memcpy(cbvec, mem+lMem-k, cbveclen*sizeof(float));
|
||||
|
||||
} else if (index < base_size) {
|
||||
|
||||
k=2*(index-(lMem-cbveclen+1))+cbveclen;
|
||||
|
||||
ihigh=k/2;
|
||||
ilow=ihigh-5;
|
||||
|
||||
/* Copy first noninterpolated part */
|
||||
|
||||
memcpy(cbvec, mem+lMem-k/2, ilow*sizeof(float));
|
||||
|
||||
/* interpolation */
|
||||
|
||||
alfa1=(float)0.2;
|
||||
alfa=0.0;
|
||||
for (j=ilow; j<ihigh; j++) {
|
||||
cbvec[j]=((float)1.0-alfa)*mem[lMem-k/2+j]+
|
||||
alfa*mem[lMem-k+j];
|
||||
alfa+=alfa1;
|
||||
}
|
||||
|
||||
/* Copy second noninterpolated part */
|
||||
|
||||
memcpy(cbvec+ihigh, mem+lMem-k+ihigh,
|
||||
(cbveclen-ihigh)*sizeof(float));
|
||||
|
||||
}
|
||||
|
||||
/* Higher codebbok section based on filtering */
|
||||
|
||||
else {
|
||||
|
||||
/* first non-interpolated vectors */
|
||||
|
||||
if (index-base_size<lMem-cbveclen+1) {
|
||||
float tempbuff2[CB_MEML+CB_FILTERLEN+1];
|
||||
float *pos;
|
||||
float *pp, *pp1;
|
||||
|
||||
memset(tempbuff2, 0,
|
||||
CB_HALFFILTERLEN*sizeof(float));
|
||||
memcpy(&tempbuff2[CB_HALFFILTERLEN], mem,
|
||||
lMem*sizeof(float));
|
||||
memset(&tempbuff2[lMem+CB_HALFFILTERLEN], 0,
|
||||
(CB_HALFFILTERLEN+1)*sizeof(float));
|
||||
|
||||
|
||||
|
||||
k=index-base_size+cbveclen;
|
||||
sFilt=lMem-k;
|
||||
memInd=sFilt+1-CB_HALFFILTERLEN;
|
||||
|
||||
/* do filtering */
|
||||
pos=cbvec;
|
||||
memset(pos, 0, cbveclen*sizeof(float));
|
||||
for (n=0; n<cbveclen; n++) {
|
||||
pp=&tempbuff2[memInd+n+CB_HALFFILTERLEN];
|
||||
pp1=&cbfiltersTbl[CB_FILTERLEN-1];
|
||||
for (j=0; j<CB_FILTERLEN; j++) {
|
||||
(*pos)+=(*pp++)*(*pp1--);
|
||||
}
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
|
||||
/* interpolated vectors */
|
||||
|
||||
else {
|
||||
float tempbuff2[CB_MEML+CB_FILTERLEN+1];
|
||||
|
||||
float *pos;
|
||||
float *pp, *pp1;
|
||||
int i;
|
||||
|
||||
memset(tempbuff2, 0,
|
||||
CB_HALFFILTERLEN*sizeof(float));
|
||||
memcpy(&tempbuff2[CB_HALFFILTERLEN], mem,
|
||||
lMem*sizeof(float));
|
||||
memset(&tempbuff2[lMem+CB_HALFFILTERLEN], 0,
|
||||
(CB_HALFFILTERLEN+1)*sizeof(float));
|
||||
|
||||
k=2*(index-base_size-
|
||||
(lMem-cbveclen+1))+cbveclen;
|
||||
sFilt=lMem-k;
|
||||
memInd=sFilt+1-CB_HALFFILTERLEN;
|
||||
|
||||
/* do filtering */
|
||||
pos=&tmpbuf[sFilt];
|
||||
memset(pos, 0, k*sizeof(float));
|
||||
for (i=0; i<k; i++) {
|
||||
pp=&tempbuff2[memInd+i+CB_HALFFILTERLEN];
|
||||
pp1=&cbfiltersTbl[CB_FILTERLEN-1];
|
||||
for (j=0; j<CB_FILTERLEN; j++) {
|
||||
(*pos)+=(*pp++)*(*pp1--);
|
||||
}
|
||||
pos++;
|
||||
}
|
||||
|
||||
ihigh=k/2;
|
||||
ilow=ihigh-5;
|
||||
|
||||
|
||||
|
||||
/* Copy first noninterpolated part */
|
||||
|
||||
memcpy(cbvec, tmpbuf+lMem-k/2,
|
||||
ilow*sizeof(float));
|
||||
|
||||
/* interpolation */
|
||||
|
||||
alfa1=(float)0.2;
|
||||
alfa=0.0;
|
||||
for (j=ilow; j<ihigh; j++) {
|
||||
cbvec[j]=((float)1.0-alfa)*
|
||||
tmpbuf[lMem-k/2+j]+alfa*tmpbuf[lMem-k+j];
|
||||
alfa+=alfa1;
|
||||
}
|
||||
|
||||
/* Copy second noninterpolated part */
|
||||
|
||||
memcpy(cbvec+ihigh, tmpbuf+lMem-k+ihigh,
|
||||
(cbveclen-ihigh)*sizeof(float));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,28 +1,28 @@
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
getCBvec.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifndef __iLBC_GETCBVEC_H
|
||||
#define __iLBC_GETCBVEC_H
|
||||
|
||||
|
||||
|
||||
void getCBvec(
|
||||
float *cbvec, /* (o) Constructed codebook vector */
|
||||
float *mem, /* (i) Codebook buffer */
|
||||
int index, /* (i) Codebook index */
|
||||
int lMem, /* (i) Length of codebook buffer */
|
||||
int cbveclen/* (i) Codebook vector length */
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
getCBvec.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifndef __iLBC_GETCBVEC_H
|
||||
#define __iLBC_GETCBVEC_H
|
||||
|
||||
|
||||
|
||||
void getCBvec(
|
||||
float *cbvec, /* (o) Constructed codebook vector */
|
||||
float *mem, /* (i) Codebook buffer */
|
||||
int index, /* (i) Codebook index */
|
||||
int lMem, /* (i) Length of codebook buffer */
|
||||
int cbveclen/* (i) Codebook vector length */
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
+307
-307
@@ -1,307 +1,307 @@
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
helpfun.c
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#include <math.h>
|
||||
|
||||
#include "iLBC_define.h"
|
||||
#include "constants.h"
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* calculation of auto correlation
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void autocorr(
|
||||
float *r, /* (o) autocorrelation vector */
|
||||
const float *x, /* (i) data vector */
|
||||
int N, /* (i) length of data vector */
|
||||
int order /* largest lag for calculated
|
||||
autocorrelations */
|
||||
){
|
||||
int lag, n;
|
||||
float sum;
|
||||
|
||||
for (lag = 0; lag <= order; lag++) {
|
||||
sum = 0;
|
||||
for (n = 0; n < N - lag; n++) {
|
||||
sum += x[n] * x[n+lag];
|
||||
}
|
||||
r[lag] = sum;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* window multiplication
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void window(
|
||||
float *z, /* (o) the windowed data */
|
||||
const float *x, /* (i) the original data vector */
|
||||
const float *y, /* (i) the window */
|
||||
int N /* (i) length of all vectors */
|
||||
){
|
||||
int i;
|
||||
|
||||
for (i = 0; i < N; i++) {
|
||||
z[i] = x[i] * y[i];
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* levinson-durbin solution for lpc coefficients
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void levdurb(
|
||||
float *a, /* (o) lpc coefficient vector starting
|
||||
with 1.0 */
|
||||
float *k, /* (o) reflection coefficients */
|
||||
float *r, /* (i) autocorrelation vector */
|
||||
int order /* (i) order of lpc filter */
|
||||
){
|
||||
float sum, alpha;
|
||||
int m, m_h, i;
|
||||
|
||||
a[0] = 1.0;
|
||||
|
||||
if (r[0] < EPS) { /* if r[0] <= 0, set LPC coeff. to zero */
|
||||
for (i = 0; i < order; i++) {
|
||||
k[i] = 0;
|
||||
a[i+1] = 0;
|
||||
}
|
||||
} else {
|
||||
a[1] = k[0] = -r[1]/r[0];
|
||||
alpha = r[0] + r[1] * k[0];
|
||||
for (m = 1; m < order; m++){
|
||||
sum = r[m + 1];
|
||||
for (i = 0; i < m; i++){
|
||||
sum += a[i+1] * r[m - i];
|
||||
}
|
||||
k[m] = -sum / alpha;
|
||||
alpha += k[m] * sum;
|
||||
m_h = (m + 1) >> 1;
|
||||
for (i = 0; i < m_h; i++){
|
||||
sum = a[i+1] + k[m] * a[m - i];
|
||||
a[m - i] += k[m] * a[i+1];
|
||||
a[i+1] = sum;
|
||||
|
||||
|
||||
}
|
||||
a[m+1] = k[m];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* interpolation between vectors
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void interpolate(
|
||||
float *out, /* (o) the interpolated vector */
|
||||
float *in1, /* (i) the first vector for the
|
||||
interpolation */
|
||||
float *in2, /* (i) the second vector for the
|
||||
interpolation */
|
||||
float coef, /* (i) interpolation weights */
|
||||
int length /* (i) length of all vectors */
|
||||
){
|
||||
int i;
|
||||
float invcoef;
|
||||
|
||||
invcoef = (float)1.0 - coef;
|
||||
for (i = 0; i < length; i++) {
|
||||
out[i] = coef * in1[i] + invcoef * in2[i];
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* lpc bandwidth expansion
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void bwexpand(
|
||||
float *out, /* (o) the bandwidth expanded lpc
|
||||
coefficients */
|
||||
float *in, /* (i) the lpc coefficients before bandwidth
|
||||
expansion */
|
||||
float coef, /* (i) the bandwidth expansion factor */
|
||||
int length /* (i) the length of lpc coefficient vectors */
|
||||
){
|
||||
int i;
|
||||
float chirp;
|
||||
|
||||
chirp = coef;
|
||||
|
||||
out[0] = in[0];
|
||||
for (i = 1; i < length; i++) {
|
||||
out[i] = chirp * in[i];
|
||||
chirp *= coef;
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* vector quantization
|
||||
|
||||
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void vq(
|
||||
float *Xq, /* (o) the quantized vector */
|
||||
int *index, /* (o) the quantization index */
|
||||
const float *CB,/* (i) the vector quantization codebook */
|
||||
float *X, /* (i) the vector to quantize */
|
||||
int n_cb, /* (i) the number of vectors in the codebook */
|
||||
int dim /* (i) the dimension of all vectors */
|
||||
){
|
||||
int i, j;
|
||||
int pos, minindex;
|
||||
float dist, tmp, mindist;
|
||||
|
||||
pos = 0;
|
||||
mindist = FLOAT_MAX;
|
||||
minindex = 0;
|
||||
for (j = 0; j < n_cb; j++) {
|
||||
dist = X[0] - CB[pos];
|
||||
dist *= dist;
|
||||
for (i = 1; i < dim; i++) {
|
||||
tmp = X[i] - CB[pos + i];
|
||||
dist += tmp*tmp;
|
||||
}
|
||||
|
||||
if (dist < mindist) {
|
||||
mindist = dist;
|
||||
minindex = j;
|
||||
}
|
||||
pos += dim;
|
||||
}
|
||||
for (i = 0; i < dim; i++) {
|
||||
Xq[i] = CB[minindex*dim + i];
|
||||
}
|
||||
*index = minindex;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* split vector quantization
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void SplitVQ(
|
||||
float *qX, /* (o) the quantized vector */
|
||||
int *index, /* (o) a vector of indexes for all vector
|
||||
codebooks in the split */
|
||||
float *X, /* (i) the vector to quantize */
|
||||
const float *CB,/* (i) the quantizer codebook */
|
||||
int nsplit, /* the number of vector splits */
|
||||
const int *dim, /* the dimension of X and qX */
|
||||
const int *cbsize /* the number of vectors in the codebook */
|
||||
){
|
||||
int cb_pos, X_pos, i;
|
||||
|
||||
cb_pos = 0;
|
||||
|
||||
|
||||
X_pos= 0;
|
||||
for (i = 0; i < nsplit; i++) {
|
||||
vq(qX + X_pos, index + i, CB + cb_pos, X + X_pos,
|
||||
cbsize[i], dim[i]);
|
||||
X_pos += dim[i];
|
||||
cb_pos += dim[i] * cbsize[i];
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* scalar quantization
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void sort_sq(
|
||||
float *xq, /* (o) the quantized value */
|
||||
int *index, /* (o) the quantization index */
|
||||
float x, /* (i) the value to quantize */
|
||||
const float *cb,/* (i) the quantization codebook */
|
||||
int cb_size /* (i) the size of the quantization codebook */
|
||||
){
|
||||
int i;
|
||||
|
||||
if (x <= cb[0]) {
|
||||
*index = 0;
|
||||
*xq = cb[0];
|
||||
} else {
|
||||
i = 0;
|
||||
while ((x > cb[i]) && i < cb_size - 1) {
|
||||
i++;
|
||||
}
|
||||
|
||||
if (x > ((cb[i] + cb[i - 1])/2)) {
|
||||
*index = i;
|
||||
*xq = cb[i];
|
||||
} else {
|
||||
*index = i - 1;
|
||||
*xq = cb[i - 1];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* check for stability of lsf coefficients
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
int LSF_check( /* (o) 1 for stable lsf vectors and 0 for
|
||||
nonstable ones */
|
||||
float *lsf, /* (i) a table of lsf vectors */
|
||||
int dim, /* (i) the dimension of each lsf vector */
|
||||
int NoAn /* (i) the number of lsf vectors in the
|
||||
table */
|
||||
){
|
||||
int k,n,m, Nit=2, change=0,pos;
|
||||
float tmp;
|
||||
|
||||
|
||||
static float eps=(float)0.039; /* 50 Hz */
|
||||
static float eps2=(float)0.0195;
|
||||
static float maxlsf=(float)3.14; /* 4000 Hz */
|
||||
static float minlsf=(float)0.01; /* 0 Hz */
|
||||
|
||||
/* LSF separation check*/
|
||||
|
||||
for (n=0; n<Nit; n++) { /* Run through a couple of times */
|
||||
for (m=0; m<NoAn; m++) { /* Number of analyses per frame */
|
||||
for (k=0; k<(dim-1); k++) {
|
||||
pos=m*dim+k;
|
||||
|
||||
if ((lsf[pos+1]-lsf[pos])<eps) {
|
||||
|
||||
if (lsf[pos+1]<lsf[pos]) {
|
||||
tmp=lsf[pos+1];
|
||||
lsf[pos+1]= lsf[pos]+eps2;
|
||||
lsf[pos]= lsf[pos+1]-eps2;
|
||||
} else {
|
||||
lsf[pos]-=eps2;
|
||||
lsf[pos+1]+=eps2;
|
||||
}
|
||||
change=1;
|
||||
}
|
||||
|
||||
if (lsf[pos]<minlsf) {
|
||||
lsf[pos]=minlsf;
|
||||
change=1;
|
||||
}
|
||||
|
||||
if (lsf[pos]>maxlsf) {
|
||||
lsf[pos]=maxlsf;
|
||||
change=1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return change;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
helpfun.c
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#include <math.h>
|
||||
|
||||
#include "iLBC_define.h"
|
||||
#include "constants.h"
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* calculation of auto correlation
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void autocorr(
|
||||
float *r, /* (o) autocorrelation vector */
|
||||
const float *x, /* (i) data vector */
|
||||
int N, /* (i) length of data vector */
|
||||
int order /* largest lag for calculated
|
||||
autocorrelations */
|
||||
){
|
||||
int lag, n;
|
||||
float sum;
|
||||
|
||||
for (lag = 0; lag <= order; lag++) {
|
||||
sum = 0;
|
||||
for (n = 0; n < N - lag; n++) {
|
||||
sum += x[n] * x[n+lag];
|
||||
}
|
||||
r[lag] = sum;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* window multiplication
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void window(
|
||||
float *z, /* (o) the windowed data */
|
||||
const float *x, /* (i) the original data vector */
|
||||
const float *y, /* (i) the window */
|
||||
int N /* (i) length of all vectors */
|
||||
){
|
||||
int i;
|
||||
|
||||
for (i = 0; i < N; i++) {
|
||||
z[i] = x[i] * y[i];
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* levinson-durbin solution for lpc coefficients
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void levdurb(
|
||||
float *a, /* (o) lpc coefficient vector starting
|
||||
with 1.0 */
|
||||
float *k, /* (o) reflection coefficients */
|
||||
float *r, /* (i) autocorrelation vector */
|
||||
int order /* (i) order of lpc filter */
|
||||
){
|
||||
float sum, alpha;
|
||||
int m, m_h, i;
|
||||
|
||||
a[0] = 1.0;
|
||||
|
||||
if (r[0] < EPS) { /* if r[0] <= 0, set LPC coeff. to zero */
|
||||
for (i = 0; i < order; i++) {
|
||||
k[i] = 0;
|
||||
a[i+1] = 0;
|
||||
}
|
||||
} else {
|
||||
a[1] = k[0] = -r[1]/r[0];
|
||||
alpha = r[0] + r[1] * k[0];
|
||||
for (m = 1; m < order; m++){
|
||||
sum = r[m + 1];
|
||||
for (i = 0; i < m; i++){
|
||||
sum += a[i+1] * r[m - i];
|
||||
}
|
||||
k[m] = -sum / alpha;
|
||||
alpha += k[m] * sum;
|
||||
m_h = (m + 1) >> 1;
|
||||
for (i = 0; i < m_h; i++){
|
||||
sum = a[i+1] + k[m] * a[m - i];
|
||||
a[m - i] += k[m] * a[i+1];
|
||||
a[i+1] = sum;
|
||||
|
||||
|
||||
}
|
||||
a[m+1] = k[m];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* interpolation between vectors
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void interpolate(
|
||||
float *out, /* (o) the interpolated vector */
|
||||
float *in1, /* (i) the first vector for the
|
||||
interpolation */
|
||||
float *in2, /* (i) the second vector for the
|
||||
interpolation */
|
||||
float coef, /* (i) interpolation weights */
|
||||
int length /* (i) length of all vectors */
|
||||
){
|
||||
int i;
|
||||
float invcoef;
|
||||
|
||||
invcoef = (float)1.0 - coef;
|
||||
for (i = 0; i < length; i++) {
|
||||
out[i] = coef * in1[i] + invcoef * in2[i];
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* lpc bandwidth expansion
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void bwexpand(
|
||||
float *out, /* (o) the bandwidth expanded lpc
|
||||
coefficients */
|
||||
float *in, /* (i) the lpc coefficients before bandwidth
|
||||
expansion */
|
||||
float coef, /* (i) the bandwidth expansion factor */
|
||||
int length /* (i) the length of lpc coefficient vectors */
|
||||
){
|
||||
int i;
|
||||
float chirp;
|
||||
|
||||
chirp = coef;
|
||||
|
||||
out[0] = in[0];
|
||||
for (i = 1; i < length; i++) {
|
||||
out[i] = chirp * in[i];
|
||||
chirp *= coef;
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* vector quantization
|
||||
|
||||
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void vq(
|
||||
float *Xq, /* (o) the quantized vector */
|
||||
int *index, /* (o) the quantization index */
|
||||
const float *CB,/* (i) the vector quantization codebook */
|
||||
float *X, /* (i) the vector to quantize */
|
||||
int n_cb, /* (i) the number of vectors in the codebook */
|
||||
int dim /* (i) the dimension of all vectors */
|
||||
){
|
||||
int i, j;
|
||||
int pos, minindex;
|
||||
float dist, tmp, mindist;
|
||||
|
||||
pos = 0;
|
||||
mindist = FLOAT_MAX;
|
||||
minindex = 0;
|
||||
for (j = 0; j < n_cb; j++) {
|
||||
dist = X[0] - CB[pos];
|
||||
dist *= dist;
|
||||
for (i = 1; i < dim; i++) {
|
||||
tmp = X[i] - CB[pos + i];
|
||||
dist += tmp*tmp;
|
||||
}
|
||||
|
||||
if (dist < mindist) {
|
||||
mindist = dist;
|
||||
minindex = j;
|
||||
}
|
||||
pos += dim;
|
||||
}
|
||||
for (i = 0; i < dim; i++) {
|
||||
Xq[i] = CB[minindex*dim + i];
|
||||
}
|
||||
*index = minindex;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* split vector quantization
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void SplitVQ(
|
||||
float *qX, /* (o) the quantized vector */
|
||||
int *index, /* (o) a vector of indexes for all vector
|
||||
codebooks in the split */
|
||||
float *X, /* (i) the vector to quantize */
|
||||
const float *CB,/* (i) the quantizer codebook */
|
||||
int nsplit, /* the number of vector splits */
|
||||
const int *dim, /* the dimension of X and qX */
|
||||
const int *cbsize /* the number of vectors in the codebook */
|
||||
){
|
||||
int cb_pos, X_pos, i;
|
||||
|
||||
cb_pos = 0;
|
||||
|
||||
|
||||
X_pos= 0;
|
||||
for (i = 0; i < nsplit; i++) {
|
||||
vq(qX + X_pos, index + i, CB + cb_pos, X + X_pos,
|
||||
cbsize[i], dim[i]);
|
||||
X_pos += dim[i];
|
||||
cb_pos += dim[i] * cbsize[i];
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* scalar quantization
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void sort_sq(
|
||||
float *xq, /* (o) the quantized value */
|
||||
int *index, /* (o) the quantization index */
|
||||
float x, /* (i) the value to quantize */
|
||||
const float *cb,/* (i) the quantization codebook */
|
||||
int cb_size /* (i) the size of the quantization codebook */
|
||||
){
|
||||
int i;
|
||||
|
||||
if (x <= cb[0]) {
|
||||
*index = 0;
|
||||
*xq = cb[0];
|
||||
} else {
|
||||
i = 0;
|
||||
while ((x > cb[i]) && i < cb_size - 1) {
|
||||
i++;
|
||||
}
|
||||
|
||||
if (x > ((cb[i] + cb[i - 1])/2)) {
|
||||
*index = i;
|
||||
*xq = cb[i];
|
||||
} else {
|
||||
*index = i - 1;
|
||||
*xq = cb[i - 1];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* check for stability of lsf coefficients
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
int LSF_check( /* (o) 1 for stable lsf vectors and 0 for
|
||||
nonstable ones */
|
||||
float *lsf, /* (i) a table of lsf vectors */
|
||||
int dim, /* (i) the dimension of each lsf vector */
|
||||
int NoAn /* (i) the number of lsf vectors in the
|
||||
table */
|
||||
){
|
||||
int k,n,m, Nit=2, change=0,pos;
|
||||
float tmp;
|
||||
|
||||
|
||||
static float eps=(float)0.039; /* 50 Hz */
|
||||
static float eps2=(float)0.0195;
|
||||
static float maxlsf=(float)3.14; /* 4000 Hz */
|
||||
static float minlsf=(float)0.01; /* 0 Hz */
|
||||
|
||||
/* LSF separation check*/
|
||||
|
||||
for (n=0; n<Nit; n++) { /* Run through a couple of times */
|
||||
for (m=0; m<NoAn; m++) { /* Number of analyses per frame */
|
||||
for (k=0; k<(dim-1); k++) {
|
||||
pos=m*dim+k;
|
||||
|
||||
if ((lsf[pos+1]-lsf[pos])<eps) {
|
||||
|
||||
if (lsf[pos+1]<lsf[pos]) {
|
||||
tmp=lsf[pos+1];
|
||||
lsf[pos+1]= lsf[pos]+eps2;
|
||||
lsf[pos]= lsf[pos+1]-eps2;
|
||||
} else {
|
||||
lsf[pos]-=eps2;
|
||||
lsf[pos+1]+=eps2;
|
||||
}
|
||||
change=1;
|
||||
}
|
||||
|
||||
if (lsf[pos]<minlsf) {
|
||||
lsf[pos]=minlsf;
|
||||
change=1;
|
||||
}
|
||||
|
||||
if (lsf[pos]>maxlsf) {
|
||||
lsf[pos]=maxlsf;
|
||||
change=1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return change;
|
||||
}
|
||||
|
||||
|
||||
|
||||
+101
-101
@@ -1,101 +1,101 @@
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
helpfun.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifndef __iLBC_HELPFUN_H
|
||||
#define __iLBC_HELPFUN_H
|
||||
|
||||
void autocorr(
|
||||
float *r, /* (o) autocorrelation vector */
|
||||
const float *x, /* (i) data vector */
|
||||
int N, /* (i) length of data vector */
|
||||
int order /* largest lag for calculated
|
||||
autocorrelations */
|
||||
);
|
||||
|
||||
void window(
|
||||
float *z, /* (o) the windowed data */
|
||||
const float *x, /* (i) the original data vector */
|
||||
const float *y, /* (i) the window */
|
||||
int N /* (i) length of all vectors */
|
||||
);
|
||||
|
||||
|
||||
|
||||
void levdurb(
|
||||
float *a, /* (o) lpc coefficient vector starting
|
||||
with 1.0 */
|
||||
float *k, /* (o) reflection coefficients */
|
||||
float *r, /* (i) autocorrelation vector */
|
||||
int order /* (i) order of lpc filter */
|
||||
);
|
||||
|
||||
void interpolate(
|
||||
float *out, /* (o) the interpolated vector */
|
||||
float *in1, /* (i) the first vector for the
|
||||
interpolation */
|
||||
float *in2, /* (i) the second vector for the
|
||||
interpolation */
|
||||
float coef, /* (i) interpolation weights */
|
||||
int length /* (i) length of all vectors */
|
||||
);
|
||||
|
||||
void bwexpand(
|
||||
float *out, /* (o) the bandwidth expanded lpc
|
||||
coefficients */
|
||||
float *in, /* (i) the lpc coefficients before bandwidth
|
||||
expansion */
|
||||
float coef, /* (i) the bandwidth expansion factor */
|
||||
int length /* (i) the length of lpc coefficient vectors */
|
||||
);
|
||||
|
||||
void vq(
|
||||
float *Xq, /* (o) the quantized vector */
|
||||
int *index, /* (o) the quantization index */
|
||||
const float *CB,/* (i) the vector quantization codebook */
|
||||
float *X, /* (i) the vector to quantize */
|
||||
int n_cb, /* (i) the number of vectors in the codebook */
|
||||
int dim /* (i) the dimension of all vectors */
|
||||
);
|
||||
|
||||
void SplitVQ(
|
||||
float *qX, /* (o) the quantized vector */
|
||||
int *index, /* (o) a vector of indexes for all vector
|
||||
codebooks in the split */
|
||||
float *X, /* (i) the vector to quantize */
|
||||
const float *CB,/* (i) the quantizer codebook */
|
||||
int nsplit, /* the number of vector splits */
|
||||
const int *dim, /* the dimension of X and qX */
|
||||
const int *cbsize /* the number of vectors in the codebook */
|
||||
);
|
||||
|
||||
|
||||
void sort_sq(
|
||||
float *xq, /* (o) the quantized value */
|
||||
int *index, /* (o) the quantization index */
|
||||
float x, /* (i) the value to quantize */
|
||||
const float *cb,/* (i) the quantization codebook */
|
||||
|
||||
|
||||
int cb_size /* (i) the size of the quantization codebook */
|
||||
);
|
||||
|
||||
int LSF_check( /* (o) 1 for stable lsf vectors and 0 for
|
||||
nonstable ones */
|
||||
float *lsf, /* (i) a table of lsf vectors */
|
||||
int dim, /* (i) the dimension of each lsf vector */
|
||||
int NoAn /* (i) the number of lsf vectors in the
|
||||
table */
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
helpfun.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifndef __iLBC_HELPFUN_H
|
||||
#define __iLBC_HELPFUN_H
|
||||
|
||||
void autocorr(
|
||||
float *r, /* (o) autocorrelation vector */
|
||||
const float *x, /* (i) data vector */
|
||||
int N, /* (i) length of data vector */
|
||||
int order /* largest lag for calculated
|
||||
autocorrelations */
|
||||
);
|
||||
|
||||
void window(
|
||||
float *z, /* (o) the windowed data */
|
||||
const float *x, /* (i) the original data vector */
|
||||
const float *y, /* (i) the window */
|
||||
int N /* (i) length of all vectors */
|
||||
);
|
||||
|
||||
|
||||
|
||||
void levdurb(
|
||||
float *a, /* (o) lpc coefficient vector starting
|
||||
with 1.0 */
|
||||
float *k, /* (o) reflection coefficients */
|
||||
float *r, /* (i) autocorrelation vector */
|
||||
int order /* (i) order of lpc filter */
|
||||
);
|
||||
|
||||
void interpolate(
|
||||
float *out, /* (o) the interpolated vector */
|
||||
float *in1, /* (i) the first vector for the
|
||||
interpolation */
|
||||
float *in2, /* (i) the second vector for the
|
||||
interpolation */
|
||||
float coef, /* (i) interpolation weights */
|
||||
int length /* (i) length of all vectors */
|
||||
);
|
||||
|
||||
void bwexpand(
|
||||
float *out, /* (o) the bandwidth expanded lpc
|
||||
coefficients */
|
||||
float *in, /* (i) the lpc coefficients before bandwidth
|
||||
expansion */
|
||||
float coef, /* (i) the bandwidth expansion factor */
|
||||
int length /* (i) the length of lpc coefficient vectors */
|
||||
);
|
||||
|
||||
void vq(
|
||||
float *Xq, /* (o) the quantized vector */
|
||||
int *index, /* (o) the quantization index */
|
||||
const float *CB,/* (i) the vector quantization codebook */
|
||||
float *X, /* (i) the vector to quantize */
|
||||
int n_cb, /* (i) the number of vectors in the codebook */
|
||||
int dim /* (i) the dimension of all vectors */
|
||||
);
|
||||
|
||||
void SplitVQ(
|
||||
float *qX, /* (o) the quantized vector */
|
||||
int *index, /* (o) a vector of indexes for all vector
|
||||
codebooks in the split */
|
||||
float *X, /* (i) the vector to quantize */
|
||||
const float *CB,/* (i) the quantizer codebook */
|
||||
int nsplit, /* the number of vector splits */
|
||||
const int *dim, /* the dimension of X and qX */
|
||||
const int *cbsize /* the number of vectors in the codebook */
|
||||
);
|
||||
|
||||
|
||||
void sort_sq(
|
||||
float *xq, /* (o) the quantized value */
|
||||
int *index, /* (o) the quantization index */
|
||||
float x, /* (i) the value to quantize */
|
||||
const float *cb,/* (i) the quantization codebook */
|
||||
|
||||
|
||||
int cb_size /* (i) the size of the quantization codebook */
|
||||
);
|
||||
|
||||
int LSF_check( /* (o) 1 for stable lsf vectors and 0 for
|
||||
nonstable ones */
|
||||
float *lsf, /* (i) a table of lsf vectors */
|
||||
int dim, /* (i) the dimension of each lsf vector */
|
||||
int NoAn /* (i) the number of lsf vectors in the
|
||||
table */
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
@@ -1,59 +1,59 @@
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
hpInput.c
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#include "constants.h"
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* Input high-pass filter
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void hpInput(
|
||||
float *In, /* (i) vector to filter */
|
||||
int len, /* (i) length of vector to filter */
|
||||
float *Out, /* (o) the resulting filtered vector */
|
||||
float *mem /* (i/o) the filter state */
|
||||
){
|
||||
int i;
|
||||
float *pi, *po;
|
||||
|
||||
/* all-zero section*/
|
||||
|
||||
pi = &In[0];
|
||||
po = &Out[0];
|
||||
for (i=0; i<len; i++) {
|
||||
*po = hpi_zero_coefsTbl[0] * (*pi);
|
||||
*po += hpi_zero_coefsTbl[1] * mem[0];
|
||||
*po += hpi_zero_coefsTbl[2] * mem[1];
|
||||
|
||||
mem[1] = mem[0];
|
||||
mem[0] = *pi;
|
||||
po++;
|
||||
|
||||
|
||||
pi++;
|
||||
|
||||
}
|
||||
|
||||
/* all-pole section*/
|
||||
|
||||
po = &Out[0];
|
||||
for (i=0; i<len; i++) {
|
||||
*po -= hpi_pole_coefsTbl[1] * mem[2];
|
||||
*po -= hpi_pole_coefsTbl[2] * mem[3];
|
||||
|
||||
mem[3] = mem[2];
|
||||
mem[2] = *po;
|
||||
po++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
hpInput.c
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#include "constants.h"
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* Input high-pass filter
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void hpInput(
|
||||
float *In, /* (i) vector to filter */
|
||||
int len, /* (i) length of vector to filter */
|
||||
float *Out, /* (o) the resulting filtered vector */
|
||||
float *mem /* (i/o) the filter state */
|
||||
){
|
||||
int i;
|
||||
float *pi, *po;
|
||||
|
||||
/* all-zero section*/
|
||||
|
||||
pi = &In[0];
|
||||
po = &Out[0];
|
||||
for (i=0; i<len; i++) {
|
||||
*po = hpi_zero_coefsTbl[0] * (*pi);
|
||||
*po += hpi_zero_coefsTbl[1] * mem[0];
|
||||
*po += hpi_zero_coefsTbl[2] * mem[1];
|
||||
|
||||
mem[1] = mem[0];
|
||||
mem[0] = *pi;
|
||||
po++;
|
||||
|
||||
|
||||
pi++;
|
||||
|
||||
}
|
||||
|
||||
/* all-pole section*/
|
||||
|
||||
po = &Out[0];
|
||||
for (i=0; i<len; i++) {
|
||||
*po -= hpi_pole_coefsTbl[1] * mem[2];
|
||||
*po -= hpi_pole_coefsTbl[2] * mem[3];
|
||||
|
||||
mem[3] = mem[2];
|
||||
mem[2] = *po;
|
||||
po++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,27 +1,27 @@
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
hpInput.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
|
||||
|
||||
#ifndef __iLBC_HPINPUT_H
|
||||
#define __iLBC_HPINPUT_H
|
||||
|
||||
void hpInput(
|
||||
float *In, /* (i) vector to filter */
|
||||
int len, /* (i) length of vector to filter */
|
||||
float *Out, /* (o) the resulting filtered vector */
|
||||
float *mem /* (i/o) the filter state */
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
hpInput.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
|
||||
|
||||
#ifndef __iLBC_HPINPUT_H
|
||||
#define __iLBC_HPINPUT_H
|
||||
|
||||
void hpInput(
|
||||
float *In, /* (i) vector to filter */
|
||||
int len, /* (i) length of vector to filter */
|
||||
float *Out, /* (o) the resulting filtered vector */
|
||||
float *mem /* (i/o) the filter state */
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
@@ -1,59 +1,59 @@
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
hpOutput.c
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#include "constants.h"
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* Output high-pass filter
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void hpOutput(
|
||||
float *In, /* (i) vector to filter */
|
||||
int len,/* (i) length of vector to filter */
|
||||
float *Out, /* (o) the resulting filtered vector */
|
||||
float *mem /* (i/o) the filter state */
|
||||
){
|
||||
int i;
|
||||
float *pi, *po;
|
||||
|
||||
/* all-zero section*/
|
||||
|
||||
pi = &In[0];
|
||||
po = &Out[0];
|
||||
for (i=0; i<len; i++) {
|
||||
*po = hpo_zero_coefsTbl[0] * (*pi);
|
||||
*po += hpo_zero_coefsTbl[1] * mem[0];
|
||||
*po += hpo_zero_coefsTbl[2] * mem[1];
|
||||
|
||||
mem[1] = mem[0];
|
||||
mem[0] = *pi;
|
||||
po++;
|
||||
pi++;
|
||||
|
||||
}
|
||||
|
||||
/* all-pole section*/
|
||||
|
||||
po = &Out[0];
|
||||
for (i=0; i<len; i++) {
|
||||
*po -= hpo_pole_coefsTbl[1] * mem[2];
|
||||
*po -= hpo_pole_coefsTbl[2] * mem[3];
|
||||
|
||||
mem[3] = mem[2];
|
||||
mem[2] = *po;
|
||||
po++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
hpOutput.c
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#include "constants.h"
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* Output high-pass filter
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void hpOutput(
|
||||
float *In, /* (i) vector to filter */
|
||||
int len,/* (i) length of vector to filter */
|
||||
float *Out, /* (o) the resulting filtered vector */
|
||||
float *mem /* (i/o) the filter state */
|
||||
){
|
||||
int i;
|
||||
float *pi, *po;
|
||||
|
||||
/* all-zero section*/
|
||||
|
||||
pi = &In[0];
|
||||
po = &Out[0];
|
||||
for (i=0; i<len; i++) {
|
||||
*po = hpo_zero_coefsTbl[0] * (*pi);
|
||||
*po += hpo_zero_coefsTbl[1] * mem[0];
|
||||
*po += hpo_zero_coefsTbl[2] * mem[1];
|
||||
|
||||
mem[1] = mem[0];
|
||||
mem[0] = *pi;
|
||||
po++;
|
||||
pi++;
|
||||
|
||||
}
|
||||
|
||||
/* all-pole section*/
|
||||
|
||||
po = &Out[0];
|
||||
for (i=0; i<len; i++) {
|
||||
*po -= hpo_pole_coefsTbl[1] * mem[2];
|
||||
*po -= hpo_pole_coefsTbl[2] * mem[3];
|
||||
|
||||
mem[3] = mem[2];
|
||||
mem[2] = *po;
|
||||
po++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,25 +1,25 @@
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
hpOutput.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifndef __iLBC_HPOUTPUT_H
|
||||
#define __iLBC_HPOUTPUT_H
|
||||
|
||||
void hpOutput(
|
||||
float *In, /* (i) vector to filter */
|
||||
int len,/* (i) length of vector to filter */
|
||||
float *Out, /* (o) the resulting filtered vector */
|
||||
float *mem /* (i/o) the filter state */
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
hpOutput.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifndef __iLBC_HPOUTPUT_H
|
||||
#define __iLBC_HPOUTPUT_H
|
||||
|
||||
void hpOutput(
|
||||
float *In, /* (i) vector to filter */
|
||||
int len,/* (i) length of vector to filter */
|
||||
float *Out, /* (o) the resulting filtered vector */
|
||||
float *mem /* (i/o) the filter state */
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
+107
-107
@@ -1,107 +1,107 @@
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
iCBConstruct.c
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#include <math.h>
|
||||
|
||||
#include "iLBC_define.h"
|
||||
#include "gainquant.h"
|
||||
#include "getCBvec.h"
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* Convert the codebook indexes to make the search easier
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
|
||||
|
||||
void index_conv_enc(
|
||||
int *index /* (i/o) Codebook indexes */
|
||||
){
|
||||
int k;
|
||||
|
||||
for (k=1; k<CB_NSTAGES; k++) {
|
||||
|
||||
if ((index[k]>=108)&&(index[k]<172)) {
|
||||
index[k]-=64;
|
||||
} else if (index[k]>=236) {
|
||||
index[k]-=128;
|
||||
} else {
|
||||
/* ERROR */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void index_conv_dec(
|
||||
int *index /* (i/o) Codebook indexes */
|
||||
){
|
||||
int k;
|
||||
|
||||
for (k=1; k<CB_NSTAGES; k++) {
|
||||
|
||||
if ((index[k]>=44)&&(index[k]<108)) {
|
||||
index[k]+=64;
|
||||
} else if ((index[k]>=108)&&(index[k]<128)) {
|
||||
index[k]+=128;
|
||||
} else {
|
||||
/* ERROR */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* Construct decoded vector from codebook and gains.
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void iCBConstruct(
|
||||
float *decvector, /* (o) Decoded vector */
|
||||
int *index, /* (i) Codebook indices */
|
||||
int *gain_index,/* (i) Gain quantization indices */
|
||||
float *mem, /* (i) Buffer for codevector construction */
|
||||
int lMem, /* (i) Length of buffer */
|
||||
int veclen, /* (i) Length of vector */
|
||||
int nStages /* (i) Number of codebook stages */
|
||||
){
|
||||
int j,k;
|
||||
float gain[CB_NSTAGES];
|
||||
float cbvec[SUBL];
|
||||
|
||||
/* gain de-quantization */
|
||||
|
||||
gain[0] = gaindequant(gain_index[0], 1.0, 32);
|
||||
|
||||
|
||||
if (nStages > 1) {
|
||||
gain[1] = gaindequant(gain_index[1],
|
||||
(float)fabs(gain[0]), 16);
|
||||
}
|
||||
if (nStages > 2) {
|
||||
gain[2] = gaindequant(gain_index[2],
|
||||
(float)fabs(gain[1]), 8);
|
||||
}
|
||||
|
||||
/* codebook vector construction and construction of
|
||||
total vector */
|
||||
|
||||
getCBvec(cbvec, mem, index[0], lMem, veclen);
|
||||
for (j=0;j<veclen;j++){
|
||||
decvector[j] = gain[0]*cbvec[j];
|
||||
}
|
||||
if (nStages > 1) {
|
||||
for (k=1; k<nStages; k++) {
|
||||
getCBvec(cbvec, mem, index[k], lMem, veclen);
|
||||
for (j=0;j<veclen;j++) {
|
||||
decvector[j] += gain[k]*cbvec[j];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
iCBConstruct.c
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#include <math.h>
|
||||
|
||||
#include "iLBC_define.h"
|
||||
#include "gainquant.h"
|
||||
#include "getCBvec.h"
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* Convert the codebook indexes to make the search easier
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
|
||||
|
||||
void index_conv_enc(
|
||||
int *index /* (i/o) Codebook indexes */
|
||||
){
|
||||
int k;
|
||||
|
||||
for (k=1; k<CB_NSTAGES; k++) {
|
||||
|
||||
if ((index[k]>=108)&&(index[k]<172)) {
|
||||
index[k]-=64;
|
||||
} else if (index[k]>=236) {
|
||||
index[k]-=128;
|
||||
} else {
|
||||
/* ERROR */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void index_conv_dec(
|
||||
int *index /* (i/o) Codebook indexes */
|
||||
){
|
||||
int k;
|
||||
|
||||
for (k=1; k<CB_NSTAGES; k++) {
|
||||
|
||||
if ((index[k]>=44)&&(index[k]<108)) {
|
||||
index[k]+=64;
|
||||
} else if ((index[k]>=108)&&(index[k]<128)) {
|
||||
index[k]+=128;
|
||||
} else {
|
||||
/* ERROR */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* Construct decoded vector from codebook and gains.
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void iCBConstruct(
|
||||
float *decvector, /* (o) Decoded vector */
|
||||
int *index, /* (i) Codebook indices */
|
||||
int *gain_index,/* (i) Gain quantization indices */
|
||||
float *mem, /* (i) Buffer for codevector construction */
|
||||
int lMem, /* (i) Length of buffer */
|
||||
int veclen, /* (i) Length of vector */
|
||||
int nStages /* (i) Number of codebook stages */
|
||||
){
|
||||
int j,k;
|
||||
float gain[CB_NSTAGES];
|
||||
float cbvec[SUBL];
|
||||
|
||||
/* gain de-quantization */
|
||||
|
||||
gain[0] = gaindequant(gain_index[0], 1.0, 32);
|
||||
|
||||
|
||||
if (nStages > 1) {
|
||||
gain[1] = gaindequant(gain_index[1],
|
||||
(float)fabs(gain[0]), 16);
|
||||
}
|
||||
if (nStages > 2) {
|
||||
gain[2] = gaindequant(gain_index[2],
|
||||
(float)fabs(gain[1]), 8);
|
||||
}
|
||||
|
||||
/* codebook vector construction and construction of
|
||||
total vector */
|
||||
|
||||
getCBvec(cbvec, mem, index[0], lMem, veclen);
|
||||
for (j=0;j<veclen;j++){
|
||||
decvector[j] = gain[0]*cbvec[j];
|
||||
}
|
||||
if (nStages > 1) {
|
||||
for (k=1; k<nStages; k++) {
|
||||
getCBvec(cbvec, mem, index[k], lMem, veclen);
|
||||
for (j=0;j<veclen;j++) {
|
||||
decvector[j] += gain[k]*cbvec[j];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,38 +1,38 @@
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
|
||||
|
||||
iCBConstruct.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifndef __iLBC_ICBCONSTRUCT_H
|
||||
#define __iLBC_ICBCONSTRUCT_H
|
||||
|
||||
void index_conv_enc(
|
||||
int *index /* (i/o) Codebook indexes */
|
||||
);
|
||||
|
||||
void index_conv_dec(
|
||||
int *index /* (i/o) Codebook indexes */
|
||||
);
|
||||
|
||||
void iCBConstruct(
|
||||
float *decvector, /* (o) Decoded vector */
|
||||
int *index, /* (i) Codebook indices */
|
||||
int *gain_index,/* (i) Gain quantization indices */
|
||||
float *mem, /* (i) Buffer for codevector construction */
|
||||
int lMem, /* (i) Length of buffer */
|
||||
int veclen, /* (i) Length of vector */
|
||||
int nStages /* (i) Number of codebook stages */
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
|
||||
|
||||
iCBConstruct.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifndef __iLBC_ICBCONSTRUCT_H
|
||||
#define __iLBC_ICBCONSTRUCT_H
|
||||
|
||||
void index_conv_enc(
|
||||
int *index /* (i/o) Codebook indexes */
|
||||
);
|
||||
|
||||
void index_conv_dec(
|
||||
int *index /* (i/o) Codebook indexes */
|
||||
);
|
||||
|
||||
void iCBConstruct(
|
||||
float *decvector, /* (o) Decoded vector */
|
||||
int *index, /* (i) Codebook indices */
|
||||
int *gain_index,/* (i) Gain quantization indices */
|
||||
float *mem, /* (i) Buffer for codevector construction */
|
||||
int lMem, /* (i) Length of buffer */
|
||||
int veclen, /* (i) Length of vector */
|
||||
int nStages /* (i) Number of codebook stages */
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
+477
-477
@@ -1,477 +1,477 @@
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
iCBSearch.c
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#include <math.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "iLBC_define.h"
|
||||
#include "gainquant.h"
|
||||
#include "createCB.h"
|
||||
#include "filter.h"
|
||||
#include "constants.h"
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* Search routine for codebook encoding and gain quantization.
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void iCBSearch(
|
||||
iLBC_Enc_Inst_t *iLBCenc_inst,
|
||||
/* (i) the encoder state structure */
|
||||
int *index, /* (o) Codebook indices */
|
||||
int *gain_index,/* (o) Gain quantization indices */
|
||||
float *intarget,/* (i) Target vector for encoding */
|
||||
float *mem, /* (i) Buffer for codebook construction */
|
||||
int lMem, /* (i) Length of buffer */
|
||||
int lTarget, /* (i) Length of vector */
|
||||
int nStages, /* (i) Number of codebook stages */
|
||||
float *weightDenum, /* (i) weighting filter coefficients */
|
||||
float *weightState, /* (i) weighting filter state */
|
||||
int block /* (i) the sub-block number */
|
||||
){
|
||||
int i, j, icount, stage, best_index, range, counter;
|
||||
float max_measure, gain, measure, crossDot, ftmp;
|
||||
float gains[CB_NSTAGES];
|
||||
float target[SUBL];
|
||||
int base_index, sInd, eInd, base_size;
|
||||
int sIndAug=0, eIndAug=0;
|
||||
float buf[CB_MEML+SUBL+2*LPC_FILTERORDER];
|
||||
|
||||
|
||||
float invenergy[CB_EXPAND*128], energy[CB_EXPAND*128];
|
||||
float *pp, *ppi=0, *ppo=0, *ppe=0;
|
||||
float cbvectors[CB_MEML];
|
||||
float tene, cene, cvec[SUBL];
|
||||
float aug_vec[SUBL];
|
||||
|
||||
memset(cvec,0,SUBL*sizeof(float));
|
||||
|
||||
/* Determine size of codebook sections */
|
||||
|
||||
base_size=lMem-lTarget+1;
|
||||
|
||||
if (lTarget==SUBL) {
|
||||
base_size=lMem-lTarget+1+lTarget/2;
|
||||
}
|
||||
|
||||
/* setup buffer for weighting */
|
||||
|
||||
memcpy(buf,weightState,sizeof(float)*LPC_FILTERORDER);
|
||||
memcpy(buf+LPC_FILTERORDER,mem,lMem*sizeof(float));
|
||||
memcpy(buf+LPC_FILTERORDER+lMem,intarget,lTarget*sizeof(float));
|
||||
|
||||
/* weighting */
|
||||
|
||||
AllPoleFilter(buf+LPC_FILTERORDER, weightDenum,
|
||||
lMem+lTarget, LPC_FILTERORDER);
|
||||
|
||||
/* Construct the codebook and target needed */
|
||||
|
||||
memcpy(target, buf+LPC_FILTERORDER+lMem, lTarget*sizeof(float));
|
||||
|
||||
tene=0.0;
|
||||
for (i=0; i<lTarget; i++) {
|
||||
tene+=target[i]*target[i];
|
||||
}
|
||||
|
||||
/* Prepare search over one more codebook section. This section
|
||||
is created by filtering the original buffer with a filter. */
|
||||
|
||||
filteredCBvecs(cbvectors, buf+LPC_FILTERORDER, lMem);
|
||||
|
||||
/* The Main Loop over stages */
|
||||
|
||||
for (stage=0; stage<nStages; stage++) {
|
||||
|
||||
range = search_rangeTbl[block][stage];
|
||||
|
||||
/* initialize search measure */
|
||||
|
||||
max_measure = (float)-10000000.0;
|
||||
gain = (float)0.0;
|
||||
best_index = 0;
|
||||
|
||||
/* Compute cross dot product between the target
|
||||
|
||||
|
||||
and the CB memory */
|
||||
|
||||
crossDot=0.0;
|
||||
pp=buf+LPC_FILTERORDER+lMem-lTarget;
|
||||
for (j=0; j<lTarget; j++) {
|
||||
crossDot += target[j]*(*pp++);
|
||||
}
|
||||
|
||||
if (stage==0) {
|
||||
|
||||
/* Calculate energy in the first block of
|
||||
'lTarget' sampels. */
|
||||
ppe = energy;
|
||||
ppi = buf+LPC_FILTERORDER+lMem-lTarget-1;
|
||||
ppo = buf+LPC_FILTERORDER+lMem-1;
|
||||
|
||||
*ppe=0.0;
|
||||
pp=buf+LPC_FILTERORDER+lMem-lTarget;
|
||||
for (j=0; j<lTarget; j++) {
|
||||
*ppe+=(*pp)*(*pp++);
|
||||
}
|
||||
|
||||
if (*ppe>0.0) {
|
||||
invenergy[0] = (float) 1.0 / (*ppe + EPS);
|
||||
} else {
|
||||
invenergy[0] = (float) 0.0;
|
||||
}
|
||||
ppe++;
|
||||
|
||||
measure=(float)-10000000.0;
|
||||
|
||||
if (crossDot > 0.0) {
|
||||
measure = crossDot*crossDot*invenergy[0];
|
||||
}
|
||||
}
|
||||
else {
|
||||
measure = crossDot*crossDot*invenergy[0];
|
||||
}
|
||||
|
||||
/* check if measure is better */
|
||||
ftmp = crossDot*invenergy[0];
|
||||
|
||||
if ((measure>max_measure) && (fabs(ftmp)<CB_MAXGAIN)) {
|
||||
best_index = 0;
|
||||
max_measure = measure;
|
||||
gain = ftmp;
|
||||
}
|
||||
|
||||
/* loop over the main first codebook section,
|
||||
full search */
|
||||
|
||||
for (icount=1; icount<range; icount++) {
|
||||
|
||||
/* calculate measure */
|
||||
|
||||
|
||||
|
||||
crossDot=0.0;
|
||||
pp = buf+LPC_FILTERORDER+lMem-lTarget-icount;
|
||||
|
||||
for (j=0; j<lTarget; j++) {
|
||||
crossDot += target[j]*(*pp++);
|
||||
}
|
||||
|
||||
if (stage==0) {
|
||||
*ppe++ = energy[icount-1] + (*ppi)*(*ppi) -
|
||||
(*ppo)*(*ppo);
|
||||
ppo--;
|
||||
ppi--;
|
||||
|
||||
if (energy[icount]>0.0) {
|
||||
invenergy[icount] =
|
||||
(float)1.0/(energy[icount]+EPS);
|
||||
} else {
|
||||
invenergy[icount] = (float) 0.0;
|
||||
}
|
||||
|
||||
measure=(float)-10000000.0;
|
||||
|
||||
if (crossDot > 0.0) {
|
||||
measure = crossDot*crossDot*invenergy[icount];
|
||||
}
|
||||
}
|
||||
else {
|
||||
measure = crossDot*crossDot*invenergy[icount];
|
||||
}
|
||||
|
||||
/* check if measure is better */
|
||||
ftmp = crossDot*invenergy[icount];
|
||||
|
||||
if ((measure>max_measure) && (fabs(ftmp)<CB_MAXGAIN)) {
|
||||
best_index = icount;
|
||||
max_measure = measure;
|
||||
gain = ftmp;
|
||||
}
|
||||
}
|
||||
|
||||
/* Loop over augmented part in the first codebook
|
||||
* section, full search.
|
||||
* The vectors are interpolated.
|
||||
*/
|
||||
|
||||
if (lTarget==SUBL) {
|
||||
|
||||
/* Search for best possible cb vector and
|
||||
compute the CB-vectors' energy. */
|
||||
searchAugmentedCB(20, 39, stage, base_size-lTarget/2,
|
||||
target, buf+LPC_FILTERORDER+lMem,
|
||||
&max_measure, &best_index, &gain, energy,
|
||||
invenergy);
|
||||
|
||||
|
||||
}
|
||||
|
||||
/* set search range for following codebook sections */
|
||||
|
||||
base_index=best_index;
|
||||
|
||||
/* unrestricted search */
|
||||
|
||||
if (CB_RESRANGE == -1) {
|
||||
sInd=0;
|
||||
eInd=range-1;
|
||||
sIndAug=20;
|
||||
eIndAug=39;
|
||||
}
|
||||
|
||||
/* restriced search around best index from first
|
||||
codebook section */
|
||||
|
||||
else {
|
||||
/* Initialize search indices */
|
||||
sIndAug=0;
|
||||
eIndAug=0;
|
||||
sInd=base_index-CB_RESRANGE/2;
|
||||
eInd=sInd+CB_RESRANGE;
|
||||
|
||||
if (lTarget==SUBL) {
|
||||
|
||||
if (sInd<0) {
|
||||
|
||||
sIndAug = 40 + sInd;
|
||||
eIndAug = 39;
|
||||
sInd=0;
|
||||
|
||||
} else if ( base_index < (base_size-20) ) {
|
||||
|
||||
if (eInd > range) {
|
||||
sInd -= (eInd-range);
|
||||
eInd = range;
|
||||
}
|
||||
} else { /* base_index >= (base_size-20) */
|
||||
|
||||
if (sInd < (base_size-20)) {
|
||||
sIndAug = 20;
|
||||
sInd = 0;
|
||||
eInd = 0;
|
||||
eIndAug = 19 + CB_RESRANGE;
|
||||
|
||||
if(eIndAug > 39) {
|
||||
eInd = eIndAug-39;
|
||||
eIndAug = 39;
|
||||
}
|
||||
} else {
|
||||
sIndAug = 20 + sInd - (base_size-20);
|
||||
eIndAug = 39;
|
||||
|
||||
|
||||
sInd = 0;
|
||||
eInd = CB_RESRANGE - (eIndAug-sIndAug+1);
|
||||
}
|
||||
}
|
||||
|
||||
} else { /* lTarget = 22 or 23 */
|
||||
|
||||
if (sInd < 0) {
|
||||
eInd -= sInd;
|
||||
sInd = 0;
|
||||
}
|
||||
|
||||
if(eInd > range) {
|
||||
sInd -= (eInd - range);
|
||||
eInd = range;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* search of higher codebook section */
|
||||
|
||||
/* index search range */
|
||||
counter = sInd;
|
||||
sInd += base_size;
|
||||
eInd += base_size;
|
||||
|
||||
|
||||
if (stage==0) {
|
||||
ppe = energy+base_size;
|
||||
*ppe=0.0;
|
||||
|
||||
pp=cbvectors+lMem-lTarget;
|
||||
for (j=0; j<lTarget; j++) {
|
||||
*ppe+=(*pp)*(*pp++);
|
||||
}
|
||||
|
||||
ppi = cbvectors + lMem - 1 - lTarget;
|
||||
ppo = cbvectors + lMem - 1;
|
||||
|
||||
for (j=0; j<(range-1); j++) {
|
||||
*(ppe+1) = *ppe + (*ppi)*(*ppi) - (*ppo)*(*ppo);
|
||||
ppo--;
|
||||
ppi--;
|
||||
ppe++;
|
||||
}
|
||||
}
|
||||
|
||||
/* loop over search range */
|
||||
|
||||
for (icount=sInd; icount<eInd; icount++) {
|
||||
|
||||
/* calculate measure */
|
||||
|
||||
crossDot=0.0;
|
||||
|
||||
|
||||
pp=cbvectors + lMem - (counter++) - lTarget;
|
||||
|
||||
for (j=0;j<lTarget;j++) {
|
||||
crossDot += target[j]*(*pp++);
|
||||
}
|
||||
|
||||
if (energy[icount]>0.0) {
|
||||
invenergy[icount] =(float)1.0/(energy[icount]+EPS);
|
||||
} else {
|
||||
invenergy[icount] =(float)0.0;
|
||||
}
|
||||
|
||||
if (stage==0) {
|
||||
|
||||
measure=(float)-10000000.0;
|
||||
|
||||
if (crossDot > 0.0) {
|
||||
measure = crossDot*crossDot*
|
||||
invenergy[icount];
|
||||
}
|
||||
}
|
||||
else {
|
||||
measure = crossDot*crossDot*invenergy[icount];
|
||||
}
|
||||
|
||||
/* check if measure is better */
|
||||
ftmp = crossDot*invenergy[icount];
|
||||
|
||||
if ((measure>max_measure) && (fabs(ftmp)<CB_MAXGAIN)) {
|
||||
best_index = icount;
|
||||
max_measure = measure;
|
||||
gain = ftmp;
|
||||
}
|
||||
}
|
||||
|
||||
/* Search the augmented CB inside the limited range. */
|
||||
|
||||
if ((lTarget==SUBL)&&(sIndAug!=0)) {
|
||||
searchAugmentedCB(sIndAug, eIndAug, stage,
|
||||
2*base_size-20, target, cbvectors+lMem,
|
||||
&max_measure, &best_index, &gain, energy,
|
||||
invenergy);
|
||||
}
|
||||
|
||||
/* record best index */
|
||||
|
||||
index[stage] = best_index;
|
||||
|
||||
/* gain quantization */
|
||||
|
||||
if (stage==0){
|
||||
|
||||
if (gain<0.0){
|
||||
gain = 0.0;
|
||||
|
||||
|
||||
}
|
||||
|
||||
if (gain>CB_MAXGAIN) {
|
||||
gain = (float)CB_MAXGAIN;
|
||||
}
|
||||
gain = gainquant(gain, 1.0, 32, &gain_index[stage]);
|
||||
}
|
||||
else {
|
||||
if (stage==1) {
|
||||
gain = gainquant(gain, (float)fabs(gains[stage-1]),
|
||||
16, &gain_index[stage]);
|
||||
} else {
|
||||
gain = gainquant(gain, (float)fabs(gains[stage-1]),
|
||||
8, &gain_index[stage]);
|
||||
}
|
||||
}
|
||||
|
||||
/* Extract the best (according to measure)
|
||||
codebook vector */
|
||||
|
||||
if (lTarget==(STATE_LEN-iLBCenc_inst->state_short_len)) {
|
||||
|
||||
if (index[stage]<base_size) {
|
||||
pp=buf+LPC_FILTERORDER+lMem-lTarget-index[stage];
|
||||
} else {
|
||||
pp=cbvectors+lMem-lTarget-
|
||||
index[stage]+base_size;
|
||||
}
|
||||
} else {
|
||||
|
||||
if (index[stage]<base_size) {
|
||||
if (index[stage]<(base_size-20)) {
|
||||
pp=buf+LPC_FILTERORDER+lMem-
|
||||
lTarget-index[stage];
|
||||
} else {
|
||||
createAugmentedVec(index[stage]-base_size+40,
|
||||
buf+LPC_FILTERORDER+lMem,aug_vec);
|
||||
pp=aug_vec;
|
||||
}
|
||||
} else {
|
||||
int filterno, position;
|
||||
|
||||
filterno=index[stage]/base_size;
|
||||
position=index[stage]-filterno*base_size;
|
||||
|
||||
|
||||
if (position<(base_size-20)) {
|
||||
pp=cbvectors+filterno*lMem-lTarget-
|
||||
index[stage]+filterno*base_size;
|
||||
} else {
|
||||
createAugmentedVec(
|
||||
index[stage]-(filterno+1)*base_size+40,
|
||||
cbvectors+filterno*lMem,aug_vec);
|
||||
pp=aug_vec;
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Subtract the best codebook vector, according
|
||||
to measure, from the target vector */
|
||||
|
||||
for (j=0;j<lTarget;j++) {
|
||||
cvec[j] += gain*(*pp);
|
||||
target[j] -= gain*(*pp++);
|
||||
}
|
||||
|
||||
/* record quantized gain */
|
||||
|
||||
gains[stage]=gain;
|
||||
|
||||
}/* end of Main Loop. for (stage=0;... */
|
||||
|
||||
/* Gain adjustment for energy matching */
|
||||
cene=0.0;
|
||||
for (i=0; i<lTarget; i++) {
|
||||
cene+=cvec[i]*cvec[i];
|
||||
}
|
||||
j=gain_index[0];
|
||||
|
||||
for (i=gain_index[0]; i<32; i++) {
|
||||
ftmp=cene*gain_sq5Tbl[i]*gain_sq5Tbl[i];
|
||||
|
||||
if ((ftmp<(tene*gains[0]*gains[0])) &&
|
||||
(gain_sq5Tbl[j]<(2.0*gains[0]))) {
|
||||
j=i;
|
||||
}
|
||||
}
|
||||
gain_index[0]=j;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
iCBSearch.c
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#include <math.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "iLBC_define.h"
|
||||
#include "gainquant.h"
|
||||
#include "createCB.h"
|
||||
#include "filter.h"
|
||||
#include "constants.h"
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* Search routine for codebook encoding and gain quantization.
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void iCBSearch(
|
||||
iLBC_Enc_Inst_t *iLBCenc_inst,
|
||||
/* (i) the encoder state structure */
|
||||
int *index, /* (o) Codebook indices */
|
||||
int *gain_index,/* (o) Gain quantization indices */
|
||||
float *intarget,/* (i) Target vector for encoding */
|
||||
float *mem, /* (i) Buffer for codebook construction */
|
||||
int lMem, /* (i) Length of buffer */
|
||||
int lTarget, /* (i) Length of vector */
|
||||
int nStages, /* (i) Number of codebook stages */
|
||||
float *weightDenum, /* (i) weighting filter coefficients */
|
||||
float *weightState, /* (i) weighting filter state */
|
||||
int block /* (i) the sub-block number */
|
||||
){
|
||||
int i, j, icount, stage, best_index, range, counter;
|
||||
float max_measure, gain, measure, crossDot, ftmp;
|
||||
float gains[CB_NSTAGES];
|
||||
float target[SUBL];
|
||||
int base_index, sInd, eInd, base_size;
|
||||
int sIndAug=0, eIndAug=0;
|
||||
float buf[CB_MEML+SUBL+2*LPC_FILTERORDER];
|
||||
|
||||
|
||||
float invenergy[CB_EXPAND*128], energy[CB_EXPAND*128];
|
||||
float *pp, *ppi=0, *ppo=0, *ppe=0;
|
||||
float cbvectors[CB_MEML];
|
||||
float tene, cene, cvec[SUBL];
|
||||
float aug_vec[SUBL];
|
||||
|
||||
memset(cvec,0,SUBL*sizeof(float));
|
||||
|
||||
/* Determine size of codebook sections */
|
||||
|
||||
base_size=lMem-lTarget+1;
|
||||
|
||||
if (lTarget==SUBL) {
|
||||
base_size=lMem-lTarget+1+lTarget/2;
|
||||
}
|
||||
|
||||
/* setup buffer for weighting */
|
||||
|
||||
memcpy(buf,weightState,sizeof(float)*LPC_FILTERORDER);
|
||||
memcpy(buf+LPC_FILTERORDER,mem,lMem*sizeof(float));
|
||||
memcpy(buf+LPC_FILTERORDER+lMem,intarget,lTarget*sizeof(float));
|
||||
|
||||
/* weighting */
|
||||
|
||||
AllPoleFilter(buf+LPC_FILTERORDER, weightDenum,
|
||||
lMem+lTarget, LPC_FILTERORDER);
|
||||
|
||||
/* Construct the codebook and target needed */
|
||||
|
||||
memcpy(target, buf+LPC_FILTERORDER+lMem, lTarget*sizeof(float));
|
||||
|
||||
tene=0.0;
|
||||
for (i=0; i<lTarget; i++) {
|
||||
tene+=target[i]*target[i];
|
||||
}
|
||||
|
||||
/* Prepare search over one more codebook section. This section
|
||||
is created by filtering the original buffer with a filter. */
|
||||
|
||||
filteredCBvecs(cbvectors, buf+LPC_FILTERORDER, lMem);
|
||||
|
||||
/* The Main Loop over stages */
|
||||
|
||||
for (stage=0; stage<nStages; stage++) {
|
||||
|
||||
range = search_rangeTbl[block][stage];
|
||||
|
||||
/* initialize search measure */
|
||||
|
||||
max_measure = (float)-10000000.0;
|
||||
gain = (float)0.0;
|
||||
best_index = 0;
|
||||
|
||||
/* Compute cross dot product between the target
|
||||
|
||||
|
||||
and the CB memory */
|
||||
|
||||
crossDot=0.0;
|
||||
pp=buf+LPC_FILTERORDER+lMem-lTarget;
|
||||
for (j=0; j<lTarget; j++) {
|
||||
crossDot += target[j]*(*pp++);
|
||||
}
|
||||
|
||||
if (stage==0) {
|
||||
|
||||
/* Calculate energy in the first block of
|
||||
'lTarget' sampels. */
|
||||
ppe = energy;
|
||||
ppi = buf+LPC_FILTERORDER+lMem-lTarget-1;
|
||||
ppo = buf+LPC_FILTERORDER+lMem-1;
|
||||
|
||||
*ppe=0.0;
|
||||
pp=buf+LPC_FILTERORDER+lMem-lTarget;
|
||||
for (j=0; j<lTarget; j++) {
|
||||
*ppe+=(*pp)*(*pp++);
|
||||
}
|
||||
|
||||
if (*ppe>0.0) {
|
||||
invenergy[0] = (float) 1.0 / (*ppe + EPS);
|
||||
} else {
|
||||
invenergy[0] = (float) 0.0;
|
||||
}
|
||||
ppe++;
|
||||
|
||||
measure=(float)-10000000.0;
|
||||
|
||||
if (crossDot > 0.0) {
|
||||
measure = crossDot*crossDot*invenergy[0];
|
||||
}
|
||||
}
|
||||
else {
|
||||
measure = crossDot*crossDot*invenergy[0];
|
||||
}
|
||||
|
||||
/* check if measure is better */
|
||||
ftmp = crossDot*invenergy[0];
|
||||
|
||||
if ((measure>max_measure) && (fabs(ftmp)<CB_MAXGAIN)) {
|
||||
best_index = 0;
|
||||
max_measure = measure;
|
||||
gain = ftmp;
|
||||
}
|
||||
|
||||
/* loop over the main first codebook section,
|
||||
full search */
|
||||
|
||||
for (icount=1; icount<range; icount++) {
|
||||
|
||||
/* calculate measure */
|
||||
|
||||
|
||||
|
||||
crossDot=0.0;
|
||||
pp = buf+LPC_FILTERORDER+lMem-lTarget-icount;
|
||||
|
||||
for (j=0; j<lTarget; j++) {
|
||||
crossDot += target[j]*(*pp++);
|
||||
}
|
||||
|
||||
if (stage==0) {
|
||||
*ppe++ = energy[icount-1] + (*ppi)*(*ppi) -
|
||||
(*ppo)*(*ppo);
|
||||
ppo--;
|
||||
ppi--;
|
||||
|
||||
if (energy[icount]>0.0) {
|
||||
invenergy[icount] =
|
||||
(float)1.0/(energy[icount]+EPS);
|
||||
} else {
|
||||
invenergy[icount] = (float) 0.0;
|
||||
}
|
||||
|
||||
measure=(float)-10000000.0;
|
||||
|
||||
if (crossDot > 0.0) {
|
||||
measure = crossDot*crossDot*invenergy[icount];
|
||||
}
|
||||
}
|
||||
else {
|
||||
measure = crossDot*crossDot*invenergy[icount];
|
||||
}
|
||||
|
||||
/* check if measure is better */
|
||||
ftmp = crossDot*invenergy[icount];
|
||||
|
||||
if ((measure>max_measure) && (fabs(ftmp)<CB_MAXGAIN)) {
|
||||
best_index = icount;
|
||||
max_measure = measure;
|
||||
gain = ftmp;
|
||||
}
|
||||
}
|
||||
|
||||
/* Loop over augmented part in the first codebook
|
||||
* section, full search.
|
||||
* The vectors are interpolated.
|
||||
*/
|
||||
|
||||
if (lTarget==SUBL) {
|
||||
|
||||
/* Search for best possible cb vector and
|
||||
compute the CB-vectors' energy. */
|
||||
searchAugmentedCB(20, 39, stage, base_size-lTarget/2,
|
||||
target, buf+LPC_FILTERORDER+lMem,
|
||||
&max_measure, &best_index, &gain, energy,
|
||||
invenergy);
|
||||
|
||||
|
||||
}
|
||||
|
||||
/* set search range for following codebook sections */
|
||||
|
||||
base_index=best_index;
|
||||
|
||||
/* unrestricted search */
|
||||
|
||||
if (CB_RESRANGE == -1) {
|
||||
sInd=0;
|
||||
eInd=range-1;
|
||||
sIndAug=20;
|
||||
eIndAug=39;
|
||||
}
|
||||
|
||||
/* restriced search around best index from first
|
||||
codebook section */
|
||||
|
||||
else {
|
||||
/* Initialize search indices */
|
||||
sIndAug=0;
|
||||
eIndAug=0;
|
||||
sInd=base_index-CB_RESRANGE/2;
|
||||
eInd=sInd+CB_RESRANGE;
|
||||
|
||||
if (lTarget==SUBL) {
|
||||
|
||||
if (sInd<0) {
|
||||
|
||||
sIndAug = 40 + sInd;
|
||||
eIndAug = 39;
|
||||
sInd=0;
|
||||
|
||||
} else if ( base_index < (base_size-20) ) {
|
||||
|
||||
if (eInd > range) {
|
||||
sInd -= (eInd-range);
|
||||
eInd = range;
|
||||
}
|
||||
} else { /* base_index >= (base_size-20) */
|
||||
|
||||
if (sInd < (base_size-20)) {
|
||||
sIndAug = 20;
|
||||
sInd = 0;
|
||||
eInd = 0;
|
||||
eIndAug = 19 + CB_RESRANGE;
|
||||
|
||||
if(eIndAug > 39) {
|
||||
eInd = eIndAug-39;
|
||||
eIndAug = 39;
|
||||
}
|
||||
} else {
|
||||
sIndAug = 20 + sInd - (base_size-20);
|
||||
eIndAug = 39;
|
||||
|
||||
|
||||
sInd = 0;
|
||||
eInd = CB_RESRANGE - (eIndAug-sIndAug+1);
|
||||
}
|
||||
}
|
||||
|
||||
} else { /* lTarget = 22 or 23 */
|
||||
|
||||
if (sInd < 0) {
|
||||
eInd -= sInd;
|
||||
sInd = 0;
|
||||
}
|
||||
|
||||
if(eInd > range) {
|
||||
sInd -= (eInd - range);
|
||||
eInd = range;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* search of higher codebook section */
|
||||
|
||||
/* index search range */
|
||||
counter = sInd;
|
||||
sInd += base_size;
|
||||
eInd += base_size;
|
||||
|
||||
|
||||
if (stage==0) {
|
||||
ppe = energy+base_size;
|
||||
*ppe=0.0;
|
||||
|
||||
pp=cbvectors+lMem-lTarget;
|
||||
for (j=0; j<lTarget; j++) {
|
||||
*ppe+=(*pp)*(*pp++);
|
||||
}
|
||||
|
||||
ppi = cbvectors + lMem - 1 - lTarget;
|
||||
ppo = cbvectors + lMem - 1;
|
||||
|
||||
for (j=0; j<(range-1); j++) {
|
||||
*(ppe+1) = *ppe + (*ppi)*(*ppi) - (*ppo)*(*ppo);
|
||||
ppo--;
|
||||
ppi--;
|
||||
ppe++;
|
||||
}
|
||||
}
|
||||
|
||||
/* loop over search range */
|
||||
|
||||
for (icount=sInd; icount<eInd; icount++) {
|
||||
|
||||
/* calculate measure */
|
||||
|
||||
crossDot=0.0;
|
||||
|
||||
|
||||
pp=cbvectors + lMem - (counter++) - lTarget;
|
||||
|
||||
for (j=0;j<lTarget;j++) {
|
||||
crossDot += target[j]*(*pp++);
|
||||
}
|
||||
|
||||
if (energy[icount]>0.0) {
|
||||
invenergy[icount] =(float)1.0/(energy[icount]+EPS);
|
||||
} else {
|
||||
invenergy[icount] =(float)0.0;
|
||||
}
|
||||
|
||||
if (stage==0) {
|
||||
|
||||
measure=(float)-10000000.0;
|
||||
|
||||
if (crossDot > 0.0) {
|
||||
measure = crossDot*crossDot*
|
||||
invenergy[icount];
|
||||
}
|
||||
}
|
||||
else {
|
||||
measure = crossDot*crossDot*invenergy[icount];
|
||||
}
|
||||
|
||||
/* check if measure is better */
|
||||
ftmp = crossDot*invenergy[icount];
|
||||
|
||||
if ((measure>max_measure) && (fabs(ftmp)<CB_MAXGAIN)) {
|
||||
best_index = icount;
|
||||
max_measure = measure;
|
||||
gain = ftmp;
|
||||
}
|
||||
}
|
||||
|
||||
/* Search the augmented CB inside the limited range. */
|
||||
|
||||
if ((lTarget==SUBL)&&(sIndAug!=0)) {
|
||||
searchAugmentedCB(sIndAug, eIndAug, stage,
|
||||
2*base_size-20, target, cbvectors+lMem,
|
||||
&max_measure, &best_index, &gain, energy,
|
||||
invenergy);
|
||||
}
|
||||
|
||||
/* record best index */
|
||||
|
||||
index[stage] = best_index;
|
||||
|
||||
/* gain quantization */
|
||||
|
||||
if (stage==0){
|
||||
|
||||
if (gain<0.0){
|
||||
gain = 0.0;
|
||||
|
||||
|
||||
}
|
||||
|
||||
if (gain>CB_MAXGAIN) {
|
||||
gain = (float)CB_MAXGAIN;
|
||||
}
|
||||
gain = gainquant(gain, 1.0, 32, &gain_index[stage]);
|
||||
}
|
||||
else {
|
||||
if (stage==1) {
|
||||
gain = gainquant(gain, (float)fabs(gains[stage-1]),
|
||||
16, &gain_index[stage]);
|
||||
} else {
|
||||
gain = gainquant(gain, (float)fabs(gains[stage-1]),
|
||||
8, &gain_index[stage]);
|
||||
}
|
||||
}
|
||||
|
||||
/* Extract the best (according to measure)
|
||||
codebook vector */
|
||||
|
||||
if (lTarget==(STATE_LEN-iLBCenc_inst->state_short_len)) {
|
||||
|
||||
if (index[stage]<base_size) {
|
||||
pp=buf+LPC_FILTERORDER+lMem-lTarget-index[stage];
|
||||
} else {
|
||||
pp=cbvectors+lMem-lTarget-
|
||||
index[stage]+base_size;
|
||||
}
|
||||
} else {
|
||||
|
||||
if (index[stage]<base_size) {
|
||||
if (index[stage]<(base_size-20)) {
|
||||
pp=buf+LPC_FILTERORDER+lMem-
|
||||
lTarget-index[stage];
|
||||
} else {
|
||||
createAugmentedVec(index[stage]-base_size+40,
|
||||
buf+LPC_FILTERORDER+lMem,aug_vec);
|
||||
pp=aug_vec;
|
||||
}
|
||||
} else {
|
||||
int filterno, position;
|
||||
|
||||
filterno=index[stage]/base_size;
|
||||
position=index[stage]-filterno*base_size;
|
||||
|
||||
|
||||
if (position<(base_size-20)) {
|
||||
pp=cbvectors+filterno*lMem-lTarget-
|
||||
index[stage]+filterno*base_size;
|
||||
} else {
|
||||
createAugmentedVec(
|
||||
index[stage]-(filterno+1)*base_size+40,
|
||||
cbvectors+filterno*lMem,aug_vec);
|
||||
pp=aug_vec;
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Subtract the best codebook vector, according
|
||||
to measure, from the target vector */
|
||||
|
||||
for (j=0;j<lTarget;j++) {
|
||||
cvec[j] += gain*(*pp);
|
||||
target[j] -= gain*(*pp++);
|
||||
}
|
||||
|
||||
/* record quantized gain */
|
||||
|
||||
gains[stage]=gain;
|
||||
|
||||
}/* end of Main Loop. for (stage=0;... */
|
||||
|
||||
/* Gain adjustment for energy matching */
|
||||
cene=0.0;
|
||||
for (i=0; i<lTarget; i++) {
|
||||
cene+=cvec[i]*cvec[i];
|
||||
}
|
||||
j=gain_index[0];
|
||||
|
||||
for (i=gain_index[0]; i<32; i++) {
|
||||
ftmp=cene*gain_sq5Tbl[i]*gain_sq5Tbl[i];
|
||||
|
||||
if ((ftmp<(tene*gains[0]*gains[0])) &&
|
||||
(gain_sq5Tbl[j]<(2.0*gains[0]))) {
|
||||
j=i;
|
||||
}
|
||||
}
|
||||
gain_index[0]=j;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,35 +1,35 @@
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
iCBSearch.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifndef __iLBC_ICBSEARCH_H
|
||||
#define __iLBC_ICBSEARCH_H
|
||||
|
||||
void iCBSearch(
|
||||
iLBC_Enc_Inst_t *iLBCenc_inst,
|
||||
/* (i) the encoder state structure */
|
||||
int *index, /* (o) Codebook indices */
|
||||
int *gain_index,/* (o) Gain quantization indices */
|
||||
float *intarget,/* (i) Target vector for encoding */
|
||||
float *mem, /* (i) Buffer for codebook construction */
|
||||
int lMem, /* (i) Length of buffer */
|
||||
int lTarget, /* (i) Length of vector */
|
||||
int nStages, /* (i) Number of codebook stages */
|
||||
float *weightDenum, /* (i) weighting filter coefficients */
|
||||
|
||||
|
||||
float *weightState, /* (i) weighting filter state */
|
||||
int block /* (i) the sub-block number */
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
iCBSearch.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifndef __iLBC_ICBSEARCH_H
|
||||
#define __iLBC_ICBSEARCH_H
|
||||
|
||||
void iCBSearch(
|
||||
iLBC_Enc_Inst_t *iLBCenc_inst,
|
||||
/* (i) the encoder state structure */
|
||||
int *index, /* (o) Codebook indices */
|
||||
int *gain_index,/* (o) Gain quantization indices */
|
||||
float *intarget,/* (i) Target vector for encoding */
|
||||
float *mem, /* (i) Buffer for codebook construction */
|
||||
int lMem, /* (i) Length of buffer */
|
||||
int lTarget, /* (i) Length of vector */
|
||||
int nStages, /* (i) Number of codebook stages */
|
||||
float *weightDenum, /* (i) weighting filter coefficients */
|
||||
|
||||
|
||||
float *weightState, /* (i) weighting filter state */
|
||||
int block /* (i) the sub-block number */
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
+618
-618
File diff suppressed because it is too large
Load Diff
@@ -1,30 +1,30 @@
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
iLBC_decode.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifndef __iLBC_ILBCDECODE_H
|
||||
#define __iLBC_ILBCDECODE_H
|
||||
|
||||
#include "iLBC_define.h"
|
||||
|
||||
short initDecode( /* (o) Number of decoded samples */
|
||||
iLBC_Dec_Inst_t *iLBCdec_inst, /* (i/o) Decoder instance */
|
||||
int mode, /* (i) frame size mode */
|
||||
int use_enhancer /* (i) 1 to use enhancer 0 to run without enhancer */
|
||||
);
|
||||
|
||||
void iLBC_decode(
|
||||
float *decblock, /* (o) decoded signal block */
|
||||
unsigned char *bytes, /* (i) encoded signal bits */
|
||||
iLBC_Dec_Inst_t *iLBCdec_inst, /* (i/o) the decoder state structure */
|
||||
int mode /* (i) 0: bad packet, PLC, 1: normal */
|
||||
);
|
||||
|
||||
#endif
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
iLBC_decode.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifndef __iLBC_ILBCDECODE_H
|
||||
#define __iLBC_ILBCDECODE_H
|
||||
|
||||
#include "iLBC_define.h"
|
||||
|
||||
short initDecode( /* (o) Number of decoded samples */
|
||||
iLBC_Dec_Inst_t *iLBCdec_inst, /* (i/o) Decoder instance */
|
||||
int mode, /* (i) frame size mode */
|
||||
int use_enhancer /* (i) 1 to use enhancer 0 to run without enhancer */
|
||||
);
|
||||
|
||||
void iLBC_decode(
|
||||
float *decblock, /* (o) decoded signal block */
|
||||
unsigned char *bytes, /* (i) encoded signal bits */
|
||||
iLBC_Dec_Inst_t *iLBCdec_inst, /* (i/o) the decoder state structure */
|
||||
int mode /* (i) 0: bad packet, PLC, 1: normal */
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
+204
-204
@@ -1,204 +1,204 @@
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
iLBC_define.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
#include <string.h>
|
||||
|
||||
#ifndef __iLBC_ILBCDEFINE_H
|
||||
#define __iLBC_ILBCDEFINE_H
|
||||
|
||||
/* general codec settings */
|
||||
|
||||
#define FS (float)8000.0
|
||||
#define BLOCKL_20MS 160
|
||||
#define BLOCKL_30MS 240
|
||||
#define BLOCKL_MAX 240
|
||||
#define NSUB_20MS 4
|
||||
#define NSUB_30MS 6
|
||||
#define NSUB_MAX 6
|
||||
#define NASUB_20MS 2
|
||||
#define NASUB_30MS 4
|
||||
#define NASUB_MAX 4
|
||||
#define SUBL 40
|
||||
#define STATE_LEN 80
|
||||
#define STATE_SHORT_LEN_30MS 58
|
||||
#define STATE_SHORT_LEN_20MS 57
|
||||
|
||||
/* LPC settings */
|
||||
|
||||
#define LPC_FILTERORDER 10
|
||||
#define LPC_CHIRP_SYNTDENUM (float)0.9025
|
||||
#define LPC_CHIRP_WEIGHTDENUM (float)0.4222
|
||||
#define LPC_LOOKBACK 60
|
||||
#define LPC_N_20MS 1
|
||||
#define LPC_N_30MS 2
|
||||
#define LPC_N_MAX 2
|
||||
#define LPC_ASYMDIFF 20
|
||||
#define LPC_BW (float)60.0
|
||||
#define LPC_WN (float)1.0001
|
||||
#define LSF_NSPLIT 3
|
||||
|
||||
|
||||
#define LSF_NUMBER_OF_STEPS 4
|
||||
#define LPC_HALFORDER (LPC_FILTERORDER/2)
|
||||
|
||||
/* cb settings */
|
||||
|
||||
#define CB_NSTAGES 3
|
||||
#define CB_EXPAND 2
|
||||
#define CB_MEML 147
|
||||
#define CB_FILTERLEN 2*4
|
||||
#define CB_HALFFILTERLEN 4
|
||||
#define CB_RESRANGE 34
|
||||
#define CB_MAXGAIN (float)1.3
|
||||
|
||||
/* enhancer */
|
||||
|
||||
#define ENH_BLOCKL 80 /* block length */
|
||||
#define ENH_BLOCKL_HALF (ENH_BLOCKL/2)
|
||||
#define ENH_HL 3 /* 2*ENH_HL+1 is number blocks
|
||||
in said second sequence */
|
||||
#define ENH_SLOP 2 /* max difference estimated and
|
||||
correct pitch period */
|
||||
#define ENH_PLOCSL 20 /* pitch-estimates and pitch-
|
||||
locations buffer length */
|
||||
#define ENH_OVERHANG 2
|
||||
#define ENH_UPS0 4 /* upsampling rate */
|
||||
#define ENH_FL0 3 /* 2*FLO+1 is the length of
|
||||
each filter */
|
||||
#define ENH_VECTL (ENH_BLOCKL+2*ENH_FL0)
|
||||
#define ENH_CORRDIM (2*ENH_SLOP+1)
|
||||
#define ENH_NBLOCKS (BLOCKL_MAX/ENH_BLOCKL)
|
||||
#define ENH_NBLOCKS_EXTRA 5
|
||||
#define ENH_NBLOCKS_TOT 8 /* ENH_NBLOCKS +
|
||||
ENH_NBLOCKS_EXTRA */
|
||||
#define ENH_BUFL (ENH_NBLOCKS_TOT)*ENH_BLOCKL
|
||||
#define ENH_ALPHA0 (float)0.05
|
||||
|
||||
/* Down sampling */
|
||||
|
||||
#define FILTERORDER_DS 7
|
||||
#define DELAY_DS 3
|
||||
#define FACTOR_DS 2
|
||||
|
||||
/* bit stream defs */
|
||||
|
||||
#define NO_OF_BYTES_20MS 38
|
||||
#define NO_OF_BYTES_30MS 50
|
||||
#define NO_OF_WORDS_20MS 19
|
||||
#define NO_OF_WORDS_30MS 25
|
||||
#define STATE_BITS 3
|
||||
#define BYTE_LEN 8
|
||||
#define ULP_CLASSES 3
|
||||
|
||||
/* help parameters */
|
||||
|
||||
|
||||
|
||||
#define FLOAT_MAX (float)1.0e37
|
||||
#define EPS (float)2.220446049250313e-016
|
||||
#define PI (float)3.14159265358979323846
|
||||
#define MIN_SAMPLE -32768
|
||||
#define MAX_SAMPLE 32767
|
||||
#define TWO_PI (float)6.283185307
|
||||
#define PI2 (float)0.159154943
|
||||
|
||||
/* type definition encoder instance */
|
||||
typedef struct iLBC_ULP_Inst_t_ {
|
||||
int lsf_bits[6][ULP_CLASSES+2];
|
||||
int start_bits[ULP_CLASSES+2];
|
||||
int startfirst_bits[ULP_CLASSES+2];
|
||||
int scale_bits[ULP_CLASSES+2];
|
||||
int state_bits[ULP_CLASSES+2];
|
||||
int extra_cb_index[CB_NSTAGES][ULP_CLASSES+2];
|
||||
int extra_cb_gain[CB_NSTAGES][ULP_CLASSES+2];
|
||||
int cb_index[NSUB_MAX][CB_NSTAGES][ULP_CLASSES+2];
|
||||
int cb_gain[NSUB_MAX][CB_NSTAGES][ULP_CLASSES+2];
|
||||
} iLBC_ULP_Inst_t;
|
||||
|
||||
/* type definition encoder instance */
|
||||
typedef struct iLBC_Enc_Inst_t_ {
|
||||
|
||||
/* flag for frame size mode */
|
||||
int mode;
|
||||
|
||||
/* basic parameters for different frame sizes */
|
||||
int blockl;
|
||||
int nsub;
|
||||
int nasub;
|
||||
int no_of_bytes, no_of_words;
|
||||
int lpc_n;
|
||||
int state_short_len;
|
||||
const iLBC_ULP_Inst_t *ULP_inst;
|
||||
|
||||
/* analysis filter state */
|
||||
float anaMem[LPC_FILTERORDER];
|
||||
|
||||
/* old lsf parameters for interpolation */
|
||||
float lsfold[LPC_FILTERORDER];
|
||||
float lsfdeqold[LPC_FILTERORDER];
|
||||
|
||||
/* signal buffer for LP analysis */
|
||||
float lpc_buffer[LPC_LOOKBACK + BLOCKL_MAX];
|
||||
|
||||
/* state of input HP filter */
|
||||
float hpimem[4];
|
||||
|
||||
} iLBC_Enc_Inst_t;
|
||||
|
||||
/* type definition decoder instance */
|
||||
typedef struct iLBC_Dec_Inst_t_ {
|
||||
|
||||
|
||||
|
||||
/* flag for frame size mode */
|
||||
int mode;
|
||||
|
||||
/* basic parameters for different frame sizes */
|
||||
int blockl;
|
||||
int nsub;
|
||||
int nasub;
|
||||
int no_of_bytes, no_of_words;
|
||||
int lpc_n;
|
||||
int state_short_len;
|
||||
const iLBC_ULP_Inst_t *ULP_inst;
|
||||
|
||||
/* synthesis filter state */
|
||||
float syntMem[LPC_FILTERORDER];
|
||||
|
||||
/* old LSF for interpolation */
|
||||
float lsfdeqold[LPC_FILTERORDER];
|
||||
|
||||
/* pitch lag estimated in enhancer and used in PLC */
|
||||
int last_lag;
|
||||
|
||||
/* PLC state information */
|
||||
int prevLag, consPLICount, prevPLI, prev_enh_pl;
|
||||
float prevLpc[LPC_FILTERORDER+1];
|
||||
float prevResidual[NSUB_MAX*SUBL];
|
||||
float per;
|
||||
unsigned long seed;
|
||||
|
||||
/* previous synthesis filter parameters */
|
||||
float old_syntdenum[(LPC_FILTERORDER + 1)*NSUB_MAX];
|
||||
|
||||
/* state of output HP filter */
|
||||
float hpomem[4];
|
||||
|
||||
/* enhancer state information */
|
||||
int use_enhancer;
|
||||
float enh_buf[ENH_BUFL];
|
||||
float enh_period[ENH_NBLOCKS_TOT];
|
||||
|
||||
} iLBC_Dec_Inst_t;
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
iLBC_define.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
#include <string.h>
|
||||
|
||||
#ifndef __iLBC_ILBCDEFINE_H
|
||||
#define __iLBC_ILBCDEFINE_H
|
||||
|
||||
/* general codec settings */
|
||||
|
||||
#define FS (float)8000.0
|
||||
#define BLOCKL_20MS 160
|
||||
#define BLOCKL_30MS 240
|
||||
#define BLOCKL_MAX 240
|
||||
#define NSUB_20MS 4
|
||||
#define NSUB_30MS 6
|
||||
#define NSUB_MAX 6
|
||||
#define NASUB_20MS 2
|
||||
#define NASUB_30MS 4
|
||||
#define NASUB_MAX 4
|
||||
#define SUBL 40
|
||||
#define STATE_LEN 80
|
||||
#define STATE_SHORT_LEN_30MS 58
|
||||
#define STATE_SHORT_LEN_20MS 57
|
||||
|
||||
/* LPC settings */
|
||||
|
||||
#define LPC_FILTERORDER 10
|
||||
#define LPC_CHIRP_SYNTDENUM (float)0.9025
|
||||
#define LPC_CHIRP_WEIGHTDENUM (float)0.4222
|
||||
#define LPC_LOOKBACK 60
|
||||
#define LPC_N_20MS 1
|
||||
#define LPC_N_30MS 2
|
||||
#define LPC_N_MAX 2
|
||||
#define LPC_ASYMDIFF 20
|
||||
#define LPC_BW (float)60.0
|
||||
#define LPC_WN (float)1.0001
|
||||
#define LSF_NSPLIT 3
|
||||
|
||||
|
||||
#define LSF_NUMBER_OF_STEPS 4
|
||||
#define LPC_HALFORDER (LPC_FILTERORDER/2)
|
||||
|
||||
/* cb settings */
|
||||
|
||||
#define CB_NSTAGES 3
|
||||
#define CB_EXPAND 2
|
||||
#define CB_MEML 147
|
||||
#define CB_FILTERLEN 2*4
|
||||
#define CB_HALFFILTERLEN 4
|
||||
#define CB_RESRANGE 34
|
||||
#define CB_MAXGAIN (float)1.3
|
||||
|
||||
/* enhancer */
|
||||
|
||||
#define ENH_BLOCKL 80 /* block length */
|
||||
#define ENH_BLOCKL_HALF (ENH_BLOCKL/2)
|
||||
#define ENH_HL 3 /* 2*ENH_HL+1 is number blocks
|
||||
in said second sequence */
|
||||
#define ENH_SLOP 2 /* max difference estimated and
|
||||
correct pitch period */
|
||||
#define ENH_PLOCSL 20 /* pitch-estimates and pitch-
|
||||
locations buffer length */
|
||||
#define ENH_OVERHANG 2
|
||||
#define ENH_UPS0 4 /* upsampling rate */
|
||||
#define ENH_FL0 3 /* 2*FLO+1 is the length of
|
||||
each filter */
|
||||
#define ENH_VECTL (ENH_BLOCKL+2*ENH_FL0)
|
||||
#define ENH_CORRDIM (2*ENH_SLOP+1)
|
||||
#define ENH_NBLOCKS (BLOCKL_MAX/ENH_BLOCKL)
|
||||
#define ENH_NBLOCKS_EXTRA 5
|
||||
#define ENH_NBLOCKS_TOT 8 /* ENH_NBLOCKS +
|
||||
ENH_NBLOCKS_EXTRA */
|
||||
#define ENH_BUFL (ENH_NBLOCKS_TOT)*ENH_BLOCKL
|
||||
#define ENH_ALPHA0 (float)0.05
|
||||
|
||||
/* Down sampling */
|
||||
|
||||
#define FILTERORDER_DS 7
|
||||
#define DELAY_DS 3
|
||||
#define FACTOR_DS 2
|
||||
|
||||
/* bit stream defs */
|
||||
|
||||
#define NO_OF_BYTES_20MS 38
|
||||
#define NO_OF_BYTES_30MS 50
|
||||
#define NO_OF_WORDS_20MS 19
|
||||
#define NO_OF_WORDS_30MS 25
|
||||
#define STATE_BITS 3
|
||||
#define BYTE_LEN 8
|
||||
#define ULP_CLASSES 3
|
||||
|
||||
/* help parameters */
|
||||
|
||||
|
||||
|
||||
#define FLOAT_MAX (float)1.0e37
|
||||
#define EPS (float)2.220446049250313e-016
|
||||
#define PI (float)3.14159265358979323846
|
||||
#define MIN_SAMPLE -32768
|
||||
#define MAX_SAMPLE 32767
|
||||
#define TWO_PI (float)6.283185307
|
||||
#define PI2 (float)0.159154943
|
||||
|
||||
/* type definition encoder instance */
|
||||
typedef struct iLBC_ULP_Inst_t_ {
|
||||
int lsf_bits[6][ULP_CLASSES+2];
|
||||
int start_bits[ULP_CLASSES+2];
|
||||
int startfirst_bits[ULP_CLASSES+2];
|
||||
int scale_bits[ULP_CLASSES+2];
|
||||
int state_bits[ULP_CLASSES+2];
|
||||
int extra_cb_index[CB_NSTAGES][ULP_CLASSES+2];
|
||||
int extra_cb_gain[CB_NSTAGES][ULP_CLASSES+2];
|
||||
int cb_index[NSUB_MAX][CB_NSTAGES][ULP_CLASSES+2];
|
||||
int cb_gain[NSUB_MAX][CB_NSTAGES][ULP_CLASSES+2];
|
||||
} iLBC_ULP_Inst_t;
|
||||
|
||||
/* type definition encoder instance */
|
||||
typedef struct iLBC_Enc_Inst_t_ {
|
||||
|
||||
/* flag for frame size mode */
|
||||
int mode;
|
||||
|
||||
/* basic parameters for different frame sizes */
|
||||
int blockl;
|
||||
int nsub;
|
||||
int nasub;
|
||||
int no_of_bytes, no_of_words;
|
||||
int lpc_n;
|
||||
int state_short_len;
|
||||
const iLBC_ULP_Inst_t *ULP_inst;
|
||||
|
||||
/* analysis filter state */
|
||||
float anaMem[LPC_FILTERORDER];
|
||||
|
||||
/* old lsf parameters for interpolation */
|
||||
float lsfold[LPC_FILTERORDER];
|
||||
float lsfdeqold[LPC_FILTERORDER];
|
||||
|
||||
/* signal buffer for LP analysis */
|
||||
float lpc_buffer[LPC_LOOKBACK + BLOCKL_MAX];
|
||||
|
||||
/* state of input HP filter */
|
||||
float hpimem[4];
|
||||
|
||||
} iLBC_Enc_Inst_t;
|
||||
|
||||
/* type definition decoder instance */
|
||||
typedef struct iLBC_Dec_Inst_t_ {
|
||||
|
||||
|
||||
|
||||
/* flag for frame size mode */
|
||||
int mode;
|
||||
|
||||
/* basic parameters for different frame sizes */
|
||||
int blockl;
|
||||
int nsub;
|
||||
int nasub;
|
||||
int no_of_bytes, no_of_words;
|
||||
int lpc_n;
|
||||
int state_short_len;
|
||||
const iLBC_ULP_Inst_t *ULP_inst;
|
||||
|
||||
/* synthesis filter state */
|
||||
float syntMem[LPC_FILTERORDER];
|
||||
|
||||
/* old LSF for interpolation */
|
||||
float lsfdeqold[LPC_FILTERORDER];
|
||||
|
||||
/* pitch lag estimated in enhancer and used in PLC */
|
||||
int last_lag;
|
||||
|
||||
/* PLC state information */
|
||||
int prevLag, consPLICount, prevPLI, prev_enh_pl;
|
||||
float prevLpc[LPC_FILTERORDER+1];
|
||||
float prevResidual[NSUB_MAX*SUBL];
|
||||
float per;
|
||||
unsigned long seed;
|
||||
|
||||
/* previous synthesis filter parameters */
|
||||
float old_syntdenum[(LPC_FILTERORDER + 1)*NSUB_MAX];
|
||||
|
||||
/* state of output HP filter */
|
||||
float hpomem[4];
|
||||
|
||||
/* enhancer state information */
|
||||
int use_enhancer;
|
||||
float enh_buf[ENH_BUFL];
|
||||
float enh_period[ENH_NBLOCKS_TOT];
|
||||
|
||||
} iLBC_Dec_Inst_t;
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
+513
-513
File diff suppressed because it is too large
Load Diff
@@ -1,32 +1,32 @@
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
iLBC_encode.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifndef __iLBC_ILBCENCODE_H
|
||||
#define __iLBC_ILBCENCODE_H
|
||||
|
||||
#include "iLBC_define.h"
|
||||
|
||||
short initEncode( /* (o) Number of bytes encoded */
|
||||
iLBC_Enc_Inst_t *iLBCenc_inst, /* (i/o) Encoder instance */
|
||||
int mode /* (i) frame size mode */
|
||||
);
|
||||
|
||||
void iLBC_encode(
|
||||
unsigned char *bytes, /* (o) encoded data bits iLBC */
|
||||
float *block, /* (o) speech vector to encode */
|
||||
iLBC_Enc_Inst_t *iLBCenc_inst /* (i/o) the general encoder state */
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
iLBC_encode.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifndef __iLBC_ILBCENCODE_H
|
||||
#define __iLBC_ILBCENCODE_H
|
||||
|
||||
#include "iLBC_define.h"
|
||||
|
||||
short initEncode( /* (o) Number of bytes encoded */
|
||||
iLBC_Enc_Inst_t *iLBCenc_inst, /* (i/o) Encoder instance */
|
||||
int mode /* (i) frame size mode */
|
||||
);
|
||||
|
||||
void iLBC_encode(
|
||||
unsigned char *bytes, /* (o) encoded data bits iLBC */
|
||||
float *block, /* (o) speech vector to encode */
|
||||
iLBC_Enc_Inst_t *iLBCenc_inst /* (i/o) the general encoder state */
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
+263
-263
@@ -1,263 +1,263 @@
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
lsf.c
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
|
||||
#include "iLBC_define.h"
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* conversion from lpc coefficients to lsf coefficients
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void a2lsf(
|
||||
float *freq,/* (o) lsf coefficients */
|
||||
float *a /* (i) lpc coefficients */
|
||||
){
|
||||
float steps[LSF_NUMBER_OF_STEPS] =
|
||||
{(float)0.00635, (float)0.003175, (float)0.0015875,
|
||||
(float)0.00079375};
|
||||
float step;
|
||||
int step_idx;
|
||||
int lsp_index;
|
||||
float p[LPC_HALFORDER];
|
||||
float q[LPC_HALFORDER];
|
||||
float p_pre[LPC_HALFORDER];
|
||||
|
||||
|
||||
float q_pre[LPC_HALFORDER];
|
||||
float old_p, old_q, *old;
|
||||
float *pq_coef;
|
||||
float omega, old_omega;
|
||||
int i;
|
||||
float hlp, hlp1, hlp2, hlp3, hlp4, hlp5;
|
||||
|
||||
for (i=0; i<LPC_HALFORDER; i++) {
|
||||
p[i] = (float)-1.0 * (a[i + 1] + a[LPC_FILTERORDER - i]);
|
||||
q[i] = a[LPC_FILTERORDER - i] - a[i + 1];
|
||||
}
|
||||
|
||||
p_pre[0] = (float)-1.0 - p[0];
|
||||
p_pre[1] = - p_pre[0] - p[1];
|
||||
p_pre[2] = - p_pre[1] - p[2];
|
||||
p_pre[3] = - p_pre[2] - p[3];
|
||||
p_pre[4] = - p_pre[3] - p[4];
|
||||
p_pre[4] = p_pre[4] / 2;
|
||||
|
||||
q_pre[0] = (float)1.0 - q[0];
|
||||
q_pre[1] = q_pre[0] - q[1];
|
||||
q_pre[2] = q_pre[1] - q[2];
|
||||
q_pre[3] = q_pre[2] - q[3];
|
||||
q_pre[4] = q_pre[3] - q[4];
|
||||
q_pre[4] = q_pre[4] / 2;
|
||||
|
||||
omega = 0.0;
|
||||
old_omega = 0.0;
|
||||
|
||||
old_p = FLOAT_MAX;
|
||||
old_q = FLOAT_MAX;
|
||||
|
||||
/* Here we loop through lsp_index to find all the
|
||||
LPC_FILTERORDER roots for omega. */
|
||||
|
||||
for (lsp_index = 0; lsp_index<LPC_FILTERORDER; lsp_index++) {
|
||||
|
||||
/* Depending on lsp_index being even or odd, we
|
||||
alternatively solve the roots for the two LSP equations. */
|
||||
|
||||
|
||||
if ((lsp_index & 0x1) == 0) {
|
||||
pq_coef = p_pre;
|
||||
old = &old_p;
|
||||
} else {
|
||||
pq_coef = q_pre;
|
||||
old = &old_q;
|
||||
}
|
||||
|
||||
/* Start with low resolution grid */
|
||||
|
||||
for (step_idx = 0, step = steps[step_idx];
|
||||
step_idx < LSF_NUMBER_OF_STEPS;){
|
||||
|
||||
|
||||
|
||||
/* cos(10piw) + pq(0)cos(8piw) + pq(1)cos(6piw) +
|
||||
pq(2)cos(4piw) + pq(3)cod(2piw) + pq(4) */
|
||||
|
||||
hlp = (float)cos(omega * TWO_PI);
|
||||
hlp1 = (float)2.0 * hlp + pq_coef[0];
|
||||
hlp2 = (float)2.0 * hlp * hlp1 - (float)1.0 +
|
||||
pq_coef[1];
|
||||
hlp3 = (float)2.0 * hlp * hlp2 - hlp1 + pq_coef[2];
|
||||
hlp4 = (float)2.0 * hlp * hlp3 - hlp2 + pq_coef[3];
|
||||
hlp5 = hlp * hlp4 - hlp3 + pq_coef[4];
|
||||
|
||||
|
||||
if (((hlp5 * (*old)) <= 0.0) || (omega >= 0.5)){
|
||||
|
||||
if (step_idx == (LSF_NUMBER_OF_STEPS - 1)){
|
||||
|
||||
if (fabs(hlp5) >= fabs(*old)) {
|
||||
freq[lsp_index] = omega - step;
|
||||
} else {
|
||||
freq[lsp_index] = omega;
|
||||
}
|
||||
|
||||
|
||||
if ((*old) >= 0.0){
|
||||
*old = (float)-1.0 * FLOAT_MAX;
|
||||
} else {
|
||||
*old = FLOAT_MAX;
|
||||
}
|
||||
|
||||
omega = old_omega;
|
||||
step_idx = 0;
|
||||
|
||||
step_idx = LSF_NUMBER_OF_STEPS;
|
||||
} else {
|
||||
|
||||
if (step_idx == 0) {
|
||||
old_omega = omega;
|
||||
}
|
||||
|
||||
step_idx++;
|
||||
omega -= steps[step_idx];
|
||||
|
||||
/* Go back one grid step */
|
||||
|
||||
step = steps[step_idx];
|
||||
}
|
||||
} else {
|
||||
|
||||
/* increment omega until they are of different sign,
|
||||
and we know there is at least one root between omega
|
||||
and old_omega */
|
||||
*old = hlp5;
|
||||
omega += step;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i<LPC_FILTERORDER; i++) {
|
||||
freq[i] = freq[i] * TWO_PI;
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* conversion from lsf coefficients to lpc coefficients
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void lsf2a(
|
||||
float *a_coef, /* (o) lpc coefficients */
|
||||
float *freq /* (i) lsf coefficients */
|
||||
){
|
||||
int i, j;
|
||||
float hlp;
|
||||
float p[LPC_HALFORDER], q[LPC_HALFORDER];
|
||||
float a[LPC_HALFORDER + 1], a1[LPC_HALFORDER],
|
||||
a2[LPC_HALFORDER];
|
||||
float b[LPC_HALFORDER + 1], b1[LPC_HALFORDER],
|
||||
b2[LPC_HALFORDER];
|
||||
|
||||
for (i=0; i<LPC_FILTERORDER; i++) {
|
||||
freq[i] = freq[i] * PI2;
|
||||
}
|
||||
|
||||
/* Check input for ill-conditioned cases. This part is not
|
||||
found in the TIA standard. It involves the following 2 IF
|
||||
blocks. If "freq" is judged ill-conditioned, then we first
|
||||
modify freq[0] and freq[LPC_HALFORDER-1] (normally
|
||||
LPC_HALFORDER = 10 for LPC applications), then we adjust
|
||||
the other "freq" values slightly */
|
||||
|
||||
|
||||
if ((freq[0] <= 0.0) || (freq[LPC_FILTERORDER - 1] >= 0.5)){
|
||||
|
||||
|
||||
if (freq[0] <= 0.0) {
|
||||
freq[0] = (float)0.022;
|
||||
}
|
||||
|
||||
|
||||
if (freq[LPC_FILTERORDER - 1] >= 0.5) {
|
||||
freq[LPC_FILTERORDER - 1] = (float)0.499;
|
||||
}
|
||||
|
||||
hlp = (freq[LPC_FILTERORDER - 1] - freq[0]) /
|
||||
(float) (LPC_FILTERORDER - 1);
|
||||
|
||||
for (i=1; i<LPC_FILTERORDER; i++) {
|
||||
freq[i] = freq[i - 1] + hlp;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
memset(a1, 0, LPC_HALFORDER*sizeof(float));
|
||||
memset(a2, 0, LPC_HALFORDER*sizeof(float));
|
||||
memset(b1, 0, LPC_HALFORDER*sizeof(float));
|
||||
memset(b2, 0, LPC_HALFORDER*sizeof(float));
|
||||
memset(a, 0, (LPC_HALFORDER+1)*sizeof(float));
|
||||
memset(b, 0, (LPC_HALFORDER+1)*sizeof(float));
|
||||
|
||||
/* p[i] and q[i] compute cos(2*pi*omega_{2j}) and
|
||||
cos(2*pi*omega_{2j-1} in eqs. 4.2.2.2-1 and 4.2.2.2-2.
|
||||
Note that for this code p[i] specifies the coefficients
|
||||
used in .Q_A(z) while q[i] specifies the coefficients used
|
||||
in .P_A(z) */
|
||||
|
||||
for (i=0; i<LPC_HALFORDER; i++) {
|
||||
p[i] = (float)cos(TWO_PI * freq[2 * i]);
|
||||
q[i] = (float)cos(TWO_PI * freq[2 * i + 1]);
|
||||
}
|
||||
|
||||
a[0] = 0.25;
|
||||
b[0] = 0.25;
|
||||
|
||||
for (i= 0; i<LPC_HALFORDER; i++) {
|
||||
a[i + 1] = a[i] - 2 * p[i] * a1[i] + a2[i];
|
||||
b[i + 1] = b[i] - 2 * q[i] * b1[i] + b2[i];
|
||||
a2[i] = a1[i];
|
||||
a1[i] = a[i];
|
||||
b2[i] = b1[i];
|
||||
b1[i] = b[i];
|
||||
}
|
||||
|
||||
for (j=0; j<LPC_FILTERORDER; j++) {
|
||||
|
||||
if (j == 0) {
|
||||
a[0] = 0.25;
|
||||
b[0] = -0.25;
|
||||
} else {
|
||||
a[0] = b[0] = 0.0;
|
||||
}
|
||||
|
||||
for (i=0; i<LPC_HALFORDER; i++) {
|
||||
a[i + 1] = a[i] - 2 * p[i] * a1[i] + a2[i];
|
||||
b[i + 1] = b[i] - 2 * q[i] * b1[i] + b2[i];
|
||||
a2[i] = a1[i];
|
||||
a1[i] = a[i];
|
||||
b2[i] = b1[i];
|
||||
b1[i] = b[i];
|
||||
}
|
||||
|
||||
a_coef[j + 1] = 2 * (a[LPC_HALFORDER] + b[LPC_HALFORDER]);
|
||||
}
|
||||
|
||||
a_coef[0] = 1.0;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
lsf.c
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
|
||||
#include "iLBC_define.h"
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* conversion from lpc coefficients to lsf coefficients
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void a2lsf(
|
||||
float *freq,/* (o) lsf coefficients */
|
||||
float *a /* (i) lpc coefficients */
|
||||
){
|
||||
float steps[LSF_NUMBER_OF_STEPS] =
|
||||
{(float)0.00635, (float)0.003175, (float)0.0015875,
|
||||
(float)0.00079375};
|
||||
float step;
|
||||
int step_idx;
|
||||
int lsp_index;
|
||||
float p[LPC_HALFORDER];
|
||||
float q[LPC_HALFORDER];
|
||||
float p_pre[LPC_HALFORDER];
|
||||
|
||||
|
||||
float q_pre[LPC_HALFORDER];
|
||||
float old_p, old_q, *old;
|
||||
float *pq_coef;
|
||||
float omega, old_omega;
|
||||
int i;
|
||||
float hlp, hlp1, hlp2, hlp3, hlp4, hlp5;
|
||||
|
||||
for (i=0; i<LPC_HALFORDER; i++) {
|
||||
p[i] = (float)-1.0 * (a[i + 1] + a[LPC_FILTERORDER - i]);
|
||||
q[i] = a[LPC_FILTERORDER - i] - a[i + 1];
|
||||
}
|
||||
|
||||
p_pre[0] = (float)-1.0 - p[0];
|
||||
p_pre[1] = - p_pre[0] - p[1];
|
||||
p_pre[2] = - p_pre[1] - p[2];
|
||||
p_pre[3] = - p_pre[2] - p[3];
|
||||
p_pre[4] = - p_pre[3] - p[4];
|
||||
p_pre[4] = p_pre[4] / 2;
|
||||
|
||||
q_pre[0] = (float)1.0 - q[0];
|
||||
q_pre[1] = q_pre[0] - q[1];
|
||||
q_pre[2] = q_pre[1] - q[2];
|
||||
q_pre[3] = q_pre[2] - q[3];
|
||||
q_pre[4] = q_pre[3] - q[4];
|
||||
q_pre[4] = q_pre[4] / 2;
|
||||
|
||||
omega = 0.0;
|
||||
old_omega = 0.0;
|
||||
|
||||
old_p = FLOAT_MAX;
|
||||
old_q = FLOAT_MAX;
|
||||
|
||||
/* Here we loop through lsp_index to find all the
|
||||
LPC_FILTERORDER roots for omega. */
|
||||
|
||||
for (lsp_index = 0; lsp_index<LPC_FILTERORDER; lsp_index++) {
|
||||
|
||||
/* Depending on lsp_index being even or odd, we
|
||||
alternatively solve the roots for the two LSP equations. */
|
||||
|
||||
|
||||
if ((lsp_index & 0x1) == 0) {
|
||||
pq_coef = p_pre;
|
||||
old = &old_p;
|
||||
} else {
|
||||
pq_coef = q_pre;
|
||||
old = &old_q;
|
||||
}
|
||||
|
||||
/* Start with low resolution grid */
|
||||
|
||||
for (step_idx = 0, step = steps[step_idx];
|
||||
step_idx < LSF_NUMBER_OF_STEPS;){
|
||||
|
||||
|
||||
|
||||
/* cos(10piw) + pq(0)cos(8piw) + pq(1)cos(6piw) +
|
||||
pq(2)cos(4piw) + pq(3)cod(2piw) + pq(4) */
|
||||
|
||||
hlp = (float)cos(omega * TWO_PI);
|
||||
hlp1 = (float)2.0 * hlp + pq_coef[0];
|
||||
hlp2 = (float)2.0 * hlp * hlp1 - (float)1.0 +
|
||||
pq_coef[1];
|
||||
hlp3 = (float)2.0 * hlp * hlp2 - hlp1 + pq_coef[2];
|
||||
hlp4 = (float)2.0 * hlp * hlp3 - hlp2 + pq_coef[3];
|
||||
hlp5 = hlp * hlp4 - hlp3 + pq_coef[4];
|
||||
|
||||
|
||||
if (((hlp5 * (*old)) <= 0.0) || (omega >= 0.5)){
|
||||
|
||||
if (step_idx == (LSF_NUMBER_OF_STEPS - 1)){
|
||||
|
||||
if (fabs(hlp5) >= fabs(*old)) {
|
||||
freq[lsp_index] = omega - step;
|
||||
} else {
|
||||
freq[lsp_index] = omega;
|
||||
}
|
||||
|
||||
|
||||
if ((*old) >= 0.0){
|
||||
*old = (float)-1.0 * FLOAT_MAX;
|
||||
} else {
|
||||
*old = FLOAT_MAX;
|
||||
}
|
||||
|
||||
omega = old_omega;
|
||||
step_idx = 0;
|
||||
|
||||
step_idx = LSF_NUMBER_OF_STEPS;
|
||||
} else {
|
||||
|
||||
if (step_idx == 0) {
|
||||
old_omega = omega;
|
||||
}
|
||||
|
||||
step_idx++;
|
||||
omega -= steps[step_idx];
|
||||
|
||||
/* Go back one grid step */
|
||||
|
||||
step = steps[step_idx];
|
||||
}
|
||||
} else {
|
||||
|
||||
/* increment omega until they are of different sign,
|
||||
and we know there is at least one root between omega
|
||||
and old_omega */
|
||||
*old = hlp5;
|
||||
omega += step;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i<LPC_FILTERORDER; i++) {
|
||||
freq[i] = freq[i] * TWO_PI;
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* conversion from lsf coefficients to lpc coefficients
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void lsf2a(
|
||||
float *a_coef, /* (o) lpc coefficients */
|
||||
float *freq /* (i) lsf coefficients */
|
||||
){
|
||||
int i, j;
|
||||
float hlp;
|
||||
float p[LPC_HALFORDER], q[LPC_HALFORDER];
|
||||
float a[LPC_HALFORDER + 1], a1[LPC_HALFORDER],
|
||||
a2[LPC_HALFORDER];
|
||||
float b[LPC_HALFORDER + 1], b1[LPC_HALFORDER],
|
||||
b2[LPC_HALFORDER];
|
||||
|
||||
for (i=0; i<LPC_FILTERORDER; i++) {
|
||||
freq[i] = freq[i] * PI2;
|
||||
}
|
||||
|
||||
/* Check input for ill-conditioned cases. This part is not
|
||||
found in the TIA standard. It involves the following 2 IF
|
||||
blocks. If "freq" is judged ill-conditioned, then we first
|
||||
modify freq[0] and freq[LPC_HALFORDER-1] (normally
|
||||
LPC_HALFORDER = 10 for LPC applications), then we adjust
|
||||
the other "freq" values slightly */
|
||||
|
||||
|
||||
if ((freq[0] <= 0.0) || (freq[LPC_FILTERORDER - 1] >= 0.5)){
|
||||
|
||||
|
||||
if (freq[0] <= 0.0) {
|
||||
freq[0] = (float)0.022;
|
||||
}
|
||||
|
||||
|
||||
if (freq[LPC_FILTERORDER - 1] >= 0.5) {
|
||||
freq[LPC_FILTERORDER - 1] = (float)0.499;
|
||||
}
|
||||
|
||||
hlp = (freq[LPC_FILTERORDER - 1] - freq[0]) /
|
||||
(float) (LPC_FILTERORDER - 1);
|
||||
|
||||
for (i=1; i<LPC_FILTERORDER; i++) {
|
||||
freq[i] = freq[i - 1] + hlp;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
memset(a1, 0, LPC_HALFORDER*sizeof(float));
|
||||
memset(a2, 0, LPC_HALFORDER*sizeof(float));
|
||||
memset(b1, 0, LPC_HALFORDER*sizeof(float));
|
||||
memset(b2, 0, LPC_HALFORDER*sizeof(float));
|
||||
memset(a, 0, (LPC_HALFORDER+1)*sizeof(float));
|
||||
memset(b, 0, (LPC_HALFORDER+1)*sizeof(float));
|
||||
|
||||
/* p[i] and q[i] compute cos(2*pi*omega_{2j}) and
|
||||
cos(2*pi*omega_{2j-1} in eqs. 4.2.2.2-1 and 4.2.2.2-2.
|
||||
Note that for this code p[i] specifies the coefficients
|
||||
used in .Q_A(z) while q[i] specifies the coefficients used
|
||||
in .P_A(z) */
|
||||
|
||||
for (i=0; i<LPC_HALFORDER; i++) {
|
||||
p[i] = (float)cos(TWO_PI * freq[2 * i]);
|
||||
q[i] = (float)cos(TWO_PI * freq[2 * i + 1]);
|
||||
}
|
||||
|
||||
a[0] = 0.25;
|
||||
b[0] = 0.25;
|
||||
|
||||
for (i= 0; i<LPC_HALFORDER; i++) {
|
||||
a[i + 1] = a[i] - 2 * p[i] * a1[i] + a2[i];
|
||||
b[i + 1] = b[i] - 2 * q[i] * b1[i] + b2[i];
|
||||
a2[i] = a1[i];
|
||||
a1[i] = a[i];
|
||||
b2[i] = b1[i];
|
||||
b1[i] = b[i];
|
||||
}
|
||||
|
||||
for (j=0; j<LPC_FILTERORDER; j++) {
|
||||
|
||||
if (j == 0) {
|
||||
a[0] = 0.25;
|
||||
b[0] = -0.25;
|
||||
} else {
|
||||
a[0] = b[0] = 0.0;
|
||||
}
|
||||
|
||||
for (i=0; i<LPC_HALFORDER; i++) {
|
||||
a[i + 1] = a[i] - 2 * p[i] * a1[i] + a2[i];
|
||||
b[i + 1] = b[i] - 2 * q[i] * b1[i] + b2[i];
|
||||
a2[i] = a1[i];
|
||||
a1[i] = a[i];
|
||||
b2[i] = b1[i];
|
||||
b1[i] = b[i];
|
||||
}
|
||||
|
||||
a_coef[j + 1] = 2 * (a[LPC_HALFORDER] + b[LPC_HALFORDER]);
|
||||
}
|
||||
|
||||
a_coef[0] = 1.0;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
+30
-30
@@ -1,30 +1,30 @@
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
lsf.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifndef __iLBC_LSF_H
|
||||
#define __iLBC_LSF_H
|
||||
|
||||
void a2lsf(
|
||||
float *freq,/* (o) lsf coefficients */
|
||||
float *a /* (i) lpc coefficients */
|
||||
);
|
||||
|
||||
void lsf2a(
|
||||
float *a_coef, /* (o) lpc coefficients */
|
||||
float *freq /* (i) lsf coefficients */
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
lsf.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifndef __iLBC_LSF_H
|
||||
#define __iLBC_LSF_H
|
||||
|
||||
void a2lsf(
|
||||
float *freq,/* (o) lsf coefficients */
|
||||
float *a /* (i) lpc coefficients */
|
||||
);
|
||||
|
||||
void lsf2a(
|
||||
float *a_coef, /* (o) lpc coefficients */
|
||||
float *freq /* (i) lsf coefficients */
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
+174
-174
@@ -1,174 +1,174 @@
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
packing.c
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#include <math.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "iLBC_define.h"
|
||||
#include "constants.h"
|
||||
#include "helpfun.h"
|
||||
#include "string.h"
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* splitting an integer into first most significant bits and
|
||||
* remaining least significant bits
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void packsplit(
|
||||
int *index, /* (i) the value to split */
|
||||
int *firstpart, /* (o) the value specified by most
|
||||
significant bits */
|
||||
int *rest, /* (o) the value specified by least
|
||||
significant bits */
|
||||
int bitno_firstpart, /* (i) number of bits in most
|
||||
significant part */
|
||||
int bitno_total /* (i) number of bits in full range
|
||||
of value */
|
||||
){
|
||||
int bitno_rest = bitno_total-bitno_firstpart;
|
||||
|
||||
|
||||
|
||||
*firstpart = *index>>(bitno_rest);
|
||||
*rest = *index-(*firstpart<<(bitno_rest));
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* combining a value corresponding to msb's with a value
|
||||
* corresponding to lsb's
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void packcombine(
|
||||
int *index, /* (i/o) the msb value in the
|
||||
combined value out */
|
||||
int rest, /* (i) the lsb value */
|
||||
int bitno_rest /* (i) the number of bits in the
|
||||
lsb part */
|
||||
){
|
||||
*index = *index<<bitno_rest;
|
||||
*index += rest;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* packing of bits into bitstream, i.e., vector of bytes
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void dopack(
|
||||
unsigned char **bitstream, /* (i/o) on entrance pointer to
|
||||
place in bitstream to pack
|
||||
new data, on exit pointer
|
||||
to place in bitstream to
|
||||
pack future data */
|
||||
int index, /* (i) the value to pack */
|
||||
int bitno, /* (i) the number of bits that the
|
||||
value will fit within */
|
||||
int *pos /* (i/o) write position in the
|
||||
current byte */
|
||||
){
|
||||
int posLeft;
|
||||
|
||||
/* Clear the bits before starting in a new byte */
|
||||
|
||||
if ((*pos)==0) {
|
||||
**bitstream=0;
|
||||
}
|
||||
|
||||
while (bitno>0) {
|
||||
|
||||
/* Jump to the next byte if end of this byte is reached*/
|
||||
|
||||
if (*pos==8) {
|
||||
*pos=0;
|
||||
(*bitstream)++;
|
||||
**bitstream=0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
posLeft=8-(*pos);
|
||||
|
||||
/* Insert index into the bitstream */
|
||||
|
||||
if (bitno <= posLeft) {
|
||||
**bitstream |= (unsigned char)(index<<(posLeft-bitno));
|
||||
*pos+=bitno;
|
||||
bitno=0;
|
||||
} else {
|
||||
**bitstream |= (unsigned char)(index>>(bitno-posLeft));
|
||||
|
||||
*pos=8;
|
||||
index-=((index>>(bitno-posLeft))<<(bitno-posLeft));
|
||||
|
||||
bitno-=posLeft;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* unpacking of bits from bitstream, i.e., vector of bytes
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void unpack(
|
||||
unsigned char **bitstream, /* (i/o) on entrance pointer to
|
||||
place in bitstream to
|
||||
unpack new data from, on
|
||||
exit pointer to place in
|
||||
bitstream to unpack future
|
||||
data from */
|
||||
int *index, /* (o) resulting value */
|
||||
int bitno, /* (i) number of bits used to
|
||||
represent the value */
|
||||
int *pos /* (i/o) read position in the
|
||||
current byte */
|
||||
){
|
||||
int BitsLeft;
|
||||
|
||||
*index=0;
|
||||
|
||||
while (bitno>0) {
|
||||
|
||||
/* move forward in bitstream when the end of the
|
||||
byte is reached */
|
||||
|
||||
if (*pos==8) {
|
||||
*pos=0;
|
||||
(*bitstream)++;
|
||||
}
|
||||
|
||||
BitsLeft=8-(*pos);
|
||||
|
||||
/* Extract bits to index */
|
||||
|
||||
|
||||
|
||||
if (BitsLeft>=bitno) {
|
||||
*index+=((((**bitstream)<<(*pos)) & 0xFF)>>(8-bitno));
|
||||
|
||||
*pos+=bitno;
|
||||
bitno=0;
|
||||
} else {
|
||||
|
||||
if ((8-bitno)>0) {
|
||||
*index+=((((**bitstream)<<(*pos)) & 0xFF)>>
|
||||
(8-bitno));
|
||||
*pos=8;
|
||||
} else {
|
||||
*index+=(((int)(((**bitstream)<<(*pos)) & 0xFF))<<
|
||||
(bitno-8));
|
||||
*pos=8;
|
||||
}
|
||||
bitno-=BitsLeft;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
packing.c
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#include <math.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "iLBC_define.h"
|
||||
#include "constants.h"
|
||||
#include "helpfun.h"
|
||||
#include "string.h"
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* splitting an integer into first most significant bits and
|
||||
* remaining least significant bits
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void packsplit(
|
||||
int *index, /* (i) the value to split */
|
||||
int *firstpart, /* (o) the value specified by most
|
||||
significant bits */
|
||||
int *rest, /* (o) the value specified by least
|
||||
significant bits */
|
||||
int bitno_firstpart, /* (i) number of bits in most
|
||||
significant part */
|
||||
int bitno_total /* (i) number of bits in full range
|
||||
of value */
|
||||
){
|
||||
int bitno_rest = bitno_total-bitno_firstpart;
|
||||
|
||||
|
||||
|
||||
*firstpart = *index>>(bitno_rest);
|
||||
*rest = *index-(*firstpart<<(bitno_rest));
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* combining a value corresponding to msb's with a value
|
||||
* corresponding to lsb's
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void packcombine(
|
||||
int *index, /* (i/o) the msb value in the
|
||||
combined value out */
|
||||
int rest, /* (i) the lsb value */
|
||||
int bitno_rest /* (i) the number of bits in the
|
||||
lsb part */
|
||||
){
|
||||
*index = *index<<bitno_rest;
|
||||
*index += rest;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* packing of bits into bitstream, i.e., vector of bytes
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void dopack(
|
||||
unsigned char **bitstream, /* (i/o) on entrance pointer to
|
||||
place in bitstream to pack
|
||||
new data, on exit pointer
|
||||
to place in bitstream to
|
||||
pack future data */
|
||||
int index, /* (i) the value to pack */
|
||||
int bitno, /* (i) the number of bits that the
|
||||
value will fit within */
|
||||
int *pos /* (i/o) write position in the
|
||||
current byte */
|
||||
){
|
||||
int posLeft;
|
||||
|
||||
/* Clear the bits before starting in a new byte */
|
||||
|
||||
if ((*pos)==0) {
|
||||
**bitstream=0;
|
||||
}
|
||||
|
||||
while (bitno>0) {
|
||||
|
||||
/* Jump to the next byte if end of this byte is reached*/
|
||||
|
||||
if (*pos==8) {
|
||||
*pos=0;
|
||||
(*bitstream)++;
|
||||
**bitstream=0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
posLeft=8-(*pos);
|
||||
|
||||
/* Insert index into the bitstream */
|
||||
|
||||
if (bitno <= posLeft) {
|
||||
**bitstream |= (unsigned char)(index<<(posLeft-bitno));
|
||||
*pos+=bitno;
|
||||
bitno=0;
|
||||
} else {
|
||||
**bitstream |= (unsigned char)(index>>(bitno-posLeft));
|
||||
|
||||
*pos=8;
|
||||
index-=((index>>(bitno-posLeft))<<(bitno-posLeft));
|
||||
|
||||
bitno-=posLeft;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* unpacking of bits from bitstream, i.e., vector of bytes
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void unpack(
|
||||
unsigned char **bitstream, /* (i/o) on entrance pointer to
|
||||
place in bitstream to
|
||||
unpack new data from, on
|
||||
exit pointer to place in
|
||||
bitstream to unpack future
|
||||
data from */
|
||||
int *index, /* (o) resulting value */
|
||||
int bitno, /* (i) number of bits used to
|
||||
represent the value */
|
||||
int *pos /* (i/o) read position in the
|
||||
current byte */
|
||||
){
|
||||
int BitsLeft;
|
||||
|
||||
*index=0;
|
||||
|
||||
while (bitno>0) {
|
||||
|
||||
/* move forward in bitstream when the end of the
|
||||
byte is reached */
|
||||
|
||||
if (*pos==8) {
|
||||
*pos=0;
|
||||
(*bitstream)++;
|
||||
}
|
||||
|
||||
BitsLeft=8-(*pos);
|
||||
|
||||
/* Extract bits to index */
|
||||
|
||||
|
||||
|
||||
if (BitsLeft>=bitno) {
|
||||
*index+=((((**bitstream)<<(*pos)) & 0xFF)>>(8-bitno));
|
||||
|
||||
*pos+=bitno;
|
||||
bitno=0;
|
||||
} else {
|
||||
|
||||
if ((8-bitno)>0) {
|
||||
*index+=((((**bitstream)<<(*pos)) & 0xFF)>>
|
||||
(8-bitno));
|
||||
*pos=8;
|
||||
} else {
|
||||
*index+=(((int)(((**bitstream)<<(*pos)) & 0xFF))<<
|
||||
(bitno-8));
|
||||
*pos=8;
|
||||
}
|
||||
bitno-=BitsLeft;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,67 +1,67 @@
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
packing.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifndef __PACKING_H
|
||||
#define __PACKING_H
|
||||
|
||||
void packsplit(
|
||||
int *index, /* (i) the value to split */
|
||||
int *firstpart, /* (o) the value specified by most
|
||||
significant bits */
|
||||
int *rest, /* (o) the value specified by least
|
||||
significant bits */
|
||||
int bitno_firstpart, /* (i) number of bits in most
|
||||
significant part */
|
||||
int bitno_total /* (i) number of bits in full range
|
||||
of value */
|
||||
);
|
||||
|
||||
void packcombine(
|
||||
int *index, /* (i/o) the msb value in the
|
||||
combined value out */
|
||||
int rest, /* (i) the lsb value */
|
||||
int bitno_rest /* (i) the number of bits in the
|
||||
lsb part */
|
||||
);
|
||||
|
||||
void dopack(
|
||||
unsigned char **bitstream, /* (i/o) on entrance pointer to
|
||||
place in bitstream to pack
|
||||
new data, on exit pointer
|
||||
to place in bitstream to
|
||||
pack future data */
|
||||
int index, /* (i) the value to pack */
|
||||
int bitno, /* (i) the number of bits that the
|
||||
value will fit within */
|
||||
int *pos /* (i/o) write position in the
|
||||
current byte */
|
||||
);
|
||||
|
||||
void unpack(
|
||||
unsigned char **bitstream, /* (i/o) on entrance pointer to
|
||||
|
||||
|
||||
place in bitstream to
|
||||
unpack new data from, on
|
||||
exit pointer to place in
|
||||
bitstream to unpack future
|
||||
data from */
|
||||
int *index, /* (o) resulting value */
|
||||
int bitno, /* (i) number of bits used to
|
||||
represent the value */
|
||||
int *pos /* (i/o) read position in the
|
||||
current byte */
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
packing.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifndef __PACKING_H
|
||||
#define __PACKING_H
|
||||
|
||||
void packsplit(
|
||||
int *index, /* (i) the value to split */
|
||||
int *firstpart, /* (o) the value specified by most
|
||||
significant bits */
|
||||
int *rest, /* (o) the value specified by least
|
||||
significant bits */
|
||||
int bitno_firstpart, /* (i) number of bits in most
|
||||
significant part */
|
||||
int bitno_total /* (i) number of bits in full range
|
||||
of value */
|
||||
);
|
||||
|
||||
void packcombine(
|
||||
int *index, /* (i/o) the msb value in the
|
||||
combined value out */
|
||||
int rest, /* (i) the lsb value */
|
||||
int bitno_rest /* (i) the number of bits in the
|
||||
lsb part */
|
||||
);
|
||||
|
||||
void dopack(
|
||||
unsigned char **bitstream, /* (i/o) on entrance pointer to
|
||||
place in bitstream to pack
|
||||
new data, on exit pointer
|
||||
to place in bitstream to
|
||||
pack future data */
|
||||
int index, /* (i) the value to pack */
|
||||
int bitno, /* (i) the number of bits that the
|
||||
value will fit within */
|
||||
int *pos /* (i/o) write position in the
|
||||
current byte */
|
||||
);
|
||||
|
||||
void unpack(
|
||||
unsigned char **bitstream, /* (i/o) on entrance pointer to
|
||||
|
||||
|
||||
place in bitstream to
|
||||
unpack new data from, on
|
||||
exit pointer to place in
|
||||
bitstream to unpack future
|
||||
data from */
|
||||
int *index, /* (o) resulting value */
|
||||
int bitno, /* (i) number of bits used to
|
||||
represent the value */
|
||||
int *pos /* (i/o) read position in the
|
||||
current byte */
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
+107
-107
@@ -1,107 +1,107 @@
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
syntFilter.c
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#include "iLBC_define.h"
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* LP synthesis filter.
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void syntFilter(
|
||||
float *Out, /* (i/o) Signal to be filtered */
|
||||
float *a, /* (i) LP parameters */
|
||||
int len, /* (i) Length of signal */
|
||||
float *mem /* (i/o) Filter state */
|
||||
){
|
||||
int i, j;
|
||||
float *po, *pi, *pa, *pm;
|
||||
|
||||
po=Out;
|
||||
|
||||
/* Filter first part using memory from past */
|
||||
|
||||
for (i=0; i<LPC_FILTERORDER; i++) {
|
||||
pi=&Out[i-1];
|
||||
pa=&a[1];
|
||||
pm=&mem[LPC_FILTERORDER-1];
|
||||
for (j=1; j<=i; j++) {
|
||||
*po-=(*pa++)*(*pi--);
|
||||
}
|
||||
for (j=i+1; j<LPC_FILTERORDER+1; j++) {
|
||||
*po-=(*pa++)*(*pm--);
|
||||
}
|
||||
po++;
|
||||
}
|
||||
|
||||
/* Filter last part where the state is entierly in
|
||||
the output vector */
|
||||
|
||||
for (i=LPC_FILTERORDER; i<len; i++) {
|
||||
|
||||
|
||||
pi=&Out[i-1];
|
||||
pa=&a[1];
|
||||
for (j=1; j<LPC_FILTERORDER+1; j++) {
|
||||
*po-=(*pa++)*(*pi--);
|
||||
}
|
||||
po++;
|
||||
}
|
||||
|
||||
/* Update state vector */
|
||||
|
||||
memcpy(mem, &Out[len-LPC_FILTERORDER],
|
||||
LPC_FILTERORDER*sizeof(float));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
syntFilter.c
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#include "iLBC_define.h"
|
||||
|
||||
/*----------------------------------------------------------------*
|
||||
* LP synthesis filter.
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
void syntFilter(
|
||||
float *Out, /* (i/o) Signal to be filtered */
|
||||
float *a, /* (i) LP parameters */
|
||||
int len, /* (i) Length of signal */
|
||||
float *mem /* (i/o) Filter state */
|
||||
){
|
||||
int i, j;
|
||||
float *po, *pi, *pa, *pm;
|
||||
|
||||
po=Out;
|
||||
|
||||
/* Filter first part using memory from past */
|
||||
|
||||
for (i=0; i<LPC_FILTERORDER; i++) {
|
||||
pi=&Out[i-1];
|
||||
pa=&a[1];
|
||||
pm=&mem[LPC_FILTERORDER-1];
|
||||
for (j=1; j<=i; j++) {
|
||||
*po-=(*pa++)*(*pi--);
|
||||
}
|
||||
for (j=i+1; j<LPC_FILTERORDER+1; j++) {
|
||||
*po-=(*pa++)*(*pm--);
|
||||
}
|
||||
po++;
|
||||
}
|
||||
|
||||
/* Filter last part where the state is entierly in
|
||||
the output vector */
|
||||
|
||||
for (i=LPC_FILTERORDER; i<len; i++) {
|
||||
|
||||
|
||||
pi=&Out[i-1];
|
||||
pa=&a[1];
|
||||
for (j=1; j<LPC_FILTERORDER+1; j++) {
|
||||
*po-=(*pa++)*(*pi--);
|
||||
}
|
||||
po++;
|
||||
}
|
||||
|
||||
/* Update state vector */
|
||||
|
||||
memcpy(mem, &Out[len-LPC_FILTERORDER],
|
||||
LPC_FILTERORDER*sizeof(float));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,27 +1,27 @@
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
syntFilter.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifndef __iLBC_SYNTFILTER_H
|
||||
#define __iLBC_SYNTFILTER_H
|
||||
|
||||
void syntFilter(
|
||||
float *Out, /* (i/o) Signal to be filtered */
|
||||
float *a, /* (i) LP parameters */
|
||||
int len, /* (i) Length of signal */
|
||||
float *mem /* (i/o) Filter state */
|
||||
|
||||
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/******************************************************************
|
||||
|
||||
iLBC Speech Coder ANSI-C Source Code
|
||||
|
||||
syntFilter.h
|
||||
|
||||
Copyright (C) The Internet Society (2004).
|
||||
All Rights Reserved.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
#ifndef __iLBC_SYNTFILTER_H
|
||||
#define __iLBC_SYNTFILTER_H
|
||||
|
||||
void syntFilter(
|
||||
float *Out, /* (i/o) Signal to be filtered */
|
||||
float *a, /* (i) LP parameters */
|
||||
int len, /* (i) Length of signal */
|
||||
float *mem /* (i/o) Filter state */
|
||||
|
||||
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
+631
-631
File diff suppressed because it is too large
Load Diff
+438
-438
@@ -1,438 +1,438 @@
|
||||
/*
|
||||
|
||||
$Log: bsynz.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.2 1996/08/20 20:18:55 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_decoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_decoder_state().
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:32:58 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int bsynz_(real *coef, integer *ip, integer *iv, real *sout, real *rms, real *ratio, real *g2pass, struct lpc10_decoder_state *st);
|
||||
/* comlen contrl_ 12 */
|
||||
/*:ref: random_ 4 0 */
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* Common Block Declarations */
|
||||
|
||||
extern struct {
|
||||
integer order, lframe;
|
||||
logical corrp;
|
||||
} contrl_;
|
||||
|
||||
#define contrl_1 contrl_
|
||||
|
||||
/* ***************************************************************** */
|
||||
|
||||
/* BSYNZ Version 54 */
|
||||
|
||||
/* $Log: bsynz.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:18:55 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_decoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_decoder_state().
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:32:58 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.4 1996/03/27 18:11:22 jaf */
|
||||
/* Changed the range of NOISE printed out in the debugging statements, */
|
||||
/* even though they are commented out. I didn't discover this until I */
|
||||
/* tried comparing two different versions of the LPC-10 coder, each with */
|
||||
/* full tracing enabled. */
|
||||
|
||||
/* Revision 1.3 1996/03/26 19:33:23 jaf */
|
||||
/* Commented out trace statements. */
|
||||
|
||||
/* Revision 1.2 1996/03/20 17:12:54 jaf */
|
||||
/* Added comments about which indices of array arguments are read or */
|
||||
/* written. */
|
||||
|
||||
/* Rearranged local variable declarations to indicate which need to be */
|
||||
/* saved from one invocation to the next. Added entry INITBSYNZ to */
|
||||
/* reinitialize the local state variables, if desired. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:43:15 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ***************************************************************** */
|
||||
|
||||
/* Synthesize One Pitch Epoch */
|
||||
|
||||
/* Input: */
|
||||
/* COEF - Predictor coefficients */
|
||||
/* Indices 1 through ORDER read. */
|
||||
/* IP - Pitch period (number of samples to synthesize) */
|
||||
/* IV - Voicing for the current epoch */
|
||||
/* RMS - Energy for the current epoch */
|
||||
/* RATIO - Energy slope for plosives */
|
||||
/* G2PASS- Sharpening factor for 2 pass synthesis */
|
||||
/* Output: */
|
||||
/* SOUT - Synthesized speech */
|
||||
/* Indices 1 through IP written. */
|
||||
|
||||
/* This subroutine maintains local state from one call to the next. If */
|
||||
/* you want to switch to using a new audio stream for this filter, or */
|
||||
/* reinitialize its state for any other reason, call the ENTRY */
|
||||
/* INITBSYNZ. */
|
||||
|
||||
/* Subroutine */ int bsynz_(real *coef, integer *ip, integer *iv,
|
||||
real *sout, real *rms, real *ratio, real *g2pass,
|
||||
struct lpc10_decoder_state *st)
|
||||
{
|
||||
/* Initialized data */
|
||||
|
||||
integer *ipo;
|
||||
real *rmso;
|
||||
static integer kexc[25] = { 8,-16,26,-48,86,-162,294,-502,718,-728,184,
|
||||
672,-610,-672,184,728,718,502,294,162,86,48,26,16,8 };
|
||||
real *exc;
|
||||
real *exc2;
|
||||
real *lpi1;
|
||||
real *lpi2;
|
||||
real *lpi3;
|
||||
real *hpi1;
|
||||
real *hpi2;
|
||||
real *hpi3;
|
||||
|
||||
/* System generated locals */
|
||||
integer i__1, i__2;
|
||||
real r__1, r__2;
|
||||
|
||||
/* Builtin functions */
|
||||
double sqrt(doublereal);
|
||||
|
||||
/* Local variables */
|
||||
real gain, xssq;
|
||||
integer i__, j, k;
|
||||
real noise[166], pulse;
|
||||
integer px;
|
||||
real sscale;
|
||||
extern integer random_(struct lpc10_decoder_state *);
|
||||
real xy, sum, ssq;
|
||||
real lpi0, hpi0;
|
||||
|
||||
/* $Log: bsynz.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:18:55 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_decoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_decoder_state().
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:32:58 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/29 22:03:47 jaf */
|
||||
/* Removed definitions for any constants that were no longer used. */
|
||||
|
||||
/* Revision 1.2 1996/03/26 19:34:33 jaf */
|
||||
/* Added comments indicating which constants are not needed in an */
|
||||
/* application that uses the LPC-10 coder. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:43:51 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
/* LPC Configuration parameters: */
|
||||
/* Frame size, Prediction order, Pitch period */
|
||||
/* Arguments */
|
||||
/* $Log: bsynz.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:18:55 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_decoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_decoder_state().
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:32:58 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/29 22:05:55 jaf */
|
||||
/* Commented out the common block variables that are not needed by the */
|
||||
/* embedded version. */
|
||||
|
||||
/* Revision 1.2 1996/03/26 19:34:50 jaf */
|
||||
/* Added comments indicating which constants are not needed in an */
|
||||
/* application that uses the LPC-10 coder. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:44:09 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
/* LPC Processing control variables: */
|
||||
|
||||
/* *** Read-only: initialized in setup */
|
||||
|
||||
/* Files for Speech, Parameter, and Bitstream Input & Output, */
|
||||
/* and message and debug outputs. */
|
||||
|
||||
/* Here are the only files which use these variables: */
|
||||
|
||||
/* lpcsim.f setup.f trans.f error.f vqsetup.f */
|
||||
|
||||
/* Many files which use fdebug are not listed, since it is only used in */
|
||||
/* those other files conditionally, to print trace statements. */
|
||||
/* integer fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
|
||||
/* LPC order, Frame size, Quantization rate, Bits per frame, */
|
||||
/* Error correction */
|
||||
/* Subroutine SETUP is the only place where order is assigned a value, */
|
||||
/* and that value is 10. It could increase efficiency 1% or so to */
|
||||
/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as
|
||||
*/
|
||||
/* a variable in a COMMON block, since it is used in many places in the */
|
||||
/* core of the coding and decoding routines. Actually, I take that back.
|
||||
*/
|
||||
/* At least when compiling with f2c, the upper bound of DO loops is */
|
||||
/* stored in a local variable before the DO loop begins, and then that is
|
||||
*/
|
||||
/* compared against on each iteration. */
|
||||
/* Similarly for lframe, which is given a value of MAXFRM in SETUP. */
|
||||
/* Similarly for quant, which is given a value of 2400 in SETUP. quant */
|
||||
/* is used in only a few places, and never in the core coding and */
|
||||
/* decoding routines, so it could be eliminated entirely. */
|
||||
/* nbits is similar to quant, and is given a value of 54 in SETUP. */
|
||||
/* corrp is given a value of .TRUE. in SETUP, and is only used in the */
|
||||
/* subroutines ENCODE and DECODE. It doesn't affect the speed of the */
|
||||
/* coder significantly whether it is .TRUE. or .FALSE., or whether it is
|
||||
*/
|
||||
/* a constant or a variable, since it is only examined once per frame. */
|
||||
/* Leaving it as a variable that is set to .TRUE. seems like a good */
|
||||
/* idea, since it does enable some error-correction capability for */
|
||||
/* unvoiced frames, with no change in the coding rate, and no noticeable
|
||||
*/
|
||||
/* quality difference in the decoded speech. */
|
||||
/* integer quant, nbits */
|
||||
/* *** Read/write: variables for debugging, not needed for LPC algorithm
|
||||
*/
|
||||
|
||||
/* Current frame, Unstable frames, Output clip count, Max onset buffer,
|
||||
*/
|
||||
/* Debug listing detail level, Line count on listing page */
|
||||
|
||||
/* nframe is not needed for an embedded LPC10 at all. */
|
||||
/* nunsfm is initialized to 0 in SETUP, and incremented in subroutine */
|
||||
/* ERROR, which is only called from RCCHK. When LPC10 is embedded into */
|
||||
/* an application, I would recommend removing the call to ERROR in RCCHK,
|
||||
*/
|
||||
/* and remove ERROR and nunsfm completely. */
|
||||
/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in
|
||||
*/
|
||||
/* sread.f. When LPC10 is embedded into an application, one might want */
|
||||
/* to cause it to be incremented in a routine that takes the output of */
|
||||
/* SYNTHS and sends it to an audio device. It could be optionally */
|
||||
/* displayed, for those that might want to know what it is. */
|
||||
/* maxosp is never initialized to 0 in SETUP, although it probably should
|
||||
*/
|
||||
/* be, and it is updated in subroutine ANALYS. I doubt that its value */
|
||||
/* would be of much interest to an application in which LPC10 is */
|
||||
/* embedded. */
|
||||
/* listl and lincnt are not needed for an embedded LPC10 at all. */
|
||||
/* integer nframe, nunsfm, iclip, maxosp, listl, lincnt */
|
||||
/* common /contrl/ fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
|
||||
/* common /contrl/ quant, nbits */
|
||||
/* common /contrl/ nframe, nunsfm, iclip, maxosp, listl, lincnt */
|
||||
/* Function return value definitions */
|
||||
/* Parameters/constants */
|
||||
/* KEXC is not a Fortran PARAMETER, but it is an array initialized
|
||||
*/
|
||||
/* with a DATA statement that is never modified. */
|
||||
/* Local variables that need not be saved */
|
||||
/* NOISE is declared with range (1:MAXPIT+MAXORD), but only indices
|
||||
*/
|
||||
/* ORDER+1 through ORDER+IP are ever used, and I think that IP */
|
||||
/* .LE. MAXPIT. Why not declare it to be in the range (1:MAXPIT) */
|
||||
/* and use that range? */
|
||||
/* Local state */
|
||||
/* I believe that only indices 1 through ORDER of EXC need to be */
|
||||
/* saved from one invocation to the next, but we may as well save */
|
||||
/* the whole array. */
|
||||
/* None of these local variables were given initial values in the */
|
||||
/* original code. I'm guessing that 0 is a reasonable initial */
|
||||
/* value for all of them. */
|
||||
/* Parameter adjustments */
|
||||
if (coef) {
|
||||
--coef;
|
||||
}
|
||||
if (sout) {
|
||||
--sout;
|
||||
}
|
||||
|
||||
/* Function Body */
|
||||
ipo = &(st->ipo);
|
||||
exc = &(st->exc[0]);
|
||||
exc2 = &(st->exc2[0]);
|
||||
lpi1 = &(st->lpi1);
|
||||
lpi2 = &(st->lpi2);
|
||||
lpi3 = &(st->lpi3);
|
||||
hpi1 = &(st->hpi1);
|
||||
hpi2 = &(st->hpi2);
|
||||
hpi3 = &(st->hpi3);
|
||||
rmso = &(st->rmso_bsynz);
|
||||
|
||||
/* MAXPIT+MAXORD=166 */
|
||||
/* Calculate history scale factor XY and scale filter state */
|
||||
/* Computing MIN */
|
||||
r__1 = *rmso / (*rms + 1e-6f);
|
||||
xy = min(r__1,8.f);
|
||||
*rmso = *rms;
|
||||
i__1 = contrl_1.order;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
exc2[i__ - 1] = exc2[*ipo + i__ - 1] * xy;
|
||||
}
|
||||
*ipo = *ip;
|
||||
if (*iv == 0) {
|
||||
/* Generate white noise for unvoiced */
|
||||
i__1 = *ip;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
exc[contrl_1.order + i__ - 1] = (real) (random_(st) / 64);
|
||||
}
|
||||
/* Impulse doublet excitation for plosives */
|
||||
/* (RANDOM()+32768) is in the range 0 to 2**16-1. Therefore the
|
||||
*/
|
||||
/* following expression should be evaluated using integers with
|
||||
at */
|
||||
/* least 32 bits (16 isn't enough), and PX should be in the rang
|
||||
e */
|
||||
/* ORDER+1+0 through ORDER+1+(IP-2) .EQ. ORDER+IP-1. */
|
||||
px = (random_(st) + 32768) * (*ip - 1) / 65536 + contrl_1.order + 1;
|
||||
r__1 = *ratio / 4 * 1.f;
|
||||
pulse = r__1 * 342;
|
||||
if (pulse > 2e3f) {
|
||||
pulse = 2e3f;
|
||||
}
|
||||
exc[px - 1] += pulse;
|
||||
exc[px] -= pulse;
|
||||
/* Load voiced excitation */
|
||||
} else {
|
||||
sscale = (real)sqrt((real) (*ip)) / 6.928f;
|
||||
i__1 = *ip;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
exc[contrl_1.order + i__ - 1] = 0.f;
|
||||
if (i__ <= 25) {
|
||||
exc[contrl_1.order + i__ - 1] = sscale * kexc[i__ - 1];
|
||||
}
|
||||
lpi0 = exc[contrl_1.order + i__ - 1];
|
||||
r__2 = exc[contrl_1.order + i__ - 1] * .125f + *lpi1 * .75f;
|
||||
r__1 = r__2 + *lpi2 * .125f;
|
||||
exc[contrl_1.order + i__ - 1] = r__1 + *lpi3 * 0.f;
|
||||
*lpi3 = *lpi2;
|
||||
*lpi2 = *lpi1;
|
||||
*lpi1 = lpi0;
|
||||
}
|
||||
i__1 = *ip;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
noise[contrl_1.order + i__ - 1] = random_(st) * 1.f / 64;
|
||||
hpi0 = noise[contrl_1.order + i__ - 1];
|
||||
r__2 = noise[contrl_1.order + i__ - 1] * -.125f + *hpi1 * .25f;
|
||||
r__1 = r__2 + *hpi2 * -.125f;
|
||||
noise[contrl_1.order + i__ - 1] = r__1 + *hpi3 * 0.f;
|
||||
*hpi3 = *hpi2;
|
||||
*hpi2 = *hpi1;
|
||||
*hpi1 = hpi0;
|
||||
}
|
||||
i__1 = *ip;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
exc[contrl_1.order + i__ - 1] += noise[contrl_1.order + i__ - 1];
|
||||
}
|
||||
}
|
||||
/* Synthesis filters: */
|
||||
/* Modify the excitation with all-zero filter 1 + G*SUM */
|
||||
xssq = 0.f;
|
||||
i__1 = *ip;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
k = contrl_1.order + i__;
|
||||
sum = 0.f;
|
||||
i__2 = contrl_1.order;
|
||||
for (j = 1; j <= i__2; ++j) {
|
||||
sum += coef[j] * exc[k - j - 1];
|
||||
}
|
||||
sum *= *g2pass;
|
||||
exc2[k - 1] = sum + exc[k - 1];
|
||||
}
|
||||
/* Synthesize using the all pole filter 1 / (1 - SUM) */
|
||||
i__1 = *ip;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
k = contrl_1.order + i__;
|
||||
sum = 0.f;
|
||||
i__2 = contrl_1.order;
|
||||
for (j = 1; j <= i__2; ++j) {
|
||||
sum += coef[j] * exc2[k - j - 1];
|
||||
}
|
||||
exc2[k - 1] = sum + exc2[k - 1];
|
||||
xssq += exc2[k - 1] * exc2[k - 1];
|
||||
}
|
||||
/* Save filter history for next epoch */
|
||||
i__1 = contrl_1.order;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
exc[i__ - 1] = exc[*ip + i__ - 1];
|
||||
exc2[i__ - 1] = exc2[*ip + i__ - 1];
|
||||
}
|
||||
/* Apply gain to match RMS */
|
||||
r__1 = *rms * *rms;
|
||||
ssq = r__1 * *ip;
|
||||
gain = (real)sqrt(ssq / xssq);
|
||||
i__1 = *ip;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
sout[i__] = gain * exc2[contrl_1.order + i__ - 1];
|
||||
}
|
||||
return 0;
|
||||
} /* bsynz_ */
|
||||
/*
|
||||
|
||||
$Log: bsynz.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.2 1996/08/20 20:18:55 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_decoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_decoder_state().
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:32:58 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int bsynz_(real *coef, integer *ip, integer *iv, real *sout, real *rms, real *ratio, real *g2pass, struct lpc10_decoder_state *st);
|
||||
/* comlen contrl_ 12 */
|
||||
/*:ref: random_ 4 0 */
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* Common Block Declarations */
|
||||
|
||||
extern struct {
|
||||
integer order, lframe;
|
||||
logical corrp;
|
||||
} contrl_;
|
||||
|
||||
#define contrl_1 contrl_
|
||||
|
||||
/* ***************************************************************** */
|
||||
|
||||
/* BSYNZ Version 54 */
|
||||
|
||||
/* $Log: bsynz.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:18:55 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_decoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_decoder_state().
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:32:58 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.4 1996/03/27 18:11:22 jaf */
|
||||
/* Changed the range of NOISE printed out in the debugging statements, */
|
||||
/* even though they are commented out. I didn't discover this until I */
|
||||
/* tried comparing two different versions of the LPC-10 coder, each with */
|
||||
/* full tracing enabled. */
|
||||
|
||||
/* Revision 1.3 1996/03/26 19:33:23 jaf */
|
||||
/* Commented out trace statements. */
|
||||
|
||||
/* Revision 1.2 1996/03/20 17:12:54 jaf */
|
||||
/* Added comments about which indices of array arguments are read or */
|
||||
/* written. */
|
||||
|
||||
/* Rearranged local variable declarations to indicate which need to be */
|
||||
/* saved from one invocation to the next. Added entry INITBSYNZ to */
|
||||
/* reinitialize the local state variables, if desired. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:43:15 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ***************************************************************** */
|
||||
|
||||
/* Synthesize One Pitch Epoch */
|
||||
|
||||
/* Input: */
|
||||
/* COEF - Predictor coefficients */
|
||||
/* Indices 1 through ORDER read. */
|
||||
/* IP - Pitch period (number of samples to synthesize) */
|
||||
/* IV - Voicing for the current epoch */
|
||||
/* RMS - Energy for the current epoch */
|
||||
/* RATIO - Energy slope for plosives */
|
||||
/* G2PASS- Sharpening factor for 2 pass synthesis */
|
||||
/* Output: */
|
||||
/* SOUT - Synthesized speech */
|
||||
/* Indices 1 through IP written. */
|
||||
|
||||
/* This subroutine maintains local state from one call to the next. If */
|
||||
/* you want to switch to using a new audio stream for this filter, or */
|
||||
/* reinitialize its state for any other reason, call the ENTRY */
|
||||
/* INITBSYNZ. */
|
||||
|
||||
/* Subroutine */ int bsynz_(real *coef, integer *ip, integer *iv,
|
||||
real *sout, real *rms, real *ratio, real *g2pass,
|
||||
struct lpc10_decoder_state *st)
|
||||
{
|
||||
/* Initialized data */
|
||||
|
||||
integer *ipo;
|
||||
real *rmso;
|
||||
static integer kexc[25] = { 8,-16,26,-48,86,-162,294,-502,718,-728,184,
|
||||
672,-610,-672,184,728,718,502,294,162,86,48,26,16,8 };
|
||||
real *exc;
|
||||
real *exc2;
|
||||
real *lpi1;
|
||||
real *lpi2;
|
||||
real *lpi3;
|
||||
real *hpi1;
|
||||
real *hpi2;
|
||||
real *hpi3;
|
||||
|
||||
/* System generated locals */
|
||||
integer i__1, i__2;
|
||||
real r__1, r__2;
|
||||
|
||||
/* Builtin functions */
|
||||
double sqrt(doublereal);
|
||||
|
||||
/* Local variables */
|
||||
real gain, xssq;
|
||||
integer i__, j, k;
|
||||
real noise[166], pulse;
|
||||
integer px;
|
||||
real sscale;
|
||||
extern integer random_(struct lpc10_decoder_state *);
|
||||
real xy, sum, ssq;
|
||||
real lpi0, hpi0;
|
||||
|
||||
/* $Log: bsynz.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:18:55 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_decoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_decoder_state().
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:32:58 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/29 22:03:47 jaf */
|
||||
/* Removed definitions for any constants that were no longer used. */
|
||||
|
||||
/* Revision 1.2 1996/03/26 19:34:33 jaf */
|
||||
/* Added comments indicating which constants are not needed in an */
|
||||
/* application that uses the LPC-10 coder. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:43:51 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
/* LPC Configuration parameters: */
|
||||
/* Frame size, Prediction order, Pitch period */
|
||||
/* Arguments */
|
||||
/* $Log: bsynz.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:18:55 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_decoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_decoder_state().
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:32:58 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/29 22:05:55 jaf */
|
||||
/* Commented out the common block variables that are not needed by the */
|
||||
/* embedded version. */
|
||||
|
||||
/* Revision 1.2 1996/03/26 19:34:50 jaf */
|
||||
/* Added comments indicating which constants are not needed in an */
|
||||
/* application that uses the LPC-10 coder. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:44:09 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
/* LPC Processing control variables: */
|
||||
|
||||
/* *** Read-only: initialized in setup */
|
||||
|
||||
/* Files for Speech, Parameter, and Bitstream Input & Output, */
|
||||
/* and message and debug outputs. */
|
||||
|
||||
/* Here are the only files which use these variables: */
|
||||
|
||||
/* lpcsim.f setup.f trans.f error.f vqsetup.f */
|
||||
|
||||
/* Many files which use fdebug are not listed, since it is only used in */
|
||||
/* those other files conditionally, to print trace statements. */
|
||||
/* integer fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
|
||||
/* LPC order, Frame size, Quantization rate, Bits per frame, */
|
||||
/* Error correction */
|
||||
/* Subroutine SETUP is the only place where order is assigned a value, */
|
||||
/* and that value is 10. It could increase efficiency 1% or so to */
|
||||
/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as
|
||||
*/
|
||||
/* a variable in a COMMON block, since it is used in many places in the */
|
||||
/* core of the coding and decoding routines. Actually, I take that back.
|
||||
*/
|
||||
/* At least when compiling with f2c, the upper bound of DO loops is */
|
||||
/* stored in a local variable before the DO loop begins, and then that is
|
||||
*/
|
||||
/* compared against on each iteration. */
|
||||
/* Similarly for lframe, which is given a value of MAXFRM in SETUP. */
|
||||
/* Similarly for quant, which is given a value of 2400 in SETUP. quant */
|
||||
/* is used in only a few places, and never in the core coding and */
|
||||
/* decoding routines, so it could be eliminated entirely. */
|
||||
/* nbits is similar to quant, and is given a value of 54 in SETUP. */
|
||||
/* corrp is given a value of .TRUE. in SETUP, and is only used in the */
|
||||
/* subroutines ENCODE and DECODE. It doesn't affect the speed of the */
|
||||
/* coder significantly whether it is .TRUE. or .FALSE., or whether it is
|
||||
*/
|
||||
/* a constant or a variable, since it is only examined once per frame. */
|
||||
/* Leaving it as a variable that is set to .TRUE. seems like a good */
|
||||
/* idea, since it does enable some error-correction capability for */
|
||||
/* unvoiced frames, with no change in the coding rate, and no noticeable
|
||||
*/
|
||||
/* quality difference in the decoded speech. */
|
||||
/* integer quant, nbits */
|
||||
/* *** Read/write: variables for debugging, not needed for LPC algorithm
|
||||
*/
|
||||
|
||||
/* Current frame, Unstable frames, Output clip count, Max onset buffer,
|
||||
*/
|
||||
/* Debug listing detail level, Line count on listing page */
|
||||
|
||||
/* nframe is not needed for an embedded LPC10 at all. */
|
||||
/* nunsfm is initialized to 0 in SETUP, and incremented in subroutine */
|
||||
/* ERROR, which is only called from RCCHK. When LPC10 is embedded into */
|
||||
/* an application, I would recommend removing the call to ERROR in RCCHK,
|
||||
*/
|
||||
/* and remove ERROR and nunsfm completely. */
|
||||
/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in
|
||||
*/
|
||||
/* sread.f. When LPC10 is embedded into an application, one might want */
|
||||
/* to cause it to be incremented in a routine that takes the output of */
|
||||
/* SYNTHS and sends it to an audio device. It could be optionally */
|
||||
/* displayed, for those that might want to know what it is. */
|
||||
/* maxosp is never initialized to 0 in SETUP, although it probably should
|
||||
*/
|
||||
/* be, and it is updated in subroutine ANALYS. I doubt that its value */
|
||||
/* would be of much interest to an application in which LPC10 is */
|
||||
/* embedded. */
|
||||
/* listl and lincnt are not needed for an embedded LPC10 at all. */
|
||||
/* integer nframe, nunsfm, iclip, maxosp, listl, lincnt */
|
||||
/* common /contrl/ fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
|
||||
/* common /contrl/ quant, nbits */
|
||||
/* common /contrl/ nframe, nunsfm, iclip, maxosp, listl, lincnt */
|
||||
/* Function return value definitions */
|
||||
/* Parameters/constants */
|
||||
/* KEXC is not a Fortran PARAMETER, but it is an array initialized
|
||||
*/
|
||||
/* with a DATA statement that is never modified. */
|
||||
/* Local variables that need not be saved */
|
||||
/* NOISE is declared with range (1:MAXPIT+MAXORD), but only indices
|
||||
*/
|
||||
/* ORDER+1 through ORDER+IP are ever used, and I think that IP */
|
||||
/* .LE. MAXPIT. Why not declare it to be in the range (1:MAXPIT) */
|
||||
/* and use that range? */
|
||||
/* Local state */
|
||||
/* I believe that only indices 1 through ORDER of EXC need to be */
|
||||
/* saved from one invocation to the next, but we may as well save */
|
||||
/* the whole array. */
|
||||
/* None of these local variables were given initial values in the */
|
||||
/* original code. I'm guessing that 0 is a reasonable initial */
|
||||
/* value for all of them. */
|
||||
/* Parameter adjustments */
|
||||
if (coef) {
|
||||
--coef;
|
||||
}
|
||||
if (sout) {
|
||||
--sout;
|
||||
}
|
||||
|
||||
/* Function Body */
|
||||
ipo = &(st->ipo);
|
||||
exc = &(st->exc[0]);
|
||||
exc2 = &(st->exc2[0]);
|
||||
lpi1 = &(st->lpi1);
|
||||
lpi2 = &(st->lpi2);
|
||||
lpi3 = &(st->lpi3);
|
||||
hpi1 = &(st->hpi1);
|
||||
hpi2 = &(st->hpi2);
|
||||
hpi3 = &(st->hpi3);
|
||||
rmso = &(st->rmso_bsynz);
|
||||
|
||||
/* MAXPIT+MAXORD=166 */
|
||||
/* Calculate history scale factor XY and scale filter state */
|
||||
/* Computing MIN */
|
||||
r__1 = *rmso / (*rms + 1e-6f);
|
||||
xy = min(r__1,8.f);
|
||||
*rmso = *rms;
|
||||
i__1 = contrl_1.order;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
exc2[i__ - 1] = exc2[*ipo + i__ - 1] * xy;
|
||||
}
|
||||
*ipo = *ip;
|
||||
if (*iv == 0) {
|
||||
/* Generate white noise for unvoiced */
|
||||
i__1 = *ip;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
exc[contrl_1.order + i__ - 1] = (real) (random_(st) / 64);
|
||||
}
|
||||
/* Impulse doublet excitation for plosives */
|
||||
/* (RANDOM()+32768) is in the range 0 to 2**16-1. Therefore the
|
||||
*/
|
||||
/* following expression should be evaluated using integers with
|
||||
at */
|
||||
/* least 32 bits (16 isn't enough), and PX should be in the rang
|
||||
e */
|
||||
/* ORDER+1+0 through ORDER+1+(IP-2) .EQ. ORDER+IP-1. */
|
||||
px = (random_(st) + 32768) * (*ip - 1) / 65536 + contrl_1.order + 1;
|
||||
r__1 = *ratio / 4 * 1.f;
|
||||
pulse = r__1 * 342;
|
||||
if (pulse > 2e3f) {
|
||||
pulse = 2e3f;
|
||||
}
|
||||
exc[px - 1] += pulse;
|
||||
exc[px] -= pulse;
|
||||
/* Load voiced excitation */
|
||||
} else {
|
||||
sscale = (real)sqrt((real) (*ip)) / 6.928f;
|
||||
i__1 = *ip;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
exc[contrl_1.order + i__ - 1] = 0.f;
|
||||
if (i__ <= 25) {
|
||||
exc[contrl_1.order + i__ - 1] = sscale * kexc[i__ - 1];
|
||||
}
|
||||
lpi0 = exc[contrl_1.order + i__ - 1];
|
||||
r__2 = exc[contrl_1.order + i__ - 1] * .125f + *lpi1 * .75f;
|
||||
r__1 = r__2 + *lpi2 * .125f;
|
||||
exc[contrl_1.order + i__ - 1] = r__1 + *lpi3 * 0.f;
|
||||
*lpi3 = *lpi2;
|
||||
*lpi2 = *lpi1;
|
||||
*lpi1 = lpi0;
|
||||
}
|
||||
i__1 = *ip;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
noise[contrl_1.order + i__ - 1] = random_(st) * 1.f / 64;
|
||||
hpi0 = noise[contrl_1.order + i__ - 1];
|
||||
r__2 = noise[contrl_1.order + i__ - 1] * -.125f + *hpi1 * .25f;
|
||||
r__1 = r__2 + *hpi2 * -.125f;
|
||||
noise[contrl_1.order + i__ - 1] = r__1 + *hpi3 * 0.f;
|
||||
*hpi3 = *hpi2;
|
||||
*hpi2 = *hpi1;
|
||||
*hpi1 = hpi0;
|
||||
}
|
||||
i__1 = *ip;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
exc[contrl_1.order + i__ - 1] += noise[contrl_1.order + i__ - 1];
|
||||
}
|
||||
}
|
||||
/* Synthesis filters: */
|
||||
/* Modify the excitation with all-zero filter 1 + G*SUM */
|
||||
xssq = 0.f;
|
||||
i__1 = *ip;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
k = contrl_1.order + i__;
|
||||
sum = 0.f;
|
||||
i__2 = contrl_1.order;
|
||||
for (j = 1; j <= i__2; ++j) {
|
||||
sum += coef[j] * exc[k - j - 1];
|
||||
}
|
||||
sum *= *g2pass;
|
||||
exc2[k - 1] = sum + exc[k - 1];
|
||||
}
|
||||
/* Synthesize using the all pole filter 1 / (1 - SUM) */
|
||||
i__1 = *ip;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
k = contrl_1.order + i__;
|
||||
sum = 0.f;
|
||||
i__2 = contrl_1.order;
|
||||
for (j = 1; j <= i__2; ++j) {
|
||||
sum += coef[j] * exc2[k - j - 1];
|
||||
}
|
||||
exc2[k - 1] = sum + exc2[k - 1];
|
||||
xssq += exc2[k - 1] * exc2[k - 1];
|
||||
}
|
||||
/* Save filter history for next epoch */
|
||||
i__1 = contrl_1.order;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
exc[i__ - 1] = exc[*ip + i__ - 1];
|
||||
exc2[i__ - 1] = exc2[*ip + i__ - 1];
|
||||
}
|
||||
/* Apply gain to match RMS */
|
||||
r__1 = *rms * *rms;
|
||||
ssq = r__1 * *ip;
|
||||
gain = (real)sqrt(ssq / xssq);
|
||||
i__1 = *ip;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
sout[i__] = gain * exc2[contrl_1.order + i__ - 1];
|
||||
}
|
||||
return 0;
|
||||
} /* bsynz_ */
|
||||
|
||||
+226
-226
@@ -1,226 +1,226 @@
|
||||
/*
|
||||
|
||||
$Log: chanwr.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.2 1996/08/20 20:20:24 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_encoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:40:31 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int chanwr_(integer *order, integer *ipitv, integer *irms, integer *irc, integer *ibits, struct lpc10_encoder_state *st);
|
||||
extern int chanrd_(integer *order, integer *ipitv, integer *irms, integer *irc, integer *ibits);
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* *********************************************************************** */
|
||||
|
||||
/* CHANL Version 49 */
|
||||
|
||||
/* $Log: chanwr.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:20:24 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_encoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:40:31 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/21 15:14:57 jaf */
|
||||
/* Added comments about which indices of argument arrays are read or */
|
||||
/* written, and about the one bit of local state in CHANWR. CHANRD */
|
||||
/* has no local state. */
|
||||
|
||||
/* Revision 1.2 1996/03/13 18:55:10 jaf */
|
||||
/* Comments added explaining which of the local variables of this */
|
||||
/* subroutine need to be saved from one invocation to the next, and which */
|
||||
/* do not. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:43:31 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* *********************************************************************** */
|
||||
|
||||
/* CHANWR: */
|
||||
/* Place quantized parameters into bitstream */
|
||||
|
||||
/* Input: */
|
||||
/* ORDER - Number of reflection coefficients (not really variable) */
|
||||
/* IPITV - Quantized pitch/voicing parameter */
|
||||
/* IRMS - Quantized energy parameter */
|
||||
/* IRC - Quantized reflection coefficients */
|
||||
/* Indices 1 through ORDER read. */
|
||||
/* Output: */
|
||||
/* IBITS - Serial bitstream */
|
||||
/* Indices 1 through 54 written. */
|
||||
/* Bit 54, the SYNC bit, alternates from one call to the next. */
|
||||
|
||||
/* Subroutine CHANWR maintains one bit of local state from one call to */
|
||||
/* the next, in the variable ISYNC. I believe that this one bit is only */
|
||||
/* intended to allow a receiver to resynchronize its interpretation of */
|
||||
/* the bit stream, by looking for which of the 54 bits alternates every */
|
||||
/* frame time. This is just a simple framing mechanism that is not */
|
||||
/* useful when other, higher overhead framing mechanisms are used to */
|
||||
/* transmit the coded frames. */
|
||||
|
||||
/* I'm not going to make an entry to reinitialize this bit, since it */
|
||||
/* doesn't help a receiver much to know whether the first sync bit is a 0 */
|
||||
/* or a 1. It needs to examine several frames in sequence to have */
|
||||
/* reasonably good assurance that its framing is correct. */
|
||||
|
||||
|
||||
/* CHANRD: */
|
||||
/* Reconstruct parameters from bitstream */
|
||||
|
||||
/* Input: */
|
||||
/* ORDER - Number of reflection coefficients (not really variable) */
|
||||
/* IBITS - Serial bitstream */
|
||||
/* Indices 1 through 53 read (SYNC bit is ignored). */
|
||||
/* Output: */
|
||||
/* IPITV - Quantized pitch/voicing parameter */
|
||||
/* IRMS - Quantized energy parameter */
|
||||
/* IRC - Quantized reflection coefficients */
|
||||
/* Indices 1 through ORDER written */
|
||||
|
||||
/* Entry CHANRD has no local state. */
|
||||
|
||||
|
||||
|
||||
/* IBITS is 54 bits of LPC data ordered as follows: */
|
||||
/* R1-0, R2-0, R3-0, P-0, A-0, */
|
||||
/* R1-1, R2-1, R3-1, P-1, A-1, */
|
||||
/* R1-2, R4-0, R3-2, A-2, P-2, R4-1, */
|
||||
/* R1-3, R2-2, R3-3, R4-2, A-3, */
|
||||
/* R1-4, R2-3, R3-4, R4-3, A-4, */
|
||||
/* P-3, R2-4, R7-0, R8-0, P-4, R4-4, */
|
||||
/* R5-0, R6-0, R7-1,R10-0, R8-1, */
|
||||
/* R5-1, R6-1, R7-2, R9-0, P-5, */
|
||||
/* R5-2, R6-2,R10-1, R8-2, P-6, R9-1, */
|
||||
/* R5-3, R6-3, R7-3, R9-2, R8-3, SYNC */
|
||||
/* Subroutine */ int chanwr_0_(int n__, integer *order, integer *ipitv,
|
||||
integer *irms, integer *irc, integer *ibits,
|
||||
struct lpc10_encoder_state *st)
|
||||
{
|
||||
/* Initialized data */
|
||||
|
||||
integer *isync;
|
||||
static integer bit[10] = { 2,4,8,8,8,8,16,16,16,16 };
|
||||
static integer iblist[53] = { 13,12,11,1,2,13,12,11,1,2,13,10,11,2,1,10,
|
||||
13,12,11,10,2,13,12,11,10,2,1,12,7,6,1,10,9,8,7,4,6,9,8,7,5,1,9,8,
|
||||
4,6,1,5,9,8,7,5,6 };
|
||||
|
||||
/* System generated locals */
|
||||
integer i__1;
|
||||
|
||||
/* Local variables */
|
||||
integer itab[13], i__;
|
||||
|
||||
/* Arguments */
|
||||
/* Parameters/constants */
|
||||
/* These arrays are not Fortran PARAMETER's, but they are defined */
|
||||
/* by DATA statements below, and their contents are never altered.
|
||||
*/
|
||||
/* Local variables that need not be saved */
|
||||
/* Local state */
|
||||
/* ISYNC is only used by CHANWR, not by ENTRY CHANRD. */
|
||||
|
||||
/* Parameter adjustments */
|
||||
--irc;
|
||||
--ibits;
|
||||
|
||||
/* Function Body */
|
||||
switch(n__) {
|
||||
case 1: goto L_chanrd;
|
||||
}
|
||||
|
||||
isync = &(st->isync);
|
||||
|
||||
/* ***********************************************************************
|
||||
*/
|
||||
/* Place quantized parameters into bitstream */
|
||||
/* ***********************************************************************
|
||||
*/
|
||||
/* Place parameters into ITAB */
|
||||
itab[0] = *ipitv;
|
||||
itab[1] = *irms;
|
||||
itab[2] = 0;
|
||||
i__1 = *order;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
itab[i__ + 2] = irc[*order + 1 - i__] & 32767;
|
||||
}
|
||||
/* Put 54 bits into IBITS array */
|
||||
for (i__ = 1; i__ <= 53; ++i__) {
|
||||
ibits[i__] = itab[iblist[i__ - 1] - 1] & 1;
|
||||
itab[iblist[i__ - 1] - 1] /= 2;
|
||||
}
|
||||
ibits[54] = *isync & 1;
|
||||
*isync = 1 - *isync;
|
||||
return 0;
|
||||
/* ***********************************************************************
|
||||
*/
|
||||
/* Reconstruct parameters from bitstream */
|
||||
/* ***********************************************************************
|
||||
*/
|
||||
|
||||
L_chanrd:
|
||||
/* Reconstruct ITAB */
|
||||
for (i__ = 1; i__ <= 13; ++i__) {
|
||||
itab[i__ - 1] = 0;
|
||||
}
|
||||
for (i__ = 1; i__ <= 53; ++i__) {
|
||||
itab[iblist[54 - i__ - 1] - 1] = (itab[iblist[54 - i__ - 1] - 1] << 1)
|
||||
+ ibits[54 - i__];
|
||||
}
|
||||
/* Sign extend RC's */
|
||||
i__1 = *order;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
if ((itab[i__ + 2] & bit[i__ - 1]) != 0) {
|
||||
itab[i__ + 2] -= bit[i__ - 1] << 1;
|
||||
}
|
||||
}
|
||||
/* Restore variables */
|
||||
*ipitv = itab[0];
|
||||
*irms = itab[1];
|
||||
i__1 = *order;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
irc[i__] = itab[*order + 4 - i__ - 1];
|
||||
}
|
||||
return 0;
|
||||
} /* chanwr_ */
|
||||
|
||||
/* Subroutine */ int chanwr_(integer *order, integer *ipitv, integer *irms,
|
||||
integer *irc, integer *ibits, struct lpc10_encoder_state *st)
|
||||
{
|
||||
return chanwr_0_(0, order, ipitv, irms, irc, ibits, st);
|
||||
}
|
||||
|
||||
/* Subroutine */ int chanrd_(integer *order, integer *ipitv, integer *irms,
|
||||
integer *irc, integer *ibits)
|
||||
{
|
||||
return chanwr_0_(1, order, ipitv, irms, irc, ibits, 0);
|
||||
}
|
||||
/*
|
||||
|
||||
$Log: chanwr.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.2 1996/08/20 20:20:24 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_encoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:40:31 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int chanwr_(integer *order, integer *ipitv, integer *irms, integer *irc, integer *ibits, struct lpc10_encoder_state *st);
|
||||
extern int chanrd_(integer *order, integer *ipitv, integer *irms, integer *irc, integer *ibits);
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* *********************************************************************** */
|
||||
|
||||
/* CHANL Version 49 */
|
||||
|
||||
/* $Log: chanwr.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:20:24 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_encoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:40:31 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/21 15:14:57 jaf */
|
||||
/* Added comments about which indices of argument arrays are read or */
|
||||
/* written, and about the one bit of local state in CHANWR. CHANRD */
|
||||
/* has no local state. */
|
||||
|
||||
/* Revision 1.2 1996/03/13 18:55:10 jaf */
|
||||
/* Comments added explaining which of the local variables of this */
|
||||
/* subroutine need to be saved from one invocation to the next, and which */
|
||||
/* do not. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:43:31 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* *********************************************************************** */
|
||||
|
||||
/* CHANWR: */
|
||||
/* Place quantized parameters into bitstream */
|
||||
|
||||
/* Input: */
|
||||
/* ORDER - Number of reflection coefficients (not really variable) */
|
||||
/* IPITV - Quantized pitch/voicing parameter */
|
||||
/* IRMS - Quantized energy parameter */
|
||||
/* IRC - Quantized reflection coefficients */
|
||||
/* Indices 1 through ORDER read. */
|
||||
/* Output: */
|
||||
/* IBITS - Serial bitstream */
|
||||
/* Indices 1 through 54 written. */
|
||||
/* Bit 54, the SYNC bit, alternates from one call to the next. */
|
||||
|
||||
/* Subroutine CHANWR maintains one bit of local state from one call to */
|
||||
/* the next, in the variable ISYNC. I believe that this one bit is only */
|
||||
/* intended to allow a receiver to resynchronize its interpretation of */
|
||||
/* the bit stream, by looking for which of the 54 bits alternates every */
|
||||
/* frame time. This is just a simple framing mechanism that is not */
|
||||
/* useful when other, higher overhead framing mechanisms are used to */
|
||||
/* transmit the coded frames. */
|
||||
|
||||
/* I'm not going to make an entry to reinitialize this bit, since it */
|
||||
/* doesn't help a receiver much to know whether the first sync bit is a 0 */
|
||||
/* or a 1. It needs to examine several frames in sequence to have */
|
||||
/* reasonably good assurance that its framing is correct. */
|
||||
|
||||
|
||||
/* CHANRD: */
|
||||
/* Reconstruct parameters from bitstream */
|
||||
|
||||
/* Input: */
|
||||
/* ORDER - Number of reflection coefficients (not really variable) */
|
||||
/* IBITS - Serial bitstream */
|
||||
/* Indices 1 through 53 read (SYNC bit is ignored). */
|
||||
/* Output: */
|
||||
/* IPITV - Quantized pitch/voicing parameter */
|
||||
/* IRMS - Quantized energy parameter */
|
||||
/* IRC - Quantized reflection coefficients */
|
||||
/* Indices 1 through ORDER written */
|
||||
|
||||
/* Entry CHANRD has no local state. */
|
||||
|
||||
|
||||
|
||||
/* IBITS is 54 bits of LPC data ordered as follows: */
|
||||
/* R1-0, R2-0, R3-0, P-0, A-0, */
|
||||
/* R1-1, R2-1, R3-1, P-1, A-1, */
|
||||
/* R1-2, R4-0, R3-2, A-2, P-2, R4-1, */
|
||||
/* R1-3, R2-2, R3-3, R4-2, A-3, */
|
||||
/* R1-4, R2-3, R3-4, R4-3, A-4, */
|
||||
/* P-3, R2-4, R7-0, R8-0, P-4, R4-4, */
|
||||
/* R5-0, R6-0, R7-1,R10-0, R8-1, */
|
||||
/* R5-1, R6-1, R7-2, R9-0, P-5, */
|
||||
/* R5-2, R6-2,R10-1, R8-2, P-6, R9-1, */
|
||||
/* R5-3, R6-3, R7-3, R9-2, R8-3, SYNC */
|
||||
/* Subroutine */ int chanwr_0_(int n__, integer *order, integer *ipitv,
|
||||
integer *irms, integer *irc, integer *ibits,
|
||||
struct lpc10_encoder_state *st)
|
||||
{
|
||||
/* Initialized data */
|
||||
|
||||
integer *isync;
|
||||
static integer bit[10] = { 2,4,8,8,8,8,16,16,16,16 };
|
||||
static integer iblist[53] = { 13,12,11,1,2,13,12,11,1,2,13,10,11,2,1,10,
|
||||
13,12,11,10,2,13,12,11,10,2,1,12,7,6,1,10,9,8,7,4,6,9,8,7,5,1,9,8,
|
||||
4,6,1,5,9,8,7,5,6 };
|
||||
|
||||
/* System generated locals */
|
||||
integer i__1;
|
||||
|
||||
/* Local variables */
|
||||
integer itab[13], i__;
|
||||
|
||||
/* Arguments */
|
||||
/* Parameters/constants */
|
||||
/* These arrays are not Fortran PARAMETER's, but they are defined */
|
||||
/* by DATA statements below, and their contents are never altered.
|
||||
*/
|
||||
/* Local variables that need not be saved */
|
||||
/* Local state */
|
||||
/* ISYNC is only used by CHANWR, not by ENTRY CHANRD. */
|
||||
|
||||
/* Parameter adjustments */
|
||||
--irc;
|
||||
--ibits;
|
||||
|
||||
/* Function Body */
|
||||
switch(n__) {
|
||||
case 1: goto L_chanrd;
|
||||
}
|
||||
|
||||
isync = &(st->isync);
|
||||
|
||||
/* ***********************************************************************
|
||||
*/
|
||||
/* Place quantized parameters into bitstream */
|
||||
/* ***********************************************************************
|
||||
*/
|
||||
/* Place parameters into ITAB */
|
||||
itab[0] = *ipitv;
|
||||
itab[1] = *irms;
|
||||
itab[2] = 0;
|
||||
i__1 = *order;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
itab[i__ + 2] = irc[*order + 1 - i__] & 32767;
|
||||
}
|
||||
/* Put 54 bits into IBITS array */
|
||||
for (i__ = 1; i__ <= 53; ++i__) {
|
||||
ibits[i__] = itab[iblist[i__ - 1] - 1] & 1;
|
||||
itab[iblist[i__ - 1] - 1] /= 2;
|
||||
}
|
||||
ibits[54] = *isync & 1;
|
||||
*isync = 1 - *isync;
|
||||
return 0;
|
||||
/* ***********************************************************************
|
||||
*/
|
||||
/* Reconstruct parameters from bitstream */
|
||||
/* ***********************************************************************
|
||||
*/
|
||||
|
||||
L_chanrd:
|
||||
/* Reconstruct ITAB */
|
||||
for (i__ = 1; i__ <= 13; ++i__) {
|
||||
itab[i__ - 1] = 0;
|
||||
}
|
||||
for (i__ = 1; i__ <= 53; ++i__) {
|
||||
itab[iblist[54 - i__ - 1] - 1] = (itab[iblist[54 - i__ - 1] - 1] << 1)
|
||||
+ ibits[54 - i__];
|
||||
}
|
||||
/* Sign extend RC's */
|
||||
i__1 = *order;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
if ((itab[i__ + 2] & bit[i__ - 1]) != 0) {
|
||||
itab[i__ + 2] -= bit[i__ - 1] << 1;
|
||||
}
|
||||
}
|
||||
/* Restore variables */
|
||||
*ipitv = itab[0];
|
||||
*irms = itab[1];
|
||||
i__1 = *order;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
irc[i__] = itab[*order + 4 - i__ - 1];
|
||||
}
|
||||
return 0;
|
||||
} /* chanwr_ */
|
||||
|
||||
/* Subroutine */ int chanwr_(integer *order, integer *ipitv, integer *irms,
|
||||
integer *irc, integer *ibits, struct lpc10_encoder_state *st)
|
||||
{
|
||||
return chanwr_0_(0, order, ipitv, irms, irc, ibits, st);
|
||||
}
|
||||
|
||||
/* Subroutine */ int chanrd_(integer *order, integer *ipitv, integer *irms,
|
||||
integer *irc, integer *ibits)
|
||||
{
|
||||
return chanwr_0_(1, order, ipitv, irms, irc, ibits, 0);
|
||||
}
|
||||
|
||||
@@ -1,96 +1,96 @@
|
||||
/*
|
||||
|
||||
$Log: dcbias.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.1 1996/08/19 22:40:23 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int dcbias_(integer *len, real *speech, real *sigout);
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* ********************************************************************* */
|
||||
|
||||
/* DCBIAS Version 50 */
|
||||
|
||||
/* $Log: dcbias.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:40:23 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/18 21:19:22 jaf */
|
||||
/* Just added a few comments about which array indices of the arguments */
|
||||
/* are used, and mentioning that this subroutine has no local state. */
|
||||
|
||||
/* Revision 1.2 1996/03/13 16:44:53 jaf */
|
||||
/* Comments added explaining that none of the local variables of this */
|
||||
/* subroutine need to be saved from one invocation to the next. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:44:21 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ********************************************************************* */
|
||||
|
||||
/* Calculate and remove DC bias from buffer. */
|
||||
|
||||
/* Input: */
|
||||
/* LEN - Length of speech buffers */
|
||||
/* SPEECH - Input speech buffer */
|
||||
/* Indices 1 through LEN read. */
|
||||
/* Output: */
|
||||
/* SIGOUT - Output speech buffer */
|
||||
/* Indices 1 through LEN written */
|
||||
|
||||
/* This subroutine has no local state. */
|
||||
|
||||
/* Subroutine */ int dcbias_(integer *len, real *speech, real *sigout)
|
||||
{
|
||||
/* System generated locals */
|
||||
integer i__1;
|
||||
|
||||
/* Local variables */
|
||||
real bias;
|
||||
integer i__;
|
||||
|
||||
/* Arguments */
|
||||
/* Local variables that need not be saved */
|
||||
/* Parameter adjustments */
|
||||
--sigout;
|
||||
--speech;
|
||||
|
||||
/* Function Body */
|
||||
bias = 0.f;
|
||||
i__1 = *len;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
bias += speech[i__];
|
||||
}
|
||||
bias /= *len;
|
||||
i__1 = *len;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
sigout[i__] = speech[i__] - bias;
|
||||
}
|
||||
return 0;
|
||||
} /* dcbias_ */
|
||||
|
||||
/*
|
||||
|
||||
$Log: dcbias.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.1 1996/08/19 22:40:23 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int dcbias_(integer *len, real *speech, real *sigout);
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* ********************************************************************* */
|
||||
|
||||
/* DCBIAS Version 50 */
|
||||
|
||||
/* $Log: dcbias.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:40:23 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/18 21:19:22 jaf */
|
||||
/* Just added a few comments about which array indices of the arguments */
|
||||
/* are used, and mentioning that this subroutine has no local state. */
|
||||
|
||||
/* Revision 1.2 1996/03/13 16:44:53 jaf */
|
||||
/* Comments added explaining that none of the local variables of this */
|
||||
/* subroutine need to be saved from one invocation to the next. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:44:21 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ********************************************************************* */
|
||||
|
||||
/* Calculate and remove DC bias from buffer. */
|
||||
|
||||
/* Input: */
|
||||
/* LEN - Length of speech buffers */
|
||||
/* SPEECH - Input speech buffer */
|
||||
/* Indices 1 through LEN read. */
|
||||
/* Output: */
|
||||
/* SIGOUT - Output speech buffer */
|
||||
/* Indices 1 through LEN written */
|
||||
|
||||
/* This subroutine has no local state. */
|
||||
|
||||
/* Subroutine */ int dcbias_(integer *len, real *speech, real *sigout)
|
||||
{
|
||||
/* System generated locals */
|
||||
integer i__1;
|
||||
|
||||
/* Local variables */
|
||||
real bias;
|
||||
integer i__;
|
||||
|
||||
/* Arguments */
|
||||
/* Local variables that need not be saved */
|
||||
/* Parameter adjustments */
|
||||
--sigout;
|
||||
--speech;
|
||||
|
||||
/* Function Body */
|
||||
bias = 0.f;
|
||||
i__1 = *len;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
bias += speech[i__];
|
||||
}
|
||||
bias /= *len;
|
||||
i__1 = *len;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
sigout[i__] = speech[i__] - bias;
|
||||
}
|
||||
return 0;
|
||||
} /* dcbias_ */
|
||||
|
||||
|
||||
+604
-604
File diff suppressed because it is too large
Load Diff
+143
-143
@@ -1,143 +1,143 @@
|
||||
/*
|
||||
|
||||
$Log: deemp.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.2 1996/08/20 20:23:46 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_decoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_decoder_state().
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:32:34 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int deemp_(real *x, integer *n, struct lpc10_decoder_state *st);
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* ***************************************************************** */
|
||||
|
||||
/* DEEMP Version 48 */
|
||||
|
||||
/* $Log: deemp.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:23:46 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_decoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_decoder_state().
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:32:34 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/20 15:54:37 jaf */
|
||||
/* Added comments about which indices of array arguments are read or */
|
||||
/* written. */
|
||||
|
||||
/* Added entry INITDEEMP to reinitialize the local state variables, if */
|
||||
/* desired. */
|
||||
|
||||
/* Revision 1.2 1996/03/14 22:11:13 jaf */
|
||||
/* Comments added explaining which of the local variables of this */
|
||||
/* subroutine need to be saved from one invocation to the next, and which */
|
||||
/* do not. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:44:53 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ***************************************************************** */
|
||||
|
||||
/* De-Emphasize output speech with 1 / ( 1 - .75z**-1 ) */
|
||||
/* cascaded with 200 Hz high pass filter */
|
||||
/* ( 1 - 1.9998z**-1 + z**-2 ) / ( 1 - 1.75z**-1 + .78z**-2 ) */
|
||||
|
||||
/* WARNING! The coefficients above may be out of date with the code */
|
||||
/* below. Either that, or some kind of transformation was performed */
|
||||
/* on the coefficients above to create the code below. */
|
||||
|
||||
/* Input: */
|
||||
/* N - Number of samples */
|
||||
/* Input/Output: */
|
||||
/* X - Speech */
|
||||
/* Indices 1 through N are read before being written. */
|
||||
|
||||
/* This subroutine maintains local state from one call to the next. If */
|
||||
/* you want to switch to using a new audio stream for this filter, or */
|
||||
/* reinitialize its state for any other reason, call the ENTRY */
|
||||
/* INITDEEMP. */
|
||||
|
||||
/* Subroutine */ int deemp_(real *x, integer *n, struct lpc10_decoder_state *st)
|
||||
{
|
||||
/* Initialized data */
|
||||
|
||||
real *dei1;
|
||||
real *dei2;
|
||||
real *deo1;
|
||||
real *deo2;
|
||||
real *deo3;
|
||||
|
||||
/* System generated locals */
|
||||
integer i__1;
|
||||
real r__1;
|
||||
|
||||
/* Local variables */
|
||||
integer k;
|
||||
real dei0;
|
||||
|
||||
/* Arguments */
|
||||
/* Local variables that need not be saved */
|
||||
/* Local state */
|
||||
/* All of the locals saved below were not given explicit initial */
|
||||
/* values in the original code. I think 0 is a safe choice. */
|
||||
/* Parameter adjustments */
|
||||
if (x) {
|
||||
--x;
|
||||
}
|
||||
|
||||
/* Function Body */
|
||||
|
||||
dei1 = &(st->dei1);
|
||||
dei2 = &(st->dei2);
|
||||
deo1 = &(st->deo1);
|
||||
deo2 = &(st->deo2);
|
||||
deo3 = &(st->deo3);
|
||||
|
||||
i__1 = *n;
|
||||
for (k = 1; k <= i__1; ++k) {
|
||||
dei0 = x[k];
|
||||
r__1 = x[k] - *dei1 * 1.9998f + *dei2;
|
||||
x[k] = r__1 + *deo1 * 2.5f - *deo2 * 2.0925f + *deo3 * .585f;
|
||||
*dei2 = *dei1;
|
||||
*dei1 = dei0;
|
||||
*deo3 = *deo2;
|
||||
*deo2 = *deo1;
|
||||
*deo1 = x[k];
|
||||
}
|
||||
return 0;
|
||||
} /* deemp_ */
|
||||
/*
|
||||
|
||||
$Log: deemp.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.2 1996/08/20 20:23:46 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_decoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_decoder_state().
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:32:34 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int deemp_(real *x, integer *n, struct lpc10_decoder_state *st);
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* ***************************************************************** */
|
||||
|
||||
/* DEEMP Version 48 */
|
||||
|
||||
/* $Log: deemp.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:23:46 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_decoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_decoder_state().
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:32:34 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/20 15:54:37 jaf */
|
||||
/* Added comments about which indices of array arguments are read or */
|
||||
/* written. */
|
||||
|
||||
/* Added entry INITDEEMP to reinitialize the local state variables, if */
|
||||
/* desired. */
|
||||
|
||||
/* Revision 1.2 1996/03/14 22:11:13 jaf */
|
||||
/* Comments added explaining which of the local variables of this */
|
||||
/* subroutine need to be saved from one invocation to the next, and which */
|
||||
/* do not. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:44:53 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ***************************************************************** */
|
||||
|
||||
/* De-Emphasize output speech with 1 / ( 1 - .75z**-1 ) */
|
||||
/* cascaded with 200 Hz high pass filter */
|
||||
/* ( 1 - 1.9998z**-1 + z**-2 ) / ( 1 - 1.75z**-1 + .78z**-2 ) */
|
||||
|
||||
/* WARNING! The coefficients above may be out of date with the code */
|
||||
/* below. Either that, or some kind of transformation was performed */
|
||||
/* on the coefficients above to create the code below. */
|
||||
|
||||
/* Input: */
|
||||
/* N - Number of samples */
|
||||
/* Input/Output: */
|
||||
/* X - Speech */
|
||||
/* Indices 1 through N are read before being written. */
|
||||
|
||||
/* This subroutine maintains local state from one call to the next. If */
|
||||
/* you want to switch to using a new audio stream for this filter, or */
|
||||
/* reinitialize its state for any other reason, call the ENTRY */
|
||||
/* INITDEEMP. */
|
||||
|
||||
/* Subroutine */ int deemp_(real *x, integer *n, struct lpc10_decoder_state *st)
|
||||
{
|
||||
/* Initialized data */
|
||||
|
||||
real *dei1;
|
||||
real *dei2;
|
||||
real *deo1;
|
||||
real *deo2;
|
||||
real *deo3;
|
||||
|
||||
/* System generated locals */
|
||||
integer i__1;
|
||||
real r__1;
|
||||
|
||||
/* Local variables */
|
||||
integer k;
|
||||
real dei0;
|
||||
|
||||
/* Arguments */
|
||||
/* Local variables that need not be saved */
|
||||
/* Local state */
|
||||
/* All of the locals saved below were not given explicit initial */
|
||||
/* values in the original code. I think 0 is a safe choice. */
|
||||
/* Parameter adjustments */
|
||||
if (x) {
|
||||
--x;
|
||||
}
|
||||
|
||||
/* Function Body */
|
||||
|
||||
dei1 = &(st->dei1);
|
||||
dei2 = &(st->dei2);
|
||||
deo1 = &(st->deo1);
|
||||
deo2 = &(st->deo2);
|
||||
deo3 = &(st->deo3);
|
||||
|
||||
i__1 = *n;
|
||||
for (k = 1; k <= i__1; ++k) {
|
||||
dei0 = x[k];
|
||||
r__1 = x[k] - *dei1 * 1.9998f + *dei2;
|
||||
x[k] = r__1 + *deo1 * 2.5f - *deo2 * 2.0925f + *deo3 * .585f;
|
||||
*dei2 = *dei1;
|
||||
*dei1 = dei0;
|
||||
*deo3 = *deo2;
|
||||
*deo2 = *deo1;
|
||||
*deo1 = x[k];
|
||||
}
|
||||
return 0;
|
||||
} /* deemp_ */
|
||||
|
||||
+122
-122
@@ -1,122 +1,122 @@
|
||||
/*
|
||||
|
||||
$Log: difmag.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.1 1996/08/19 22:32:31 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int difmag_(real *speech, integer *lpita, integer *tau, integer *ltau, integer *maxlag, real *amdf, integer *minptr, integer *maxptr);
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* ********************************************************************** */
|
||||
|
||||
/* DIFMAG Version 49 */
|
||||
|
||||
/* $Log: difmag.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:32:31 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/15 23:09:39 jaf */
|
||||
/* Just added a few comments about which array indices of the arguments */
|
||||
/* are used, and mentioning that this subroutine has no local state. */
|
||||
|
||||
/* Revision 1.2 1996/03/13 14:41:31 jaf */
|
||||
/* Comments added explaining that none of the local variables of this */
|
||||
/* subroutine need to be saved from one invocation to the next. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:45:04 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ********************************************************************* */
|
||||
|
||||
/* Compute Average Magnitude Difference Function */
|
||||
|
||||
/* Inputs: */
|
||||
/* SPEECH - Low pass filtered speech */
|
||||
/* Indices MIN_N1 through MAX_N1+LPITA-1 are read, where */
|
||||
/* MIN_N1 = (MAXLAG - MAX_TAU)/2+1 MAX_TAU = max of TAU(I) for I=1,LTAU
|
||||
*/
|
||||
/* MAX_N1 = (MAXLAG - MIN_TAU)/2+1 MIN_TAU = min of TAU(I) for I=1,LTAU
|
||||
*/
|
||||
/* LPITA - Length of speech buffer */
|
||||
/* TAU - Table of lags */
|
||||
/* Indices 1 through LTAU read. */
|
||||
/* LTAU - Number of lag values to compute */
|
||||
/* MAXLAG - Maximum possible lag value */
|
||||
/* Outputs: */
|
||||
/* (All of these outputs are also read, but only after being written.) */
|
||||
/* AMDF - Average Magnitude Difference for each lag in TAU */
|
||||
/* Indices 1 through LTAU written */
|
||||
/* MINPTR - Index of minimum AMDF value */
|
||||
/* MAXPTR - Index of maximum AMDF value */
|
||||
|
||||
/* This subroutine has no local state. */
|
||||
|
||||
/* Subroutine */ int difmag_(real *speech, integer *lpita, integer *tau,
|
||||
integer *ltau, integer *maxlag, real *amdf, integer *minptr, integer *
|
||||
maxptr)
|
||||
{
|
||||
/* System generated locals */
|
||||
integer i__1, i__2;
|
||||
real r__1;
|
||||
|
||||
/* Local variables */
|
||||
integer i__, j, n1, n2;
|
||||
real sum;
|
||||
|
||||
/* Arguments */
|
||||
/* Local variables that need not be saved */
|
||||
/* Local state */
|
||||
/* None */
|
||||
/* Parameter adjustments */
|
||||
--amdf;
|
||||
--tau;
|
||||
--speech;
|
||||
|
||||
/* Function Body */
|
||||
*minptr = 1;
|
||||
*maxptr = 1;
|
||||
i__1 = *ltau;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
n1 = (*maxlag - tau[i__]) / 2 + 1;
|
||||
n2 = n1 + *lpita - 1;
|
||||
sum = 0.f;
|
||||
i__2 = n2;
|
||||
for (j = n1; j <= i__2; j += 4) {
|
||||
sum += (r__1 = speech[j] - speech[j + tau[i__]], abs(r__1));
|
||||
}
|
||||
amdf[i__] = sum;
|
||||
if (amdf[i__] < amdf[*minptr]) {
|
||||
*minptr = i__;
|
||||
}
|
||||
if (amdf[i__] > amdf[*maxptr]) {
|
||||
*maxptr = i__;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
} /* difmag_ */
|
||||
|
||||
/*
|
||||
|
||||
$Log: difmag.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.1 1996/08/19 22:32:31 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int difmag_(real *speech, integer *lpita, integer *tau, integer *ltau, integer *maxlag, real *amdf, integer *minptr, integer *maxptr);
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* ********************************************************************** */
|
||||
|
||||
/* DIFMAG Version 49 */
|
||||
|
||||
/* $Log: difmag.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:32:31 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/15 23:09:39 jaf */
|
||||
/* Just added a few comments about which array indices of the arguments */
|
||||
/* are used, and mentioning that this subroutine has no local state. */
|
||||
|
||||
/* Revision 1.2 1996/03/13 14:41:31 jaf */
|
||||
/* Comments added explaining that none of the local variables of this */
|
||||
/* subroutine need to be saved from one invocation to the next. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:45:04 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ********************************************************************* */
|
||||
|
||||
/* Compute Average Magnitude Difference Function */
|
||||
|
||||
/* Inputs: */
|
||||
/* SPEECH - Low pass filtered speech */
|
||||
/* Indices MIN_N1 through MAX_N1+LPITA-1 are read, where */
|
||||
/* MIN_N1 = (MAXLAG - MAX_TAU)/2+1 MAX_TAU = max of TAU(I) for I=1,LTAU
|
||||
*/
|
||||
/* MAX_N1 = (MAXLAG - MIN_TAU)/2+1 MIN_TAU = min of TAU(I) for I=1,LTAU
|
||||
*/
|
||||
/* LPITA - Length of speech buffer */
|
||||
/* TAU - Table of lags */
|
||||
/* Indices 1 through LTAU read. */
|
||||
/* LTAU - Number of lag values to compute */
|
||||
/* MAXLAG - Maximum possible lag value */
|
||||
/* Outputs: */
|
||||
/* (All of these outputs are also read, but only after being written.) */
|
||||
/* AMDF - Average Magnitude Difference for each lag in TAU */
|
||||
/* Indices 1 through LTAU written */
|
||||
/* MINPTR - Index of minimum AMDF value */
|
||||
/* MAXPTR - Index of maximum AMDF value */
|
||||
|
||||
/* This subroutine has no local state. */
|
||||
|
||||
/* Subroutine */ int difmag_(real *speech, integer *lpita, integer *tau,
|
||||
integer *ltau, integer *maxlag, real *amdf, integer *minptr, integer *
|
||||
maxptr)
|
||||
{
|
||||
/* System generated locals */
|
||||
integer i__1, i__2;
|
||||
real r__1;
|
||||
|
||||
/* Local variables */
|
||||
integer i__, j, n1, n2;
|
||||
real sum;
|
||||
|
||||
/* Arguments */
|
||||
/* Local variables that need not be saved */
|
||||
/* Local state */
|
||||
/* None */
|
||||
/* Parameter adjustments */
|
||||
--amdf;
|
||||
--tau;
|
||||
--speech;
|
||||
|
||||
/* Function Body */
|
||||
*minptr = 1;
|
||||
*maxptr = 1;
|
||||
i__1 = *ltau;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
n1 = (*maxlag - tau[i__]) / 2 + 1;
|
||||
n2 = n1 + *lpita - 1;
|
||||
sum = 0.f;
|
||||
i__2 = n2;
|
||||
for (j = n1; j <= i__2; j += 4) {
|
||||
sum += (r__1 = speech[j] - speech[j + tau[i__]], abs(r__1));
|
||||
}
|
||||
amdf[i__] = sum;
|
||||
if (amdf[i__] < amdf[*minptr]) {
|
||||
*minptr = i__;
|
||||
}
|
||||
if (amdf[i__] > amdf[*maxptr]) {
|
||||
*maxptr = i__;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
} /* difmag_ */
|
||||
|
||||
|
||||
+389
-389
@@ -1,389 +1,389 @@
|
||||
/*
|
||||
|
||||
$Log: dyptrk.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.2 1996/08/20 20:25:29 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_encoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_encoder_state().
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:32:26 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int dyptrk_(real *amdf, integer *ltau, integer *minptr, integer *voice, integer *pitch, integer *midx, struct lpc10_encoder_state *st);
|
||||
/* comlen contrl_ 12 */
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* Common Block Declarations */
|
||||
|
||||
extern struct {
|
||||
integer order, lframe;
|
||||
logical corrp;
|
||||
} contrl_;
|
||||
|
||||
#define contrl_1 contrl_
|
||||
|
||||
/* ********************************************************************* */
|
||||
|
||||
/* DYPTRK Version 52 */
|
||||
|
||||
/* $Log: dyptrk.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:25:29 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_encoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_encoder_state().
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:32:26 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.5 1996/03/26 19:35:35 jaf */
|
||||
/* Commented out trace statements. */
|
||||
|
||||
/* Revision 1.4 1996/03/19 18:03:22 jaf */
|
||||
/* Replaced the initialization "DATA P/60*DEPTH*0/" with "DATA P/120*0/", */
|
||||
/* because apparently Fortran (or at least f2c) can't handle expressions */
|
||||
/* like that. */
|
||||
|
||||
/* Revision 1.3 1996/03/19 17:38:32 jaf */
|
||||
/* Added comments about the local variables that should be saved from one */
|
||||
/* invocation to the next. None of them were given initial values in the */
|
||||
/* original code, but from my testing, it appears that initializing them */
|
||||
/* all to 0 works. */
|
||||
|
||||
/* Added entry INITDYPTRK to reinitialize these local variables. */
|
||||
|
||||
/* Revision 1.2 1996/03/13 16:32:17 jaf */
|
||||
/* Comments added explaining which of the local variables of this */
|
||||
/* subroutine need to be saved from one invocation to the next, and which */
|
||||
/* do not. */
|
||||
|
||||
/* WARNING! Some of them that should are never given initial values in */
|
||||
/* this code. Hopefully, Fortran 77 defines initial values for them, but */
|
||||
/* even so, giving them explicit initial values is preferable. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:45:14 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ********************************************************************* */
|
||||
|
||||
/* Dynamic Pitch Tracker */
|
||||
|
||||
/* Input: */
|
||||
/* AMDF - Average Magnitude Difference Function array */
|
||||
/* Indices 1 through LTAU read, and MINPTR */
|
||||
/* LTAU - Number of lags in AMDF */
|
||||
/* MINPTR - Location of minimum AMDF value */
|
||||
/* VOICE - Voicing decision */
|
||||
/* Output: */
|
||||
/* PITCH - Smoothed pitch value, 2 frames delayed */
|
||||
/* MIDX - Initial estimate of current frame pitch */
|
||||
/* Compile time constant: */
|
||||
/* DEPTH - Number of frames to trace back */
|
||||
|
||||
/* This subroutine maintains local state from one call to the next. If */
|
||||
/* you want to switch to using a new audio stream for this filter, or */
|
||||
/* reinitialize its state for any other reason, call the ENTRY */
|
||||
/* INITDYPTRK. */
|
||||
|
||||
/* Subroutine */ int dyptrk_(real *amdf, integer *ltau, integer *
|
||||
minptr, integer *voice, integer *pitch, integer *midx,
|
||||
struct lpc10_encoder_state *st)
|
||||
{
|
||||
/* Initialized data */
|
||||
|
||||
real *s;
|
||||
integer *p;
|
||||
integer *ipoint;
|
||||
real *alphax;
|
||||
|
||||
/* System generated locals */
|
||||
integer i__1;
|
||||
|
||||
/* Local variables */
|
||||
integer pbar;
|
||||
real sbar;
|
||||
integer path[2], iptr, i__, j;
|
||||
real alpha, minsc, maxsc;
|
||||
|
||||
/* Arguments */
|
||||
/* $Log: dyptrk.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:25:29 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_encoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_encoder_state().
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:32:26 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/29 22:05:55 jaf */
|
||||
/* Commented out the common block variables that are not needed by the */
|
||||
/* embedded version. */
|
||||
|
||||
/* Revision 1.2 1996/03/26 19:34:50 jaf */
|
||||
/* Added comments indicating which constants are not needed in an */
|
||||
/* application that uses the LPC-10 coder. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:44:09 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
/* LPC Processing control variables: */
|
||||
|
||||
/* *** Read-only: initialized in setup */
|
||||
|
||||
/* Files for Speech, Parameter, and Bitstream Input & Output, */
|
||||
/* and message and debug outputs. */
|
||||
|
||||
/* Here are the only files which use these variables: */
|
||||
|
||||
/* lpcsim.f setup.f trans.f error.f vqsetup.f */
|
||||
|
||||
/* Many files which use fdebug are not listed, since it is only used in */
|
||||
/* those other files conditionally, to print trace statements. */
|
||||
/* integer fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
|
||||
/* LPC order, Frame size, Quantization rate, Bits per frame, */
|
||||
/* Error correction */
|
||||
/* Subroutine SETUP is the only place where order is assigned a value, */
|
||||
/* and that value is 10. It could increase efficiency 1% or so to */
|
||||
/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as
|
||||
*/
|
||||
/* a variable in a COMMON block, since it is used in many places in the */
|
||||
/* core of the coding and decoding routines. Actually, I take that back.
|
||||
*/
|
||||
/* At least when compiling with f2c, the upper bound of DO loops is */
|
||||
/* stored in a local variable before the DO loop begins, and then that is
|
||||
*/
|
||||
/* compared against on each iteration. */
|
||||
/* Similarly for lframe, which is given a value of MAXFRM in SETUP. */
|
||||
/* Similarly for quant, which is given a value of 2400 in SETUP. quant */
|
||||
/* is used in only a few places, and never in the core coding and */
|
||||
/* decoding routines, so it could be eliminated entirely. */
|
||||
/* nbits is similar to quant, and is given a value of 54 in SETUP. */
|
||||
/* corrp is given a value of .TRUE. in SETUP, and is only used in the */
|
||||
/* subroutines ENCODE and DECODE. It doesn't affect the speed of the */
|
||||
/* coder significantly whether it is .TRUE. or .FALSE., or whether it is
|
||||
*/
|
||||
/* a constant or a variable, since it is only examined once per frame. */
|
||||
/* Leaving it as a variable that is set to .TRUE. seems like a good */
|
||||
/* idea, since it does enable some error-correction capability for */
|
||||
/* unvoiced frames, with no change in the coding rate, and no noticeable
|
||||
*/
|
||||
/* quality difference in the decoded speech. */
|
||||
/* integer quant, nbits */
|
||||
/* *** Read/write: variables for debugging, not needed for LPC algorithm
|
||||
*/
|
||||
|
||||
/* Current frame, Unstable frames, Output clip count, Max onset buffer,
|
||||
*/
|
||||
/* Debug listing detail level, Line count on listing page */
|
||||
|
||||
/* nframe is not needed for an embedded LPC10 at all. */
|
||||
/* nunsfm is initialized to 0 in SETUP, and incremented in subroutine */
|
||||
/* ERROR, which is only called from RCCHK. When LPC10 is embedded into */
|
||||
/* an application, I would recommend removing the call to ERROR in RCCHK,
|
||||
*/
|
||||
/* and remove ERROR and nunsfm completely. */
|
||||
/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in
|
||||
*/
|
||||
/* sread.f. When LPC10 is embedded into an application, one might want */
|
||||
/* to cause it to be incremented in a routine that takes the output of */
|
||||
/* SYNTHS and sends it to an audio device. It could be optionally */
|
||||
/* displayed, for those that might want to know what it is. */
|
||||
/* maxosp is never initialized to 0 in SETUP, although it probably should
|
||||
*/
|
||||
/* be, and it is updated in subroutine ANALYS. I doubt that its value */
|
||||
/* would be of much interest to an application in which LPC10 is */
|
||||
/* embedded. */
|
||||
/* listl and lincnt are not needed for an embedded LPC10 at all. */
|
||||
/* integer nframe, nunsfm, iclip, maxosp, listl, lincnt */
|
||||
/* common /contrl/ fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
|
||||
/* common /contrl/ quant, nbits */
|
||||
/* common /contrl/ nframe, nunsfm, iclip, maxosp, listl, lincnt */
|
||||
/* Parameters/constants */
|
||||
/* Local variables that need not be saved */
|
||||
/* Note that PATH is only used for debugging purposes, and can be */
|
||||
/* removed. */
|
||||
/* Local state */
|
||||
/* It would be a bit more "general" to define S(LTAU), if Fortran */
|
||||
/* allows the argument of a function to be used as the dimension of
|
||||
*/
|
||||
/* a local array variable. */
|
||||
/* IPOINT is always in the range 0 to DEPTH-1. */
|
||||
/* WARNING! */
|
||||
|
||||
/* In the original version of this subroutine, IPOINT, ALPHAX, */
|
||||
/* every element of S, and potentially any element of P with the */
|
||||
/* second index value .NE. IPTR were read without being given */
|
||||
/* initial values (all indices of P with second index equal to */
|
||||
/* IPTR are all written before being read in this subroutine). */
|
||||
|
||||
/* From examining the code carefully, it appears that all of these
|
||||
*/
|
||||
/* should be saved from one invocation to the next. */
|
||||
|
||||
/* I've run lpcsim with the "-l 6" option to see all of the */
|
||||
/* debugging information that is printed out by this subroutine */
|
||||
/* below, and it appears that S, P, IPOINT, and ALPHAX are all */
|
||||
/* initialized to 0 (these initial values would likely be different
|
||||
*/
|
||||
/* on different platforms, compilers, etc.). Given that the output
|
||||
*/
|
||||
/* of the coder sounds reasonable, I'm going to initialize these */
|
||||
/* variables to 0 explicitly. */
|
||||
|
||||
s = &(st->s[0]);
|
||||
p = &(st->p[0]);
|
||||
ipoint = &(st->ipoint);
|
||||
alphax = &(st->alphax);
|
||||
|
||||
|
||||
/* Parameter adjustments */
|
||||
if (amdf) {
|
||||
--amdf;
|
||||
}
|
||||
|
||||
/* Function Body */
|
||||
|
||||
/* Calculate the confidence factor ALPHA, used as a threshold slope in
|
||||
*/
|
||||
/* SEESAW. If unvoiced, set high slope so that every point in P array
|
||||
*/
|
||||
/* is marked as a potential pitch frequency. A scaled up version (ALPHAX
|
||||
)*/
|
||||
/* is used to maintain arithmetic precision. */
|
||||
if (*voice == 1) {
|
||||
*alphax = *alphax * .75f + amdf[*minptr] / 2.f;
|
||||
} else {
|
||||
*alphax *= .984375f;
|
||||
}
|
||||
alpha = *alphax / 16;
|
||||
if (*voice == 0 && *alphax < 128.f) {
|
||||
alpha = 8.f;
|
||||
}
|
||||
/* SEESAW: Construct a pitch pointer array and intermediate winner functio
|
||||
n*/
|
||||
/* Left to right pass: */
|
||||
iptr = *ipoint + 1;
|
||||
p[iptr * 60 - 60] = 1;
|
||||
i__ = 1;
|
||||
pbar = 1;
|
||||
sbar = s[0];
|
||||
i__1 = *ltau;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
sbar += alpha;
|
||||
if (sbar < s[i__ - 1]) {
|
||||
s[i__ - 1] = sbar;
|
||||
p[i__ + iptr * 60 - 61] = pbar;
|
||||
} else {
|
||||
sbar = s[i__ - 1];
|
||||
p[i__ + iptr * 60 - 61] = i__;
|
||||
pbar = i__;
|
||||
}
|
||||
}
|
||||
/* Right to left pass: */
|
||||
i__ = pbar - 1;
|
||||
sbar = s[i__];
|
||||
while(i__ >= 1) {
|
||||
sbar += alpha;
|
||||
if (sbar < s[i__ - 1]) {
|
||||
s[i__ - 1] = sbar;
|
||||
p[i__ + iptr * 60 - 61] = pbar;
|
||||
} else {
|
||||
pbar = p[i__ + iptr * 60 - 61];
|
||||
i__ = pbar;
|
||||
sbar = s[i__ - 1];
|
||||
}
|
||||
--i__;
|
||||
}
|
||||
/* Update S using AMDF */
|
||||
/* Find maximum, minimum, and location of minimum */
|
||||
s[0] += amdf[1] / 2;
|
||||
minsc = s[0];
|
||||
maxsc = minsc;
|
||||
*midx = 1;
|
||||
i__1 = *ltau;
|
||||
for (i__ = 2; i__ <= i__1; ++i__) {
|
||||
s[i__ - 1] += amdf[i__] / 2;
|
||||
if (s[i__ - 1] > maxsc) {
|
||||
maxsc = s[i__ - 1];
|
||||
}
|
||||
if (s[i__ - 1] < minsc) {
|
||||
*midx = i__;
|
||||
minsc = s[i__ - 1];
|
||||
}
|
||||
}
|
||||
/* Subtract MINSC from S to prevent overflow */
|
||||
i__1 = *ltau;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
s[i__ - 1] -= minsc;
|
||||
}
|
||||
maxsc -= minsc;
|
||||
/* Use higher octave pitch if significant null there */
|
||||
j = 0;
|
||||
for (i__ = 20; i__ <= 40; i__ += 10) {
|
||||
if (*midx > i__) {
|
||||
if (s[*midx - i__ - 1] < maxsc / 4) {
|
||||
j = i__;
|
||||
}
|
||||
}
|
||||
}
|
||||
*midx -= j;
|
||||
/* TRACE: look back two frames to find minimum cost pitch estimate */
|
||||
j = *ipoint;
|
||||
*pitch = *midx;
|
||||
for (i__ = 1; i__ <= 2; ++i__) {
|
||||
j = j % 2 + 1;
|
||||
*pitch = p[*pitch + j * 60 - 61];
|
||||
path[i__ - 1] = *pitch;
|
||||
}
|
||||
|
||||
/* The following statement subtracts one from IPOINT, mod DEPTH. I
|
||||
*/
|
||||
/* think the author chose to add DEPTH-1, instead of subtracting 1,
|
||||
*/
|
||||
/* because then it will work even if MOD doesn't work as desired on
|
||||
*/
|
||||
/* negative arguments. */
|
||||
|
||||
*ipoint = (*ipoint + 1) % 2;
|
||||
return 0;
|
||||
} /* dyptrk_ */
|
||||
/*
|
||||
|
||||
$Log: dyptrk.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.2 1996/08/20 20:25:29 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_encoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_encoder_state().
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:32:26 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int dyptrk_(real *amdf, integer *ltau, integer *minptr, integer *voice, integer *pitch, integer *midx, struct lpc10_encoder_state *st);
|
||||
/* comlen contrl_ 12 */
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* Common Block Declarations */
|
||||
|
||||
extern struct {
|
||||
integer order, lframe;
|
||||
logical corrp;
|
||||
} contrl_;
|
||||
|
||||
#define contrl_1 contrl_
|
||||
|
||||
/* ********************************************************************* */
|
||||
|
||||
/* DYPTRK Version 52 */
|
||||
|
||||
/* $Log: dyptrk.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:25:29 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_encoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_encoder_state().
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:32:26 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.5 1996/03/26 19:35:35 jaf */
|
||||
/* Commented out trace statements. */
|
||||
|
||||
/* Revision 1.4 1996/03/19 18:03:22 jaf */
|
||||
/* Replaced the initialization "DATA P/60*DEPTH*0/" with "DATA P/120*0/", */
|
||||
/* because apparently Fortran (or at least f2c) can't handle expressions */
|
||||
/* like that. */
|
||||
|
||||
/* Revision 1.3 1996/03/19 17:38:32 jaf */
|
||||
/* Added comments about the local variables that should be saved from one */
|
||||
/* invocation to the next. None of them were given initial values in the */
|
||||
/* original code, but from my testing, it appears that initializing them */
|
||||
/* all to 0 works. */
|
||||
|
||||
/* Added entry INITDYPTRK to reinitialize these local variables. */
|
||||
|
||||
/* Revision 1.2 1996/03/13 16:32:17 jaf */
|
||||
/* Comments added explaining which of the local variables of this */
|
||||
/* subroutine need to be saved from one invocation to the next, and which */
|
||||
/* do not. */
|
||||
|
||||
/* WARNING! Some of them that should are never given initial values in */
|
||||
/* this code. Hopefully, Fortran 77 defines initial values for them, but */
|
||||
/* even so, giving them explicit initial values is preferable. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:45:14 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ********************************************************************* */
|
||||
|
||||
/* Dynamic Pitch Tracker */
|
||||
|
||||
/* Input: */
|
||||
/* AMDF - Average Magnitude Difference Function array */
|
||||
/* Indices 1 through LTAU read, and MINPTR */
|
||||
/* LTAU - Number of lags in AMDF */
|
||||
/* MINPTR - Location of minimum AMDF value */
|
||||
/* VOICE - Voicing decision */
|
||||
/* Output: */
|
||||
/* PITCH - Smoothed pitch value, 2 frames delayed */
|
||||
/* MIDX - Initial estimate of current frame pitch */
|
||||
/* Compile time constant: */
|
||||
/* DEPTH - Number of frames to trace back */
|
||||
|
||||
/* This subroutine maintains local state from one call to the next. If */
|
||||
/* you want to switch to using a new audio stream for this filter, or */
|
||||
/* reinitialize its state for any other reason, call the ENTRY */
|
||||
/* INITDYPTRK. */
|
||||
|
||||
/* Subroutine */ int dyptrk_(real *amdf, integer *ltau, integer *
|
||||
minptr, integer *voice, integer *pitch, integer *midx,
|
||||
struct lpc10_encoder_state *st)
|
||||
{
|
||||
/* Initialized data */
|
||||
|
||||
real *s;
|
||||
integer *p;
|
||||
integer *ipoint;
|
||||
real *alphax;
|
||||
|
||||
/* System generated locals */
|
||||
integer i__1;
|
||||
|
||||
/* Local variables */
|
||||
integer pbar;
|
||||
real sbar;
|
||||
integer path[2], iptr, i__, j;
|
||||
real alpha, minsc, maxsc;
|
||||
|
||||
/* Arguments */
|
||||
/* $Log: dyptrk.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:25:29 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_encoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_encoder_state().
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:32:26 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/29 22:05:55 jaf */
|
||||
/* Commented out the common block variables that are not needed by the */
|
||||
/* embedded version. */
|
||||
|
||||
/* Revision 1.2 1996/03/26 19:34:50 jaf */
|
||||
/* Added comments indicating which constants are not needed in an */
|
||||
/* application that uses the LPC-10 coder. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:44:09 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
/* LPC Processing control variables: */
|
||||
|
||||
/* *** Read-only: initialized in setup */
|
||||
|
||||
/* Files for Speech, Parameter, and Bitstream Input & Output, */
|
||||
/* and message and debug outputs. */
|
||||
|
||||
/* Here are the only files which use these variables: */
|
||||
|
||||
/* lpcsim.f setup.f trans.f error.f vqsetup.f */
|
||||
|
||||
/* Many files which use fdebug are not listed, since it is only used in */
|
||||
/* those other files conditionally, to print trace statements. */
|
||||
/* integer fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
|
||||
/* LPC order, Frame size, Quantization rate, Bits per frame, */
|
||||
/* Error correction */
|
||||
/* Subroutine SETUP is the only place where order is assigned a value, */
|
||||
/* and that value is 10. It could increase efficiency 1% or so to */
|
||||
/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as
|
||||
*/
|
||||
/* a variable in a COMMON block, since it is used in many places in the */
|
||||
/* core of the coding and decoding routines. Actually, I take that back.
|
||||
*/
|
||||
/* At least when compiling with f2c, the upper bound of DO loops is */
|
||||
/* stored in a local variable before the DO loop begins, and then that is
|
||||
*/
|
||||
/* compared against on each iteration. */
|
||||
/* Similarly for lframe, which is given a value of MAXFRM in SETUP. */
|
||||
/* Similarly for quant, which is given a value of 2400 in SETUP. quant */
|
||||
/* is used in only a few places, and never in the core coding and */
|
||||
/* decoding routines, so it could be eliminated entirely. */
|
||||
/* nbits is similar to quant, and is given a value of 54 in SETUP. */
|
||||
/* corrp is given a value of .TRUE. in SETUP, and is only used in the */
|
||||
/* subroutines ENCODE and DECODE. It doesn't affect the speed of the */
|
||||
/* coder significantly whether it is .TRUE. or .FALSE., or whether it is
|
||||
*/
|
||||
/* a constant or a variable, since it is only examined once per frame. */
|
||||
/* Leaving it as a variable that is set to .TRUE. seems like a good */
|
||||
/* idea, since it does enable some error-correction capability for */
|
||||
/* unvoiced frames, with no change in the coding rate, and no noticeable
|
||||
*/
|
||||
/* quality difference in the decoded speech. */
|
||||
/* integer quant, nbits */
|
||||
/* *** Read/write: variables for debugging, not needed for LPC algorithm
|
||||
*/
|
||||
|
||||
/* Current frame, Unstable frames, Output clip count, Max onset buffer,
|
||||
*/
|
||||
/* Debug listing detail level, Line count on listing page */
|
||||
|
||||
/* nframe is not needed for an embedded LPC10 at all. */
|
||||
/* nunsfm is initialized to 0 in SETUP, and incremented in subroutine */
|
||||
/* ERROR, which is only called from RCCHK. When LPC10 is embedded into */
|
||||
/* an application, I would recommend removing the call to ERROR in RCCHK,
|
||||
*/
|
||||
/* and remove ERROR and nunsfm completely. */
|
||||
/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in
|
||||
*/
|
||||
/* sread.f. When LPC10 is embedded into an application, one might want */
|
||||
/* to cause it to be incremented in a routine that takes the output of */
|
||||
/* SYNTHS and sends it to an audio device. It could be optionally */
|
||||
/* displayed, for those that might want to know what it is. */
|
||||
/* maxosp is never initialized to 0 in SETUP, although it probably should
|
||||
*/
|
||||
/* be, and it is updated in subroutine ANALYS. I doubt that its value */
|
||||
/* would be of much interest to an application in which LPC10 is */
|
||||
/* embedded. */
|
||||
/* listl and lincnt are not needed for an embedded LPC10 at all. */
|
||||
/* integer nframe, nunsfm, iclip, maxosp, listl, lincnt */
|
||||
/* common /contrl/ fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
|
||||
/* common /contrl/ quant, nbits */
|
||||
/* common /contrl/ nframe, nunsfm, iclip, maxosp, listl, lincnt */
|
||||
/* Parameters/constants */
|
||||
/* Local variables that need not be saved */
|
||||
/* Note that PATH is only used for debugging purposes, and can be */
|
||||
/* removed. */
|
||||
/* Local state */
|
||||
/* It would be a bit more "general" to define S(LTAU), if Fortran */
|
||||
/* allows the argument of a function to be used as the dimension of
|
||||
*/
|
||||
/* a local array variable. */
|
||||
/* IPOINT is always in the range 0 to DEPTH-1. */
|
||||
/* WARNING! */
|
||||
|
||||
/* In the original version of this subroutine, IPOINT, ALPHAX, */
|
||||
/* every element of S, and potentially any element of P with the */
|
||||
/* second index value .NE. IPTR were read without being given */
|
||||
/* initial values (all indices of P with second index equal to */
|
||||
/* IPTR are all written before being read in this subroutine). */
|
||||
|
||||
/* From examining the code carefully, it appears that all of these
|
||||
*/
|
||||
/* should be saved from one invocation to the next. */
|
||||
|
||||
/* I've run lpcsim with the "-l 6" option to see all of the */
|
||||
/* debugging information that is printed out by this subroutine */
|
||||
/* below, and it appears that S, P, IPOINT, and ALPHAX are all */
|
||||
/* initialized to 0 (these initial values would likely be different
|
||||
*/
|
||||
/* on different platforms, compilers, etc.). Given that the output
|
||||
*/
|
||||
/* of the coder sounds reasonable, I'm going to initialize these */
|
||||
/* variables to 0 explicitly. */
|
||||
|
||||
s = &(st->s[0]);
|
||||
p = &(st->p[0]);
|
||||
ipoint = &(st->ipoint);
|
||||
alphax = &(st->alphax);
|
||||
|
||||
|
||||
/* Parameter adjustments */
|
||||
if (amdf) {
|
||||
--amdf;
|
||||
}
|
||||
|
||||
/* Function Body */
|
||||
|
||||
/* Calculate the confidence factor ALPHA, used as a threshold slope in
|
||||
*/
|
||||
/* SEESAW. If unvoiced, set high slope so that every point in P array
|
||||
*/
|
||||
/* is marked as a potential pitch frequency. A scaled up version (ALPHAX
|
||||
)*/
|
||||
/* is used to maintain arithmetic precision. */
|
||||
if (*voice == 1) {
|
||||
*alphax = *alphax * .75f + amdf[*minptr] / 2.f;
|
||||
} else {
|
||||
*alphax *= .984375f;
|
||||
}
|
||||
alpha = *alphax / 16;
|
||||
if (*voice == 0 && *alphax < 128.f) {
|
||||
alpha = 8.f;
|
||||
}
|
||||
/* SEESAW: Construct a pitch pointer array and intermediate winner functio
|
||||
n*/
|
||||
/* Left to right pass: */
|
||||
iptr = *ipoint + 1;
|
||||
p[iptr * 60 - 60] = 1;
|
||||
i__ = 1;
|
||||
pbar = 1;
|
||||
sbar = s[0];
|
||||
i__1 = *ltau;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
sbar += alpha;
|
||||
if (sbar < s[i__ - 1]) {
|
||||
s[i__ - 1] = sbar;
|
||||
p[i__ + iptr * 60 - 61] = pbar;
|
||||
} else {
|
||||
sbar = s[i__ - 1];
|
||||
p[i__ + iptr * 60 - 61] = i__;
|
||||
pbar = i__;
|
||||
}
|
||||
}
|
||||
/* Right to left pass: */
|
||||
i__ = pbar - 1;
|
||||
sbar = s[i__];
|
||||
while(i__ >= 1) {
|
||||
sbar += alpha;
|
||||
if (sbar < s[i__ - 1]) {
|
||||
s[i__ - 1] = sbar;
|
||||
p[i__ + iptr * 60 - 61] = pbar;
|
||||
} else {
|
||||
pbar = p[i__ + iptr * 60 - 61];
|
||||
i__ = pbar;
|
||||
sbar = s[i__ - 1];
|
||||
}
|
||||
--i__;
|
||||
}
|
||||
/* Update S using AMDF */
|
||||
/* Find maximum, minimum, and location of minimum */
|
||||
s[0] += amdf[1] / 2;
|
||||
minsc = s[0];
|
||||
maxsc = minsc;
|
||||
*midx = 1;
|
||||
i__1 = *ltau;
|
||||
for (i__ = 2; i__ <= i__1; ++i__) {
|
||||
s[i__ - 1] += amdf[i__] / 2;
|
||||
if (s[i__ - 1] > maxsc) {
|
||||
maxsc = s[i__ - 1];
|
||||
}
|
||||
if (s[i__ - 1] < minsc) {
|
||||
*midx = i__;
|
||||
minsc = s[i__ - 1];
|
||||
}
|
||||
}
|
||||
/* Subtract MINSC from S to prevent overflow */
|
||||
i__1 = *ltau;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
s[i__ - 1] -= minsc;
|
||||
}
|
||||
maxsc -= minsc;
|
||||
/* Use higher octave pitch if significant null there */
|
||||
j = 0;
|
||||
for (i__ = 20; i__ <= 40; i__ += 10) {
|
||||
if (*midx > i__) {
|
||||
if (s[*midx - i__ - 1] < maxsc / 4) {
|
||||
j = i__;
|
||||
}
|
||||
}
|
||||
}
|
||||
*midx -= j;
|
||||
/* TRACE: look back two frames to find minimum cost pitch estimate */
|
||||
j = *ipoint;
|
||||
*pitch = *midx;
|
||||
for (i__ = 1; i__ <= 2; ++i__) {
|
||||
j = j % 2 + 1;
|
||||
*pitch = p[*pitch + j * 60 - 61];
|
||||
path[i__ - 1] = *pitch;
|
||||
}
|
||||
|
||||
/* The following statement subtracts one from IPOINT, mod DEPTH. I
|
||||
*/
|
||||
/* think the author chose to add DEPTH-1, instead of subtracting 1,
|
||||
*/
|
||||
/* because then it will work even if MOD doesn't work as desired on
|
||||
*/
|
||||
/* negative arguments. */
|
||||
|
||||
*ipoint = (*ipoint + 1) % 2;
|
||||
return 0;
|
||||
} /* dyptrk_ */
|
||||
|
||||
+364
-364
@@ -1,364 +1,364 @@
|
||||
/*
|
||||
|
||||
$Log: encode_.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.1 1996/08/19 22:32:21 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int encode_(integer *voice, integer *pitch, real *rms, real *rc, integer *ipitch, integer *irms, integer *irc);
|
||||
/* comlen contrl_ 12 */
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* Common Block Declarations */
|
||||
|
||||
extern struct {
|
||||
integer order, lframe;
|
||||
logical corrp;
|
||||
} contrl_;
|
||||
|
||||
#define contrl_1 contrl_
|
||||
|
||||
/* Table of constant values */
|
||||
|
||||
static integer c__2 = 2;
|
||||
|
||||
/* ***************************************************************** */
|
||||
|
||||
/* ENCODE Version 54 */
|
||||
|
||||
/* $Log: encode_.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:32:21 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.5 1996/03/26 19:35:50 jaf */
|
||||
/* Commented out trace statements. */
|
||||
|
||||
/* Revision 1.4 1996/03/21 00:26:29 jaf */
|
||||
/* Added the comment that this subroutine has no local state. */
|
||||
|
||||
/* In the last check-in, I forgot to mention that I had added comments */
|
||||
/* explaining which indices of array arguments are read or written. */
|
||||
|
||||
/* Revision 1.3 1996/03/21 00:22:39 jaf */
|
||||
/* Added comments explaining that all local arrays are effectively */
|
||||
/* constants. */
|
||||
|
||||
/* Revision 1.2 1996/03/13 18:48:33 jaf */
|
||||
/* Comments added explaining that none of the local variables of this */
|
||||
/* subroutine need to be saved from one invocation to the next. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:45:29 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ***************************************************************** */
|
||||
|
||||
/* Quantize LPC parameters for transmission */
|
||||
|
||||
/* INPUTS: */
|
||||
/* VOICE - Half frame voicing decisions */
|
||||
/* Indices 1 through 2 read. */
|
||||
/* PITCH - Pitch */
|
||||
/* RMS - Energy */
|
||||
/* RC - Reflection coefficients */
|
||||
/* Indices 1 through ORDER read. */
|
||||
/* CORRP - Error Correction: TRUE = yes, FALSE = none */
|
||||
/* (this is defined in file control.fh) */
|
||||
/* OUTPUTS: */
|
||||
/* IPITCH - Coded pitch and voicing */
|
||||
/* IRMS - Quantized energy */
|
||||
/* IRC - Quantized reflection coefficients */
|
||||
/* Indices 1 through MAX(ORDER,2) written. */
|
||||
/* If CORRP is .TRUE., then indices 1 through 10 written */
|
||||
/* for unvoiced frames. */
|
||||
|
||||
/* This subroutine has no local state. */
|
||||
|
||||
/* Subroutine */ int encode_(integer *voice, integer *pitch, real *rms, real *
|
||||
rc, integer *ipitch, integer *irms, integer *irc)
|
||||
{
|
||||
/* Initialized data */
|
||||
|
||||
static integer enctab[16] = { 0,7,11,12,13,10,6,1,14,9,5,2,3,4,8,15 };
|
||||
static integer entau[60] = { 19,11,27,25,29,21,23,22,30,14,15,7,39,38,46,
|
||||
42,43,41,45,37,53,49,51,50,54,52,60,56,58,26,90,88,92,84,86,82,83,
|
||||
81,85,69,77,73,75,74,78,70,71,67,99,97,113,112,114,98,106,104,108,
|
||||
100,101,76 };
|
||||
static integer enadd[8] = { 1920,-768,2432,1280,3584,1536,2816,-1152 };
|
||||
static real enscl[8] = { .0204f,.0167f,.0145f,.0147f,.0143f,.0135f,.0125f,
|
||||
.0112f };
|
||||
static integer enbits[8] = { 6,5,4,4,4,4,3,3 };
|
||||
static integer entab6[64] = { 0,0,0,0,0,0,1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,
|
||||
3,3,3,3,3,4,4,4,4,4,4,4,5,5,5,5,5,6,6,6,6,6,7,7,7,7,7,8,8,8,8,9,9,
|
||||
9,10,10,11,11,12,13,14,15 };
|
||||
static integer rmst[64] = { 1024,936,856,784,718,656,600,550,502,460,420,
|
||||
384,352,328,294,270,246,226,206,188,172,158,144,132,120,110,102,
|
||||
92,84,78,70,64,60,54,50,46,42,38,34,32,30,26,24,22,20,18,17,16,15,
|
||||
14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 };
|
||||
|
||||
/* System generated locals */
|
||||
integer i__1, i__2;
|
||||
|
||||
/* Builtin functions */
|
||||
integer pow_ii(integer *, integer *);
|
||||
|
||||
/* Local variables */
|
||||
integer idel, nbit, i__, j, i2, i3, mrk;
|
||||
|
||||
/* $Log: encode_.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:32:21 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/29 22:03:47 jaf */
|
||||
/* Removed definitions for any constants that were no longer used. */
|
||||
|
||||
/* Revision 1.2 1996/03/26 19:34:33 jaf */
|
||||
/* Added comments indicating which constants are not needed in an */
|
||||
/* application that uses the LPC-10 coder. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:43:51 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
/* LPC Configuration parameters: */
|
||||
/* Frame size, Prediction order, Pitch period */
|
||||
/* Arguments */
|
||||
/* $Log: encode_.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:32:21 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/29 22:05:55 jaf */
|
||||
/* Commented out the common block variables that are not needed by the */
|
||||
/* embedded version. */
|
||||
|
||||
/* Revision 1.2 1996/03/26 19:34:50 jaf */
|
||||
/* Added comments indicating which constants are not needed in an */
|
||||
/* application that uses the LPC-10 coder. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:44:09 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
/* LPC Processing control variables: */
|
||||
|
||||
/* *** Read-only: initialized in setup */
|
||||
|
||||
/* Files for Speech, Parameter, and Bitstream Input & Output, */
|
||||
/* and message and debug outputs. */
|
||||
|
||||
/* Here are the only files which use these variables: */
|
||||
|
||||
/* lpcsim.f setup.f trans.f error.f vqsetup.f */
|
||||
|
||||
/* Many files which use fdebug are not listed, since it is only used in */
|
||||
/* those other files conditionally, to print trace statements. */
|
||||
/* integer fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
|
||||
/* LPC order, Frame size, Quantization rate, Bits per frame, */
|
||||
/* Error correction */
|
||||
/* Subroutine SETUP is the only place where order is assigned a value, */
|
||||
/* and that value is 10. It could increase efficiency 1% or so to */
|
||||
/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as
|
||||
*/
|
||||
/* a variable in a COMMON block, since it is used in many places in the */
|
||||
/* core of the coding and decoding routines. Actually, I take that back.
|
||||
*/
|
||||
/* At least when compiling with f2c, the upper bound of DO loops is */
|
||||
/* stored in a local variable before the DO loop begins, and then that is
|
||||
*/
|
||||
/* compared against on each iteration. */
|
||||
/* Similarly for lframe, which is given a value of MAXFRM in SETUP. */
|
||||
/* Similarly for quant, which is given a value of 2400 in SETUP. quant */
|
||||
/* is used in only a few places, and never in the core coding and */
|
||||
/* decoding routines, so it could be eliminated entirely. */
|
||||
/* nbits is similar to quant, and is given a value of 54 in SETUP. */
|
||||
/* corrp is given a value of .TRUE. in SETUP, and is only used in the */
|
||||
/* subroutines ENCODE and DECODE. It doesn't affect the speed of the */
|
||||
/* coder significantly whether it is .TRUE. or .FALSE., or whether it is
|
||||
*/
|
||||
/* a constant or a variable, since it is only examined once per frame. */
|
||||
/* Leaving it as a variable that is set to .TRUE. seems like a good */
|
||||
/* idea, since it does enable some error-correction capability for */
|
||||
/* unvoiced frames, with no change in the coding rate, and no noticeable
|
||||
*/
|
||||
/* quality difference in the decoded speech. */
|
||||
/* integer quant, nbits */
|
||||
/* *** Read/write: variables for debugging, not needed for LPC algorithm
|
||||
*/
|
||||
|
||||
/* Current frame, Unstable frames, Output clip count, Max onset buffer,
|
||||
*/
|
||||
/* Debug listing detail level, Line count on listing page */
|
||||
|
||||
/* nframe is not needed for an embedded LPC10 at all. */
|
||||
/* nunsfm is initialized to 0 in SETUP, and incremented in subroutine */
|
||||
/* ERROR, which is only called from RCCHK. When LPC10 is embedded into */
|
||||
/* an application, I would recommend removing the call to ERROR in RCCHK,
|
||||
*/
|
||||
/* and remove ERROR and nunsfm completely. */
|
||||
/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in
|
||||
*/
|
||||
/* sread.f. When LPC10 is embedded into an application, one might want */
|
||||
/* to cause it to be incremented in a routine that takes the output of */
|
||||
/* SYNTHS and sends it to an audio device. It could be optionally */
|
||||
/* displayed, for those that might want to know what it is. */
|
||||
/* maxosp is never initialized to 0 in SETUP, although it probably should
|
||||
*/
|
||||
/* be, and it is updated in subroutine ANALYS. I doubt that its value */
|
||||
/* would be of much interest to an application in which LPC10 is */
|
||||
/* embedded. */
|
||||
/* listl and lincnt are not needed for an embedded LPC10 at all. */
|
||||
/* integer nframe, nunsfm, iclip, maxosp, listl, lincnt */
|
||||
/* common /contrl/ fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
|
||||
/* common /contrl/ quant, nbits */
|
||||
/* common /contrl/ nframe, nunsfm, iclip, maxosp, listl, lincnt */
|
||||
/* Parameters/constants */
|
||||
/* These arrays are not Fortran PARAMETER's, but they are defined */
|
||||
/* by DATA statements below, and their contents are never altered.
|
||||
*/
|
||||
/* Local variables that need not be saved */
|
||||
/* Parameter adjustments */
|
||||
--irc;
|
||||
--rc;
|
||||
--voice;
|
||||
|
||||
/* Function Body */
|
||||
/* Scale RMS and RC's to integers */
|
||||
*irms = (integer)*rms;
|
||||
i__1 = contrl_1.order;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
irc[i__] = (integer)(rc[i__] * 32768.f);
|
||||
}
|
||||
/* IF(LISTL.GE.3)WRITE(FDEBUG,800)VOICE,PITCH,IRMS,(IRC(I),I=1,ORDER) */
|
||||
/* 800 FORMAT(1X,/,' <<ENCODE IN>>',T32,2I3,I6,I5,T50,10I8) */
|
||||
/* Encode pitch and voicing */
|
||||
if (voice[1] != 0 && voice[2] != 0) {
|
||||
*ipitch = entau[*pitch - 1];
|
||||
} else {
|
||||
if (contrl_1.corrp) {
|
||||
*ipitch = 0;
|
||||
if (voice[1] != voice[2]) {
|
||||
*ipitch = 127;
|
||||
}
|
||||
} else {
|
||||
*ipitch = (voice[1] << 1) + voice[2];
|
||||
}
|
||||
}
|
||||
/* Encode RMS by binary table search */
|
||||
j = 32;
|
||||
idel = 16;
|
||||
*irms = min(*irms,1023);
|
||||
while(idel > 0) {
|
||||
if (*irms > rmst[j - 1]) {
|
||||
j -= idel;
|
||||
}
|
||||
if (*irms < rmst[j - 1]) {
|
||||
j += idel;
|
||||
}
|
||||
idel /= 2;
|
||||
}
|
||||
if (*irms > rmst[j - 1]) {
|
||||
--j;
|
||||
}
|
||||
*irms = 31 - j / 2;
|
||||
/* Encode RC(1) and (2) as log-area-ratios */
|
||||
for (i__ = 1; i__ <= 2; ++i__) {
|
||||
i2 = irc[i__];
|
||||
mrk = 0;
|
||||
if (i2 < 0) {
|
||||
i2 = -i2;
|
||||
mrk = 1;
|
||||
}
|
||||
i2 /= 512;
|
||||
i2 = min(i2,63);
|
||||
i2 = entab6[i2];
|
||||
if (mrk != 0) {
|
||||
i2 = -i2;
|
||||
}
|
||||
irc[i__] = i2;
|
||||
}
|
||||
/* Encode RC(3) - (10) linearly, remove bias then scale */
|
||||
i__1 = contrl_1.order;
|
||||
for (i__ = 3; i__ <= i__1; ++i__) {
|
||||
i2 = irc[i__] / 2;
|
||||
i2 = (integer)((i2 + enadd[contrl_1.order + 1 - i__ - 1]) * enscl[
|
||||
contrl_1.order + 1 - i__ - 1]);
|
||||
/* Computing MIN */
|
||||
i__2 = max(i2,-127);
|
||||
i2 = min(i__2,127);
|
||||
nbit = enbits[contrl_1.order + 1 - i__ - 1];
|
||||
i3 = 0;
|
||||
if (i2 < 0) {
|
||||
i3 = -1;
|
||||
}
|
||||
i2 /= pow_ii(&c__2, &nbit);
|
||||
if (i3 == -1) {
|
||||
--i2;
|
||||
}
|
||||
irc[i__] = i2;
|
||||
}
|
||||
/* Protect the most significant bits of the most */
|
||||
/* important parameters during non-voiced frames. */
|
||||
/* RC(1) - RC(4) are protected using 20 parity bits */
|
||||
/* replacing RC(5) - RC(10). */
|
||||
if (contrl_1.corrp) {
|
||||
if (*ipitch == 0 || *ipitch == 127) {
|
||||
irc[5] = enctab[(irc[1] & 30) / 2];
|
||||
irc[6] = enctab[(irc[2] & 30) / 2];
|
||||
irc[7] = enctab[(irc[3] & 30) / 2];
|
||||
irc[8] = enctab[(*irms & 30) / 2];
|
||||
irc[9] = enctab[(irc[4] & 30) / 2] / 2;
|
||||
irc[10] = enctab[(irc[4] & 30) / 2] & 1;
|
||||
}
|
||||
}
|
||||
/* IF(LISTL.GE.3)WRITE(FDEBUG,801)VOICE,IPITCH,IRMS,(IRC(J),J=1,ORDER) */
|
||||
/* 801 FORMAT(1X,'<<ENCODE OUT>>',T32,2I3,I6,I5,T50,10I8) */
|
||||
return 0;
|
||||
} /* encode_ */
|
||||
|
||||
/*
|
||||
|
||||
$Log: encode_.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.1 1996/08/19 22:32:21 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int encode_(integer *voice, integer *pitch, real *rms, real *rc, integer *ipitch, integer *irms, integer *irc);
|
||||
/* comlen contrl_ 12 */
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* Common Block Declarations */
|
||||
|
||||
extern struct {
|
||||
integer order, lframe;
|
||||
logical corrp;
|
||||
} contrl_;
|
||||
|
||||
#define contrl_1 contrl_
|
||||
|
||||
/* Table of constant values */
|
||||
|
||||
static integer c__2 = 2;
|
||||
|
||||
/* ***************************************************************** */
|
||||
|
||||
/* ENCODE Version 54 */
|
||||
|
||||
/* $Log: encode_.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:32:21 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.5 1996/03/26 19:35:50 jaf */
|
||||
/* Commented out trace statements. */
|
||||
|
||||
/* Revision 1.4 1996/03/21 00:26:29 jaf */
|
||||
/* Added the comment that this subroutine has no local state. */
|
||||
|
||||
/* In the last check-in, I forgot to mention that I had added comments */
|
||||
/* explaining which indices of array arguments are read or written. */
|
||||
|
||||
/* Revision 1.3 1996/03/21 00:22:39 jaf */
|
||||
/* Added comments explaining that all local arrays are effectively */
|
||||
/* constants. */
|
||||
|
||||
/* Revision 1.2 1996/03/13 18:48:33 jaf */
|
||||
/* Comments added explaining that none of the local variables of this */
|
||||
/* subroutine need to be saved from one invocation to the next. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:45:29 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ***************************************************************** */
|
||||
|
||||
/* Quantize LPC parameters for transmission */
|
||||
|
||||
/* INPUTS: */
|
||||
/* VOICE - Half frame voicing decisions */
|
||||
/* Indices 1 through 2 read. */
|
||||
/* PITCH - Pitch */
|
||||
/* RMS - Energy */
|
||||
/* RC - Reflection coefficients */
|
||||
/* Indices 1 through ORDER read. */
|
||||
/* CORRP - Error Correction: TRUE = yes, FALSE = none */
|
||||
/* (this is defined in file control.fh) */
|
||||
/* OUTPUTS: */
|
||||
/* IPITCH - Coded pitch and voicing */
|
||||
/* IRMS - Quantized energy */
|
||||
/* IRC - Quantized reflection coefficients */
|
||||
/* Indices 1 through MAX(ORDER,2) written. */
|
||||
/* If CORRP is .TRUE., then indices 1 through 10 written */
|
||||
/* for unvoiced frames. */
|
||||
|
||||
/* This subroutine has no local state. */
|
||||
|
||||
/* Subroutine */ int encode_(integer *voice, integer *pitch, real *rms, real *
|
||||
rc, integer *ipitch, integer *irms, integer *irc)
|
||||
{
|
||||
/* Initialized data */
|
||||
|
||||
static integer enctab[16] = { 0,7,11,12,13,10,6,1,14,9,5,2,3,4,8,15 };
|
||||
static integer entau[60] = { 19,11,27,25,29,21,23,22,30,14,15,7,39,38,46,
|
||||
42,43,41,45,37,53,49,51,50,54,52,60,56,58,26,90,88,92,84,86,82,83,
|
||||
81,85,69,77,73,75,74,78,70,71,67,99,97,113,112,114,98,106,104,108,
|
||||
100,101,76 };
|
||||
static integer enadd[8] = { 1920,-768,2432,1280,3584,1536,2816,-1152 };
|
||||
static real enscl[8] = { .0204f,.0167f,.0145f,.0147f,.0143f,.0135f,.0125f,
|
||||
.0112f };
|
||||
static integer enbits[8] = { 6,5,4,4,4,4,3,3 };
|
||||
static integer entab6[64] = { 0,0,0,0,0,0,1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,
|
||||
3,3,3,3,3,4,4,4,4,4,4,4,5,5,5,5,5,6,6,6,6,6,7,7,7,7,7,8,8,8,8,9,9,
|
||||
9,10,10,11,11,12,13,14,15 };
|
||||
static integer rmst[64] = { 1024,936,856,784,718,656,600,550,502,460,420,
|
||||
384,352,328,294,270,246,226,206,188,172,158,144,132,120,110,102,
|
||||
92,84,78,70,64,60,54,50,46,42,38,34,32,30,26,24,22,20,18,17,16,15,
|
||||
14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 };
|
||||
|
||||
/* System generated locals */
|
||||
integer i__1, i__2;
|
||||
|
||||
/* Builtin functions */
|
||||
integer pow_ii(integer *, integer *);
|
||||
|
||||
/* Local variables */
|
||||
integer idel, nbit, i__, j, i2, i3, mrk;
|
||||
|
||||
/* $Log: encode_.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:32:21 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/29 22:03:47 jaf */
|
||||
/* Removed definitions for any constants that were no longer used. */
|
||||
|
||||
/* Revision 1.2 1996/03/26 19:34:33 jaf */
|
||||
/* Added comments indicating which constants are not needed in an */
|
||||
/* application that uses the LPC-10 coder. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:43:51 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
/* LPC Configuration parameters: */
|
||||
/* Frame size, Prediction order, Pitch period */
|
||||
/* Arguments */
|
||||
/* $Log: encode_.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:32:21 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/29 22:05:55 jaf */
|
||||
/* Commented out the common block variables that are not needed by the */
|
||||
/* embedded version. */
|
||||
|
||||
/* Revision 1.2 1996/03/26 19:34:50 jaf */
|
||||
/* Added comments indicating which constants are not needed in an */
|
||||
/* application that uses the LPC-10 coder. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:44:09 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
/* LPC Processing control variables: */
|
||||
|
||||
/* *** Read-only: initialized in setup */
|
||||
|
||||
/* Files for Speech, Parameter, and Bitstream Input & Output, */
|
||||
/* and message and debug outputs. */
|
||||
|
||||
/* Here are the only files which use these variables: */
|
||||
|
||||
/* lpcsim.f setup.f trans.f error.f vqsetup.f */
|
||||
|
||||
/* Many files which use fdebug are not listed, since it is only used in */
|
||||
/* those other files conditionally, to print trace statements. */
|
||||
/* integer fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
|
||||
/* LPC order, Frame size, Quantization rate, Bits per frame, */
|
||||
/* Error correction */
|
||||
/* Subroutine SETUP is the only place where order is assigned a value, */
|
||||
/* and that value is 10. It could increase efficiency 1% or so to */
|
||||
/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as
|
||||
*/
|
||||
/* a variable in a COMMON block, since it is used in many places in the */
|
||||
/* core of the coding and decoding routines. Actually, I take that back.
|
||||
*/
|
||||
/* At least when compiling with f2c, the upper bound of DO loops is */
|
||||
/* stored in a local variable before the DO loop begins, and then that is
|
||||
*/
|
||||
/* compared against on each iteration. */
|
||||
/* Similarly for lframe, which is given a value of MAXFRM in SETUP. */
|
||||
/* Similarly for quant, which is given a value of 2400 in SETUP. quant */
|
||||
/* is used in only a few places, and never in the core coding and */
|
||||
/* decoding routines, so it could be eliminated entirely. */
|
||||
/* nbits is similar to quant, and is given a value of 54 in SETUP. */
|
||||
/* corrp is given a value of .TRUE. in SETUP, and is only used in the */
|
||||
/* subroutines ENCODE and DECODE. It doesn't affect the speed of the */
|
||||
/* coder significantly whether it is .TRUE. or .FALSE., or whether it is
|
||||
*/
|
||||
/* a constant or a variable, since it is only examined once per frame. */
|
||||
/* Leaving it as a variable that is set to .TRUE. seems like a good */
|
||||
/* idea, since it does enable some error-correction capability for */
|
||||
/* unvoiced frames, with no change in the coding rate, and no noticeable
|
||||
*/
|
||||
/* quality difference in the decoded speech. */
|
||||
/* integer quant, nbits */
|
||||
/* *** Read/write: variables for debugging, not needed for LPC algorithm
|
||||
*/
|
||||
|
||||
/* Current frame, Unstable frames, Output clip count, Max onset buffer,
|
||||
*/
|
||||
/* Debug listing detail level, Line count on listing page */
|
||||
|
||||
/* nframe is not needed for an embedded LPC10 at all. */
|
||||
/* nunsfm is initialized to 0 in SETUP, and incremented in subroutine */
|
||||
/* ERROR, which is only called from RCCHK. When LPC10 is embedded into */
|
||||
/* an application, I would recommend removing the call to ERROR in RCCHK,
|
||||
*/
|
||||
/* and remove ERROR and nunsfm completely. */
|
||||
/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in
|
||||
*/
|
||||
/* sread.f. When LPC10 is embedded into an application, one might want */
|
||||
/* to cause it to be incremented in a routine that takes the output of */
|
||||
/* SYNTHS and sends it to an audio device. It could be optionally */
|
||||
/* displayed, for those that might want to know what it is. */
|
||||
/* maxosp is never initialized to 0 in SETUP, although it probably should
|
||||
*/
|
||||
/* be, and it is updated in subroutine ANALYS. I doubt that its value */
|
||||
/* would be of much interest to an application in which LPC10 is */
|
||||
/* embedded. */
|
||||
/* listl and lincnt are not needed for an embedded LPC10 at all. */
|
||||
/* integer nframe, nunsfm, iclip, maxosp, listl, lincnt */
|
||||
/* common /contrl/ fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
|
||||
/* common /contrl/ quant, nbits */
|
||||
/* common /contrl/ nframe, nunsfm, iclip, maxosp, listl, lincnt */
|
||||
/* Parameters/constants */
|
||||
/* These arrays are not Fortran PARAMETER's, but they are defined */
|
||||
/* by DATA statements below, and their contents are never altered.
|
||||
*/
|
||||
/* Local variables that need not be saved */
|
||||
/* Parameter adjustments */
|
||||
--irc;
|
||||
--rc;
|
||||
--voice;
|
||||
|
||||
/* Function Body */
|
||||
/* Scale RMS and RC's to integers */
|
||||
*irms = (integer)*rms;
|
||||
i__1 = contrl_1.order;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
irc[i__] = (integer)(rc[i__] * 32768.f);
|
||||
}
|
||||
/* IF(LISTL.GE.3)WRITE(FDEBUG,800)VOICE,PITCH,IRMS,(IRC(I),I=1,ORDER) */
|
||||
/* 800 FORMAT(1X,/,' <<ENCODE IN>>',T32,2I3,I6,I5,T50,10I8) */
|
||||
/* Encode pitch and voicing */
|
||||
if (voice[1] != 0 && voice[2] != 0) {
|
||||
*ipitch = entau[*pitch - 1];
|
||||
} else {
|
||||
if (contrl_1.corrp) {
|
||||
*ipitch = 0;
|
||||
if (voice[1] != voice[2]) {
|
||||
*ipitch = 127;
|
||||
}
|
||||
} else {
|
||||
*ipitch = (voice[1] << 1) + voice[2];
|
||||
}
|
||||
}
|
||||
/* Encode RMS by binary table search */
|
||||
j = 32;
|
||||
idel = 16;
|
||||
*irms = min(*irms,1023);
|
||||
while(idel > 0) {
|
||||
if (*irms > rmst[j - 1]) {
|
||||
j -= idel;
|
||||
}
|
||||
if (*irms < rmst[j - 1]) {
|
||||
j += idel;
|
||||
}
|
||||
idel /= 2;
|
||||
}
|
||||
if (*irms > rmst[j - 1]) {
|
||||
--j;
|
||||
}
|
||||
*irms = 31 - j / 2;
|
||||
/* Encode RC(1) and (2) as log-area-ratios */
|
||||
for (i__ = 1; i__ <= 2; ++i__) {
|
||||
i2 = irc[i__];
|
||||
mrk = 0;
|
||||
if (i2 < 0) {
|
||||
i2 = -i2;
|
||||
mrk = 1;
|
||||
}
|
||||
i2 /= 512;
|
||||
i2 = min(i2,63);
|
||||
i2 = entab6[i2];
|
||||
if (mrk != 0) {
|
||||
i2 = -i2;
|
||||
}
|
||||
irc[i__] = i2;
|
||||
}
|
||||
/* Encode RC(3) - (10) linearly, remove bias then scale */
|
||||
i__1 = contrl_1.order;
|
||||
for (i__ = 3; i__ <= i__1; ++i__) {
|
||||
i2 = irc[i__] / 2;
|
||||
i2 = (integer)((i2 + enadd[contrl_1.order + 1 - i__ - 1]) * enscl[
|
||||
contrl_1.order + 1 - i__ - 1]);
|
||||
/* Computing MIN */
|
||||
i__2 = max(i2,-127);
|
||||
i2 = min(i__2,127);
|
||||
nbit = enbits[contrl_1.order + 1 - i__ - 1];
|
||||
i3 = 0;
|
||||
if (i2 < 0) {
|
||||
i3 = -1;
|
||||
}
|
||||
i2 /= pow_ii(&c__2, &nbit);
|
||||
if (i3 == -1) {
|
||||
--i2;
|
||||
}
|
||||
irc[i__] = i2;
|
||||
}
|
||||
/* Protect the most significant bits of the most */
|
||||
/* important parameters during non-voiced frames. */
|
||||
/* RC(1) - RC(4) are protected using 20 parity bits */
|
||||
/* replacing RC(5) - RC(10). */
|
||||
if (contrl_1.corrp) {
|
||||
if (*ipitch == 0 || *ipitch == 127) {
|
||||
irc[5] = enctab[(irc[1] & 30) / 2];
|
||||
irc[6] = enctab[(irc[2] & 30) / 2];
|
||||
irc[7] = enctab[(irc[3] & 30) / 2];
|
||||
irc[8] = enctab[(*irms & 30) / 2];
|
||||
irc[9] = enctab[(irc[4] & 30) / 2] / 2;
|
||||
irc[10] = enctab[(irc[4] & 30) / 2] & 1;
|
||||
}
|
||||
}
|
||||
/* IF(LISTL.GE.3)WRITE(FDEBUG,801)VOICE,IPITCH,IRMS,(IRC(J),J=1,ORDER) */
|
||||
/* 801 FORMAT(1X,'<<ENCODE OUT>>',T32,2I3,I6,I5,T50,10I8) */
|
||||
return 0;
|
||||
} /* encode_ */
|
||||
|
||||
|
||||
@@ -1,98 +1,98 @@
|
||||
/*
|
||||
|
||||
$Log: energy.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.1 1996/08/19 22:32:17 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int energy_(integer *len, real *speech, real *rms);
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* ********************************************************************* */
|
||||
|
||||
/* ENERGY Version 50 */
|
||||
|
||||
/* $Log: energy.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:32:17 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/18 21:17:41 jaf */
|
||||
/* Just added a few comments about which array indices of the arguments */
|
||||
/* are used, and mentioning that this subroutine has no local state. */
|
||||
|
||||
/* Revision 1.2 1996/03/13 16:46:02 jaf */
|
||||
/* Comments added explaining that none of the local variables of this */
|
||||
/* subroutine need to be saved from one invocation to the next. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:45:40 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ********************************************************************* */
|
||||
|
||||
/* Compute RMS energy. */
|
||||
|
||||
/* Input: */
|
||||
/* LEN - Length of speech buffer */
|
||||
/* SPEECH - Speech buffer */
|
||||
/* Indices 1 through LEN read. */
|
||||
/* Output: */
|
||||
/* RMS - Root Mean Square energy */
|
||||
|
||||
/* This subroutine has no local state. */
|
||||
|
||||
/* Subroutine */ int energy_(integer *len, real *speech, real *rms)
|
||||
{
|
||||
/* System generated locals */
|
||||
integer i__1;
|
||||
|
||||
/* Builtin functions */
|
||||
double sqrt(doublereal);
|
||||
|
||||
/* Local variables */
|
||||
integer i__;
|
||||
|
||||
/* Arguments */
|
||||
/* Local variables that need not be saved */
|
||||
/* Parameter adjustments */
|
||||
--speech;
|
||||
|
||||
/* Function Body */
|
||||
*rms = 0.f;
|
||||
i__1 = *len;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
*rms += speech[i__] * speech[i__];
|
||||
}
|
||||
*rms = (real)sqrt(*rms / *len);
|
||||
return 0;
|
||||
} /* energy_ */
|
||||
|
||||
/*
|
||||
|
||||
$Log: energy.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.1 1996/08/19 22:32:17 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int energy_(integer *len, real *speech, real *rms);
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* ********************************************************************* */
|
||||
|
||||
/* ENERGY Version 50 */
|
||||
|
||||
/* $Log: energy.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:32:17 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/18 21:17:41 jaf */
|
||||
/* Just added a few comments about which array indices of the arguments */
|
||||
/* are used, and mentioning that this subroutine has no local state. */
|
||||
|
||||
/* Revision 1.2 1996/03/13 16:46:02 jaf */
|
||||
/* Comments added explaining that none of the local variables of this */
|
||||
/* subroutine need to be saved from one invocation to the next. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:45:40 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ********************************************************************* */
|
||||
|
||||
/* Compute RMS energy. */
|
||||
|
||||
/* Input: */
|
||||
/* LEN - Length of speech buffer */
|
||||
/* SPEECH - Speech buffer */
|
||||
/* Indices 1 through LEN read. */
|
||||
/* Output: */
|
||||
/* RMS - Root Mean Square energy */
|
||||
|
||||
/* This subroutine has no local state. */
|
||||
|
||||
/* Subroutine */ int energy_(integer *len, real *speech, real *rms)
|
||||
{
|
||||
/* System generated locals */
|
||||
integer i__1;
|
||||
|
||||
/* Builtin functions */
|
||||
double sqrt(doublereal);
|
||||
|
||||
/* Local variables */
|
||||
integer i__;
|
||||
|
||||
/* Arguments */
|
||||
/* Local variables that need not be saved */
|
||||
/* Parameter adjustments */
|
||||
--speech;
|
||||
|
||||
/* Function Body */
|
||||
*rms = 0.f;
|
||||
i__1 = *len;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
*rms += speech[i__] * speech[i__];
|
||||
}
|
||||
*rms = (real)sqrt(*rms / *len);
|
||||
return 0;
|
||||
} /* energy_ */
|
||||
|
||||
|
||||
+252
-252
@@ -1,252 +1,252 @@
|
||||
/*
|
||||
|
||||
$Log: f2c.h,v $
|
||||
Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.2 1996/08/20 20:26:28 jaf
|
||||
* Any typedef defining a type that was used in lpc10_encoder_state or
|
||||
* lpc10_decoder_state struct's was commented out here and added to
|
||||
* lpc10.h.
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:32:13 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
* f2c.h
|
||||
*
|
||||
* SCCS ID: @(#)f2c.h 1.2 96/05/19
|
||||
*/
|
||||
|
||||
/* f2c.h -- Standard Fortran to C header file */
|
||||
|
||||
/** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed."
|
||||
|
||||
- From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */
|
||||
|
||||
#ifndef F2C_INCLUDE
|
||||
#define F2C_INCLUDE
|
||||
|
||||
#include "lpc10.h"
|
||||
|
||||
/*typedef long int integer;*/
|
||||
/*typedef INT32 integer;*/
|
||||
/*typedef short int shortint;*/
|
||||
/*typedef INT16 shortint;*/
|
||||
/*typedef float real;*/
|
||||
/* doublereal only used for function arguments to sqrt, exp, etc. */
|
||||
typedef double doublereal;
|
||||
/* 32 bits seems wasteful, but there really aren't that many logical
|
||||
* variables around, and making them 32 bits could avoid word
|
||||
* alignment problems, perhaps. */
|
||||
/*typedef long int logical;*/
|
||||
/*typedef INT32 logical;*/
|
||||
/* The following types are not used in the translated C code for the
|
||||
* LPC-10 coder, but they might be needed by the definitions down
|
||||
* below, so they don't cause compilation errors. */
|
||||
typedef char *address;
|
||||
typedef struct { real r, i; } complex;
|
||||
typedef struct { doublereal r, i; } doublecomplex;
|
||||
typedef short int shortlogical;
|
||||
typedef char logical1;
|
||||
typedef char integer1;
|
||||
/* typedef long long longint; */ /* system-dependent */
|
||||
|
||||
#define TRUE_ (1)
|
||||
#define FALSE_ (0)
|
||||
|
||||
/* Extern is for use with -E */
|
||||
#ifndef Extern
|
||||
#define Extern extern
|
||||
#endif
|
||||
|
||||
/* I/O stuff */
|
||||
|
||||
#ifdef f2c_i2
|
||||
/* for -i2 */
|
||||
typedef short flag;
|
||||
typedef short ftnlen;
|
||||
typedef short ftnint;
|
||||
#else
|
||||
typedef long int flag;
|
||||
typedef long int ftnlen;
|
||||
typedef long int ftnint;
|
||||
#endif
|
||||
|
||||
/*external read, write*/
|
||||
typedef struct
|
||||
{ flag cierr;
|
||||
ftnint ciunit;
|
||||
flag ciend;
|
||||
char *cifmt;
|
||||
ftnint cirec;
|
||||
} cilist;
|
||||
|
||||
/*internal read, write*/
|
||||
typedef struct
|
||||
{ flag icierr;
|
||||
char *iciunit;
|
||||
flag iciend;
|
||||
char *icifmt;
|
||||
ftnint icirlen;
|
||||
ftnint icirnum;
|
||||
} icilist;
|
||||
|
||||
/*open*/
|
||||
typedef struct
|
||||
{ flag oerr;
|
||||
ftnint ounit;
|
||||
char *ofnm;
|
||||
ftnlen ofnmlen;
|
||||
char *osta;
|
||||
char *oacc;
|
||||
char *ofm;
|
||||
ftnint orl;
|
||||
char *oblnk;
|
||||
} olist;
|
||||
|
||||
/*close*/
|
||||
typedef struct
|
||||
{ flag cerr;
|
||||
ftnint cunit;
|
||||
char *csta;
|
||||
} cllist;
|
||||
|
||||
/*rewind, backspace, endfile*/
|
||||
typedef struct
|
||||
{ flag aerr;
|
||||
ftnint aunit;
|
||||
} alist;
|
||||
|
||||
/* inquire */
|
||||
typedef struct
|
||||
{ flag inerr;
|
||||
ftnint inunit;
|
||||
char *infile;
|
||||
ftnlen infilen;
|
||||
ftnint *inex; /*parameters in standard's order*/
|
||||
ftnint *inopen;
|
||||
ftnint *innum;
|
||||
ftnint *innamed;
|
||||
char *inname;
|
||||
ftnlen innamlen;
|
||||
char *inacc;
|
||||
ftnlen inacclen;
|
||||
char *inseq;
|
||||
ftnlen inseqlen;
|
||||
char *indir;
|
||||
ftnlen indirlen;
|
||||
char *infmt;
|
||||
ftnlen infmtlen;
|
||||
char *inform;
|
||||
ftnint informlen;
|
||||
char *inunf;
|
||||
ftnlen inunflen;
|
||||
ftnint *inrecl;
|
||||
ftnint *innrec;
|
||||
char *inblank;
|
||||
ftnlen inblanklen;
|
||||
} inlist;
|
||||
|
||||
#define VOID void
|
||||
|
||||
union Multitype { /* for multiple entry points */
|
||||
integer1 g;
|
||||
shortint h;
|
||||
integer i;
|
||||
/* longint j; */
|
||||
real r;
|
||||
doublereal d;
|
||||
complex c;
|
||||
doublecomplex z;
|
||||
};
|
||||
|
||||
typedef union Multitype Multitype;
|
||||
|
||||
/*typedef long int Long;*/ /* No longer used; formerly in Namelist */
|
||||
|
||||
struct Vardesc { /* for Namelist */
|
||||
char *name;
|
||||
char *addr;
|
||||
ftnlen *dims;
|
||||
int type;
|
||||
};
|
||||
typedef struct Vardesc Vardesc;
|
||||
|
||||
struct Namelist {
|
||||
char *name;
|
||||
Vardesc **vars;
|
||||
int nvars;
|
||||
};
|
||||
typedef struct Namelist Namelist;
|
||||
|
||||
#define abs(x) ((x) >= 0 ? (x) : -(x))
|
||||
#define dabs(x) (doublereal)abs(x)
|
||||
#define min(a,b) ((a) <= (b) ? (a) : (b))
|
||||
#define max(a,b) ((a) >= (b) ? (a) : (b))
|
||||
#define dmin(a,b) (doublereal)min(a,b)
|
||||
#define dmax(a,b) (doublereal)max(a,b)
|
||||
|
||||
/* procedure parameter types for -A and -C++ */
|
||||
|
||||
#define F2C_proc_par_types 1
|
||||
#ifdef __cplusplus
|
||||
typedef int /* Unknown procedure type */ (*U_fp)(...);
|
||||
typedef shortint (*J_fp)(...);
|
||||
typedef integer (*I_fp)(...);
|
||||
typedef real (*R_fp)(...);
|
||||
typedef doublereal (*D_fp)(...), (*E_fp)(...);
|
||||
typedef /* Complex */ VOID (*C_fp)(...);
|
||||
typedef /* Double Complex */ VOID (*Z_fp)(...);
|
||||
typedef logical (*L_fp)(...);
|
||||
typedef shortlogical (*K_fp)(...);
|
||||
typedef /* Character */ VOID (*H_fp)(...);
|
||||
typedef /* Subroutine */ int (*S_fp)(...);
|
||||
#else
|
||||
typedef int /* Unknown procedure type */ (*U_fp)();
|
||||
typedef shortint (*J_fp)();
|
||||
typedef integer (*I_fp)();
|
||||
typedef real (*R_fp)();
|
||||
typedef doublereal (*D_fp)(), (*E_fp)();
|
||||
typedef /* Complex */ VOID (*C_fp)();
|
||||
typedef /* Double Complex */ VOID (*Z_fp)();
|
||||
typedef logical (*L_fp)();
|
||||
typedef shortlogical (*K_fp)();
|
||||
typedef /* Character */ VOID (*H_fp)();
|
||||
typedef /* Subroutine */ int (*S_fp)();
|
||||
#endif
|
||||
/* E_fp is for real functions when -R is not specified */
|
||||
typedef VOID C_f; /* complex function */
|
||||
typedef VOID H_f; /* character function */
|
||||
typedef VOID Z_f; /* double complex function */
|
||||
typedef doublereal E_f; /* real function with -R not specified */
|
||||
|
||||
/* undef any lower-case symbols that your C compiler predefines, e.g.: */
|
||||
|
||||
#ifndef Skip_f2c_Undefs
|
||||
#undef cray
|
||||
#undef gcos
|
||||
#undef mc68010
|
||||
#undef mc68020
|
||||
#undef mips
|
||||
#undef pdp11
|
||||
#undef sgi
|
||||
#undef sparc
|
||||
#undef sun
|
||||
#undef sun2
|
||||
#undef sun3
|
||||
#undef sun4
|
||||
#undef u370
|
||||
#undef u3b
|
||||
#undef u3b2
|
||||
#undef u3b5
|
||||
#undef unix
|
||||
#undef vax
|
||||
#endif
|
||||
#endif
|
||||
/*
|
||||
|
||||
$Log: f2c.h,v $
|
||||
Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.2 1996/08/20 20:26:28 jaf
|
||||
* Any typedef defining a type that was used in lpc10_encoder_state or
|
||||
* lpc10_decoder_state struct's was commented out here and added to
|
||||
* lpc10.h.
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:32:13 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
* f2c.h
|
||||
*
|
||||
* SCCS ID: @(#)f2c.h 1.2 96/05/19
|
||||
*/
|
||||
|
||||
/* f2c.h -- Standard Fortran to C header file */
|
||||
|
||||
/** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed."
|
||||
|
||||
- From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */
|
||||
|
||||
#ifndef F2C_INCLUDE
|
||||
#define F2C_INCLUDE
|
||||
|
||||
#include "lpc10.h"
|
||||
|
||||
/*typedef long int integer;*/
|
||||
/*typedef INT32 integer;*/
|
||||
/*typedef short int shortint;*/
|
||||
/*typedef INT16 shortint;*/
|
||||
/*typedef float real;*/
|
||||
/* doublereal only used for function arguments to sqrt, exp, etc. */
|
||||
typedef double doublereal;
|
||||
/* 32 bits seems wasteful, but there really aren't that many logical
|
||||
* variables around, and making them 32 bits could avoid word
|
||||
* alignment problems, perhaps. */
|
||||
/*typedef long int logical;*/
|
||||
/*typedef INT32 logical;*/
|
||||
/* The following types are not used in the translated C code for the
|
||||
* LPC-10 coder, but they might be needed by the definitions down
|
||||
* below, so they don't cause compilation errors. */
|
||||
typedef char *address;
|
||||
typedef struct { real r, i; } complex;
|
||||
typedef struct { doublereal r, i; } doublecomplex;
|
||||
typedef short int shortlogical;
|
||||
typedef char logical1;
|
||||
typedef char integer1;
|
||||
/* typedef long long longint; */ /* system-dependent */
|
||||
|
||||
#define TRUE_ (1)
|
||||
#define FALSE_ (0)
|
||||
|
||||
/* Extern is for use with -E */
|
||||
#ifndef Extern
|
||||
#define Extern extern
|
||||
#endif
|
||||
|
||||
/* I/O stuff */
|
||||
|
||||
#ifdef f2c_i2
|
||||
/* for -i2 */
|
||||
typedef short flag;
|
||||
typedef short ftnlen;
|
||||
typedef short ftnint;
|
||||
#else
|
||||
typedef long int flag;
|
||||
typedef long int ftnlen;
|
||||
typedef long int ftnint;
|
||||
#endif
|
||||
|
||||
/*external read, write*/
|
||||
typedef struct
|
||||
{ flag cierr;
|
||||
ftnint ciunit;
|
||||
flag ciend;
|
||||
char *cifmt;
|
||||
ftnint cirec;
|
||||
} cilist;
|
||||
|
||||
/*internal read, write*/
|
||||
typedef struct
|
||||
{ flag icierr;
|
||||
char *iciunit;
|
||||
flag iciend;
|
||||
char *icifmt;
|
||||
ftnint icirlen;
|
||||
ftnint icirnum;
|
||||
} icilist;
|
||||
|
||||
/*open*/
|
||||
typedef struct
|
||||
{ flag oerr;
|
||||
ftnint ounit;
|
||||
char *ofnm;
|
||||
ftnlen ofnmlen;
|
||||
char *osta;
|
||||
char *oacc;
|
||||
char *ofm;
|
||||
ftnint orl;
|
||||
char *oblnk;
|
||||
} olist;
|
||||
|
||||
/*close*/
|
||||
typedef struct
|
||||
{ flag cerr;
|
||||
ftnint cunit;
|
||||
char *csta;
|
||||
} cllist;
|
||||
|
||||
/*rewind, backspace, endfile*/
|
||||
typedef struct
|
||||
{ flag aerr;
|
||||
ftnint aunit;
|
||||
} alist;
|
||||
|
||||
/* inquire */
|
||||
typedef struct
|
||||
{ flag inerr;
|
||||
ftnint inunit;
|
||||
char *infile;
|
||||
ftnlen infilen;
|
||||
ftnint *inex; /*parameters in standard's order*/
|
||||
ftnint *inopen;
|
||||
ftnint *innum;
|
||||
ftnint *innamed;
|
||||
char *inname;
|
||||
ftnlen innamlen;
|
||||
char *inacc;
|
||||
ftnlen inacclen;
|
||||
char *inseq;
|
||||
ftnlen inseqlen;
|
||||
char *indir;
|
||||
ftnlen indirlen;
|
||||
char *infmt;
|
||||
ftnlen infmtlen;
|
||||
char *inform;
|
||||
ftnint informlen;
|
||||
char *inunf;
|
||||
ftnlen inunflen;
|
||||
ftnint *inrecl;
|
||||
ftnint *innrec;
|
||||
char *inblank;
|
||||
ftnlen inblanklen;
|
||||
} inlist;
|
||||
|
||||
#define VOID void
|
||||
|
||||
union Multitype { /* for multiple entry points */
|
||||
integer1 g;
|
||||
shortint h;
|
||||
integer i;
|
||||
/* longint j; */
|
||||
real r;
|
||||
doublereal d;
|
||||
complex c;
|
||||
doublecomplex z;
|
||||
};
|
||||
|
||||
typedef union Multitype Multitype;
|
||||
|
||||
/*typedef long int Long;*/ /* No longer used; formerly in Namelist */
|
||||
|
||||
struct Vardesc { /* for Namelist */
|
||||
char *name;
|
||||
char *addr;
|
||||
ftnlen *dims;
|
||||
int type;
|
||||
};
|
||||
typedef struct Vardesc Vardesc;
|
||||
|
||||
struct Namelist {
|
||||
char *name;
|
||||
Vardesc **vars;
|
||||
int nvars;
|
||||
};
|
||||
typedef struct Namelist Namelist;
|
||||
|
||||
#define abs(x) ((x) >= 0 ? (x) : -(x))
|
||||
#define dabs(x) (doublereal)abs(x)
|
||||
#define min(a,b) ((a) <= (b) ? (a) : (b))
|
||||
#define max(a,b) ((a) >= (b) ? (a) : (b))
|
||||
#define dmin(a,b) (doublereal)min(a,b)
|
||||
#define dmax(a,b) (doublereal)max(a,b)
|
||||
|
||||
/* procedure parameter types for -A and -C++ */
|
||||
|
||||
#define F2C_proc_par_types 1
|
||||
#ifdef __cplusplus
|
||||
typedef int /* Unknown procedure type */ (*U_fp)(...);
|
||||
typedef shortint (*J_fp)(...);
|
||||
typedef integer (*I_fp)(...);
|
||||
typedef real (*R_fp)(...);
|
||||
typedef doublereal (*D_fp)(...), (*E_fp)(...);
|
||||
typedef /* Complex */ VOID (*C_fp)(...);
|
||||
typedef /* Double Complex */ VOID (*Z_fp)(...);
|
||||
typedef logical (*L_fp)(...);
|
||||
typedef shortlogical (*K_fp)(...);
|
||||
typedef /* Character */ VOID (*H_fp)(...);
|
||||
typedef /* Subroutine */ int (*S_fp)(...);
|
||||
#else
|
||||
typedef int /* Unknown procedure type */ (*U_fp)();
|
||||
typedef shortint (*J_fp)();
|
||||
typedef integer (*I_fp)();
|
||||
typedef real (*R_fp)();
|
||||
typedef doublereal (*D_fp)(), (*E_fp)();
|
||||
typedef /* Complex */ VOID (*C_fp)();
|
||||
typedef /* Double Complex */ VOID (*Z_fp)();
|
||||
typedef logical (*L_fp)();
|
||||
typedef shortlogical (*K_fp)();
|
||||
typedef /* Character */ VOID (*H_fp)();
|
||||
typedef /* Subroutine */ int (*S_fp)();
|
||||
#endif
|
||||
/* E_fp is for real functions when -R is not specified */
|
||||
typedef VOID C_f; /* complex function */
|
||||
typedef VOID H_f; /* character function */
|
||||
typedef VOID Z_f; /* double complex function */
|
||||
typedef doublereal E_f; /* real function with -R not specified */
|
||||
|
||||
/* undef any lower-case symbols that your C compiler predefines, e.g.: */
|
||||
|
||||
#ifndef Skip_f2c_Undefs
|
||||
#undef cray
|
||||
#undef gcos
|
||||
#undef mc68010
|
||||
#undef mc68020
|
||||
#undef mips
|
||||
#undef pdp11
|
||||
#undef sgi
|
||||
#undef sparc
|
||||
#undef sun
|
||||
#undef sun2
|
||||
#undef sun3
|
||||
#undef sun4
|
||||
#undef u370
|
||||
#undef u3b
|
||||
#undef u3b2
|
||||
#undef u3b5
|
||||
#undef unix
|
||||
#undef vax
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -1,91 +1,91 @@
|
||||
/*
|
||||
|
||||
$Log: f2clib.c,v $
|
||||
Revision 1.2 2004/05/05 13:25:38 rjongbloed
|
||||
Fixed clearly incorrect code (dived by zero) found with an MSVC warning
|
||||
|
||||
Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.3 2004/02/17 09:21:45 csoutheren
|
||||
Fix for GM bug 134591
|
||||
|
||||
Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.1 1996/08/19 22:32:10 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
* f2clib.c
|
||||
*
|
||||
* SCCS ID: @(#)f2clib.c 1.2 96/05/19
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
#ifdef KR_headers
|
||||
integer pow_ii(ap, bp) integer *ap, *bp;
|
||||
#else
|
||||
integer pow_ii(integer *ap, integer *bp)
|
||||
#endif
|
||||
{
|
||||
integer pow, x, n;
|
||||
unsigned long u;
|
||||
|
||||
x = *ap;
|
||||
n = *bp;
|
||||
|
||||
if (n <= 0) {
|
||||
if (n == 0 || x == 1)
|
||||
return 1;
|
||||
if (x != -1)
|
||||
return x != 0 ? 1/x : 0;
|
||||
n = -n;
|
||||
}
|
||||
u = n;
|
||||
for(pow = 1; ; )
|
||||
{
|
||||
if(u & 01)
|
||||
pow *= x;
|
||||
if(u >>= 1)
|
||||
x *= x;
|
||||
else
|
||||
break;
|
||||
}
|
||||
return(pow);
|
||||
}
|
||||
|
||||
|
||||
|
||||
#ifdef KR_headers
|
||||
double r_sign(a,b) real *a, *b;
|
||||
#else
|
||||
double r_sign(real *a, real *b)
|
||||
#endif
|
||||
{
|
||||
double x;
|
||||
x = (*a >= 0 ? *a : - *a);
|
||||
return( *b >= 0 ? x : -x);
|
||||
}
|
||||
|
||||
|
||||
|
||||
#ifdef KR_headers
|
||||
double floor();
|
||||
integer i_nint(x) real *x;
|
||||
#else
|
||||
#undef abs
|
||||
#include "math.h"
|
||||
integer i_nint(real *x)
|
||||
#endif
|
||||
{
|
||||
return (integer)( (*x)>=0 ?
|
||||
floor(*x + .5) : -(floor(.5 - *x)) );
|
||||
}
|
||||
/*
|
||||
|
||||
$Log: f2clib.c,v $
|
||||
Revision 1.2 2004/05/05 13:25:38 rjongbloed
|
||||
Fixed clearly incorrect code (dived by zero) found with an MSVC warning
|
||||
|
||||
Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.3 2004/02/17 09:21:45 csoutheren
|
||||
Fix for GM bug 134591
|
||||
|
||||
Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.1 1996/08/19 22:32:10 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
* f2clib.c
|
||||
*
|
||||
* SCCS ID: @(#)f2clib.c 1.2 96/05/19
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
#ifdef KR_headers
|
||||
integer pow_ii(ap, bp) integer *ap, *bp;
|
||||
#else
|
||||
integer pow_ii(integer *ap, integer *bp)
|
||||
#endif
|
||||
{
|
||||
integer pow, x, n;
|
||||
unsigned long u;
|
||||
|
||||
x = *ap;
|
||||
n = *bp;
|
||||
|
||||
if (n <= 0) {
|
||||
if (n == 0 || x == 1)
|
||||
return 1;
|
||||
if (x != -1)
|
||||
return x != 0 ? 1/x : 0;
|
||||
n = -n;
|
||||
}
|
||||
u = n;
|
||||
for(pow = 1; ; )
|
||||
{
|
||||
if(u & 01)
|
||||
pow *= x;
|
||||
if(u >>= 1)
|
||||
x *= x;
|
||||
else
|
||||
break;
|
||||
}
|
||||
return(pow);
|
||||
}
|
||||
|
||||
|
||||
|
||||
#ifdef KR_headers
|
||||
double r_sign(a,b) real *a, *b;
|
||||
#else
|
||||
double r_sign(real *a, real *b)
|
||||
#endif
|
||||
{
|
||||
double x;
|
||||
x = (*a >= 0 ? *a : - *a);
|
||||
return( *b >= 0 ? x : -x);
|
||||
}
|
||||
|
||||
|
||||
|
||||
#ifdef KR_headers
|
||||
double floor();
|
||||
integer i_nint(x) real *x;
|
||||
#else
|
||||
#undef abs
|
||||
#include "math.h"
|
||||
integer i_nint(real *x)
|
||||
#endif
|
||||
{
|
||||
return (integer)( (*x)>=0 ?
|
||||
floor(*x + .5) : -(floor(.5 - *x)) );
|
||||
}
|
||||
|
||||
+115
-115
@@ -1,115 +1,115 @@
|
||||
/*
|
||||
|
||||
$Log: ham84.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.1 1996/08/19 22:32:07 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int ham84_(integer *input, integer *output, integer *errcnt);
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* ***************************************************************** */
|
||||
|
||||
/* HAM84 Version 45G */
|
||||
|
||||
/* $Log: ham84.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:32:07 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/21 15:26:00 jaf */
|
||||
/* Put comment header in standard form. */
|
||||
|
||||
/* Revision 1.2 1996/03/13 22:00:13 jaf */
|
||||
/* Comments added explaining that none of the local variables of this */
|
||||
/* subroutine need to be saved from one invocation to the next. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:47:04 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ***************************************************************** */
|
||||
|
||||
/* Hamming 8,4 Decoder - can correct 1 out of seven bits */
|
||||
/* and can detect up to two errors. */
|
||||
|
||||
/* Input: */
|
||||
/* INPUT - Seven bit data word, 4 bits parameter and */
|
||||
/* 4 bits parity information */
|
||||
/* Input/Output: */
|
||||
/* ERRCNT - Sums errors detected by Hamming code */
|
||||
/* Output: */
|
||||
/* OUTPUT - 4 corrected parameter bits */
|
||||
|
||||
/* This subroutine is entered with an eight bit word in INPUT. The 8th */
|
||||
/* bit is parity and is stripped off. The remaining 7 bits address the */
|
||||
/* hamming 8,4 table and the output OUTPUT from the table gives the 4 */
|
||||
/* bits of corrected data. If bit 4 is set, no error was detected. */
|
||||
/* ERRCNT is the number of errors counted. */
|
||||
|
||||
/* This subroutine has no local state. */
|
||||
|
||||
/* Subroutine */ int ham84_(integer *input, integer *output, integer *errcnt)
|
||||
{
|
||||
/* Initialized data */
|
||||
|
||||
static integer dactab[128] = { 16,0,0,3,0,5,14,7,0,9,14,11,14,13,30,14,0,
|
||||
9,2,7,4,7,7,23,9,25,10,9,12,9,14,7,0,5,2,11,5,21,6,5,8,11,11,27,
|
||||
12,5,14,11,2,1,18,2,12,5,2,7,12,9,2,11,28,12,12,15,0,3,3,19,4,13,
|
||||
6,3,8,13,10,3,13,29,14,13,4,1,10,3,20,4,4,7,10,9,26,10,4,13,10,15,
|
||||
8,1,6,3,6,5,22,6,24,8,8,11,8,13,6,15,1,17,2,1,4,1,6,15,8,1,10,15,
|
||||
12,15,15,31 };
|
||||
|
||||
integer i__, j, parity;
|
||||
|
||||
/* Arguments */
|
||||
/* Parameters/constants */
|
||||
/* Local variables that need not be saved */
|
||||
/* Determine parity of input word */
|
||||
parity = *input & 255;
|
||||
parity ^= parity / 16;
|
||||
parity ^= parity / 4;
|
||||
parity ^= parity / 2;
|
||||
parity &= 1;
|
||||
i__ = dactab[*input & 127];
|
||||
*output = i__ & 15;
|
||||
j = i__ & 16;
|
||||
if (j != 0) {
|
||||
/* No errors detected in seven bits */
|
||||
if (parity != 0) {
|
||||
++(*errcnt);
|
||||
}
|
||||
} else {
|
||||
/* One or two errors detected */
|
||||
++(*errcnt);
|
||||
if (parity == 0) {
|
||||
/* Two errors detected */
|
||||
++(*errcnt);
|
||||
*output = -1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
} /* ham84_ */
|
||||
|
||||
/*
|
||||
|
||||
$Log: ham84.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.1 1996/08/19 22:32:07 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int ham84_(integer *input, integer *output, integer *errcnt);
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* ***************************************************************** */
|
||||
|
||||
/* HAM84 Version 45G */
|
||||
|
||||
/* $Log: ham84.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:32:07 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/21 15:26:00 jaf */
|
||||
/* Put comment header in standard form. */
|
||||
|
||||
/* Revision 1.2 1996/03/13 22:00:13 jaf */
|
||||
/* Comments added explaining that none of the local variables of this */
|
||||
/* subroutine need to be saved from one invocation to the next. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:47:04 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ***************************************************************** */
|
||||
|
||||
/* Hamming 8,4 Decoder - can correct 1 out of seven bits */
|
||||
/* and can detect up to two errors. */
|
||||
|
||||
/* Input: */
|
||||
/* INPUT - Seven bit data word, 4 bits parameter and */
|
||||
/* 4 bits parity information */
|
||||
/* Input/Output: */
|
||||
/* ERRCNT - Sums errors detected by Hamming code */
|
||||
/* Output: */
|
||||
/* OUTPUT - 4 corrected parameter bits */
|
||||
|
||||
/* This subroutine is entered with an eight bit word in INPUT. The 8th */
|
||||
/* bit is parity and is stripped off. The remaining 7 bits address the */
|
||||
/* hamming 8,4 table and the output OUTPUT from the table gives the 4 */
|
||||
/* bits of corrected data. If bit 4 is set, no error was detected. */
|
||||
/* ERRCNT is the number of errors counted. */
|
||||
|
||||
/* This subroutine has no local state. */
|
||||
|
||||
/* Subroutine */ int ham84_(integer *input, integer *output, integer *errcnt)
|
||||
{
|
||||
/* Initialized data */
|
||||
|
||||
static integer dactab[128] = { 16,0,0,3,0,5,14,7,0,9,14,11,14,13,30,14,0,
|
||||
9,2,7,4,7,7,23,9,25,10,9,12,9,14,7,0,5,2,11,5,21,6,5,8,11,11,27,
|
||||
12,5,14,11,2,1,18,2,12,5,2,7,12,9,2,11,28,12,12,15,0,3,3,19,4,13,
|
||||
6,3,8,13,10,3,13,29,14,13,4,1,10,3,20,4,4,7,10,9,26,10,4,13,10,15,
|
||||
8,1,6,3,6,5,22,6,24,8,8,11,8,13,6,15,1,17,2,1,4,1,6,15,8,1,10,15,
|
||||
12,15,15,31 };
|
||||
|
||||
integer i__, j, parity;
|
||||
|
||||
/* Arguments */
|
||||
/* Parameters/constants */
|
||||
/* Local variables that need not be saved */
|
||||
/* Determine parity of input word */
|
||||
parity = *input & 255;
|
||||
parity ^= parity / 16;
|
||||
parity ^= parity / 4;
|
||||
parity ^= parity / 2;
|
||||
parity &= 1;
|
||||
i__ = dactab[*input & 127];
|
||||
*output = i__ & 15;
|
||||
j = i__ & 16;
|
||||
if (j != 0) {
|
||||
/* No errors detected in seven bits */
|
||||
if (parity != 0) {
|
||||
++(*errcnt);
|
||||
}
|
||||
} else {
|
||||
/* One or two errors detected */
|
||||
++(*errcnt);
|
||||
if (parity == 0) {
|
||||
/* Two errors detected */
|
||||
++(*errcnt);
|
||||
*output = -1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
} /* ham84_ */
|
||||
|
||||
|
||||
+158
-158
@@ -1,158 +1,158 @@
|
||||
/*
|
||||
|
||||
$Log: hp100.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.2 1996/08/20 20:28:05 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_encoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_encoder_state().
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:32:04 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int hp100_(real *speech, integer *start, integer *end,
|
||||
struct lpc10_encoder_state *st);
|
||||
extern int inithp100_(void);
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* ********************************************************************* */
|
||||
|
||||
/* HP100 Version 55 */
|
||||
|
||||
/* $Log: hp100.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:28:05 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_encoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_encoder_state().
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:32:04 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.6 1996/03/15 16:45:25 jaf */
|
||||
/* Rearranged a few comments. */
|
||||
|
||||
/* Revision 1.5 1996/03/14 23:20:54 jaf */
|
||||
/* Added comments about when INITHP100 should be used. */
|
||||
|
||||
/* Revision 1.4 1996/03/14 23:08:08 jaf */
|
||||
/* Added an entry named INITHP100 that initializes the local state of */
|
||||
/* subroutine HP100. */
|
||||
|
||||
/* Revision 1.3 1996/03/14 22:09:20 jaf */
|
||||
/* Comments added explaining which of the local variables of this */
|
||||
/* subroutine need to be saved from one invocation to the next, and which */
|
||||
/* do not. */
|
||||
|
||||
/* Revision 1.2 1996/02/12 15:05:54 jaf */
|
||||
/* Added lots of comments explaining why I changed one line, which was a */
|
||||
/* declaration with initializations. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:47:12 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ********************************************************************* */
|
||||
|
||||
/* 100 Hz High Pass Filter */
|
||||
|
||||
/* Jan 92 - corrected typo (1.937148 to 1.935715), */
|
||||
/* rounded coefficients to 7 places, */
|
||||
/* corrected and merged gain (.97466**4), */
|
||||
/* merged numerator into first two sections. */
|
||||
|
||||
/* Input: */
|
||||
/* start, end - Range of samples to filter */
|
||||
/* Input/Output: */
|
||||
/* speech(end) - Speech data. */
|
||||
/* Indices start through end are read and modified. */
|
||||
|
||||
/* This subroutine maintains local state from one call to the next. If */
|
||||
/* you want to switch to using a new audio stream for this filter, or */
|
||||
/* reinitialize its state for any other reason, call the ENTRY */
|
||||
/* INITHP100. */
|
||||
/* Subroutine */ int hp100_(real *speech, integer *start, integer *end,
|
||||
struct lpc10_encoder_state *st)
|
||||
{
|
||||
/* Temporary local copies of variables in lpc10_encoder_state.
|
||||
I've only created these because it might cause the loop below
|
||||
to execute a bit faster to access local variables, rather than
|
||||
variables in the lpc10_encoder_state structure. It is just a
|
||||
guess that it will be faster. */
|
||||
|
||||
real z11;
|
||||
real z21;
|
||||
real z12;
|
||||
real z22;
|
||||
|
||||
/* System generated locals */
|
||||
integer i__1;
|
||||
|
||||
/* Local variables */
|
||||
integer i__;
|
||||
real si, err;
|
||||
|
||||
/* Arguments */
|
||||
/* Local variables that need not be saved */
|
||||
/* Local state */
|
||||
/* Parameter adjustments */
|
||||
if (speech) {
|
||||
--speech;
|
||||
}
|
||||
|
||||
/* Function Body */
|
||||
|
||||
z11 = st->z11;
|
||||
z21 = st->z21;
|
||||
z12 = st->z12;
|
||||
z22 = st->z22;
|
||||
|
||||
i__1 = *end;
|
||||
for (i__ = *start; i__ <= i__1; ++i__) {
|
||||
si = speech[i__];
|
||||
err = si + z11 * 1.859076f - z21 * .8648249f;
|
||||
si = err - z11 * 2.f + z21;
|
||||
z21 = z11;
|
||||
z11 = err;
|
||||
err = si + z12 * 1.935715f - z22 * .9417004f;
|
||||
si = err - z12 * 2.f + z22;
|
||||
z22 = z12;
|
||||
z12 = err;
|
||||
speech[i__] = si * .902428f;
|
||||
}
|
||||
|
||||
st->z11 = z11;
|
||||
st->z21 = z21;
|
||||
st->z12 = z12;
|
||||
st->z22 = z22;
|
||||
|
||||
return 0;
|
||||
} /* hp100_ */
|
||||
/*
|
||||
|
||||
$Log: hp100.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.2 1996/08/20 20:28:05 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_encoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_encoder_state().
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:32:04 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int hp100_(real *speech, integer *start, integer *end,
|
||||
struct lpc10_encoder_state *st);
|
||||
extern int inithp100_(void);
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* ********************************************************************* */
|
||||
|
||||
/* HP100 Version 55 */
|
||||
|
||||
/* $Log: hp100.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:28:05 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_encoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_encoder_state().
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:32:04 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.6 1996/03/15 16:45:25 jaf */
|
||||
/* Rearranged a few comments. */
|
||||
|
||||
/* Revision 1.5 1996/03/14 23:20:54 jaf */
|
||||
/* Added comments about when INITHP100 should be used. */
|
||||
|
||||
/* Revision 1.4 1996/03/14 23:08:08 jaf */
|
||||
/* Added an entry named INITHP100 that initializes the local state of */
|
||||
/* subroutine HP100. */
|
||||
|
||||
/* Revision 1.3 1996/03/14 22:09:20 jaf */
|
||||
/* Comments added explaining which of the local variables of this */
|
||||
/* subroutine need to be saved from one invocation to the next, and which */
|
||||
/* do not. */
|
||||
|
||||
/* Revision 1.2 1996/02/12 15:05:54 jaf */
|
||||
/* Added lots of comments explaining why I changed one line, which was a */
|
||||
/* declaration with initializations. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:47:12 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ********************************************************************* */
|
||||
|
||||
/* 100 Hz High Pass Filter */
|
||||
|
||||
/* Jan 92 - corrected typo (1.937148 to 1.935715), */
|
||||
/* rounded coefficients to 7 places, */
|
||||
/* corrected and merged gain (.97466**4), */
|
||||
/* merged numerator into first two sections. */
|
||||
|
||||
/* Input: */
|
||||
/* start, end - Range of samples to filter */
|
||||
/* Input/Output: */
|
||||
/* speech(end) - Speech data. */
|
||||
/* Indices start through end are read and modified. */
|
||||
|
||||
/* This subroutine maintains local state from one call to the next. If */
|
||||
/* you want to switch to using a new audio stream for this filter, or */
|
||||
/* reinitialize its state for any other reason, call the ENTRY */
|
||||
/* INITHP100. */
|
||||
/* Subroutine */ int hp100_(real *speech, integer *start, integer *end,
|
||||
struct lpc10_encoder_state *st)
|
||||
{
|
||||
/* Temporary local copies of variables in lpc10_encoder_state.
|
||||
I've only created these because it might cause the loop below
|
||||
to execute a bit faster to access local variables, rather than
|
||||
variables in the lpc10_encoder_state structure. It is just a
|
||||
guess that it will be faster. */
|
||||
|
||||
real z11;
|
||||
real z21;
|
||||
real z12;
|
||||
real z22;
|
||||
|
||||
/* System generated locals */
|
||||
integer i__1;
|
||||
|
||||
/* Local variables */
|
||||
integer i__;
|
||||
real si, err;
|
||||
|
||||
/* Arguments */
|
||||
/* Local variables that need not be saved */
|
||||
/* Local state */
|
||||
/* Parameter adjustments */
|
||||
if (speech) {
|
||||
--speech;
|
||||
}
|
||||
|
||||
/* Function Body */
|
||||
|
||||
z11 = st->z11;
|
||||
z21 = st->z21;
|
||||
z12 = st->z12;
|
||||
z22 = st->z22;
|
||||
|
||||
i__1 = *end;
|
||||
for (i__ = *start; i__ <= i__1; ++i__) {
|
||||
si = speech[i__];
|
||||
err = si + z11 * 1.859076f - z21 * .8648249f;
|
||||
si = err - z11 * 2.f + z21;
|
||||
z21 = z11;
|
||||
z11 = err;
|
||||
err = si + z12 * 1.935715f - z22 * .9417004f;
|
||||
si = err - z12 * 2.f + z22;
|
||||
z22 = z12;
|
||||
z12 = err;
|
||||
speech[i__] = si * .902428f;
|
||||
}
|
||||
|
||||
st->z11 = z11;
|
||||
st->z21 = z21;
|
||||
st->z12 = z12;
|
||||
st->z22 = z22;
|
||||
|
||||
return 0;
|
||||
} /* hp100_ */
|
||||
|
||||
+177
-177
@@ -1,177 +1,177 @@
|
||||
/*
|
||||
|
||||
$Log: invert.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.1 1996/08/19 22:32:00 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int invert_(integer *order, real *phi, real *psi, real *rc);
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* **************************************************************** */
|
||||
|
||||
/* INVERT Version 45G */
|
||||
|
||||
/* $Log: invert.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:32:00 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/18 20:52:47 jaf */
|
||||
/* Just added a few comments about which array indices of the arguments */
|
||||
/* are used, and mentioning that this subroutine has no local state. */
|
||||
|
||||
/* Revision 1.2 1996/03/13 16:51:32 jaf */
|
||||
/* Comments added explaining that none of the local variables of this */
|
||||
/* subroutine need to be saved from one invocation to the next. */
|
||||
|
||||
/* Eliminated a comment from the original, describing a local array X */
|
||||
/* that appeared nowhere in the code. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:47:20 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* **************************************************************** */
|
||||
|
||||
/* Invert a covariance matrix using Choleski decomposition method. */
|
||||
|
||||
/* Input: */
|
||||
/* ORDER - Analysis order */
|
||||
/* PHI(ORDER,ORDER) - Covariance matrix */
|
||||
/* Indices (I,J) read, where ORDER .GE. I .GE. J .GE. 1.*/
|
||||
/* All other indices untouched. */
|
||||
/* PSI(ORDER) - Column vector to be predicted */
|
||||
/* Indices 1 through ORDER read. */
|
||||
/* Output: */
|
||||
/* RC(ORDER) - Pseudo reflection coefficients */
|
||||
/* Indices 1 through ORDER written, and then possibly read.
|
||||
*/
|
||||
/* Internal: */
|
||||
/* V(ORDER,ORDER) - Temporary matrix */
|
||||
/* Same indices written as read from PHI. */
|
||||
/* Many indices may be read and written again after */
|
||||
/* initially being copied from PHI, but all indices */
|
||||
/* are written before being read. */
|
||||
|
||||
/* NOTE: Temporary matrix V is not needed and may be replaced */
|
||||
/* by PHI if the original PHI values do not need to be preserved. */
|
||||
|
||||
/* Subroutine */ int invert_(integer *order, real *phi, real *psi, real *rc)
|
||||
{
|
||||
/* System generated locals */
|
||||
integer phi_dim1, phi_offset, i__1, i__2, i__3;
|
||||
real r__1, r__2;
|
||||
|
||||
/* Local variables */
|
||||
real save;
|
||||
integer i__, j, k;
|
||||
real v[100] /* was [10][10] */;
|
||||
|
||||
/* Arguments */
|
||||
/* $Log: invert.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:32:00 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/29 22:03:47 jaf */
|
||||
/* Removed definitions for any constants that were no longer used. */
|
||||
|
||||
/* Revision 1.2 1996/03/26 19:34:33 jaf */
|
||||
/* Added comments indicating which constants are not needed in an */
|
||||
/* application that uses the LPC-10 coder. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:43:51 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
/* LPC Configuration parameters: */
|
||||
/* Frame size, Prediction order, Pitch period */
|
||||
/* Parameters/constants */
|
||||
/* Local variables that need not be saved */
|
||||
/* Decompose PHI into V * D * V' where V is a triangular matrix whose */
|
||||
/* main diagonal elements are all 1, V' is the transpose of V, and */
|
||||
/* D is a vector. Here D(n) is stored in location V(n,n). */
|
||||
/* Parameter adjustments */
|
||||
--rc;
|
||||
--psi;
|
||||
phi_dim1 = *order;
|
||||
phi_offset = phi_dim1 + 1;
|
||||
phi -= phi_offset;
|
||||
|
||||
/* Function Body */
|
||||
i__1 = *order;
|
||||
for (j = 1; j <= i__1; ++j) {
|
||||
i__2 = *order;
|
||||
for (i__ = j; i__ <= i__2; ++i__) {
|
||||
v[i__ + j * 10 - 11] = phi[i__ + j * phi_dim1];
|
||||
}
|
||||
i__2 = j - 1;
|
||||
for (k = 1; k <= i__2; ++k) {
|
||||
save = v[j + k * 10 - 11] * v[k + k * 10 - 11];
|
||||
i__3 = *order;
|
||||
for (i__ = j; i__ <= i__3; ++i__) {
|
||||
v[i__ + j * 10 - 11] -= v[i__ + k * 10 - 11] * save;
|
||||
}
|
||||
}
|
||||
/* Compute intermediate results, which are similar to RC's */
|
||||
if ((r__1 = v[j + j * 10 - 11], abs(r__1)) < 1e-10f) {
|
||||
goto L100;
|
||||
}
|
||||
rc[j] = psi[j];
|
||||
i__2 = j - 1;
|
||||
for (k = 1; k <= i__2; ++k) {
|
||||
rc[j] -= rc[k] * v[j + k * 10 - 11];
|
||||
}
|
||||
v[j + j * 10 - 11] = 1.f / v[j + j * 10 - 11];
|
||||
rc[j] *= v[j + j * 10 - 11];
|
||||
/* Computing MAX */
|
||||
/* Computing MIN */
|
||||
r__2 = rc[j];
|
||||
r__1 = min(r__2,.999f);
|
||||
rc[j] = max(r__1,-.999f);
|
||||
}
|
||||
return 0;
|
||||
/* Zero out higher order RC's if algorithm terminated early */
|
||||
L100:
|
||||
i__1 = *order;
|
||||
for (i__ = j; i__ <= i__1; ++i__) {
|
||||
rc[i__] = 0.f;
|
||||
}
|
||||
/* Back substitute for PC's (if needed) */
|
||||
/* 110 DO J = ORDER,1,-1 */
|
||||
/* PC(J) = RC(J) */
|
||||
/* DO I = 1,J-1 */
|
||||
/* PC(J) = PC(J) - PC(I)*V(J,I) */
|
||||
/* END DO */
|
||||
/* END DO */
|
||||
return 0;
|
||||
} /* invert_ */
|
||||
|
||||
/*
|
||||
|
||||
$Log: invert.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.1 1996/08/19 22:32:00 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int invert_(integer *order, real *phi, real *psi, real *rc);
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* **************************************************************** */
|
||||
|
||||
/* INVERT Version 45G */
|
||||
|
||||
/* $Log: invert.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:32:00 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/18 20:52:47 jaf */
|
||||
/* Just added a few comments about which array indices of the arguments */
|
||||
/* are used, and mentioning that this subroutine has no local state. */
|
||||
|
||||
/* Revision 1.2 1996/03/13 16:51:32 jaf */
|
||||
/* Comments added explaining that none of the local variables of this */
|
||||
/* subroutine need to be saved from one invocation to the next. */
|
||||
|
||||
/* Eliminated a comment from the original, describing a local array X */
|
||||
/* that appeared nowhere in the code. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:47:20 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* **************************************************************** */
|
||||
|
||||
/* Invert a covariance matrix using Choleski decomposition method. */
|
||||
|
||||
/* Input: */
|
||||
/* ORDER - Analysis order */
|
||||
/* PHI(ORDER,ORDER) - Covariance matrix */
|
||||
/* Indices (I,J) read, where ORDER .GE. I .GE. J .GE. 1.*/
|
||||
/* All other indices untouched. */
|
||||
/* PSI(ORDER) - Column vector to be predicted */
|
||||
/* Indices 1 through ORDER read. */
|
||||
/* Output: */
|
||||
/* RC(ORDER) - Pseudo reflection coefficients */
|
||||
/* Indices 1 through ORDER written, and then possibly read.
|
||||
*/
|
||||
/* Internal: */
|
||||
/* V(ORDER,ORDER) - Temporary matrix */
|
||||
/* Same indices written as read from PHI. */
|
||||
/* Many indices may be read and written again after */
|
||||
/* initially being copied from PHI, but all indices */
|
||||
/* are written before being read. */
|
||||
|
||||
/* NOTE: Temporary matrix V is not needed and may be replaced */
|
||||
/* by PHI if the original PHI values do not need to be preserved. */
|
||||
|
||||
/* Subroutine */ int invert_(integer *order, real *phi, real *psi, real *rc)
|
||||
{
|
||||
/* System generated locals */
|
||||
integer phi_dim1, phi_offset, i__1, i__2, i__3;
|
||||
real r__1, r__2;
|
||||
|
||||
/* Local variables */
|
||||
real save;
|
||||
integer i__, j, k;
|
||||
real v[100] /* was [10][10] */;
|
||||
|
||||
/* Arguments */
|
||||
/* $Log: invert.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:42 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:32:00 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/29 22:03:47 jaf */
|
||||
/* Removed definitions for any constants that were no longer used. */
|
||||
|
||||
/* Revision 1.2 1996/03/26 19:34:33 jaf */
|
||||
/* Added comments indicating which constants are not needed in an */
|
||||
/* application that uses the LPC-10 coder. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:43:51 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
/* LPC Configuration parameters: */
|
||||
/* Frame size, Prediction order, Pitch period */
|
||||
/* Parameters/constants */
|
||||
/* Local variables that need not be saved */
|
||||
/* Decompose PHI into V * D * V' where V is a triangular matrix whose */
|
||||
/* main diagonal elements are all 1, V' is the transpose of V, and */
|
||||
/* D is a vector. Here D(n) is stored in location V(n,n). */
|
||||
/* Parameter adjustments */
|
||||
--rc;
|
||||
--psi;
|
||||
phi_dim1 = *order;
|
||||
phi_offset = phi_dim1 + 1;
|
||||
phi -= phi_offset;
|
||||
|
||||
/* Function Body */
|
||||
i__1 = *order;
|
||||
for (j = 1; j <= i__1; ++j) {
|
||||
i__2 = *order;
|
||||
for (i__ = j; i__ <= i__2; ++i__) {
|
||||
v[i__ + j * 10 - 11] = phi[i__ + j * phi_dim1];
|
||||
}
|
||||
i__2 = j - 1;
|
||||
for (k = 1; k <= i__2; ++k) {
|
||||
save = v[j + k * 10 - 11] * v[k + k * 10 - 11];
|
||||
i__3 = *order;
|
||||
for (i__ = j; i__ <= i__3; ++i__) {
|
||||
v[i__ + j * 10 - 11] -= v[i__ + k * 10 - 11] * save;
|
||||
}
|
||||
}
|
||||
/* Compute intermediate results, which are similar to RC's */
|
||||
if ((r__1 = v[j + j * 10 - 11], abs(r__1)) < 1e-10f) {
|
||||
goto L100;
|
||||
}
|
||||
rc[j] = psi[j];
|
||||
i__2 = j - 1;
|
||||
for (k = 1; k <= i__2; ++k) {
|
||||
rc[j] -= rc[k] * v[j + k * 10 - 11];
|
||||
}
|
||||
v[j + j * 10 - 11] = 1.f / v[j + j * 10 - 11];
|
||||
rc[j] *= v[j + j * 10 - 11];
|
||||
/* Computing MAX */
|
||||
/* Computing MIN */
|
||||
r__2 = rc[j];
|
||||
r__1 = min(r__2,.999f);
|
||||
rc[j] = max(r__1,-.999f);
|
||||
}
|
||||
return 0;
|
||||
/* Zero out higher order RC's if algorithm terminated early */
|
||||
L100:
|
||||
i__1 = *order;
|
||||
for (i__ = j; i__ <= i__1; ++i__) {
|
||||
rc[i__] = 0.f;
|
||||
}
|
||||
/* Back substitute for PC's (if needed) */
|
||||
/* 110 DO J = ORDER,1,-1 */
|
||||
/* PC(J) = RC(J) */
|
||||
/* DO I = 1,J-1 */
|
||||
/* PC(J) = PC(J) - PC(I)*V(J,I) */
|
||||
/* END DO */
|
||||
/* END DO */
|
||||
return 0;
|
||||
} /* invert_ */
|
||||
|
||||
|
||||
+144
-144
@@ -1,144 +1,144 @@
|
||||
/*
|
||||
|
||||
$Log: irc2pc.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.1 1996/08/19 22:31:56 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int irc2pc_(real *rc, real *pc, integer *order, real *gprime, real *g2pass);
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* ***************************************************************** */
|
||||
|
||||
/* IRC2PC Version 48 */
|
||||
|
||||
/* $Log: irc2pc.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:31:56 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/20 15:47:19 jaf */
|
||||
/* Added comments about which indices of array arguments are read or */
|
||||
/* written. */
|
||||
|
||||
/* Revision 1.2 1996/03/14 16:59:04 jaf */
|
||||
/* Comments added explaining that none of the local variables of this */
|
||||
/* subroutine need to be saved from one invocation to the next. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:47:27 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ***************************************************************** */
|
||||
|
||||
/* Convert Reflection Coefficients to Predictor Coeficients */
|
||||
|
||||
/* Inputs: */
|
||||
/* RC - Reflection coefficients */
|
||||
/* Indices 1 through ORDER read. */
|
||||
/* ORDER - Number of RC's */
|
||||
/* GPRIME - Excitation modification gain */
|
||||
/* Outputs: */
|
||||
/* PC - Predictor coefficients */
|
||||
/* Indices 1 through ORDER written. */
|
||||
/* Indices 1 through ORDER-1 are read after being written. */
|
||||
/* G2PASS - Excitation modification sharpening factor */
|
||||
|
||||
/* This subroutine has no local state. */
|
||||
|
||||
/* Subroutine */ int irc2pc_(real *rc, real *pc, integer *order, real *gprime,
|
||||
real *g2pass)
|
||||
{
|
||||
/* System generated locals */
|
||||
integer i__1, i__2;
|
||||
|
||||
/* Builtin functions */
|
||||
double sqrt(doublereal);
|
||||
|
||||
/* Local variables */
|
||||
real temp[10];
|
||||
integer i__, j;
|
||||
|
||||
/* Arguments */
|
||||
/* $Log: irc2pc.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:31:56 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/29 22:03:47 jaf */
|
||||
/* Removed definitions for any constants that were no longer used. */
|
||||
|
||||
/* Revision 1.2 1996/03/26 19:34:33 jaf */
|
||||
/* Added comments indicating which constants are not needed in an */
|
||||
/* application that uses the LPC-10 coder. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:43:51 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
/* LPC Configuration parameters: */
|
||||
/* Frame size, Prediction order, Pitch period */
|
||||
/* Local variables that need not be saved */
|
||||
/* Parameter adjustments */
|
||||
--pc;
|
||||
--rc;
|
||||
|
||||
/* Function Body */
|
||||
*g2pass = 1.f;
|
||||
i__1 = *order;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
*g2pass *= 1.f - rc[i__] * rc[i__];
|
||||
}
|
||||
*g2pass = (real)(*gprime * sqrt(*g2pass));
|
||||
pc[1] = rc[1];
|
||||
i__1 = *order;
|
||||
for (i__ = 2; i__ <= i__1; ++i__) {
|
||||
i__2 = i__ - 1;
|
||||
for (j = 1; j <= i__2; ++j) {
|
||||
temp[j - 1] = pc[j] - rc[i__] * pc[i__ - j];
|
||||
}
|
||||
i__2 = i__ - 1;
|
||||
for (j = 1; j <= i__2; ++j) {
|
||||
pc[j] = temp[j - 1];
|
||||
}
|
||||
pc[i__] = rc[i__];
|
||||
}
|
||||
return 0;
|
||||
} /* irc2pc_ */
|
||||
|
||||
/*
|
||||
|
||||
$Log: irc2pc.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.1 1996/08/19 22:31:56 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int irc2pc_(real *rc, real *pc, integer *order, real *gprime, real *g2pass);
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* ***************************************************************** */
|
||||
|
||||
/* IRC2PC Version 48 */
|
||||
|
||||
/* $Log: irc2pc.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:31:56 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/20 15:47:19 jaf */
|
||||
/* Added comments about which indices of array arguments are read or */
|
||||
/* written. */
|
||||
|
||||
/* Revision 1.2 1996/03/14 16:59:04 jaf */
|
||||
/* Comments added explaining that none of the local variables of this */
|
||||
/* subroutine need to be saved from one invocation to the next. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:47:27 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ***************************************************************** */
|
||||
|
||||
/* Convert Reflection Coefficients to Predictor Coeficients */
|
||||
|
||||
/* Inputs: */
|
||||
/* RC - Reflection coefficients */
|
||||
/* Indices 1 through ORDER read. */
|
||||
/* ORDER - Number of RC's */
|
||||
/* GPRIME - Excitation modification gain */
|
||||
/* Outputs: */
|
||||
/* PC - Predictor coefficients */
|
||||
/* Indices 1 through ORDER written. */
|
||||
/* Indices 1 through ORDER-1 are read after being written. */
|
||||
/* G2PASS - Excitation modification sharpening factor */
|
||||
|
||||
/* This subroutine has no local state. */
|
||||
|
||||
/* Subroutine */ int irc2pc_(real *rc, real *pc, integer *order, real *gprime,
|
||||
real *g2pass)
|
||||
{
|
||||
/* System generated locals */
|
||||
integer i__1, i__2;
|
||||
|
||||
/* Builtin functions */
|
||||
double sqrt(doublereal);
|
||||
|
||||
/* Local variables */
|
||||
real temp[10];
|
||||
integer i__, j;
|
||||
|
||||
/* Arguments */
|
||||
/* $Log: irc2pc.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:31:56 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/29 22:03:47 jaf */
|
||||
/* Removed definitions for any constants that were no longer used. */
|
||||
|
||||
/* Revision 1.2 1996/03/26 19:34:33 jaf */
|
||||
/* Added comments indicating which constants are not needed in an */
|
||||
/* application that uses the LPC-10 coder. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:43:51 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
/* LPC Configuration parameters: */
|
||||
/* Frame size, Prediction order, Pitch period */
|
||||
/* Local variables that need not be saved */
|
||||
/* Parameter adjustments */
|
||||
--pc;
|
||||
--rc;
|
||||
|
||||
/* Function Body */
|
||||
*g2pass = 1.f;
|
||||
i__1 = *order;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
*g2pass *= 1.f - rc[i__] * rc[i__];
|
||||
}
|
||||
*g2pass = (real)(*gprime * sqrt(*g2pass));
|
||||
pc[1] = rc[1];
|
||||
i__1 = *order;
|
||||
for (i__ = 2; i__ <= i__1; ++i__) {
|
||||
i__2 = i__ - 1;
|
||||
for (j = 1; j <= i__2; ++j) {
|
||||
temp[j - 1] = pc[j] - rc[i__] * pc[i__ - j];
|
||||
}
|
||||
i__2 = i__ - 1;
|
||||
for (j = 1; j <= i__2; ++j) {
|
||||
pc[j] = temp[j - 1];
|
||||
}
|
||||
pc[i__] = rc[i__];
|
||||
}
|
||||
return 0;
|
||||
} /* irc2pc_ */
|
||||
|
||||
|
||||
+125
-125
@@ -1,125 +1,125 @@
|
||||
/*
|
||||
|
||||
$Log: ivfilt.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.1 1996/08/19 22:31:53 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int ivfilt_(real *lpbuf, real *ivbuf, integer *len, integer *nsamp, real *ivrc);
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* ********************************************************************* */
|
||||
|
||||
/* IVFILT Version 48 */
|
||||
|
||||
/* $Log: ivfilt.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:31:53 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/15 21:36:29 jaf */
|
||||
/* Just added a few comments about which array indices of the arguments */
|
||||
/* are used, and mentioning that this subroutine has no local state. */
|
||||
|
||||
/* Revision 1.2 1996/03/13 00:01:00 jaf */
|
||||
/* Comments added explaining that none of the local variables of this */
|
||||
/* subroutine need to be saved from one invocation to the next. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:47:34 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ********************************************************************* */
|
||||
|
||||
/* 2nd order inverse filter, speech is decimated 4:1 */
|
||||
|
||||
/* Input: */
|
||||
/* LEN - Length of speech buffers */
|
||||
/* NSAMP - Number of samples to filter */
|
||||
/* LPBUF - Low pass filtered speech buffer */
|
||||
/* Indices LEN-NSAMP-7 through LEN read. */
|
||||
/* Output: */
|
||||
/* IVBUF - Inverse filtered speech buffer */
|
||||
/* Indices LEN-NSAMP+1 through LEN written. */
|
||||
/* IVRC - Inverse filter reflection coefficients (for voicing) */
|
||||
/* Indices 1 and 2 both written (also read, but only after writing).
|
||||
*/
|
||||
|
||||
/* This subroutine has no local state. */
|
||||
|
||||
/* Subroutine */ int ivfilt_(real *lpbuf, real *ivbuf, integer *len, integer *
|
||||
nsamp, real *ivrc)
|
||||
{
|
||||
/* System generated locals */
|
||||
integer i__1;
|
||||
|
||||
/* Local variables */
|
||||
integer i__, j, k;
|
||||
real r__[3], pc1, pc2;
|
||||
|
||||
/* Arguments */
|
||||
/* Local variables that need not be saved */
|
||||
/* Local state */
|
||||
/* None */
|
||||
/* Calculate Autocorrelations */
|
||||
/* Parameter adjustments */
|
||||
--ivbuf;
|
||||
--lpbuf;
|
||||
--ivrc;
|
||||
|
||||
/* Function Body */
|
||||
for (i__ = 1; i__ <= 3; ++i__) {
|
||||
r__[i__ - 1] = 0.f;
|
||||
k = i__ - (1 << 2);
|
||||
i__1 = *len;
|
||||
for (j = (i__ << 2) + *len - *nsamp; j <= i__1; j += 2) {
|
||||
r__[i__ - 1] += lpbuf[j] * lpbuf[j - k];
|
||||
}
|
||||
}
|
||||
/* Calculate predictor coefficients */
|
||||
pc1 = 0.f;
|
||||
pc2 = 0.f;
|
||||
ivrc[1] = 0.f;
|
||||
ivrc[2] = 0.f;
|
||||
if (r__[0] > 1e-10f) {
|
||||
ivrc[1] = r__[1] / r__[0];
|
||||
ivrc[2] = (r__[2] - ivrc[1] * r__[1]) / (r__[0] - ivrc[1] * r__[1]);
|
||||
pc1 = ivrc[1] - ivrc[1] * ivrc[2];
|
||||
pc2 = ivrc[2];
|
||||
}
|
||||
/* Inverse filter LPBUF into IVBUF */
|
||||
i__1 = *len;
|
||||
for (i__ = *len + 1 - *nsamp; i__ <= i__1; ++i__) {
|
||||
ivbuf[i__] = lpbuf[i__] - pc1 * lpbuf[i__ - 4] - pc2 * lpbuf[i__ - 8];
|
||||
}
|
||||
return 0;
|
||||
} /* ivfilt_ */
|
||||
|
||||
/*
|
||||
|
||||
$Log: ivfilt.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.1 1996/08/19 22:31:53 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int ivfilt_(real *lpbuf, real *ivbuf, integer *len, integer *nsamp, real *ivrc);
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* ********************************************************************* */
|
||||
|
||||
/* IVFILT Version 48 */
|
||||
|
||||
/* $Log: ivfilt.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:31:53 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/15 21:36:29 jaf */
|
||||
/* Just added a few comments about which array indices of the arguments */
|
||||
/* are used, and mentioning that this subroutine has no local state. */
|
||||
|
||||
/* Revision 1.2 1996/03/13 00:01:00 jaf */
|
||||
/* Comments added explaining that none of the local variables of this */
|
||||
/* subroutine need to be saved from one invocation to the next. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:47:34 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ********************************************************************* */
|
||||
|
||||
/* 2nd order inverse filter, speech is decimated 4:1 */
|
||||
|
||||
/* Input: */
|
||||
/* LEN - Length of speech buffers */
|
||||
/* NSAMP - Number of samples to filter */
|
||||
/* LPBUF - Low pass filtered speech buffer */
|
||||
/* Indices LEN-NSAMP-7 through LEN read. */
|
||||
/* Output: */
|
||||
/* IVBUF - Inverse filtered speech buffer */
|
||||
/* Indices LEN-NSAMP+1 through LEN written. */
|
||||
/* IVRC - Inverse filter reflection coefficients (for voicing) */
|
||||
/* Indices 1 and 2 both written (also read, but only after writing).
|
||||
*/
|
||||
|
||||
/* This subroutine has no local state. */
|
||||
|
||||
/* Subroutine */ int ivfilt_(real *lpbuf, real *ivbuf, integer *len, integer *
|
||||
nsamp, real *ivrc)
|
||||
{
|
||||
/* System generated locals */
|
||||
integer i__1;
|
||||
|
||||
/* Local variables */
|
||||
integer i__, j, k;
|
||||
real r__[3], pc1, pc2;
|
||||
|
||||
/* Arguments */
|
||||
/* Local variables that need not be saved */
|
||||
/* Local state */
|
||||
/* None */
|
||||
/* Calculate Autocorrelations */
|
||||
/* Parameter adjustments */
|
||||
--ivbuf;
|
||||
--lpbuf;
|
||||
--ivrc;
|
||||
|
||||
/* Function Body */
|
||||
for (i__ = 1; i__ <= 3; ++i__) {
|
||||
r__[i__ - 1] = 0.f;
|
||||
k = i__ - (1 << 2);
|
||||
i__1 = *len;
|
||||
for (j = (i__ << 2) + *len - *nsamp; j <= i__1; j += 2) {
|
||||
r__[i__ - 1] += lpbuf[j] * lpbuf[j - k];
|
||||
}
|
||||
}
|
||||
/* Calculate predictor coefficients */
|
||||
pc1 = 0.f;
|
||||
pc2 = 0.f;
|
||||
ivrc[1] = 0.f;
|
||||
ivrc[2] = 0.f;
|
||||
if (r__[0] > 1e-10f) {
|
||||
ivrc[1] = r__[1] / r__[0];
|
||||
ivrc[2] = (r__[2] - ivrc[1] * r__[1]) / (r__[0] - ivrc[1] * r__[1]);
|
||||
pc1 = ivrc[1] - ivrc[1] * ivrc[2];
|
||||
pc2 = ivrc[2];
|
||||
}
|
||||
/* Inverse filter LPBUF into IVBUF */
|
||||
i__1 = *len;
|
||||
for (i__ = *len + 1 - *nsamp; i__ <= i__1; ++i__) {
|
||||
ivbuf[i__] = lpbuf[i__] - pc1 * lpbuf[i__ - 4] - pc2 * lpbuf[i__ - 8];
|
||||
}
|
||||
return 0;
|
||||
} /* ivfilt_ */
|
||||
|
||||
|
||||
+211
-211
@@ -1,211 +1,211 @@
|
||||
/*
|
||||
|
||||
$Log: lpc10.h,v $
|
||||
Revision 1.1 2004/05/04 11:30:49 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:11 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.1 1996/08/19 22:47:31 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __LPC10_H__
|
||||
#define __LPC10_H__
|
||||
|
||||
#define LPC10_SAMPLES_PER_FRAME 180
|
||||
#define LPC10_BITS_IN_COMPRESSED_FRAME 54
|
||||
|
||||
|
||||
typedef short INT16;
|
||||
typedef int INT32;
|
||||
|
||||
|
||||
/* The initial values for every member of this structure is 0, except
|
||||
where noted in comments. */
|
||||
|
||||
/* These two lines are copied from f2c.h. There should be a more
|
||||
elegant way of doing this than having the same declarations in two
|
||||
files. */
|
||||
|
||||
typedef float real;
|
||||
typedef INT32 integer;
|
||||
typedef INT32 logical;
|
||||
typedef INT16 shortint;
|
||||
|
||||
struct lpc10_encoder_state {
|
||||
/* State used only by function hp100 */
|
||||
real z11;
|
||||
real z21;
|
||||
real z12;
|
||||
real z22;
|
||||
|
||||
/* State used by function analys */
|
||||
real inbuf[540], pebuf[540];
|
||||
real lpbuf[696], ivbuf[312];
|
||||
real bias;
|
||||
integer osbuf[10]; /* no initial value necessary */
|
||||
integer osptr; /* initial value 1 */
|
||||
integer obound[3];
|
||||
integer vwin[6] /* was [2][3] */; /* initial value vwin[4] = 307; vwin[5] = 462; */
|
||||
integer awin[6] /* was [2][3] */; /* initial value awin[4] = 307; awin[5] = 462; */
|
||||
integer voibuf[8] /* was [2][4] */;
|
||||
real rmsbuf[3];
|
||||
real rcbuf[30] /* was [10][3] */;
|
||||
real zpre;
|
||||
|
||||
|
||||
/* State used by function onset */
|
||||
real n;
|
||||
real d__; /* initial value 1.f */
|
||||
real fpc; /* no initial value necessary */
|
||||
real l2buf[16];
|
||||
real l2sum1;
|
||||
integer l2ptr1; /* initial value 1 */
|
||||
integer l2ptr2; /* initial value 9 */
|
||||
integer lasti; /* no initial value necessary */
|
||||
logical hyst; /* initial value FALSE_ */
|
||||
|
||||
/* State used by function voicin */
|
||||
real dither; /* initial value 20.f */
|
||||
real snr;
|
||||
real maxmin;
|
||||
real voice[6] /* was [2][3] */; /* initial value is probably unnecessary */
|
||||
integer lbve, lbue, fbve, fbue;
|
||||
integer ofbue, sfbue;
|
||||
integer olbue, slbue;
|
||||
/* Initial values:
|
||||
lbve = 3000;
|
||||
fbve = 3000;
|
||||
fbue = 187;
|
||||
ofbue = 187;
|
||||
sfbue = 187;
|
||||
lbue = 93;
|
||||
olbue = 93;
|
||||
slbue = 93;
|
||||
snr = (real) (fbve / fbue << 6);
|
||||
*/
|
||||
|
||||
/* State used by function dyptrk */
|
||||
real s[60];
|
||||
integer p[120] /* was [60][2] */;
|
||||
integer ipoint;
|
||||
real alphax;
|
||||
|
||||
/* State used by function chanwr */
|
||||
integer isync;
|
||||
|
||||
};
|
||||
|
||||
|
||||
struct lpc10_decoder_state {
|
||||
|
||||
/* State used by function decode */
|
||||
integer iptold; /* initial value 60 */
|
||||
logical first; /* initial value TRUE_ */
|
||||
integer ivp2h;
|
||||
integer iovoic;
|
||||
integer iavgp; /* initial value 60 */
|
||||
integer erate;
|
||||
integer drc[30] /* was [3][10] */;
|
||||
integer dpit[3];
|
||||
integer drms[3];
|
||||
|
||||
/* State used by function synths */
|
||||
real buf[360];
|
||||
integer buflen; /* initial value 180 */
|
||||
|
||||
/* State used by function pitsyn */
|
||||
integer ivoico; /* no initial value necessary as long as first_pitsyn is initially TRUE_ */
|
||||
integer ipito; /* no initial value necessary as long as first_pitsyn is initially TRUE_ */
|
||||
real rmso; /* initial value 1.f */
|
||||
real rco[10]; /* no initial value necessary as long as first_pitsyn is initially TRUE_ */
|
||||
integer jsamp; /* no initial value necessary as long as first_pitsyn is initially TRUE_ */
|
||||
logical first_pitsyn; /* initial value TRUE_ */
|
||||
|
||||
/* State used by function bsynz */
|
||||
integer ipo;
|
||||
real exc[166];
|
||||
real exc2[166];
|
||||
real lpi1;
|
||||
real lpi2;
|
||||
real lpi3;
|
||||
real hpi1;
|
||||
real hpi2;
|
||||
real hpi3;
|
||||
real rmso_bsynz;
|
||||
|
||||
/* State used by function random */
|
||||
integer j; /* initial value 2 */
|
||||
integer k; /* initial value 5 */
|
||||
shortint y[5]; /* initial value { -21161,-8478,30892,-10216,16950 } */
|
||||
|
||||
/* State used by function deemp */
|
||||
real dei1;
|
||||
real dei2;
|
||||
real deo1;
|
||||
real deo2;
|
||||
real deo3;
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
/*
|
||||
|
||||
Calling sequence:
|
||||
|
||||
Call create_lpc10_encoder_state(), which returns a pointer to an
|
||||
already initialized lpc10_encoder_state structure.
|
||||
|
||||
lpc10_encode reads indices 0 through (LPC10_SAMPLES_PER_FRAME-1) of
|
||||
array speech[], and writes indices 0 through
|
||||
(LPC10_BITS_IN_COMPRESSED_FRAME-1) of array bits[], and both reads
|
||||
and writes the lpc10_encoder_state structure contents. The
|
||||
lpc10_encoder_state structure should *not* be initialized for every
|
||||
frame of encoded speech. Once at the beginning of execution, done
|
||||
automatically for you by create_lpc10_encoder_state(), is enough.
|
||||
|
||||
init_lpc10_encoder_state() reinitializes the lpc10_encoder_state
|
||||
structure. This might be useful if you are finished processing one
|
||||
sound sample, and want to reuse the same lpc10_encoder_state
|
||||
structure to process another sound sample. There might be other
|
||||
uses as well.
|
||||
|
||||
Note that the comments in the lpc10/lpcenc.c file imply that indices
|
||||
1 through 180 of array speech[] are read. These comments were
|
||||
written for the Fortran version of the code, before it was
|
||||
automatically converted to C by the conversion program f2c. f2c
|
||||
seems to use the convention that the pointers to arrays passed as
|
||||
function arguments point to the first index used in the Fortran
|
||||
code, whatever index that might be (usually 1), and then it modifies
|
||||
the pointer inside of the function, like so:
|
||||
|
||||
if (speech) {
|
||||
--speech;
|
||||
}
|
||||
|
||||
So that the code can access the first value at index 1 and the last
|
||||
at index 180. This makes the translated C code "closer" to the
|
||||
original Fortran code.
|
||||
|
||||
The calling sequence for the decoder is similar to the encoder. The
|
||||
only significant difference is that the array bits[] is read
|
||||
(indices 0 through (LPC10_BITS_IN_COMPRESSED_FRAME-1)), and the
|
||||
array speech[] is written (indices 0 through
|
||||
(LPC10_SAMPLES_PER_FRAME-1)).
|
||||
|
||||
*/
|
||||
|
||||
struct lpc10_encoder_state * create_lpc10_encoder_state ();
|
||||
void init_lpc10_encoder_state (struct lpc10_encoder_state *st);
|
||||
int lpc10_encode (real *speech, INT32 *bits, struct lpc10_encoder_state *st);
|
||||
|
||||
struct lpc10_decoder_state * create_lpc10_decoder_state ();
|
||||
void init_lpc10_decoder_state (struct lpc10_decoder_state *st);
|
||||
int lpc10_decode (INT32 *bits, real *speech, struct lpc10_decoder_state *st);
|
||||
|
||||
#endif /* __LPC10_H__ */
|
||||
/*
|
||||
|
||||
$Log: lpc10.h,v $
|
||||
Revision 1.1 2004/05/04 11:30:49 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:11 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.1 1996/08/19 22:47:31 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __LPC10_H__
|
||||
#define __LPC10_H__
|
||||
|
||||
#define LPC10_SAMPLES_PER_FRAME 180
|
||||
#define LPC10_BITS_IN_COMPRESSED_FRAME 54
|
||||
|
||||
|
||||
typedef short INT16;
|
||||
typedef int INT32;
|
||||
|
||||
|
||||
/* The initial values for every member of this structure is 0, except
|
||||
where noted in comments. */
|
||||
|
||||
/* These two lines are copied from f2c.h. There should be a more
|
||||
elegant way of doing this than having the same declarations in two
|
||||
files. */
|
||||
|
||||
typedef float real;
|
||||
typedef INT32 integer;
|
||||
typedef INT32 logical;
|
||||
typedef INT16 shortint;
|
||||
|
||||
struct lpc10_encoder_state {
|
||||
/* State used only by function hp100 */
|
||||
real z11;
|
||||
real z21;
|
||||
real z12;
|
||||
real z22;
|
||||
|
||||
/* State used by function analys */
|
||||
real inbuf[540], pebuf[540];
|
||||
real lpbuf[696], ivbuf[312];
|
||||
real bias;
|
||||
integer osbuf[10]; /* no initial value necessary */
|
||||
integer osptr; /* initial value 1 */
|
||||
integer obound[3];
|
||||
integer vwin[6] /* was [2][3] */; /* initial value vwin[4] = 307; vwin[5] = 462; */
|
||||
integer awin[6] /* was [2][3] */; /* initial value awin[4] = 307; awin[5] = 462; */
|
||||
integer voibuf[8] /* was [2][4] */;
|
||||
real rmsbuf[3];
|
||||
real rcbuf[30] /* was [10][3] */;
|
||||
real zpre;
|
||||
|
||||
|
||||
/* State used by function onset */
|
||||
real n;
|
||||
real d__; /* initial value 1.f */
|
||||
real fpc; /* no initial value necessary */
|
||||
real l2buf[16];
|
||||
real l2sum1;
|
||||
integer l2ptr1; /* initial value 1 */
|
||||
integer l2ptr2; /* initial value 9 */
|
||||
integer lasti; /* no initial value necessary */
|
||||
logical hyst; /* initial value FALSE_ */
|
||||
|
||||
/* State used by function voicin */
|
||||
real dither; /* initial value 20.f */
|
||||
real snr;
|
||||
real maxmin;
|
||||
real voice[6] /* was [2][3] */; /* initial value is probably unnecessary */
|
||||
integer lbve, lbue, fbve, fbue;
|
||||
integer ofbue, sfbue;
|
||||
integer olbue, slbue;
|
||||
/* Initial values:
|
||||
lbve = 3000;
|
||||
fbve = 3000;
|
||||
fbue = 187;
|
||||
ofbue = 187;
|
||||
sfbue = 187;
|
||||
lbue = 93;
|
||||
olbue = 93;
|
||||
slbue = 93;
|
||||
snr = (real) (fbve / fbue << 6);
|
||||
*/
|
||||
|
||||
/* State used by function dyptrk */
|
||||
real s[60];
|
||||
integer p[120] /* was [60][2] */;
|
||||
integer ipoint;
|
||||
real alphax;
|
||||
|
||||
/* State used by function chanwr */
|
||||
integer isync;
|
||||
|
||||
};
|
||||
|
||||
|
||||
struct lpc10_decoder_state {
|
||||
|
||||
/* State used by function decode */
|
||||
integer iptold; /* initial value 60 */
|
||||
logical first; /* initial value TRUE_ */
|
||||
integer ivp2h;
|
||||
integer iovoic;
|
||||
integer iavgp; /* initial value 60 */
|
||||
integer erate;
|
||||
integer drc[30] /* was [3][10] */;
|
||||
integer dpit[3];
|
||||
integer drms[3];
|
||||
|
||||
/* State used by function synths */
|
||||
real buf[360];
|
||||
integer buflen; /* initial value 180 */
|
||||
|
||||
/* State used by function pitsyn */
|
||||
integer ivoico; /* no initial value necessary as long as first_pitsyn is initially TRUE_ */
|
||||
integer ipito; /* no initial value necessary as long as first_pitsyn is initially TRUE_ */
|
||||
real rmso; /* initial value 1.f */
|
||||
real rco[10]; /* no initial value necessary as long as first_pitsyn is initially TRUE_ */
|
||||
integer jsamp; /* no initial value necessary as long as first_pitsyn is initially TRUE_ */
|
||||
logical first_pitsyn; /* initial value TRUE_ */
|
||||
|
||||
/* State used by function bsynz */
|
||||
integer ipo;
|
||||
real exc[166];
|
||||
real exc2[166];
|
||||
real lpi1;
|
||||
real lpi2;
|
||||
real lpi3;
|
||||
real hpi1;
|
||||
real hpi2;
|
||||
real hpi3;
|
||||
real rmso_bsynz;
|
||||
|
||||
/* State used by function random */
|
||||
integer j; /* initial value 2 */
|
||||
integer k; /* initial value 5 */
|
||||
shortint y[5]; /* initial value { -21161,-8478,30892,-10216,16950 } */
|
||||
|
||||
/* State used by function deemp */
|
||||
real dei1;
|
||||
real dei2;
|
||||
real deo1;
|
||||
real deo2;
|
||||
real deo3;
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
/*
|
||||
|
||||
Calling sequence:
|
||||
|
||||
Call create_lpc10_encoder_state(), which returns a pointer to an
|
||||
already initialized lpc10_encoder_state structure.
|
||||
|
||||
lpc10_encode reads indices 0 through (LPC10_SAMPLES_PER_FRAME-1) of
|
||||
array speech[], and writes indices 0 through
|
||||
(LPC10_BITS_IN_COMPRESSED_FRAME-1) of array bits[], and both reads
|
||||
and writes the lpc10_encoder_state structure contents. The
|
||||
lpc10_encoder_state structure should *not* be initialized for every
|
||||
frame of encoded speech. Once at the beginning of execution, done
|
||||
automatically for you by create_lpc10_encoder_state(), is enough.
|
||||
|
||||
init_lpc10_encoder_state() reinitializes the lpc10_encoder_state
|
||||
structure. This might be useful if you are finished processing one
|
||||
sound sample, and want to reuse the same lpc10_encoder_state
|
||||
structure to process another sound sample. There might be other
|
||||
uses as well.
|
||||
|
||||
Note that the comments in the lpc10/lpcenc.c file imply that indices
|
||||
1 through 180 of array speech[] are read. These comments were
|
||||
written for the Fortran version of the code, before it was
|
||||
automatically converted to C by the conversion program f2c. f2c
|
||||
seems to use the convention that the pointers to arrays passed as
|
||||
function arguments point to the first index used in the Fortran
|
||||
code, whatever index that might be (usually 1), and then it modifies
|
||||
the pointer inside of the function, like so:
|
||||
|
||||
if (speech) {
|
||||
--speech;
|
||||
}
|
||||
|
||||
So that the code can access the first value at index 1 and the last
|
||||
at index 180. This makes the translated C code "closer" to the
|
||||
original Fortran code.
|
||||
|
||||
The calling sequence for the decoder is similar to the encoder. The
|
||||
only significant difference is that the array bits[] is read
|
||||
(indices 0 through (LPC10_BITS_IN_COMPRESSED_FRAME-1)), and the
|
||||
array speech[] is written (indices 0 through
|
||||
(LPC10_SAMPLES_PER_FRAME-1)).
|
||||
|
||||
*/
|
||||
|
||||
struct lpc10_encoder_state * create_lpc10_encoder_state ();
|
||||
void init_lpc10_encoder_state (struct lpc10_encoder_state *st);
|
||||
int lpc10_encode (real *speech, INT32 *bits, struct lpc10_encoder_state *st);
|
||||
|
||||
struct lpc10_decoder_state * create_lpc10_decoder_state ();
|
||||
void init_lpc10_decoder_state (struct lpc10_decoder_state *st);
|
||||
int lpc10_decode (INT32 *bits, real *speech, struct lpc10_decoder_state *st);
|
||||
|
||||
#endif /* __LPC10_H__ */
|
||||
|
||||
+276
-276
@@ -1,276 +1,276 @@
|
||||
/*
|
||||
|
||||
$Log: lpcdec.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.2 1996/08/20 20:30:11 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_encoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_encoder_state().
|
||||
*
|
||||
* Changed name of function from lpcenc_ to lpc10_encode, simply to make
|
||||
* all lpc10 functions have more consistent naming with each other.
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:31:48 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int lpcdec_(integer *bits, real *speech);
|
||||
extern int initlpcdec_(void);
|
||||
/* comlen contrl_ 12 */
|
||||
/*:ref: chanrd_ 14 5 4 4 4 4 4 */
|
||||
/*:ref: decode_ 14 7 4 4 4 4 4 6 6 */
|
||||
/*:ref: synths_ 14 6 4 4 6 6 6 4 */
|
||||
/*:ref: initdecode_ 14 0 */
|
||||
/*:ref: initsynths_ 14 0 */
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* Common Block Declarations */
|
||||
|
||||
extern struct {
|
||||
integer order, lframe;
|
||||
logical corrp;
|
||||
} contrl_;
|
||||
|
||||
#define contrl_1 contrl_
|
||||
|
||||
/* Table of constant values */
|
||||
|
||||
static integer c__10 = 10;
|
||||
|
||||
/* ***************************************************************** */
|
||||
|
||||
/* $Log: lpcdec.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:30:11 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_encoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_encoder_state().
|
||||
*
|
||||
* Changed name of function from lpcenc_ to lpc10_encode, simply to make
|
||||
* all lpc10 functions have more consistent naming with each other.
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:31:48 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.1 1996/03/28 00:03:00 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ***************************************************************** */
|
||||
|
||||
/* Decode 54 bits to one frame of 180 speech samples. */
|
||||
|
||||
/* Input: */
|
||||
/* BITS - 54 encoded bits, stored 1 per array element. */
|
||||
/* Indices 1 through 53 read (SYNC bit ignored). */
|
||||
/* Output: */
|
||||
/* SPEECH - Speech encoded as real values in the range [-1,+1]. */
|
||||
/* Indices 1 through 180 written. */
|
||||
|
||||
/* This subroutine maintains local state from one call to the next. If */
|
||||
/* you want to switch to using a new audio stream for this filter, or */
|
||||
/* reinitialize its state for any other reason, call the ENTRY */
|
||||
/* INITLPCDEC. */
|
||||
|
||||
/* Subroutine */ int lpc10_decode(integer *bits, real *speech,
|
||||
struct lpc10_decoder_state *st)
|
||||
{
|
||||
integer irms, voice[2], pitch, ipitv;
|
||||
extern /* Subroutine */ int decode_(integer *, integer *, integer *,
|
||||
integer *, integer *, real *, real *, struct lpc10_decoder_state *);
|
||||
real rc[10];
|
||||
extern /* Subroutine */ int chanrd_(integer *, integer *, integer *,
|
||||
integer *, integer *), synths_(integer *,
|
||||
integer *, real *, real *, real *, integer *,
|
||||
struct lpc10_decoder_state *);
|
||||
integer irc[10], len;
|
||||
real rms;
|
||||
|
||||
/* $Log: lpcdec.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:30:11 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_encoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_encoder_state().
|
||||
*
|
||||
* Changed name of function from lpcenc_ to lpc10_encode, simply to make
|
||||
* all lpc10 functions have more consistent naming with each other.
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:31:48 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/29 22:03:47 jaf */
|
||||
/* Removed definitions for any constants that were no longer used. */
|
||||
|
||||
/* Revision 1.2 1996/03/26 19:34:33 jaf */
|
||||
/* Added comments indicating which constants are not needed in an */
|
||||
/* application that uses the LPC-10 coder. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:43:51 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
/* LPC Configuration parameters: */
|
||||
/* Frame size, Prediction order, Pitch period */
|
||||
/* Arguments */
|
||||
/* $Log: lpcdec.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:30:11 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_encoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_encoder_state().
|
||||
*
|
||||
* Changed name of function from lpcenc_ to lpc10_encode, simply to make
|
||||
* all lpc10 functions have more consistent naming with each other.
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:31:48 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/29 22:05:55 jaf */
|
||||
/* Commented out the common block variables that are not needed by the */
|
||||
/* embedded version. */
|
||||
|
||||
/* Revision 1.2 1996/03/26 19:34:50 jaf */
|
||||
/* Added comments indicating which constants are not needed in an */
|
||||
/* application that uses the LPC-10 coder. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:44:09 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
/* LPC Processing control variables: */
|
||||
|
||||
/* *** Read-only: initialized in setup */
|
||||
|
||||
/* Files for Speech, Parameter, and Bitstream Input & Output, */
|
||||
/* and message and debug outputs. */
|
||||
|
||||
/* Here are the only files which use these variables: */
|
||||
|
||||
/* lpcsim.f setup.f trans.f error.f vqsetup.f */
|
||||
|
||||
/* Many files which use fdebug are not listed, since it is only used in */
|
||||
/* those other files conditionally, to print trace statements. */
|
||||
/* integer fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
|
||||
/* LPC order, Frame size, Quantization rate, Bits per frame, */
|
||||
/* Error correction */
|
||||
/* Subroutine SETUP is the only place where order is assigned a value, */
|
||||
/* and that value is 10. It could increase efficiency 1% or so to */
|
||||
/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as
|
||||
*/
|
||||
/* a variable in a COMMON block, since it is used in many places in the */
|
||||
/* core of the coding and decoding routines. Actually, I take that back.
|
||||
*/
|
||||
/* At least when compiling with f2c, the upper bound of DO loops is */
|
||||
/* stored in a local variable before the DO loop begins, and then that is
|
||||
*/
|
||||
/* compared against on each iteration. */
|
||||
/* Similarly for lframe, which is given a value of MAXFRM in SETUP. */
|
||||
/* Similarly for quant, which is given a value of 2400 in SETUP. quant */
|
||||
/* is used in only a few places, and never in the core coding and */
|
||||
/* decoding routines, so it could be eliminated entirely. */
|
||||
/* nbits is similar to quant, and is given a value of 54 in SETUP. */
|
||||
/* corrp is given a value of .TRUE. in SETUP, and is only used in the */
|
||||
/* subroutines ENCODE and DECODE. It doesn't affect the speed of the */
|
||||
/* coder significantly whether it is .TRUE. or .FALSE., or whether it is
|
||||
*/
|
||||
/* a constant or a variable, since it is only examined once per frame. */
|
||||
/* Leaving it as a variable that is set to .TRUE. seems like a good */
|
||||
/* idea, since it does enable some error-correction capability for */
|
||||
/* unvoiced frames, with no change in the coding rate, and no noticeable
|
||||
*/
|
||||
/* quality difference in the decoded speech. */
|
||||
/* integer quant, nbits */
|
||||
/* *** Read/write: variables for debugging, not needed for LPC algorithm
|
||||
*/
|
||||
|
||||
/* Current frame, Unstable frames, Output clip count, Max onset buffer,
|
||||
*/
|
||||
/* Debug listing detail level, Line count on listing page */
|
||||
|
||||
/* nframe is not needed for an embedded LPC10 at all. */
|
||||
/* nunsfm is initialized to 0 in SETUP, and incremented in subroutine */
|
||||
/* ERROR, which is only called from RCCHK. When LPC10 is embedded into */
|
||||
/* an application, I would recommend removing the call to ERROR in RCCHK,
|
||||
*/
|
||||
/* and remove ERROR and nunsfm completely. */
|
||||
/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in
|
||||
*/
|
||||
/* sread.f. When LPC10 is embedded into an application, one might want */
|
||||
/* to cause it to be incremented in a routine that takes the output of */
|
||||
/* SYNTHS and sends it to an audio device. It could be optionally */
|
||||
/* displayed, for those that might want to know what it is. */
|
||||
/* maxosp is never initialized to 0 in SETUP, although it probably should
|
||||
*/
|
||||
/* be, and it is updated in subroutine ANALYS. I doubt that its value */
|
||||
/* would be of much interest to an application in which LPC10 is */
|
||||
/* embedded. */
|
||||
/* listl and lincnt are not needed for an embedded LPC10 at all. */
|
||||
/* integer nframe, nunsfm, iclip, maxosp, listl, lincnt */
|
||||
/* common /contrl/ fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
|
||||
/* common /contrl/ quant, nbits */
|
||||
/* common /contrl/ nframe, nunsfm, iclip, maxosp, listl, lincnt */
|
||||
/* Local variables that need not be saved */
|
||||
/* Uncoded speech parameters */
|
||||
/* Coded speech parameters */
|
||||
/* Others */
|
||||
/* Local state */
|
||||
/* None */
|
||||
/* Parameter adjustments */
|
||||
if (bits) {
|
||||
--bits;
|
||||
}
|
||||
if (speech) {
|
||||
--speech;
|
||||
}
|
||||
|
||||
/* Function Body */
|
||||
|
||||
chanrd_(&c__10, &ipitv, &irms, irc, &bits[1]);
|
||||
decode_(&ipitv, &irms, irc, voice, &pitch, &rms, rc, st);
|
||||
synths_(voice, &pitch, &rms, rc, &speech[1], &len, st);
|
||||
return 0;
|
||||
} /* lpcdec_ */
|
||||
/*
|
||||
|
||||
$Log: lpcdec.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.2 1996/08/20 20:30:11 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_encoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_encoder_state().
|
||||
*
|
||||
* Changed name of function from lpcenc_ to lpc10_encode, simply to make
|
||||
* all lpc10 functions have more consistent naming with each other.
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:31:48 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int lpcdec_(integer *bits, real *speech);
|
||||
extern int initlpcdec_(void);
|
||||
/* comlen contrl_ 12 */
|
||||
/*:ref: chanrd_ 14 5 4 4 4 4 4 */
|
||||
/*:ref: decode_ 14 7 4 4 4 4 4 6 6 */
|
||||
/*:ref: synths_ 14 6 4 4 6 6 6 4 */
|
||||
/*:ref: initdecode_ 14 0 */
|
||||
/*:ref: initsynths_ 14 0 */
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* Common Block Declarations */
|
||||
|
||||
extern struct {
|
||||
integer order, lframe;
|
||||
logical corrp;
|
||||
} contrl_;
|
||||
|
||||
#define contrl_1 contrl_
|
||||
|
||||
/* Table of constant values */
|
||||
|
||||
static integer c__10 = 10;
|
||||
|
||||
/* ***************************************************************** */
|
||||
|
||||
/* $Log: lpcdec.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:30:11 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_encoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_encoder_state().
|
||||
*
|
||||
* Changed name of function from lpcenc_ to lpc10_encode, simply to make
|
||||
* all lpc10 functions have more consistent naming with each other.
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:31:48 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.1 1996/03/28 00:03:00 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ***************************************************************** */
|
||||
|
||||
/* Decode 54 bits to one frame of 180 speech samples. */
|
||||
|
||||
/* Input: */
|
||||
/* BITS - 54 encoded bits, stored 1 per array element. */
|
||||
/* Indices 1 through 53 read (SYNC bit ignored). */
|
||||
/* Output: */
|
||||
/* SPEECH - Speech encoded as real values in the range [-1,+1]. */
|
||||
/* Indices 1 through 180 written. */
|
||||
|
||||
/* This subroutine maintains local state from one call to the next. If */
|
||||
/* you want to switch to using a new audio stream for this filter, or */
|
||||
/* reinitialize its state for any other reason, call the ENTRY */
|
||||
/* INITLPCDEC. */
|
||||
|
||||
/* Subroutine */ int lpc10_decode(integer *bits, real *speech,
|
||||
struct lpc10_decoder_state *st)
|
||||
{
|
||||
integer irms, voice[2], pitch, ipitv;
|
||||
extern /* Subroutine */ int decode_(integer *, integer *, integer *,
|
||||
integer *, integer *, real *, real *, struct lpc10_decoder_state *);
|
||||
real rc[10];
|
||||
extern /* Subroutine */ int chanrd_(integer *, integer *, integer *,
|
||||
integer *, integer *), synths_(integer *,
|
||||
integer *, real *, real *, real *, integer *,
|
||||
struct lpc10_decoder_state *);
|
||||
integer irc[10], len;
|
||||
real rms;
|
||||
|
||||
/* $Log: lpcdec.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:30:11 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_encoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_encoder_state().
|
||||
*
|
||||
* Changed name of function from lpcenc_ to lpc10_encode, simply to make
|
||||
* all lpc10 functions have more consistent naming with each other.
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:31:48 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/29 22:03:47 jaf */
|
||||
/* Removed definitions for any constants that were no longer used. */
|
||||
|
||||
/* Revision 1.2 1996/03/26 19:34:33 jaf */
|
||||
/* Added comments indicating which constants are not needed in an */
|
||||
/* application that uses the LPC-10 coder. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:43:51 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
/* LPC Configuration parameters: */
|
||||
/* Frame size, Prediction order, Pitch period */
|
||||
/* Arguments */
|
||||
/* $Log: lpcdec.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:30:11 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_encoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_encoder_state().
|
||||
*
|
||||
* Changed name of function from lpcenc_ to lpc10_encode, simply to make
|
||||
* all lpc10 functions have more consistent naming with each other.
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:31:48 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/29 22:05:55 jaf */
|
||||
/* Commented out the common block variables that are not needed by the */
|
||||
/* embedded version. */
|
||||
|
||||
/* Revision 1.2 1996/03/26 19:34:50 jaf */
|
||||
/* Added comments indicating which constants are not needed in an */
|
||||
/* application that uses the LPC-10 coder. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:44:09 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
/* LPC Processing control variables: */
|
||||
|
||||
/* *** Read-only: initialized in setup */
|
||||
|
||||
/* Files for Speech, Parameter, and Bitstream Input & Output, */
|
||||
/* and message and debug outputs. */
|
||||
|
||||
/* Here are the only files which use these variables: */
|
||||
|
||||
/* lpcsim.f setup.f trans.f error.f vqsetup.f */
|
||||
|
||||
/* Many files which use fdebug are not listed, since it is only used in */
|
||||
/* those other files conditionally, to print trace statements. */
|
||||
/* integer fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
|
||||
/* LPC order, Frame size, Quantization rate, Bits per frame, */
|
||||
/* Error correction */
|
||||
/* Subroutine SETUP is the only place where order is assigned a value, */
|
||||
/* and that value is 10. It could increase efficiency 1% or so to */
|
||||
/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as
|
||||
*/
|
||||
/* a variable in a COMMON block, since it is used in many places in the */
|
||||
/* core of the coding and decoding routines. Actually, I take that back.
|
||||
*/
|
||||
/* At least when compiling with f2c, the upper bound of DO loops is */
|
||||
/* stored in a local variable before the DO loop begins, and then that is
|
||||
*/
|
||||
/* compared against on each iteration. */
|
||||
/* Similarly for lframe, which is given a value of MAXFRM in SETUP. */
|
||||
/* Similarly for quant, which is given a value of 2400 in SETUP. quant */
|
||||
/* is used in only a few places, and never in the core coding and */
|
||||
/* decoding routines, so it could be eliminated entirely. */
|
||||
/* nbits is similar to quant, and is given a value of 54 in SETUP. */
|
||||
/* corrp is given a value of .TRUE. in SETUP, and is only used in the */
|
||||
/* subroutines ENCODE and DECODE. It doesn't affect the speed of the */
|
||||
/* coder significantly whether it is .TRUE. or .FALSE., or whether it is
|
||||
*/
|
||||
/* a constant or a variable, since it is only examined once per frame. */
|
||||
/* Leaving it as a variable that is set to .TRUE. seems like a good */
|
||||
/* idea, since it does enable some error-correction capability for */
|
||||
/* unvoiced frames, with no change in the coding rate, and no noticeable
|
||||
*/
|
||||
/* quality difference in the decoded speech. */
|
||||
/* integer quant, nbits */
|
||||
/* *** Read/write: variables for debugging, not needed for LPC algorithm
|
||||
*/
|
||||
|
||||
/* Current frame, Unstable frames, Output clip count, Max onset buffer,
|
||||
*/
|
||||
/* Debug listing detail level, Line count on listing page */
|
||||
|
||||
/* nframe is not needed for an embedded LPC10 at all. */
|
||||
/* nunsfm is initialized to 0 in SETUP, and incremented in subroutine */
|
||||
/* ERROR, which is only called from RCCHK. When LPC10 is embedded into */
|
||||
/* an application, I would recommend removing the call to ERROR in RCCHK,
|
||||
*/
|
||||
/* and remove ERROR and nunsfm completely. */
|
||||
/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in
|
||||
*/
|
||||
/* sread.f. When LPC10 is embedded into an application, one might want */
|
||||
/* to cause it to be incremented in a routine that takes the output of */
|
||||
/* SYNTHS and sends it to an audio device. It could be optionally */
|
||||
/* displayed, for those that might want to know what it is. */
|
||||
/* maxosp is never initialized to 0 in SETUP, although it probably should
|
||||
*/
|
||||
/* be, and it is updated in subroutine ANALYS. I doubt that its value */
|
||||
/* would be of much interest to an application in which LPC10 is */
|
||||
/* embedded. */
|
||||
/* listl and lincnt are not needed for an embedded LPC10 at all. */
|
||||
/* integer nframe, nunsfm, iclip, maxosp, listl, lincnt */
|
||||
/* common /contrl/ fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
|
||||
/* common /contrl/ quant, nbits */
|
||||
/* common /contrl/ nframe, nunsfm, iclip, maxosp, listl, lincnt */
|
||||
/* Local variables that need not be saved */
|
||||
/* Uncoded speech parameters */
|
||||
/* Coded speech parameters */
|
||||
/* Others */
|
||||
/* Local state */
|
||||
/* None */
|
||||
/* Parameter adjustments */
|
||||
if (bits) {
|
||||
--bits;
|
||||
}
|
||||
if (speech) {
|
||||
--speech;
|
||||
}
|
||||
|
||||
/* Function Body */
|
||||
|
||||
chanrd_(&c__10, &ipitv, &irms, irc, &bits[1]);
|
||||
decode_(&ipitv, &irms, irc, voice, &pitch, &rms, rc, st);
|
||||
synths_(voice, &pitch, &rms, rc, &speech[1], &len, st);
|
||||
return 0;
|
||||
} /* lpcdec_ */
|
||||
|
||||
+165
-165
@@ -1,165 +1,165 @@
|
||||
/*
|
||||
|
||||
$Log: lpcenc.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.2 1996/08/20 20:31:21 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_encoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_encoder_state().
|
||||
*
|
||||
* Changed name of function from lpcenc_ to lpc10_encode, simply to make
|
||||
* all lpc10 functions have more consistent naming with each other.
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:31:44 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int lpcenc_(real *speech, integer *bits);
|
||||
extern int initlpcenc_(void);
|
||||
/*:ref: prepro_ 14 2 6 4 */
|
||||
/*:ref: analys_ 14 5 6 4 4 6 6 */
|
||||
/*:ref: encode_ 14 7 4 4 6 6 4 4 4 */
|
||||
/*:ref: chanwr_ 14 5 4 4 4 4 4 */
|
||||
/*:ref: initprepro_ 14 0 */
|
||||
/*:ref: initanalys_ 14 0 */
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* Table of constant values */
|
||||
|
||||
static integer c__180 = 180;
|
||||
static integer c__10 = 10;
|
||||
|
||||
/* ***************************************************************** */
|
||||
|
||||
/* $Log: lpcenc.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:31:21 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_encoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_encoder_state().
|
||||
*
|
||||
* Changed name of function from lpcenc_ to lpc10_encode, simply to make
|
||||
* all lpc10 functions have more consistent naming with each other.
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:31:44 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.2 1996/03/28 00:01:22 jaf */
|
||||
/* Commented out some trace statements. */
|
||||
|
||||
/* Revision 1.1 1996/03/28 00:00:27 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ***************************************************************** */
|
||||
|
||||
/* Encode one frame of 180 speech samples to 54 bits. */
|
||||
|
||||
/* Input: */
|
||||
/* SPEECH - Speech encoded as real values in the range [-1,+1]. */
|
||||
/* Indices 1 through 180 read, and modified (by PREPRO). */
|
||||
/* Output: */
|
||||
/* BITS - 54 encoded bits, stored 1 per array element. */
|
||||
/* Indices 1 through 54 written. */
|
||||
|
||||
/* This subroutine maintains local state from one call to the next. If */
|
||||
/* you want to switch to using a new audio stream for this filter, or */
|
||||
/* reinitialize its state for any other reason, call the ENTRY */
|
||||
/* INITLPCENC. */
|
||||
|
||||
/* Subroutine */ int lpc10_encode(real *speech, integer *bits,
|
||||
struct lpc10_encoder_state *st)
|
||||
{
|
||||
integer irms, voice[2], pitch, ipitv;
|
||||
real rc[10];
|
||||
extern /* Subroutine */ int encode_(integer *, integer *, real *, real *,
|
||||
integer *, integer *, integer *), chanwr_(integer *, integer *,
|
||||
integer *, integer *, integer *, struct lpc10_encoder_state *),
|
||||
analys_(real *, integer *,
|
||||
integer *, real *, real *, struct lpc10_encoder_state *),
|
||||
prepro_(real *, integer *, struct lpc10_encoder_state *);
|
||||
integer irc[10];
|
||||
real rms;
|
||||
|
||||
/* Arguments */
|
||||
/* $Log: lpcenc.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:31:21 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_encoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_encoder_state().
|
||||
*
|
||||
* Changed name of function from lpcenc_ to lpc10_encode, simply to make
|
||||
* all lpc10 functions have more consistent naming with each other.
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:31:44 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/29 22:03:47 jaf */
|
||||
/* Removed definitions for any constants that were no longer used. */
|
||||
|
||||
/* Revision 1.2 1996/03/26 19:34:33 jaf */
|
||||
/* Added comments indicating which constants are not needed in an */
|
||||
/* application that uses the LPC-10 coder. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:43:51 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
/* LPC Configuration parameters: */
|
||||
/* Frame size, Prediction order, Pitch period */
|
||||
/* Local variables that need not be saved */
|
||||
/* Uncoded speech parameters */
|
||||
/* Coded speech parameters */
|
||||
/* Local state */
|
||||
/* None */
|
||||
/* Parameter adjustments */
|
||||
if (speech) {
|
||||
--speech;
|
||||
}
|
||||
if (bits) {
|
||||
--bits;
|
||||
}
|
||||
|
||||
/* Function Body */
|
||||
prepro_(&speech[1], &c__180, st);
|
||||
analys_(&speech[1], voice, &pitch, &rms, rc, st);
|
||||
encode_(voice, &pitch, &rms, rc, &ipitv, &irms, irc);
|
||||
chanwr_(&c__10, &ipitv, &irms, irc, &bits[1], st);
|
||||
return 0;
|
||||
} /* lpcenc_ */
|
||||
/*
|
||||
|
||||
$Log: lpcenc.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.2 1996/08/20 20:31:21 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_encoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_encoder_state().
|
||||
*
|
||||
* Changed name of function from lpcenc_ to lpc10_encode, simply to make
|
||||
* all lpc10 functions have more consistent naming with each other.
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:31:44 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int lpcenc_(real *speech, integer *bits);
|
||||
extern int initlpcenc_(void);
|
||||
/*:ref: prepro_ 14 2 6 4 */
|
||||
/*:ref: analys_ 14 5 6 4 4 6 6 */
|
||||
/*:ref: encode_ 14 7 4 4 6 6 4 4 4 */
|
||||
/*:ref: chanwr_ 14 5 4 4 4 4 4 */
|
||||
/*:ref: initprepro_ 14 0 */
|
||||
/*:ref: initanalys_ 14 0 */
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* Table of constant values */
|
||||
|
||||
static integer c__180 = 180;
|
||||
static integer c__10 = 10;
|
||||
|
||||
/* ***************************************************************** */
|
||||
|
||||
/* $Log: lpcenc.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:31:21 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_encoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_encoder_state().
|
||||
*
|
||||
* Changed name of function from lpcenc_ to lpc10_encode, simply to make
|
||||
* all lpc10 functions have more consistent naming with each other.
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:31:44 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.2 1996/03/28 00:01:22 jaf */
|
||||
/* Commented out some trace statements. */
|
||||
|
||||
/* Revision 1.1 1996/03/28 00:00:27 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ***************************************************************** */
|
||||
|
||||
/* Encode one frame of 180 speech samples to 54 bits. */
|
||||
|
||||
/* Input: */
|
||||
/* SPEECH - Speech encoded as real values in the range [-1,+1]. */
|
||||
/* Indices 1 through 180 read, and modified (by PREPRO). */
|
||||
/* Output: */
|
||||
/* BITS - 54 encoded bits, stored 1 per array element. */
|
||||
/* Indices 1 through 54 written. */
|
||||
|
||||
/* This subroutine maintains local state from one call to the next. If */
|
||||
/* you want to switch to using a new audio stream for this filter, or */
|
||||
/* reinitialize its state for any other reason, call the ENTRY */
|
||||
/* INITLPCENC. */
|
||||
|
||||
/* Subroutine */ int lpc10_encode(real *speech, integer *bits,
|
||||
struct lpc10_encoder_state *st)
|
||||
{
|
||||
integer irms, voice[2], pitch, ipitv;
|
||||
real rc[10];
|
||||
extern /* Subroutine */ int encode_(integer *, integer *, real *, real *,
|
||||
integer *, integer *, integer *), chanwr_(integer *, integer *,
|
||||
integer *, integer *, integer *, struct lpc10_encoder_state *),
|
||||
analys_(real *, integer *,
|
||||
integer *, real *, real *, struct lpc10_encoder_state *),
|
||||
prepro_(real *, integer *, struct lpc10_encoder_state *);
|
||||
integer irc[10];
|
||||
real rms;
|
||||
|
||||
/* Arguments */
|
||||
/* $Log: lpcenc.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:31:21 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_encoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_encoder_state().
|
||||
*
|
||||
* Changed name of function from lpcenc_ to lpc10_encode, simply to make
|
||||
* all lpc10 functions have more consistent naming with each other.
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:31:44 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/29 22:03:47 jaf */
|
||||
/* Removed definitions for any constants that were no longer used. */
|
||||
|
||||
/* Revision 1.2 1996/03/26 19:34:33 jaf */
|
||||
/* Added comments indicating which constants are not needed in an */
|
||||
/* application that uses the LPC-10 coder. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:43:51 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
/* LPC Configuration parameters: */
|
||||
/* Frame size, Prediction order, Pitch period */
|
||||
/* Local variables that need not be saved */
|
||||
/* Uncoded speech parameters */
|
||||
/* Coded speech parameters */
|
||||
/* Local state */
|
||||
/* None */
|
||||
/* Parameter adjustments */
|
||||
if (speech) {
|
||||
--speech;
|
||||
}
|
||||
if (bits) {
|
||||
--bits;
|
||||
}
|
||||
|
||||
/* Function Body */
|
||||
prepro_(&speech[1], &c__180, st);
|
||||
analys_(&speech[1], voice, &pitch, &rms, rc, st);
|
||||
encode_(voice, &pitch, &rms, rc, &ipitv, &irms, irc);
|
||||
chanwr_(&c__10, &ipitv, &irms, irc, &bits[1], st);
|
||||
return 0;
|
||||
} /* lpcenc_ */
|
||||
|
||||
+435
-435
@@ -1,435 +1,435 @@
|
||||
/*
|
||||
|
||||
$Log: lpcini.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.3 2002/10/10 05:29:04 robertj
|
||||
Removed non-ansi-C comments to maximise portability, thanks Martijn Roest
|
||||
|
||||
Revision 1.2 2001/02/24 14:00:10 rogerh
|
||||
Select the correct header file for malloc (stdlib.h or malloc.h)
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.2 1996/08/20 20:35:41 jaf
|
||||
* Added functions for allocating and initializing lpc10_encoder_state
|
||||
* and lpc10_decoder_state structures.
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:31:40 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int lpcini_(void);
|
||||
/* comlen contrl_ 12 */
|
||||
/*:ref: initlpcenc_ 14 0 */
|
||||
/*:ref: initlpcdec_ 14 0 */
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* malloc is now defined in stdlib.h in serveral systems */
|
||||
#ifdef HAS_STDLIB_H
|
||||
# include <stdlib.h>
|
||||
#else
|
||||
# ifdef HAS_MALLOC_H
|
||||
# include <malloc.h>
|
||||
# else
|
||||
extern char * malloc();
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Common Block Declarations */
|
||||
|
||||
struct {
|
||||
integer order, lframe;
|
||||
logical corrp;
|
||||
} contrl_;
|
||||
|
||||
#define contrl_1 contrl_
|
||||
|
||||
/* ***************************************************************** */
|
||||
|
||||
/* $Log: lpcini.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.3 2002/10/10 05:29:04 robertj
|
||||
* Removed non-ansi-C comments to maximise portability, thanks Martijn Roest
|
||||
*
|
||||
* Revision 1.2 2001/02/24 14:00:10 rogerh
|
||||
* Select the correct header file for malloc (stdlib.h or malloc.h)
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:35:41 jaf
|
||||
* Added functions for allocating and initializing lpc10_encoder_state
|
||||
* and lpc10_decoder_state structures.
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:31:40 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.1 1996/03/28 00:04:05 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ***************************************************************** */
|
||||
|
||||
/* Initialize COMMON block variables used by LPC-10 encoder and decoder, */
|
||||
/* and call initialization routines for both of them. */
|
||||
|
||||
/* Subroutine */ int lpcini_(void)
|
||||
{
|
||||
|
||||
/* $Log: lpcini.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.3 2002/10/10 05:29:04 robertj
|
||||
* Removed non-ansi-C comments to maximise portability, thanks Martijn Roest
|
||||
*
|
||||
* Revision 1.2 2001/02/24 14:00:10 rogerh
|
||||
* Select the correct header file for malloc (stdlib.h or malloc.h)
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:35:41 jaf
|
||||
* Added functions for allocating and initializing lpc10_encoder_state
|
||||
* and lpc10_decoder_state structures.
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:31:40 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/29 22:03:47 jaf */
|
||||
/* Removed definitions for any constants that were no longer used. */
|
||||
|
||||
/* Revision 1.2 1996/03/26 19:34:33 jaf */
|
||||
/* Added comments indicating which constants are not needed in an */
|
||||
/* application that uses the LPC-10 coder. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:43:51 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
/* LPC Configuration parameters: */
|
||||
/* Frame size, Prediction order, Pitch period */
|
||||
/* $Log: lpcini.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.3 2002/10/10 05:29:04 robertj
|
||||
* Removed non-ansi-C comments to maximise portability, thanks Martijn Roest
|
||||
*
|
||||
* Revision 1.2 2001/02/24 14:00:10 rogerh
|
||||
* Select the correct header file for malloc (stdlib.h or malloc.h)
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:35:41 jaf
|
||||
* Added functions for allocating and initializing lpc10_encoder_state
|
||||
* and lpc10_decoder_state structures.
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:31:40 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/29 22:05:55 jaf */
|
||||
/* Commented out the common block variables that are not needed by the */
|
||||
/* embedded version. */
|
||||
|
||||
/* Revision 1.2 1996/03/26 19:34:50 jaf */
|
||||
/* Added comments indicating which constants are not needed in an */
|
||||
/* application that uses the LPC-10 coder. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:44:09 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
/* LPC Processing control variables: */
|
||||
|
||||
/* *** Read-only: initialized in setup */
|
||||
|
||||
/* Files for Speech, Parameter, and Bitstream Input & Output, */
|
||||
/* and message and debug outputs. */
|
||||
|
||||
/* Here are the only files which use these variables: */
|
||||
|
||||
/* lpcsim.f setup.f trans.f error.f vqsetup.f */
|
||||
|
||||
/* Many files which use fdebug are not listed, since it is only used in */
|
||||
/* those other files conditionally, to print trace statements. */
|
||||
/* integer fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
|
||||
/* LPC order, Frame size, Quantization rate, Bits per frame, */
|
||||
/* Error correction */
|
||||
/* Subroutine SETUP is the only place where order is assigned a value, */
|
||||
/* and that value is 10. It could increase efficiency 1% or so to */
|
||||
/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as
|
||||
*/
|
||||
/* a variable in a COMMON block, since it is used in many places in the */
|
||||
/* core of the coding and decoding routines. Actually, I take that back.
|
||||
*/
|
||||
/* At least when compiling with f2c, the upper bound of DO loops is */
|
||||
/* stored in a local variable before the DO loop begins, and then that is
|
||||
*/
|
||||
/* compared against on each iteration. */
|
||||
/* Similarly for lframe, which is given a value of MAXFRM in SETUP. */
|
||||
/* Similarly for quant, which is given a value of 2400 in SETUP. quant */
|
||||
/* is used in only a few places, and never in the core coding and */
|
||||
/* decoding routines, so it could be eliminated entirely. */
|
||||
/* nbits is similar to quant, and is given a value of 54 in SETUP. */
|
||||
/* corrp is given a value of .TRUE. in SETUP, and is only used in the */
|
||||
/* subroutines ENCODE and DECODE. It doesn't affect the speed of the */
|
||||
/* coder significantly whether it is .TRUE. or .FALSE., or whether it is
|
||||
*/
|
||||
/* a constant or a variable, since it is only examined once per frame. */
|
||||
/* Leaving it as a variable that is set to .TRUE. seems like a good */
|
||||
/* idea, since it does enable some error-correction capability for */
|
||||
/* unvoiced frames, with no change in the coding rate, and no noticeable
|
||||
*/
|
||||
/* quality difference in the decoded speech. */
|
||||
/* integer quant, nbits */
|
||||
/* *** Read/write: variables for debugging, not needed for LPC algorithm
|
||||
*/
|
||||
|
||||
/* Current frame, Unstable frames, Output clip count, Max onset buffer,
|
||||
*/
|
||||
/* Debug listing detail level, Line count on listing page */
|
||||
|
||||
/* nframe is not needed for an embedded LPC10 at all. */
|
||||
/* nunsfm is initialized to 0 in SETUP, and incremented in subroutine */
|
||||
/* ERROR, which is only called from RCCHK. When LPC10 is embedded into */
|
||||
/* an application, I would recommend removing the call to ERROR in RCCHK,
|
||||
*/
|
||||
/* and remove ERROR and nunsfm completely. */
|
||||
/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in
|
||||
*/
|
||||
/* sread.f. When LPC10 is embedded into an application, one might want */
|
||||
/* to cause it to be incremented in a routine that takes the output of */
|
||||
/* SYNTHS and sends it to an audio device. It could be optionally */
|
||||
/* displayed, for those that might want to know what it is. */
|
||||
/* maxosp is never initialized to 0 in SETUP, although it probably should
|
||||
*/
|
||||
/* be, and it is updated in subroutine ANALYS. I doubt that its value */
|
||||
/* would be of much interest to an application in which LPC10 is */
|
||||
/* embedded. */
|
||||
/* listl and lincnt are not needed for an embedded LPC10 at all. */
|
||||
/* integer nframe, nunsfm, iclip, maxosp, listl, lincnt */
|
||||
/* common /contrl/ fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
|
||||
/* common /contrl/ quant, nbits */
|
||||
/* common /contrl/ nframe, nunsfm, iclip, maxosp, listl, lincnt */
|
||||
contrl_1.order = 10;
|
||||
contrl_1.lframe = 180;
|
||||
contrl_1.corrp = TRUE_;
|
||||
return 0;
|
||||
} /* lpcini_ */
|
||||
|
||||
|
||||
|
||||
/* Allocate memory for, and initialize, the state that needs to be
|
||||
kept from encoding one frame to the next for a single
|
||||
LPC-10-compressed audio stream. Return 0 if malloc fails,
|
||||
otherwise return pointer to new structure. */
|
||||
|
||||
struct lpc10_encoder_state *
|
||||
create_lpc10_encoder_state()
|
||||
{
|
||||
struct lpc10_encoder_state *st;
|
||||
|
||||
st = (struct lpc10_encoder_state *)
|
||||
malloc((unsigned) sizeof (struct lpc10_encoder_state));
|
||||
if (st != 0) {
|
||||
init_lpc10_encoder_state(st);
|
||||
}
|
||||
return (st);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void init_lpc10_encoder_state(struct lpc10_encoder_state *st)
|
||||
{
|
||||
int i;
|
||||
|
||||
lpcini_();
|
||||
|
||||
/* State used only by function hp100 */
|
||||
st->z11 = 0.0f;
|
||||
st->z21 = 0.0f;
|
||||
st->z12 = 0.0f;
|
||||
st->z22 = 0.0f;
|
||||
|
||||
/* State used by function analys */
|
||||
for (i = 0; i < 540; i++) {
|
||||
st->inbuf[i] = 0.0f;
|
||||
st->pebuf[i] = 0.0f;
|
||||
}
|
||||
for (i = 0; i < 696; i++) {
|
||||
st->lpbuf[i] = 0.0f;
|
||||
}
|
||||
for (i = 0; i < 312; i++) {
|
||||
st->ivbuf[i] = 0.0f;
|
||||
}
|
||||
st->bias = 0.0f;
|
||||
/* integer osbuf[10]; no initial value necessary */
|
||||
st->osptr = 1;
|
||||
for (i = 0; i < 3; i++) {
|
||||
st->obound[i] = 0;
|
||||
}
|
||||
st->vwin[4] = 307;
|
||||
st->vwin[5] = 462;
|
||||
st->awin[4] = 307;
|
||||
st->awin[5] = 462;
|
||||
for (i = 0; i < 8; i++) {
|
||||
st->voibuf[i] = 0;
|
||||
}
|
||||
for (i = 0; i < 3; i++) {
|
||||
st->rmsbuf[i] = 0.0f;
|
||||
}
|
||||
for (i = 0; i < 30; i++) {
|
||||
st->rcbuf[i] = 0.0f;
|
||||
}
|
||||
st->zpre = 0.0f;
|
||||
|
||||
|
||||
/* State used by function onset */
|
||||
st->n = 0.0f;
|
||||
st->d__ = 1.0f;
|
||||
/* real fpc; no initial value necessary */
|
||||
for (i = 0; i < 16; i++) {
|
||||
st->l2buf[i] = 0.0f;
|
||||
}
|
||||
st->l2sum1 = 0.0f;
|
||||
st->l2ptr1 = 1;
|
||||
st->l2ptr2 = 9;
|
||||
/* integer lasti; no initial value necessary */
|
||||
st->hyst = FALSE_;
|
||||
|
||||
/* State used by function voicin */
|
||||
st->dither = 20.0f;
|
||||
st->maxmin = 0.0f;
|
||||
for (i = 0; i < 6; i++) {
|
||||
st->voice[i] = 0.0f;
|
||||
}
|
||||
st->lbve = 3000;
|
||||
st->fbve = 3000;
|
||||
st->fbue = 187;
|
||||
st->ofbue = 187;
|
||||
st->sfbue = 187;
|
||||
st->lbue = 93;
|
||||
st->olbue = 93;
|
||||
st->slbue = 93;
|
||||
st->snr = (real) (st->fbve / st->fbue << 6);
|
||||
|
||||
/* State used by function dyptrk */
|
||||
for (i = 0; i < 60; i++) {
|
||||
st->s[i] = 0.0f;
|
||||
}
|
||||
for (i = 0; i < 120; i++) {
|
||||
st->p[i] = 0;
|
||||
}
|
||||
st->ipoint = 0;
|
||||
st->alphax = 0.0f;
|
||||
|
||||
/* State used by function chanwr */
|
||||
st->isync = 0;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Allocate memory for, and initialize, the state that needs to be
|
||||
kept from decoding one frame to the next for a single
|
||||
LPC-10-compressed audio stream. Return 0 if malloc fails,
|
||||
otherwise return pointer to new structure. */
|
||||
|
||||
struct lpc10_decoder_state *
|
||||
create_lpc10_decoder_state()
|
||||
{
|
||||
struct lpc10_decoder_state *st;
|
||||
|
||||
st = (struct lpc10_decoder_state *)
|
||||
malloc((unsigned) sizeof (struct lpc10_decoder_state));
|
||||
if (st != 0) {
|
||||
init_lpc10_decoder_state(st);
|
||||
}
|
||||
return (st);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void init_lpc10_decoder_state(struct lpc10_decoder_state *st)
|
||||
{
|
||||
int i;
|
||||
|
||||
lpcini_();
|
||||
|
||||
/* State used by function decode */
|
||||
st->iptold = 60;
|
||||
st->first = TRUE_;
|
||||
st->ivp2h = 0;
|
||||
st->iovoic = 0;
|
||||
st->iavgp = 60;
|
||||
st->erate = 0;
|
||||
for (i = 0; i < 30; i++) {
|
||||
st->drc[i] = 0;
|
||||
}
|
||||
for (i = 0; i < 3; i++) {
|
||||
st->dpit[i] = 0;
|
||||
st->drms[i] = 0;
|
||||
}
|
||||
|
||||
/* State used by function synths */
|
||||
for (i = 0; i < 360; i++) {
|
||||
st->buf[i] = 0.0f;
|
||||
}
|
||||
st->buflen = 180;
|
||||
|
||||
/* State used by function pitsyn */
|
||||
/* ivoico; no initial value necessary as long as first_pitsyn is initially TRUE_ */
|
||||
/* ipito; no initial value necessary as long as first_pitsyn is initially TRUE_ */
|
||||
st->rmso = 1.0f;
|
||||
/* rco[10]; no initial value necessary as long as first_pitsyn is initially TRUE_ */
|
||||
/* integer jsamp; no initial value necessary as long as first_pitsyn is initially TRUE_ */
|
||||
st->first_pitsyn = TRUE_;
|
||||
|
||||
/* State used by function bsynz */
|
||||
st->ipo = 0;
|
||||
for (i = 0; i < 166; i++) {
|
||||
st->exc[i] = 0.0f;
|
||||
st->exc2[i] = 0.0f;
|
||||
}
|
||||
st->lpi1 = 0.0f;
|
||||
st->lpi2 = 0.0f;
|
||||
st->lpi3 = 0.0f;
|
||||
st->hpi1 = 0.0f;
|
||||
st->hpi2 = 0.0f;
|
||||
st->hpi3 = 0.0f;
|
||||
st->rmso_bsynz = 0.0f;
|
||||
|
||||
/* State used by function random */
|
||||
st->j = 2;
|
||||
st->k = 5;
|
||||
st->y[0] = (shortint) -21161;
|
||||
st->y[1] = (shortint) -8478;
|
||||
st->y[2] = (shortint) 30892;
|
||||
st->y[3] = (shortint) -10216;
|
||||
st->y[4] = (shortint) 16950;
|
||||
|
||||
/* State used by function deemp */
|
||||
st->dei1 = 0.0f;
|
||||
st->dei2 = 0.0f;
|
||||
st->deo1 = 0.0f;
|
||||
st->deo2 = 0.0f;
|
||||
st->deo3 = 0.0f;
|
||||
}
|
||||
/*
|
||||
|
||||
$Log: lpcini.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.3 2002/10/10 05:29:04 robertj
|
||||
Removed non-ansi-C comments to maximise portability, thanks Martijn Roest
|
||||
|
||||
Revision 1.2 2001/02/24 14:00:10 rogerh
|
||||
Select the correct header file for malloc (stdlib.h or malloc.h)
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.2 1996/08/20 20:35:41 jaf
|
||||
* Added functions for allocating and initializing lpc10_encoder_state
|
||||
* and lpc10_decoder_state structures.
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:31:40 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int lpcini_(void);
|
||||
/* comlen contrl_ 12 */
|
||||
/*:ref: initlpcenc_ 14 0 */
|
||||
/*:ref: initlpcdec_ 14 0 */
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* malloc is now defined in stdlib.h in serveral systems */
|
||||
#ifdef HAS_STDLIB_H
|
||||
# include <stdlib.h>
|
||||
#else
|
||||
# ifdef HAS_MALLOC_H
|
||||
# include <malloc.h>
|
||||
# else
|
||||
extern char * malloc();
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Common Block Declarations */
|
||||
|
||||
struct {
|
||||
integer order, lframe;
|
||||
logical corrp;
|
||||
} contrl_;
|
||||
|
||||
#define contrl_1 contrl_
|
||||
|
||||
/* ***************************************************************** */
|
||||
|
||||
/* $Log: lpcini.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.3 2002/10/10 05:29:04 robertj
|
||||
* Removed non-ansi-C comments to maximise portability, thanks Martijn Roest
|
||||
*
|
||||
* Revision 1.2 2001/02/24 14:00:10 rogerh
|
||||
* Select the correct header file for malloc (stdlib.h or malloc.h)
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:35:41 jaf
|
||||
* Added functions for allocating and initializing lpc10_encoder_state
|
||||
* and lpc10_decoder_state structures.
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:31:40 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.1 1996/03/28 00:04:05 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ***************************************************************** */
|
||||
|
||||
/* Initialize COMMON block variables used by LPC-10 encoder and decoder, */
|
||||
/* and call initialization routines for both of them. */
|
||||
|
||||
/* Subroutine */ int lpcini_(void)
|
||||
{
|
||||
|
||||
/* $Log: lpcini.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.3 2002/10/10 05:29:04 robertj
|
||||
* Removed non-ansi-C comments to maximise portability, thanks Martijn Roest
|
||||
*
|
||||
* Revision 1.2 2001/02/24 14:00:10 rogerh
|
||||
* Select the correct header file for malloc (stdlib.h or malloc.h)
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:35:41 jaf
|
||||
* Added functions for allocating and initializing lpc10_encoder_state
|
||||
* and lpc10_decoder_state structures.
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:31:40 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/29 22:03:47 jaf */
|
||||
/* Removed definitions for any constants that were no longer used. */
|
||||
|
||||
/* Revision 1.2 1996/03/26 19:34:33 jaf */
|
||||
/* Added comments indicating which constants are not needed in an */
|
||||
/* application that uses the LPC-10 coder. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:43:51 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
/* LPC Configuration parameters: */
|
||||
/* Frame size, Prediction order, Pitch period */
|
||||
/* $Log: lpcini.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.3 2002/10/10 05:29:04 robertj
|
||||
* Removed non-ansi-C comments to maximise portability, thanks Martijn Roest
|
||||
*
|
||||
* Revision 1.2 2001/02/24 14:00:10 rogerh
|
||||
* Select the correct header file for malloc (stdlib.h or malloc.h)
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:35:41 jaf
|
||||
* Added functions for allocating and initializing lpc10_encoder_state
|
||||
* and lpc10_decoder_state structures.
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:31:40 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/29 22:05:55 jaf */
|
||||
/* Commented out the common block variables that are not needed by the */
|
||||
/* embedded version. */
|
||||
|
||||
/* Revision 1.2 1996/03/26 19:34:50 jaf */
|
||||
/* Added comments indicating which constants are not needed in an */
|
||||
/* application that uses the LPC-10 coder. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:44:09 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
/* LPC Processing control variables: */
|
||||
|
||||
/* *** Read-only: initialized in setup */
|
||||
|
||||
/* Files for Speech, Parameter, and Bitstream Input & Output, */
|
||||
/* and message and debug outputs. */
|
||||
|
||||
/* Here are the only files which use these variables: */
|
||||
|
||||
/* lpcsim.f setup.f trans.f error.f vqsetup.f */
|
||||
|
||||
/* Many files which use fdebug are not listed, since it is only used in */
|
||||
/* those other files conditionally, to print trace statements. */
|
||||
/* integer fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
|
||||
/* LPC order, Frame size, Quantization rate, Bits per frame, */
|
||||
/* Error correction */
|
||||
/* Subroutine SETUP is the only place where order is assigned a value, */
|
||||
/* and that value is 10. It could increase efficiency 1% or so to */
|
||||
/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as
|
||||
*/
|
||||
/* a variable in a COMMON block, since it is used in many places in the */
|
||||
/* core of the coding and decoding routines. Actually, I take that back.
|
||||
*/
|
||||
/* At least when compiling with f2c, the upper bound of DO loops is */
|
||||
/* stored in a local variable before the DO loop begins, and then that is
|
||||
*/
|
||||
/* compared against on each iteration. */
|
||||
/* Similarly for lframe, which is given a value of MAXFRM in SETUP. */
|
||||
/* Similarly for quant, which is given a value of 2400 in SETUP. quant */
|
||||
/* is used in only a few places, and never in the core coding and */
|
||||
/* decoding routines, so it could be eliminated entirely. */
|
||||
/* nbits is similar to quant, and is given a value of 54 in SETUP. */
|
||||
/* corrp is given a value of .TRUE. in SETUP, and is only used in the */
|
||||
/* subroutines ENCODE and DECODE. It doesn't affect the speed of the */
|
||||
/* coder significantly whether it is .TRUE. or .FALSE., or whether it is
|
||||
*/
|
||||
/* a constant or a variable, since it is only examined once per frame. */
|
||||
/* Leaving it as a variable that is set to .TRUE. seems like a good */
|
||||
/* idea, since it does enable some error-correction capability for */
|
||||
/* unvoiced frames, with no change in the coding rate, and no noticeable
|
||||
*/
|
||||
/* quality difference in the decoded speech. */
|
||||
/* integer quant, nbits */
|
||||
/* *** Read/write: variables for debugging, not needed for LPC algorithm
|
||||
*/
|
||||
|
||||
/* Current frame, Unstable frames, Output clip count, Max onset buffer,
|
||||
*/
|
||||
/* Debug listing detail level, Line count on listing page */
|
||||
|
||||
/* nframe is not needed for an embedded LPC10 at all. */
|
||||
/* nunsfm is initialized to 0 in SETUP, and incremented in subroutine */
|
||||
/* ERROR, which is only called from RCCHK. When LPC10 is embedded into */
|
||||
/* an application, I would recommend removing the call to ERROR in RCCHK,
|
||||
*/
|
||||
/* and remove ERROR and nunsfm completely. */
|
||||
/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in
|
||||
*/
|
||||
/* sread.f. When LPC10 is embedded into an application, one might want */
|
||||
/* to cause it to be incremented in a routine that takes the output of */
|
||||
/* SYNTHS and sends it to an audio device. It could be optionally */
|
||||
/* displayed, for those that might want to know what it is. */
|
||||
/* maxosp is never initialized to 0 in SETUP, although it probably should
|
||||
*/
|
||||
/* be, and it is updated in subroutine ANALYS. I doubt that its value */
|
||||
/* would be of much interest to an application in which LPC10 is */
|
||||
/* embedded. */
|
||||
/* listl and lincnt are not needed for an embedded LPC10 at all. */
|
||||
/* integer nframe, nunsfm, iclip, maxosp, listl, lincnt */
|
||||
/* common /contrl/ fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
|
||||
/* common /contrl/ quant, nbits */
|
||||
/* common /contrl/ nframe, nunsfm, iclip, maxosp, listl, lincnt */
|
||||
contrl_1.order = 10;
|
||||
contrl_1.lframe = 180;
|
||||
contrl_1.corrp = TRUE_;
|
||||
return 0;
|
||||
} /* lpcini_ */
|
||||
|
||||
|
||||
|
||||
/* Allocate memory for, and initialize, the state that needs to be
|
||||
kept from encoding one frame to the next for a single
|
||||
LPC-10-compressed audio stream. Return 0 if malloc fails,
|
||||
otherwise return pointer to new structure. */
|
||||
|
||||
struct lpc10_encoder_state *
|
||||
create_lpc10_encoder_state()
|
||||
{
|
||||
struct lpc10_encoder_state *st;
|
||||
|
||||
st = (struct lpc10_encoder_state *)
|
||||
malloc((unsigned) sizeof (struct lpc10_encoder_state));
|
||||
if (st != 0) {
|
||||
init_lpc10_encoder_state(st);
|
||||
}
|
||||
return (st);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void init_lpc10_encoder_state(struct lpc10_encoder_state *st)
|
||||
{
|
||||
int i;
|
||||
|
||||
lpcini_();
|
||||
|
||||
/* State used only by function hp100 */
|
||||
st->z11 = 0.0f;
|
||||
st->z21 = 0.0f;
|
||||
st->z12 = 0.0f;
|
||||
st->z22 = 0.0f;
|
||||
|
||||
/* State used by function analys */
|
||||
for (i = 0; i < 540; i++) {
|
||||
st->inbuf[i] = 0.0f;
|
||||
st->pebuf[i] = 0.0f;
|
||||
}
|
||||
for (i = 0; i < 696; i++) {
|
||||
st->lpbuf[i] = 0.0f;
|
||||
}
|
||||
for (i = 0; i < 312; i++) {
|
||||
st->ivbuf[i] = 0.0f;
|
||||
}
|
||||
st->bias = 0.0f;
|
||||
/* integer osbuf[10]; no initial value necessary */
|
||||
st->osptr = 1;
|
||||
for (i = 0; i < 3; i++) {
|
||||
st->obound[i] = 0;
|
||||
}
|
||||
st->vwin[4] = 307;
|
||||
st->vwin[5] = 462;
|
||||
st->awin[4] = 307;
|
||||
st->awin[5] = 462;
|
||||
for (i = 0; i < 8; i++) {
|
||||
st->voibuf[i] = 0;
|
||||
}
|
||||
for (i = 0; i < 3; i++) {
|
||||
st->rmsbuf[i] = 0.0f;
|
||||
}
|
||||
for (i = 0; i < 30; i++) {
|
||||
st->rcbuf[i] = 0.0f;
|
||||
}
|
||||
st->zpre = 0.0f;
|
||||
|
||||
|
||||
/* State used by function onset */
|
||||
st->n = 0.0f;
|
||||
st->d__ = 1.0f;
|
||||
/* real fpc; no initial value necessary */
|
||||
for (i = 0; i < 16; i++) {
|
||||
st->l2buf[i] = 0.0f;
|
||||
}
|
||||
st->l2sum1 = 0.0f;
|
||||
st->l2ptr1 = 1;
|
||||
st->l2ptr2 = 9;
|
||||
/* integer lasti; no initial value necessary */
|
||||
st->hyst = FALSE_;
|
||||
|
||||
/* State used by function voicin */
|
||||
st->dither = 20.0f;
|
||||
st->maxmin = 0.0f;
|
||||
for (i = 0; i < 6; i++) {
|
||||
st->voice[i] = 0.0f;
|
||||
}
|
||||
st->lbve = 3000;
|
||||
st->fbve = 3000;
|
||||
st->fbue = 187;
|
||||
st->ofbue = 187;
|
||||
st->sfbue = 187;
|
||||
st->lbue = 93;
|
||||
st->olbue = 93;
|
||||
st->slbue = 93;
|
||||
st->snr = (real) (st->fbve / st->fbue << 6);
|
||||
|
||||
/* State used by function dyptrk */
|
||||
for (i = 0; i < 60; i++) {
|
||||
st->s[i] = 0.0f;
|
||||
}
|
||||
for (i = 0; i < 120; i++) {
|
||||
st->p[i] = 0;
|
||||
}
|
||||
st->ipoint = 0;
|
||||
st->alphax = 0.0f;
|
||||
|
||||
/* State used by function chanwr */
|
||||
st->isync = 0;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Allocate memory for, and initialize, the state that needs to be
|
||||
kept from decoding one frame to the next for a single
|
||||
LPC-10-compressed audio stream. Return 0 if malloc fails,
|
||||
otherwise return pointer to new structure. */
|
||||
|
||||
struct lpc10_decoder_state *
|
||||
create_lpc10_decoder_state()
|
||||
{
|
||||
struct lpc10_decoder_state *st;
|
||||
|
||||
st = (struct lpc10_decoder_state *)
|
||||
malloc((unsigned) sizeof (struct lpc10_decoder_state));
|
||||
if (st != 0) {
|
||||
init_lpc10_decoder_state(st);
|
||||
}
|
||||
return (st);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void init_lpc10_decoder_state(struct lpc10_decoder_state *st)
|
||||
{
|
||||
int i;
|
||||
|
||||
lpcini_();
|
||||
|
||||
/* State used by function decode */
|
||||
st->iptold = 60;
|
||||
st->first = TRUE_;
|
||||
st->ivp2h = 0;
|
||||
st->iovoic = 0;
|
||||
st->iavgp = 60;
|
||||
st->erate = 0;
|
||||
for (i = 0; i < 30; i++) {
|
||||
st->drc[i] = 0;
|
||||
}
|
||||
for (i = 0; i < 3; i++) {
|
||||
st->dpit[i] = 0;
|
||||
st->drms[i] = 0;
|
||||
}
|
||||
|
||||
/* State used by function synths */
|
||||
for (i = 0; i < 360; i++) {
|
||||
st->buf[i] = 0.0f;
|
||||
}
|
||||
st->buflen = 180;
|
||||
|
||||
/* State used by function pitsyn */
|
||||
/* ivoico; no initial value necessary as long as first_pitsyn is initially TRUE_ */
|
||||
/* ipito; no initial value necessary as long as first_pitsyn is initially TRUE_ */
|
||||
st->rmso = 1.0f;
|
||||
/* rco[10]; no initial value necessary as long as first_pitsyn is initially TRUE_ */
|
||||
/* integer jsamp; no initial value necessary as long as first_pitsyn is initially TRUE_ */
|
||||
st->first_pitsyn = TRUE_;
|
||||
|
||||
/* State used by function bsynz */
|
||||
st->ipo = 0;
|
||||
for (i = 0; i < 166; i++) {
|
||||
st->exc[i] = 0.0f;
|
||||
st->exc2[i] = 0.0f;
|
||||
}
|
||||
st->lpi1 = 0.0f;
|
||||
st->lpi2 = 0.0f;
|
||||
st->lpi3 = 0.0f;
|
||||
st->hpi1 = 0.0f;
|
||||
st->hpi2 = 0.0f;
|
||||
st->hpi3 = 0.0f;
|
||||
st->rmso_bsynz = 0.0f;
|
||||
|
||||
/* State used by function random */
|
||||
st->j = 2;
|
||||
st->k = 5;
|
||||
st->y[0] = (shortint) -21161;
|
||||
st->y[1] = (shortint) -8478;
|
||||
st->y[2] = (shortint) 30892;
|
||||
st->y[3] = (shortint) -10216;
|
||||
st->y[4] = (shortint) 16950;
|
||||
|
||||
/* State used by function deemp */
|
||||
st->dei1 = 0.0f;
|
||||
st->dei2 = 0.0f;
|
||||
st->deo1 = 0.0f;
|
||||
st->deo2 = 0.0f;
|
||||
st->deo3 = 0.0f;
|
||||
}
|
||||
|
||||
+114
-114
@@ -1,114 +1,114 @@
|
||||
/*
|
||||
|
||||
$Log: lpfilt.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.1 1996/08/19 22:31:35 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int lpfilt_(real *inbuf, real *lpbuf, integer *len, integer *nsamp);
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* *********************************************************************** */
|
||||
|
||||
/* LPFILT Version 55 */
|
||||
|
||||
/* $Log: lpfilt.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:31:35 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/15 16:53:49 jaf */
|
||||
/* Just put comment header in standard form. */
|
||||
|
||||
/* Revision 1.2 1996/03/12 23:58:06 jaf */
|
||||
/* Comments added explaining that none of the local variables of this */
|
||||
/* subroutine need to be saved from one invocation to the next. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:47:44 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* *********************************************************************** */
|
||||
|
||||
/* 31 Point Equiripple FIR Low-Pass Filter */
|
||||
/* Linear phase, delay = 15 samples */
|
||||
|
||||
/* Passband: ripple = 0.25 dB, cutoff = 800 Hz */
|
||||
/* Stopband: atten. = 40. dB, cutoff = 1240 Hz */
|
||||
|
||||
/* Inputs: */
|
||||
/* LEN - Length of speech buffers */
|
||||
/* NSAMP - Number of samples to filter */
|
||||
/* INBUF - Input speech buffer */
|
||||
/* Indices len-nsamp-29 through len are read. */
|
||||
/* Output: */
|
||||
/* LPBUF - Low passed speech buffer (must be different array than INBUF) */
|
||||
/* Indices len+1-nsamp through len are written. */
|
||||
|
||||
/* This subroutine has no local state. */
|
||||
|
||||
/* Subroutine */ int lpfilt_(real *inbuf, real *lpbuf, integer *len, integer *
|
||||
nsamp)
|
||||
{
|
||||
/* System generated locals */
|
||||
integer i__1;
|
||||
|
||||
/* Local variables */
|
||||
integer j;
|
||||
real t;
|
||||
|
||||
/* Arguments */
|
||||
/* Parameters/constants */
|
||||
/* Local variables that need not be saved */
|
||||
/* Local state */
|
||||
/* None */
|
||||
/* Parameter adjustments */
|
||||
--lpbuf;
|
||||
--inbuf;
|
||||
|
||||
/* Function Body */
|
||||
i__1 = *len;
|
||||
for (j = *len + 1 - *nsamp; j <= i__1; ++j) {
|
||||
t = (inbuf[j] + inbuf[j - 30]) * -.0097201988f;
|
||||
t += (inbuf[j - 1] + inbuf[j - 29]) * -.0105179986f;
|
||||
t += (inbuf[j - 2] + inbuf[j - 28]) * -.0083479648f;
|
||||
t += (inbuf[j - 3] + inbuf[j - 27]) * 5.860774e-4f;
|
||||
t += (inbuf[j - 4] + inbuf[j - 26]) * .0130892089f;
|
||||
t += (inbuf[j - 5] + inbuf[j - 25]) * .0217052232f;
|
||||
t += (inbuf[j - 6] + inbuf[j - 24]) * .0184161253f;
|
||||
t += (inbuf[j - 7] + inbuf[j - 23]) * 3.39723e-4f;
|
||||
t += (inbuf[j - 8] + inbuf[j - 22]) * -.0260797087f;
|
||||
t += (inbuf[j - 9] + inbuf[j - 21]) * -.0455563702f;
|
||||
t += (inbuf[j - 10] + inbuf[j - 20]) * -.040306855f;
|
||||
t += (inbuf[j - 11] + inbuf[j - 19]) * 5.029835e-4f;
|
||||
t += (inbuf[j - 12] + inbuf[j - 18]) * .0729262903f;
|
||||
t += (inbuf[j - 13] + inbuf[j - 17]) * .1572008878f;
|
||||
t += (inbuf[j - 14] + inbuf[j - 16]) * .2247288674f;
|
||||
t += inbuf[j - 15] * .250535965f;
|
||||
lpbuf[j] = t;
|
||||
}
|
||||
return 0;
|
||||
} /* lpfilt_ */
|
||||
|
||||
/*
|
||||
|
||||
$Log: lpfilt.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.1 1996/08/19 22:31:35 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int lpfilt_(real *inbuf, real *lpbuf, integer *len, integer *nsamp);
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* *********************************************************************** */
|
||||
|
||||
/* LPFILT Version 55 */
|
||||
|
||||
/* $Log: lpfilt.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:31:35 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/15 16:53:49 jaf */
|
||||
/* Just put comment header in standard form. */
|
||||
|
||||
/* Revision 1.2 1996/03/12 23:58:06 jaf */
|
||||
/* Comments added explaining that none of the local variables of this */
|
||||
/* subroutine need to be saved from one invocation to the next. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:47:44 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* *********************************************************************** */
|
||||
|
||||
/* 31 Point Equiripple FIR Low-Pass Filter */
|
||||
/* Linear phase, delay = 15 samples */
|
||||
|
||||
/* Passband: ripple = 0.25 dB, cutoff = 800 Hz */
|
||||
/* Stopband: atten. = 40. dB, cutoff = 1240 Hz */
|
||||
|
||||
/* Inputs: */
|
||||
/* LEN - Length of speech buffers */
|
||||
/* NSAMP - Number of samples to filter */
|
||||
/* INBUF - Input speech buffer */
|
||||
/* Indices len-nsamp-29 through len are read. */
|
||||
/* Output: */
|
||||
/* LPBUF - Low passed speech buffer (must be different array than INBUF) */
|
||||
/* Indices len+1-nsamp through len are written. */
|
||||
|
||||
/* This subroutine has no local state. */
|
||||
|
||||
/* Subroutine */ int lpfilt_(real *inbuf, real *lpbuf, integer *len, integer *
|
||||
nsamp)
|
||||
{
|
||||
/* System generated locals */
|
||||
integer i__1;
|
||||
|
||||
/* Local variables */
|
||||
integer j;
|
||||
real t;
|
||||
|
||||
/* Arguments */
|
||||
/* Parameters/constants */
|
||||
/* Local variables that need not be saved */
|
||||
/* Local state */
|
||||
/* None */
|
||||
/* Parameter adjustments */
|
||||
--lpbuf;
|
||||
--inbuf;
|
||||
|
||||
/* Function Body */
|
||||
i__1 = *len;
|
||||
for (j = *len + 1 - *nsamp; j <= i__1; ++j) {
|
||||
t = (inbuf[j] + inbuf[j - 30]) * -.0097201988f;
|
||||
t += (inbuf[j - 1] + inbuf[j - 29]) * -.0105179986f;
|
||||
t += (inbuf[j - 2] + inbuf[j - 28]) * -.0083479648f;
|
||||
t += (inbuf[j - 3] + inbuf[j - 27]) * 5.860774e-4f;
|
||||
t += (inbuf[j - 4] + inbuf[j - 26]) * .0130892089f;
|
||||
t += (inbuf[j - 5] + inbuf[j - 25]) * .0217052232f;
|
||||
t += (inbuf[j - 6] + inbuf[j - 24]) * .0184161253f;
|
||||
t += (inbuf[j - 7] + inbuf[j - 23]) * 3.39723e-4f;
|
||||
t += (inbuf[j - 8] + inbuf[j - 22]) * -.0260797087f;
|
||||
t += (inbuf[j - 9] + inbuf[j - 21]) * -.0455563702f;
|
||||
t += (inbuf[j - 10] + inbuf[j - 20]) * -.040306855f;
|
||||
t += (inbuf[j - 11] + inbuf[j - 19]) * 5.029835e-4f;
|
||||
t += (inbuf[j - 12] + inbuf[j - 18]) * .0729262903f;
|
||||
t += (inbuf[j - 13] + inbuf[j - 17]) * .1572008878f;
|
||||
t += (inbuf[j - 14] + inbuf[j - 16]) * .2247288674f;
|
||||
t += inbuf[j - 15] * .250535965f;
|
||||
lpbuf[j] = t;
|
||||
}
|
||||
return 0;
|
||||
} /* lpfilt_ */
|
||||
|
||||
|
||||
@@ -1,78 +1,78 @@
|
||||
/*
|
||||
|
||||
$Log: median.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.1 1996/08/19 22:31:31 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern integer median_(integer *d1, integer *d2, integer *d3);
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* ********************************************************************* */
|
||||
|
||||
/* MEDIAN Version 45G */
|
||||
|
||||
/* $Log: median.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:31:31 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.2 1996/03/14 22:30:22 jaf */
|
||||
/* Just rearranged the comments and local variable declarations a bit. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:47:53 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ********************************************************************* */
|
||||
|
||||
/* Find median of three values */
|
||||
|
||||
/* Input: */
|
||||
/* D1,D2,D3 - Three input values */
|
||||
/* Output: */
|
||||
/* MEDIAN - Median value */
|
||||
|
||||
integer median_(integer *d1, integer *d2, integer *d3)
|
||||
{
|
||||
/* System generated locals */
|
||||
integer ret_val;
|
||||
|
||||
/* Arguments */
|
||||
ret_val = *d2;
|
||||
if (*d2 > *d1 && *d2 > *d3) {
|
||||
ret_val = *d1;
|
||||
if (*d3 > *d1) {
|
||||
ret_val = *d3;
|
||||
}
|
||||
} else if (*d2 < *d1 && *d2 < *d3) {
|
||||
ret_val = *d1;
|
||||
if (*d3 < *d1) {
|
||||
ret_val = *d3;
|
||||
}
|
||||
}
|
||||
return ret_val;
|
||||
} /* median_ */
|
||||
|
||||
/*
|
||||
|
||||
$Log: median.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.1 1996/08/19 22:31:31 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern integer median_(integer *d1, integer *d2, integer *d3);
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* ********************************************************************* */
|
||||
|
||||
/* MEDIAN Version 45G */
|
||||
|
||||
/* $Log: median.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:31:31 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.2 1996/03/14 22:30:22 jaf */
|
||||
/* Just rearranged the comments and local variable declarations a bit. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:47:53 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ********************************************************************* */
|
||||
|
||||
/* Find median of three values */
|
||||
|
||||
/* Input: */
|
||||
/* D1,D2,D3 - Three input values */
|
||||
/* Output: */
|
||||
/* MEDIAN - Median value */
|
||||
|
||||
integer median_(integer *d1, integer *d2, integer *d3)
|
||||
{
|
||||
/* System generated locals */
|
||||
integer ret_val;
|
||||
|
||||
/* Arguments */
|
||||
ret_val = *d2;
|
||||
if (*d2 > *d1 && *d2 > *d3) {
|
||||
ret_val = *d1;
|
||||
if (*d3 > *d1) {
|
||||
ret_val = *d3;
|
||||
}
|
||||
} else if (*d2 < *d1 && *d2 < *d3) {
|
||||
ret_val = *d1;
|
||||
if (*d3 < *d1) {
|
||||
ret_val = *d3;
|
||||
}
|
||||
}
|
||||
return ret_val;
|
||||
} /* median_ */
|
||||
|
||||
|
||||
+152
-152
@@ -1,152 +1,152 @@
|
||||
/*
|
||||
|
||||
$Log: mload.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.1 1996/08/19 22:31:25 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int mload_(integer *order, integer *awins, integer *awinf, real *speech, real *phi, real *psi);
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* ***************************************************************** */
|
||||
|
||||
/* MLOAD Version 48 */
|
||||
|
||||
/* $Log: mload.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:31:25 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.5 1996/03/27 23:59:51 jaf */
|
||||
/* Added some more accurate comments about which indices of the argument */
|
||||
/* array SPEECH are read. I thought that this might be the cause of a */
|
||||
/* problem I've been having, but it isn't. */
|
||||
|
||||
/* Revision 1.4 1996/03/26 19:16:53 jaf */
|
||||
/* Commented out the code at the end that copied the lower triangular */
|
||||
/* half of PHI into the upper triangular half (making the resulting */
|
||||
/* matrix symmetric). The upper triangular half was never used by later */
|
||||
/* code in subroutine ANALYS. */
|
||||
|
||||
/* Revision 1.3 1996/03/18 21:16:00 jaf */
|
||||
/* Just added a few comments about which array indices of the arguments */
|
||||
/* are used, and mentioning that this subroutine has no local state. */
|
||||
|
||||
/* Revision 1.2 1996/03/13 16:47:41 jaf */
|
||||
/* Comments added explaining that none of the local variables of this */
|
||||
/* subroutine need to be saved from one invocation to the next. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:48:01 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ***************************************************************** */
|
||||
|
||||
/* Load a covariance matrix. */
|
||||
|
||||
/* Input: */
|
||||
/* ORDER - Analysis order */
|
||||
/* AWINS - Analysis window start */
|
||||
/* AWINF - Analysis window finish */
|
||||
/* SPEECH(AWINF) - Speech buffer */
|
||||
/* Indices MIN(AWINS, AWINF-(ORDER-1)) through */
|
||||
/* MAX(AWINF, AWINS+(ORDER-1)) read. */
|
||||
/* As long as (AWINF-AWINS) .GE. (ORDER-1), */
|
||||
/* this is just indices AWINS through AWINF. */
|
||||
/* Output: */
|
||||
/* PHI(ORDER,ORDER) - Covariance matrix */
|
||||
/* Lower triangular half and diagonal written, and read.*/
|
||||
/* Upper triangular half untouched. */
|
||||
/* PSI(ORDER) - Prediction vector */
|
||||
/* Indices 1 through ORDER written, */
|
||||
/* and most are read after that. */
|
||||
|
||||
/* This subroutine has no local state. */
|
||||
|
||||
/* Subroutine */ int mload_(integer *order, integer *awins, integer *awinf,
|
||||
real *speech, real *phi, real *psi)
|
||||
{
|
||||
/* System generated locals */
|
||||
integer phi_dim1, phi_offset, i__1, i__2;
|
||||
|
||||
/* Local variables */
|
||||
integer c__, i__, r__, start;
|
||||
|
||||
/* Arguments */
|
||||
/* Local variables that need not be saved */
|
||||
/* Load first column of triangular covariance matrix PHI */
|
||||
/* Parameter adjustments */
|
||||
--psi;
|
||||
phi_dim1 = *order;
|
||||
phi_offset = phi_dim1 + 1;
|
||||
phi -= phi_offset;
|
||||
--speech;
|
||||
|
||||
/* Function Body */
|
||||
start = *awins + *order;
|
||||
i__1 = *order;
|
||||
for (r__ = 1; r__ <= i__1; ++r__) {
|
||||
phi[r__ + phi_dim1] = 0.f;
|
||||
i__2 = *awinf;
|
||||
for (i__ = start; i__ <= i__2; ++i__) {
|
||||
phi[r__ + phi_dim1] += speech[i__ - 1] * speech[i__ - r__];
|
||||
}
|
||||
}
|
||||
/* Load last element of vector PSI */
|
||||
psi[*order] = 0.f;
|
||||
i__1 = *awinf;
|
||||
for (i__ = start; i__ <= i__1; ++i__) {
|
||||
psi[*order] += speech[i__] * speech[i__ - *order];
|
||||
}
|
||||
/* End correct to get additional columns of PHI */
|
||||
i__1 = *order;
|
||||
for (r__ = 2; r__ <= i__1; ++r__) {
|
||||
i__2 = r__;
|
||||
for (c__ = 2; c__ <= i__2; ++c__) {
|
||||
phi[r__ + c__ * phi_dim1] = phi[r__ - 1 + (c__ - 1) * phi_dim1] -
|
||||
speech[*awinf + 1 - r__] * speech[*awinf + 1 - c__] +
|
||||
speech[start - r__] * speech[start - c__];
|
||||
}
|
||||
}
|
||||
/* End correct to get additional elements of PSI */
|
||||
i__1 = *order - 1;
|
||||
for (c__ = 1; c__ <= i__1; ++c__) {
|
||||
psi[c__] = phi[c__ + 1 + phi_dim1] - speech[start - 1] * speech[start
|
||||
- 1 - c__] + speech[*awinf] * speech[*awinf - c__];
|
||||
}
|
||||
/* Copy lower triangular section into upper (why bother?) */
|
||||
/* I'm commenting this out, since the upper triangular half of PHI
|
||||
*/
|
||||
/* is never used by later code, unless a sufficiently high level of
|
||||
*/
|
||||
/* tracing is turned on. */
|
||||
/* DO R = 1,ORDER */
|
||||
/* DO C = 1,R-1 */
|
||||
/* PHI(C,R) = PHI(R,C) */
|
||||
/* END DO */
|
||||
/* END DO */
|
||||
return 0;
|
||||
} /* mload_ */
|
||||
|
||||
/*
|
||||
|
||||
$Log: mload.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.1 1996/08/19 22:31:25 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int mload_(integer *order, integer *awins, integer *awinf, real *speech, real *phi, real *psi);
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* ***************************************************************** */
|
||||
|
||||
/* MLOAD Version 48 */
|
||||
|
||||
/* $Log: mload.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:31:25 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.5 1996/03/27 23:59:51 jaf */
|
||||
/* Added some more accurate comments about which indices of the argument */
|
||||
/* array SPEECH are read. I thought that this might be the cause of a */
|
||||
/* problem I've been having, but it isn't. */
|
||||
|
||||
/* Revision 1.4 1996/03/26 19:16:53 jaf */
|
||||
/* Commented out the code at the end that copied the lower triangular */
|
||||
/* half of PHI into the upper triangular half (making the resulting */
|
||||
/* matrix symmetric). The upper triangular half was never used by later */
|
||||
/* code in subroutine ANALYS. */
|
||||
|
||||
/* Revision 1.3 1996/03/18 21:16:00 jaf */
|
||||
/* Just added a few comments about which array indices of the arguments */
|
||||
/* are used, and mentioning that this subroutine has no local state. */
|
||||
|
||||
/* Revision 1.2 1996/03/13 16:47:41 jaf */
|
||||
/* Comments added explaining that none of the local variables of this */
|
||||
/* subroutine need to be saved from one invocation to the next. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:48:01 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ***************************************************************** */
|
||||
|
||||
/* Load a covariance matrix. */
|
||||
|
||||
/* Input: */
|
||||
/* ORDER - Analysis order */
|
||||
/* AWINS - Analysis window start */
|
||||
/* AWINF - Analysis window finish */
|
||||
/* SPEECH(AWINF) - Speech buffer */
|
||||
/* Indices MIN(AWINS, AWINF-(ORDER-1)) through */
|
||||
/* MAX(AWINF, AWINS+(ORDER-1)) read. */
|
||||
/* As long as (AWINF-AWINS) .GE. (ORDER-1), */
|
||||
/* this is just indices AWINS through AWINF. */
|
||||
/* Output: */
|
||||
/* PHI(ORDER,ORDER) - Covariance matrix */
|
||||
/* Lower triangular half and diagonal written, and read.*/
|
||||
/* Upper triangular half untouched. */
|
||||
/* PSI(ORDER) - Prediction vector */
|
||||
/* Indices 1 through ORDER written, */
|
||||
/* and most are read after that. */
|
||||
|
||||
/* This subroutine has no local state. */
|
||||
|
||||
/* Subroutine */ int mload_(integer *order, integer *awins, integer *awinf,
|
||||
real *speech, real *phi, real *psi)
|
||||
{
|
||||
/* System generated locals */
|
||||
integer phi_dim1, phi_offset, i__1, i__2;
|
||||
|
||||
/* Local variables */
|
||||
integer c__, i__, r__, start;
|
||||
|
||||
/* Arguments */
|
||||
/* Local variables that need not be saved */
|
||||
/* Load first column of triangular covariance matrix PHI */
|
||||
/* Parameter adjustments */
|
||||
--psi;
|
||||
phi_dim1 = *order;
|
||||
phi_offset = phi_dim1 + 1;
|
||||
phi -= phi_offset;
|
||||
--speech;
|
||||
|
||||
/* Function Body */
|
||||
start = *awins + *order;
|
||||
i__1 = *order;
|
||||
for (r__ = 1; r__ <= i__1; ++r__) {
|
||||
phi[r__ + phi_dim1] = 0.f;
|
||||
i__2 = *awinf;
|
||||
for (i__ = start; i__ <= i__2; ++i__) {
|
||||
phi[r__ + phi_dim1] += speech[i__ - 1] * speech[i__ - r__];
|
||||
}
|
||||
}
|
||||
/* Load last element of vector PSI */
|
||||
psi[*order] = 0.f;
|
||||
i__1 = *awinf;
|
||||
for (i__ = start; i__ <= i__1; ++i__) {
|
||||
psi[*order] += speech[i__] * speech[i__ - *order];
|
||||
}
|
||||
/* End correct to get additional columns of PHI */
|
||||
i__1 = *order;
|
||||
for (r__ = 2; r__ <= i__1; ++r__) {
|
||||
i__2 = r__;
|
||||
for (c__ = 2; c__ <= i__2; ++c__) {
|
||||
phi[r__ + c__ * phi_dim1] = phi[r__ - 1 + (c__ - 1) * phi_dim1] -
|
||||
speech[*awinf + 1 - r__] * speech[*awinf + 1 - c__] +
|
||||
speech[start - r__] * speech[start - c__];
|
||||
}
|
||||
}
|
||||
/* End correct to get additional elements of PSI */
|
||||
i__1 = *order - 1;
|
||||
for (c__ = 1; c__ <= i__1; ++c__) {
|
||||
psi[c__] = phi[c__ + 1 + phi_dim1] - speech[start - 1] * speech[start
|
||||
- 1 - c__] + speech[*awinf] * speech[*awinf - c__];
|
||||
}
|
||||
/* Copy lower triangular section into upper (why bother?) */
|
||||
/* I'm commenting this out, since the upper triangular half of PHI
|
||||
*/
|
||||
/* is never used by later code, unless a sufficiently high level of
|
||||
*/
|
||||
/* tracing is turned on. */
|
||||
/* DO R = 1,ORDER */
|
||||
/* DO C = 1,R-1 */
|
||||
/* PHI(C,R) = PHI(R,C) */
|
||||
/* END DO */
|
||||
/* END DO */
|
||||
return 0;
|
||||
} /* mload_ */
|
||||
|
||||
|
||||
+317
-317
@@ -1,317 +1,317 @@
|
||||
/*
|
||||
|
||||
$Log: onset.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.2 1996/08/20 20:37:55 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_encoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_encoder_state().
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:31:18 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int onset_(real *pebuf, integer *osbuf, integer *osptr, integer *oslen, integer *sbufl, integer *sbufh, integer *lframe, struct lpc10_encoder_state *st);
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* Table of constant values */
|
||||
|
||||
static real c_b2 = 1.f;
|
||||
|
||||
/* ****************************************************************** */
|
||||
|
||||
/* ONSET Version 49 */
|
||||
|
||||
/* $Log: onset.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:37:55 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_encoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_encoder_state().
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:31:18 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.5 1996/03/15 16:41:01 jaf */
|
||||
/* Just rearranged INITONSET assignment orders to be consistent with */
|
||||
/* order of DATA statements in ONSET. */
|
||||
|
||||
/* Revision 1.4 1996/03/15 15:48:27 jaf */
|
||||
/* Changed some comments, and only reordered the DATA statements (their */
|
||||
/* meaning wasn't changed). */
|
||||
|
||||
/* Revision 1.3 1996/03/14 23:53:06 jaf */
|
||||
/* Added an entry INITONSET that reinitializes the local state variables */
|
||||
/* of subroutine ONSET. */
|
||||
|
||||
/* Rearranged quite a few comments, adding more explaining which */
|
||||
/* arguments were inputs, and how the modified ones can be changed. */
|
||||
|
||||
/* Revision 1.2 1996/03/12 23:53:00 jaf */
|
||||
/* Lots of comments added about the local state of this subroutine that */
|
||||
/* must be saved from one invocation to the next. */
|
||||
|
||||
/* One constant 180 replaced with LFRAME, which should be "more general", */
|
||||
/* even though it would probably require many more changes than this to */
|
||||
/* get this coder to work for other frame sizes. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:48:09 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ****************************************************************** */
|
||||
|
||||
/* Floating point version */
|
||||
|
||||
|
||||
/* Detection of onsets in (or slightly preceding) the futuremost frame */
|
||||
/* of speech. */
|
||||
|
||||
|
||||
/* Input: */
|
||||
/* PEBUF(SBUFL:SBUFH) - Preemphasized speech */
|
||||
/* Indices SBUFH-LFRAME through SBUFH are read. */
|
||||
/* OSLEN - Maximum number of onsets that can be stored in OSBUF. */
|
||||
/* SBUFL, SBUFH - Range of PEBUF */
|
||||
/* LFRAME - length of a frame, in samples */
|
||||
/* Input/Output: */
|
||||
/* OSBUF(OSLEN) - Buffer which holds sorted indexes of onsets */
|
||||
/* Indices A through B are modified, where A */
|
||||
/* is the original value of OSPTR, and B is the final */
|
||||
/* value of OSPTR-1. B is at most OSLEN. */
|
||||
/* OSPTR - Free pointer into OSBUF */
|
||||
/* Initial value should be .LE. OSLEN+1. */
|
||||
/* If so, final value grows by one for each new onset */
|
||||
/* found, and final value will be .LE. OSLEN+1. */
|
||||
|
||||
/* This subroutine maintains local state from one call to the next. If */
|
||||
/* you want to switch to using a new audio stream for this subroutine, or */
|
||||
/* reinitialize its state for any other reason, call the ENTRY INITONSET. */
|
||||
|
||||
/* Subroutine */ int onset_(real *pebuf, integer *osbuf, integer *
|
||||
osptr, integer *oslen, integer *sbufl, integer *sbufh, integer *
|
||||
lframe, struct lpc10_encoder_state *st)
|
||||
{
|
||||
/* Initialized data */
|
||||
|
||||
real *n;
|
||||
real *d__;
|
||||
real *l2buf;
|
||||
real *l2sum1;
|
||||
integer *l2ptr1;
|
||||
integer *l2ptr2;
|
||||
logical *hyst;
|
||||
|
||||
/* System generated locals */
|
||||
integer pebuf_offset, i__1;
|
||||
real r__1;
|
||||
|
||||
/* Builtin functions */
|
||||
double r_sign(real *, real *);
|
||||
|
||||
/* Local variables */
|
||||
integer i__;
|
||||
integer *lasti;
|
||||
real l2sum2;
|
||||
real *fpc;
|
||||
|
||||
/* Arguments */
|
||||
/* $Log: onset.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:37:55 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_encoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_encoder_state().
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:31:18 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/29 22:03:47 jaf */
|
||||
/* Removed definitions for any constants that were no longer used. */
|
||||
|
||||
/* Revision 1.2 1996/03/26 19:34:33 jaf */
|
||||
/* Added comments indicating which constants are not needed in an */
|
||||
/* application that uses the LPC-10 coder. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:43:51 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
/* LPC Configuration parameters: */
|
||||
/* Frame size, Prediction order, Pitch period */
|
||||
/* Parameters/constants */
|
||||
/* Parameters for onset detection algorithm: */
|
||||
/* L2 Threshold for filtered slope of FPC (function of L2WID!) */
|
||||
/* L2LAG Lag due to both filters which compute filtered slope of FPC */
|
||||
/* L2WID Width of the filter which computes the slope of FPC */
|
||||
/* OSHYST The number of samples of slope(FPC) which must be below */
|
||||
/* the threshold before a new onset may be declared. */
|
||||
/* Local variables that need not be saved */
|
||||
/* Local state */
|
||||
/* Variables */
|
||||
/* N, D Numerator and denominator of prediction filters */
|
||||
/* FPC Current prediction coefs */
|
||||
/* L2BUF, L2SUM1, L2SUM2 State of slope filter */
|
||||
/* The only "significant" change I've made is to change L2SUM2 out
|
||||
*/
|
||||
/* of the list of local variables that need to be saved, since it */
|
||||
/* didn't need to be. */
|
||||
/* L2SUM1 need not be, but avoiding saving it would require a small
|
||||
*/
|
||||
/* change to the body of the code. See comments below for an */
|
||||
/* example of how the code could be changed to avoid saving L2SUM1.
|
||||
*/
|
||||
/* FPC and LASTI are saved from one invocation to the next, but */
|
||||
/* they are not given initial values. This is acceptable, because
|
||||
*/
|
||||
/* FPC will be assigned a value the first time that this function */
|
||||
/* is called after D is initialized to 1, since the formula to */
|
||||
/* change D will not change it to 0 in one step, and the IF (D */
|
||||
/* .NE. 0) statement will execute its THEN part, initializing FPC.
|
||||
*/
|
||||
|
||||
/* LASTI's value will not be used until HYST is .TRUE., and */
|
||||
/* whenever HYST is changed from its initial value of .FALSE., */
|
||||
/* LASTI is assigned a value. */
|
||||
/* In a C version of this coder, it would be nice if all of these */
|
||||
/* saved things, in this and all other subroutines, could be stored
|
||||
*/
|
||||
/* in a single struct lpc10_coder_state_t, initialized with a call
|
||||
*/
|
||||
/* to a function like lpc10_init(&lpc10_coder_state). In this way,
|
||||
*/
|
||||
/* a program that used these functions could conveniently alternate
|
||||
*/
|
||||
/* coding more than one distinct audio stream. */
|
||||
|
||||
n = &(st->n);
|
||||
d__ = &(st->d__);
|
||||
fpc = &(st->fpc);
|
||||
l2buf = &(st->l2buf[0]);
|
||||
l2sum1 = &(st->l2sum1);
|
||||
l2ptr1 = &(st->l2ptr1);
|
||||
l2ptr2 = &(st->l2ptr2);
|
||||
lasti = &(st->lasti);
|
||||
hyst = &(st->hyst);
|
||||
|
||||
/* Parameter adjustments */
|
||||
if (osbuf) {
|
||||
--osbuf;
|
||||
}
|
||||
if (pebuf) {
|
||||
pebuf_offset = *sbufl;
|
||||
pebuf -= pebuf_offset;
|
||||
}
|
||||
|
||||
/* Function Body */
|
||||
|
||||
/* The following line subtracted a hard-coded "180" from LASTI, */
|
||||
/* instead of using a variable like LFRAME or a constant like */
|
||||
/* MAXFRM. I changed it to LFRAME, for "generality". */
|
||||
if (*hyst) {
|
||||
*lasti -= *lframe;
|
||||
}
|
||||
i__1 = *sbufh;
|
||||
for (i__ = *sbufh - *lframe + 1; i__ <= i__1; ++i__) {
|
||||
/* Compute FPC; Use old FPC on divide by zero; Clamp FPC to +/- 1.
|
||||
*/
|
||||
*n = (pebuf[i__] * pebuf[i__ - 1] + (*n) * 63.f) / 64.f;
|
||||
/* Computing 2nd power */
|
||||
r__1 = pebuf[i__ - 1];
|
||||
*d__ = (r__1 * r__1 + (*d__) * 63.f) / 64.f;
|
||||
if ((*d__) != 0.f) {
|
||||
if (abs(*n) > (*d__)) {
|
||||
*fpc = (real)r_sign(&c_b2, n);
|
||||
} else {
|
||||
*fpc = (*n) / (*d__);
|
||||
}
|
||||
}
|
||||
/* Filter FPC */
|
||||
/* In order to allow L2SUM1 not to be saved from one invocation
|
||||
of */
|
||||
/* this subroutine to the next, one could change the sequence of
|
||||
*/
|
||||
/* assignments below, up to the IF statement, to the following.
|
||||
In */
|
||||
/* addition, the initial value of L2PTR2 should be changed to */
|
||||
/* L2WID/2 instead of L2WID/2+1. */
|
||||
|
||||
/* L2SUM1 = L2BUF(L2PTR2) */
|
||||
/* L2PTR2 = MOD(L2PTR2,L2WID)+1 */
|
||||
/* L2SUM1 = L2SUM1 - L2BUF(L2PTR2) + FPC */
|
||||
/* L2BUF(L2PTR2) = L2SUM1 */
|
||||
|
||||
/* * The following lines didn't change from the original: */
|
||||
/* L2SUM2 = L2BUF(L2PTR1) */
|
||||
/* L2BUF(L2PTR1) = FPC */
|
||||
/* L2PTR1 = MOD(L2PTR1,L2WID)+1 */
|
||||
|
||||
l2sum2 = l2buf[*l2ptr1 - 1];
|
||||
*l2sum1 = *l2sum1 - l2buf[*l2ptr2 - 1] + *fpc;
|
||||
l2buf[*l2ptr2 - 1] = *l2sum1;
|
||||
l2buf[*l2ptr1 - 1] = *fpc;
|
||||
*l2ptr1 = *l2ptr1 % 16 + 1;
|
||||
*l2ptr2 = *l2ptr2 % 16 + 1;
|
||||
if ((r__1 = *l2sum1 - l2sum2, abs(r__1)) > 1.7f) {
|
||||
if (! (*hyst)) {
|
||||
/* Ignore if buffer full */
|
||||
if (*osptr <= *oslen) {
|
||||
osbuf[*osptr] = i__ - 9;
|
||||
++(*osptr);
|
||||
}
|
||||
*hyst = TRUE_;
|
||||
}
|
||||
*lasti = i__;
|
||||
/* After one onset detection, at least OSHYST sample times m
|
||||
ust go */
|
||||
/* by before another is allowed to occur. */
|
||||
} else if ((*hyst) && i__ - *lasti >= 10) {
|
||||
*hyst = FALSE_;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
} /* onset_ */
|
||||
/*
|
||||
|
||||
$Log: onset.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.2 1996/08/20 20:37:55 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_encoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_encoder_state().
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:31:18 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int onset_(real *pebuf, integer *osbuf, integer *osptr, integer *oslen, integer *sbufl, integer *sbufh, integer *lframe, struct lpc10_encoder_state *st);
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* Table of constant values */
|
||||
|
||||
static real c_b2 = 1.f;
|
||||
|
||||
/* ****************************************************************** */
|
||||
|
||||
/* ONSET Version 49 */
|
||||
|
||||
/* $Log: onset.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:37:55 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_encoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_encoder_state().
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:31:18 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.5 1996/03/15 16:41:01 jaf */
|
||||
/* Just rearranged INITONSET assignment orders to be consistent with */
|
||||
/* order of DATA statements in ONSET. */
|
||||
|
||||
/* Revision 1.4 1996/03/15 15:48:27 jaf */
|
||||
/* Changed some comments, and only reordered the DATA statements (their */
|
||||
/* meaning wasn't changed). */
|
||||
|
||||
/* Revision 1.3 1996/03/14 23:53:06 jaf */
|
||||
/* Added an entry INITONSET that reinitializes the local state variables */
|
||||
/* of subroutine ONSET. */
|
||||
|
||||
/* Rearranged quite a few comments, adding more explaining which */
|
||||
/* arguments were inputs, and how the modified ones can be changed. */
|
||||
|
||||
/* Revision 1.2 1996/03/12 23:53:00 jaf */
|
||||
/* Lots of comments added about the local state of this subroutine that */
|
||||
/* must be saved from one invocation to the next. */
|
||||
|
||||
/* One constant 180 replaced with LFRAME, which should be "more general", */
|
||||
/* even though it would probably require many more changes than this to */
|
||||
/* get this coder to work for other frame sizes. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:48:09 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ****************************************************************** */
|
||||
|
||||
/* Floating point version */
|
||||
|
||||
|
||||
/* Detection of onsets in (or slightly preceding) the futuremost frame */
|
||||
/* of speech. */
|
||||
|
||||
|
||||
/* Input: */
|
||||
/* PEBUF(SBUFL:SBUFH) - Preemphasized speech */
|
||||
/* Indices SBUFH-LFRAME through SBUFH are read. */
|
||||
/* OSLEN - Maximum number of onsets that can be stored in OSBUF. */
|
||||
/* SBUFL, SBUFH - Range of PEBUF */
|
||||
/* LFRAME - length of a frame, in samples */
|
||||
/* Input/Output: */
|
||||
/* OSBUF(OSLEN) - Buffer which holds sorted indexes of onsets */
|
||||
/* Indices A through B are modified, where A */
|
||||
/* is the original value of OSPTR, and B is the final */
|
||||
/* value of OSPTR-1. B is at most OSLEN. */
|
||||
/* OSPTR - Free pointer into OSBUF */
|
||||
/* Initial value should be .LE. OSLEN+1. */
|
||||
/* If so, final value grows by one for each new onset */
|
||||
/* found, and final value will be .LE. OSLEN+1. */
|
||||
|
||||
/* This subroutine maintains local state from one call to the next. If */
|
||||
/* you want to switch to using a new audio stream for this subroutine, or */
|
||||
/* reinitialize its state for any other reason, call the ENTRY INITONSET. */
|
||||
|
||||
/* Subroutine */ int onset_(real *pebuf, integer *osbuf, integer *
|
||||
osptr, integer *oslen, integer *sbufl, integer *sbufh, integer *
|
||||
lframe, struct lpc10_encoder_state *st)
|
||||
{
|
||||
/* Initialized data */
|
||||
|
||||
real *n;
|
||||
real *d__;
|
||||
real *l2buf;
|
||||
real *l2sum1;
|
||||
integer *l2ptr1;
|
||||
integer *l2ptr2;
|
||||
logical *hyst;
|
||||
|
||||
/* System generated locals */
|
||||
integer pebuf_offset, i__1;
|
||||
real r__1;
|
||||
|
||||
/* Builtin functions */
|
||||
double r_sign(real *, real *);
|
||||
|
||||
/* Local variables */
|
||||
integer i__;
|
||||
integer *lasti;
|
||||
real l2sum2;
|
||||
real *fpc;
|
||||
|
||||
/* Arguments */
|
||||
/* $Log: onset.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:37:55 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_encoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_encoder_state().
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:31:18 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/29 22:03:47 jaf */
|
||||
/* Removed definitions for any constants that were no longer used. */
|
||||
|
||||
/* Revision 1.2 1996/03/26 19:34:33 jaf */
|
||||
/* Added comments indicating which constants are not needed in an */
|
||||
/* application that uses the LPC-10 coder. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:43:51 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
/* LPC Configuration parameters: */
|
||||
/* Frame size, Prediction order, Pitch period */
|
||||
/* Parameters/constants */
|
||||
/* Parameters for onset detection algorithm: */
|
||||
/* L2 Threshold for filtered slope of FPC (function of L2WID!) */
|
||||
/* L2LAG Lag due to both filters which compute filtered slope of FPC */
|
||||
/* L2WID Width of the filter which computes the slope of FPC */
|
||||
/* OSHYST The number of samples of slope(FPC) which must be below */
|
||||
/* the threshold before a new onset may be declared. */
|
||||
/* Local variables that need not be saved */
|
||||
/* Local state */
|
||||
/* Variables */
|
||||
/* N, D Numerator and denominator of prediction filters */
|
||||
/* FPC Current prediction coefs */
|
||||
/* L2BUF, L2SUM1, L2SUM2 State of slope filter */
|
||||
/* The only "significant" change I've made is to change L2SUM2 out
|
||||
*/
|
||||
/* of the list of local variables that need to be saved, since it */
|
||||
/* didn't need to be. */
|
||||
/* L2SUM1 need not be, but avoiding saving it would require a small
|
||||
*/
|
||||
/* change to the body of the code. See comments below for an */
|
||||
/* example of how the code could be changed to avoid saving L2SUM1.
|
||||
*/
|
||||
/* FPC and LASTI are saved from one invocation to the next, but */
|
||||
/* they are not given initial values. This is acceptable, because
|
||||
*/
|
||||
/* FPC will be assigned a value the first time that this function */
|
||||
/* is called after D is initialized to 1, since the formula to */
|
||||
/* change D will not change it to 0 in one step, and the IF (D */
|
||||
/* .NE. 0) statement will execute its THEN part, initializing FPC.
|
||||
*/
|
||||
|
||||
/* LASTI's value will not be used until HYST is .TRUE., and */
|
||||
/* whenever HYST is changed from its initial value of .FALSE., */
|
||||
/* LASTI is assigned a value. */
|
||||
/* In a C version of this coder, it would be nice if all of these */
|
||||
/* saved things, in this and all other subroutines, could be stored
|
||||
*/
|
||||
/* in a single struct lpc10_coder_state_t, initialized with a call
|
||||
*/
|
||||
/* to a function like lpc10_init(&lpc10_coder_state). In this way,
|
||||
*/
|
||||
/* a program that used these functions could conveniently alternate
|
||||
*/
|
||||
/* coding more than one distinct audio stream. */
|
||||
|
||||
n = &(st->n);
|
||||
d__ = &(st->d__);
|
||||
fpc = &(st->fpc);
|
||||
l2buf = &(st->l2buf[0]);
|
||||
l2sum1 = &(st->l2sum1);
|
||||
l2ptr1 = &(st->l2ptr1);
|
||||
l2ptr2 = &(st->l2ptr2);
|
||||
lasti = &(st->lasti);
|
||||
hyst = &(st->hyst);
|
||||
|
||||
/* Parameter adjustments */
|
||||
if (osbuf) {
|
||||
--osbuf;
|
||||
}
|
||||
if (pebuf) {
|
||||
pebuf_offset = *sbufl;
|
||||
pebuf -= pebuf_offset;
|
||||
}
|
||||
|
||||
/* Function Body */
|
||||
|
||||
/* The following line subtracted a hard-coded "180" from LASTI, */
|
||||
/* instead of using a variable like LFRAME or a constant like */
|
||||
/* MAXFRM. I changed it to LFRAME, for "generality". */
|
||||
if (*hyst) {
|
||||
*lasti -= *lframe;
|
||||
}
|
||||
i__1 = *sbufh;
|
||||
for (i__ = *sbufh - *lframe + 1; i__ <= i__1; ++i__) {
|
||||
/* Compute FPC; Use old FPC on divide by zero; Clamp FPC to +/- 1.
|
||||
*/
|
||||
*n = (pebuf[i__] * pebuf[i__ - 1] + (*n) * 63.f) / 64.f;
|
||||
/* Computing 2nd power */
|
||||
r__1 = pebuf[i__ - 1];
|
||||
*d__ = (r__1 * r__1 + (*d__) * 63.f) / 64.f;
|
||||
if ((*d__) != 0.f) {
|
||||
if (abs(*n) > (*d__)) {
|
||||
*fpc = (real)r_sign(&c_b2, n);
|
||||
} else {
|
||||
*fpc = (*n) / (*d__);
|
||||
}
|
||||
}
|
||||
/* Filter FPC */
|
||||
/* In order to allow L2SUM1 not to be saved from one invocation
|
||||
of */
|
||||
/* this subroutine to the next, one could change the sequence of
|
||||
*/
|
||||
/* assignments below, up to the IF statement, to the following.
|
||||
In */
|
||||
/* addition, the initial value of L2PTR2 should be changed to */
|
||||
/* L2WID/2 instead of L2WID/2+1. */
|
||||
|
||||
/* L2SUM1 = L2BUF(L2PTR2) */
|
||||
/* L2PTR2 = MOD(L2PTR2,L2WID)+1 */
|
||||
/* L2SUM1 = L2SUM1 - L2BUF(L2PTR2) + FPC */
|
||||
/* L2BUF(L2PTR2) = L2SUM1 */
|
||||
|
||||
/* * The following lines didn't change from the original: */
|
||||
/* L2SUM2 = L2BUF(L2PTR1) */
|
||||
/* L2BUF(L2PTR1) = FPC */
|
||||
/* L2PTR1 = MOD(L2PTR1,L2WID)+1 */
|
||||
|
||||
l2sum2 = l2buf[*l2ptr1 - 1];
|
||||
*l2sum1 = *l2sum1 - l2buf[*l2ptr2 - 1] + *fpc;
|
||||
l2buf[*l2ptr2 - 1] = *l2sum1;
|
||||
l2buf[*l2ptr1 - 1] = *fpc;
|
||||
*l2ptr1 = *l2ptr1 % 16 + 1;
|
||||
*l2ptr2 = *l2ptr2 % 16 + 1;
|
||||
if ((r__1 = *l2sum1 - l2sum2, abs(r__1)) > 1.7f) {
|
||||
if (! (*hyst)) {
|
||||
/* Ignore if buffer full */
|
||||
if (*osptr <= *oslen) {
|
||||
osbuf[*osptr] = i__ - 9;
|
||||
++(*osptr);
|
||||
}
|
||||
*hyst = TRUE_;
|
||||
}
|
||||
*lasti = i__;
|
||||
/* After one onset detection, at least OSHYST sample times m
|
||||
ust go */
|
||||
/* by before another is allowed to occur. */
|
||||
} else if ((*hyst) && i__ - *lasti >= 10) {
|
||||
*hyst = FALSE_;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
} /* onset_ */
|
||||
|
||||
+567
-567
File diff suppressed because it is too large
Load Diff
+225
-225
@@ -1,225 +1,225 @@
|
||||
/*
|
||||
|
||||
$Log: placea.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.2 2001/10/16 21:21:14 yurik
|
||||
Removed warnings on Windows CE. Submitted by Jehan Bing, jehan@bravobrava.com
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.1 1996/08/19 22:31:07 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int placea_(integer *ipitch, integer *voibuf, integer *obound, integer *af, integer *vwin, integer *awin, integer *ewin, integer *lframe, integer *maxwin);
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* *********************************************************************** */
|
||||
|
||||
/* PLACEA Version 48 */
|
||||
|
||||
/* $Log: placea.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.2 2001/10/16 21:21:14 yurik
|
||||
* Removed warnings on Windows CE. Submitted by Jehan Bing, jehan@bravobrava.com
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:31:07 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.5 1996/03/19 20:41:55 jaf */
|
||||
/* Added some conditions satisfied by the output values in EWIN. */
|
||||
|
||||
/* Revision 1.4 1996/03/19 20:24:17 jaf */
|
||||
/* Added some conditions satisfied by the output values in AWIN. */
|
||||
|
||||
/* Revision 1.3 1996/03/18 21:40:04 jaf */
|
||||
/* Just added a few comments about which array indices of the arguments */
|
||||
/* are used, and mentioning that this subroutine has no local state. */
|
||||
|
||||
/* Revision 1.2 1996/03/13 16:43:09 jaf */
|
||||
/* Comments added explaining that none of the local variables of this */
|
||||
/* subroutine need to be saved from one invocation to the next. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:48:31 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* *********************************************************************** */
|
||||
/* Input: */
|
||||
/* IPITCH */
|
||||
/* VOIBUF */
|
||||
/* Indices (2,AF-2), (1,AF-1), (2,AF-1), (1,AF), and (2,AF) read.*/
|
||||
/* All other indices untouched. */
|
||||
/* OBOUND */
|
||||
/* AF */
|
||||
/* VWIN */
|
||||
/* Indices (1,AF) and (2,AF) read. */
|
||||
/* All other indices untouched. */
|
||||
/* LFRAME */
|
||||
/* MAXWIN */
|
||||
/* Input/Output: */
|
||||
/* AWIN */
|
||||
/* Index (1,AF-1) read. */
|
||||
/* Indices (1,AF) and (2,AF) written, and then read. */
|
||||
/* All other indices untouched. */
|
||||
/* In all cases (except possibly one), the final values will */
|
||||
/* satisfy the condition: AWIN(2,AF)-AWIN(1,AF)+1 = MAXWIN. */
|
||||
/* In that other case, */
|
||||
/* AWIN(1,AF)=VWIN(1,AF) and AWIN(2,AF)=VWIN(2,AF). */
|
||||
/* Output: */
|
||||
/* EWIN */
|
||||
/* Indices (1,AF) and (2,AF) written. */
|
||||
/* All other indices untouched. */
|
||||
/* In all cases, the final values will satisfy the condition: */
|
||||
/* AWIN(1,AF) .LE. EWIN(1,AF) .LE. EWIN(2,AF) .LE. AWIN(2,AF) */
|
||||
/* In other words, the energy window is a sub-window of */
|
||||
/* the analysis window. */
|
||||
|
||||
/* This subroutine has no local state. */
|
||||
|
||||
/* Subroutine */ int placea_(integer *ipitch, integer *voibuf, integer *
|
||||
obound, integer *af, integer *vwin, integer *awin, integer *ewin,
|
||||
integer *lframe, integer *maxwin)
|
||||
{
|
||||
/* System generated locals */
|
||||
real r__1;
|
||||
|
||||
/* Builtin functions */
|
||||
integer i_nint(real *);
|
||||
|
||||
/* Local variables */
|
||||
logical allv, winv;
|
||||
integer i__, j, k, l, hrange;
|
||||
logical ephase;
|
||||
integer lrange;
|
||||
|
||||
/* Arguments */
|
||||
/* Local variables that need not be saved */
|
||||
/* Parameter adjustments */
|
||||
ewin -= 3;
|
||||
awin -= 3;
|
||||
vwin -= 3;
|
||||
--voibuf;
|
||||
|
||||
/* Function Body */
|
||||
lrange = (*af - 2) * *lframe + 1;
|
||||
hrange = *af * *lframe;
|
||||
/* Place the Analysis window based on the voicing window */
|
||||
/* placement, onsets, tentative voicing decision, and pitch. */
|
||||
|
||||
/* Case 1: Sustained Voiced Speech */
|
||||
/* If the five most recent voicing decisions are */
|
||||
/* voiced, then the window is placed phase-synchronously with the */
|
||||
/* previous window, as close to the present voicing window if possible.
|
||||
*/
|
||||
/* If onsets bound the voicing window, then preference is given to */
|
||||
/* a phase-synchronous placement which does not overlap these onsets. */
|
||||
|
||||
/* Case 2: Voiced Transition */
|
||||
/* If at least one voicing decision in AF is voicied, and there are no
|
||||
*/
|
||||
/* onsets, then the window is placed as in case 1. */
|
||||
|
||||
/* Case 3: Unvoiced Speech or Onsets */
|
||||
/* If both voicing decisions in AF are unvoiced, or there are onsets, */
|
||||
/* then the window is placed coincident with the voicing window. */
|
||||
|
||||
/* Note: During phase-synchronous placement of windows, the length */
|
||||
/* is not altered from MAXWIN, since this would defeat the purpose */
|
||||
/* of phase-synchronous placement. */
|
||||
/* Check for case 1 and case 2 */
|
||||
allv = voibuf[((*af - 2) << 1) + 2] == 1;
|
||||
allv = allv && voibuf[((*af - 1) << 1) + 1] == 1;
|
||||
allv = allv && voibuf[((*af - 1) << 1) + 2] == 1;
|
||||
allv = allv && voibuf[(*af << 1) + 1] == 1;
|
||||
allv = allv && voibuf[(*af << 1) + 2] == 1;
|
||||
winv = voibuf[(*af << 1) + 1] == 1 || voibuf[(*af << 1) + 2] == 1;
|
||||
if (allv || winv && *obound == 0) {
|
||||
/* APHASE: Phase synchronous window placement. */
|
||||
/* Get minimum lower index of the window. */
|
||||
i__ = (lrange + *ipitch - 1 - awin[((*af - 1) << 1) + 1]) / *ipitch;
|
||||
i__ *= *ipitch;
|
||||
i__ += awin[((*af - 1) << 1) + 1];
|
||||
/* L = the actual length of this frame's analysis window. */
|
||||
l = *maxwin;
|
||||
/* Calculate the location where a perfectly centered window would star
|
||||
t. */
|
||||
k = (vwin[(*af << 1) + 1] + vwin[(*af << 1) + 2] + 1 - l) / 2;
|
||||
/* Choose the actual location to be the pitch multiple closest to this
|
||||
. */
|
||||
r__1 = (real) (k - i__) / *ipitch;
|
||||
awin[(*af << 1) + 1] = i__ + i_nint(&r__1) * *ipitch;
|
||||
awin[(*af << 1) + 2] = awin[(*af << 1) + 1] + l - 1;
|
||||
/* If there is an onset bounding the right of the voicing window and t
|
||||
he */
|
||||
/* analysis window overlaps that, then move the analysis window backwa
|
||||
rd */
|
||||
/* to avoid this onset. */
|
||||
if (*obound >= 2 && awin[(*af << 1) + 2] > vwin[(*af << 1) + 2]) {
|
||||
awin[(*af << 1) + 1] -= *ipitch;
|
||||
awin[(*af << 1) + 2] -= *ipitch;
|
||||
}
|
||||
/* Similarly for the left of the voicing window. */
|
||||
if ((*obound == 1 || *obound == 3) && awin[(*af << 1) + 1] < vwin[(*
|
||||
af << 1) + 1]) {
|
||||
awin[(*af << 1) + 1] += *ipitch;
|
||||
awin[(*af << 1) + 2] += *ipitch;
|
||||
}
|
||||
/* If this placement puts the analysis window above HRANGE, then */
|
||||
/* move it backward an integer number of pitch periods. */
|
||||
while(awin[(*af << 1) + 2] > hrange) {
|
||||
awin[(*af << 1) + 1] -= *ipitch;
|
||||
awin[(*af << 1) + 2] -= *ipitch;
|
||||
}
|
||||
/* Similarly if the placement puts the analysis window below LRANGE.
|
||||
*/
|
||||
while(awin[(*af << 1) + 1] < lrange) {
|
||||
awin[(*af << 1) + 1] += *ipitch;
|
||||
awin[(*af << 1) + 2] += *ipitch;
|
||||
}
|
||||
/* Make Energy window be phase-synchronous. */
|
||||
ephase = TRUE_;
|
||||
/* Case 3 */
|
||||
} else {
|
||||
awin[(*af << 1) + 1] = vwin[(*af << 1) + 1];
|
||||
awin[(*af << 1) + 2] = vwin[(*af << 1) + 2];
|
||||
ephase = FALSE_;
|
||||
}
|
||||
/* RMS is computed over an integer number of pitch periods in the analysis
|
||||
*/
|
||||
/*window. When it is not placed phase-synchronously, it is placed as clos
|
||||
e*/
|
||||
/* as possible to onsets. */
|
||||
j = (awin[(*af << 1) + 2] - awin[(*af << 1) + 1] + 1) / *ipitch * *ipitch;
|
||||
if (j == 0 || ! winv) {
|
||||
ewin[(*af << 1) + 1] = vwin[(*af << 1) + 1];
|
||||
ewin[(*af << 1) + 2] = vwin[(*af << 1) + 2];
|
||||
} else if (! ephase && *obound == 2) {
|
||||
ewin[(*af << 1) + 1] = awin[(*af << 1) + 2] - j + 1;
|
||||
ewin[(*af << 1) + 2] = awin[(*af << 1) + 2];
|
||||
} else {
|
||||
ewin[(*af << 1) + 1] = awin[(*af << 1) + 1];
|
||||
ewin[(*af << 1) + 2] = awin[(*af << 1) + 1] + j - 1;
|
||||
}
|
||||
return 0;
|
||||
} /* placea_ */
|
||||
|
||||
/*
|
||||
|
||||
$Log: placea.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.2 2001/10/16 21:21:14 yurik
|
||||
Removed warnings on Windows CE. Submitted by Jehan Bing, jehan@bravobrava.com
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.1 1996/08/19 22:31:07 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int placea_(integer *ipitch, integer *voibuf, integer *obound, integer *af, integer *vwin, integer *awin, integer *ewin, integer *lframe, integer *maxwin);
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* *********************************************************************** */
|
||||
|
||||
/* PLACEA Version 48 */
|
||||
|
||||
/* $Log: placea.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.2 2001/10/16 21:21:14 yurik
|
||||
* Removed warnings on Windows CE. Submitted by Jehan Bing, jehan@bravobrava.com
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:31:07 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.5 1996/03/19 20:41:55 jaf */
|
||||
/* Added some conditions satisfied by the output values in EWIN. */
|
||||
|
||||
/* Revision 1.4 1996/03/19 20:24:17 jaf */
|
||||
/* Added some conditions satisfied by the output values in AWIN. */
|
||||
|
||||
/* Revision 1.3 1996/03/18 21:40:04 jaf */
|
||||
/* Just added a few comments about which array indices of the arguments */
|
||||
/* are used, and mentioning that this subroutine has no local state. */
|
||||
|
||||
/* Revision 1.2 1996/03/13 16:43:09 jaf */
|
||||
/* Comments added explaining that none of the local variables of this */
|
||||
/* subroutine need to be saved from one invocation to the next. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:48:31 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* *********************************************************************** */
|
||||
/* Input: */
|
||||
/* IPITCH */
|
||||
/* VOIBUF */
|
||||
/* Indices (2,AF-2), (1,AF-1), (2,AF-1), (1,AF), and (2,AF) read.*/
|
||||
/* All other indices untouched. */
|
||||
/* OBOUND */
|
||||
/* AF */
|
||||
/* VWIN */
|
||||
/* Indices (1,AF) and (2,AF) read. */
|
||||
/* All other indices untouched. */
|
||||
/* LFRAME */
|
||||
/* MAXWIN */
|
||||
/* Input/Output: */
|
||||
/* AWIN */
|
||||
/* Index (1,AF-1) read. */
|
||||
/* Indices (1,AF) and (2,AF) written, and then read. */
|
||||
/* All other indices untouched. */
|
||||
/* In all cases (except possibly one), the final values will */
|
||||
/* satisfy the condition: AWIN(2,AF)-AWIN(1,AF)+1 = MAXWIN. */
|
||||
/* In that other case, */
|
||||
/* AWIN(1,AF)=VWIN(1,AF) and AWIN(2,AF)=VWIN(2,AF). */
|
||||
/* Output: */
|
||||
/* EWIN */
|
||||
/* Indices (1,AF) and (2,AF) written. */
|
||||
/* All other indices untouched. */
|
||||
/* In all cases, the final values will satisfy the condition: */
|
||||
/* AWIN(1,AF) .LE. EWIN(1,AF) .LE. EWIN(2,AF) .LE. AWIN(2,AF) */
|
||||
/* In other words, the energy window is a sub-window of */
|
||||
/* the analysis window. */
|
||||
|
||||
/* This subroutine has no local state. */
|
||||
|
||||
/* Subroutine */ int placea_(integer *ipitch, integer *voibuf, integer *
|
||||
obound, integer *af, integer *vwin, integer *awin, integer *ewin,
|
||||
integer *lframe, integer *maxwin)
|
||||
{
|
||||
/* System generated locals */
|
||||
real r__1;
|
||||
|
||||
/* Builtin functions */
|
||||
integer i_nint(real *);
|
||||
|
||||
/* Local variables */
|
||||
logical allv, winv;
|
||||
integer i__, j, k, l, hrange;
|
||||
logical ephase;
|
||||
integer lrange;
|
||||
|
||||
/* Arguments */
|
||||
/* Local variables that need not be saved */
|
||||
/* Parameter adjustments */
|
||||
ewin -= 3;
|
||||
awin -= 3;
|
||||
vwin -= 3;
|
||||
--voibuf;
|
||||
|
||||
/* Function Body */
|
||||
lrange = (*af - 2) * *lframe + 1;
|
||||
hrange = *af * *lframe;
|
||||
/* Place the Analysis window based on the voicing window */
|
||||
/* placement, onsets, tentative voicing decision, and pitch. */
|
||||
|
||||
/* Case 1: Sustained Voiced Speech */
|
||||
/* If the five most recent voicing decisions are */
|
||||
/* voiced, then the window is placed phase-synchronously with the */
|
||||
/* previous window, as close to the present voicing window if possible.
|
||||
*/
|
||||
/* If onsets bound the voicing window, then preference is given to */
|
||||
/* a phase-synchronous placement which does not overlap these onsets. */
|
||||
|
||||
/* Case 2: Voiced Transition */
|
||||
/* If at least one voicing decision in AF is voicied, and there are no
|
||||
*/
|
||||
/* onsets, then the window is placed as in case 1. */
|
||||
|
||||
/* Case 3: Unvoiced Speech or Onsets */
|
||||
/* If both voicing decisions in AF are unvoiced, or there are onsets, */
|
||||
/* then the window is placed coincident with the voicing window. */
|
||||
|
||||
/* Note: During phase-synchronous placement of windows, the length */
|
||||
/* is not altered from MAXWIN, since this would defeat the purpose */
|
||||
/* of phase-synchronous placement. */
|
||||
/* Check for case 1 and case 2 */
|
||||
allv = voibuf[((*af - 2) << 1) + 2] == 1;
|
||||
allv = allv && voibuf[((*af - 1) << 1) + 1] == 1;
|
||||
allv = allv && voibuf[((*af - 1) << 1) + 2] == 1;
|
||||
allv = allv && voibuf[(*af << 1) + 1] == 1;
|
||||
allv = allv && voibuf[(*af << 1) + 2] == 1;
|
||||
winv = voibuf[(*af << 1) + 1] == 1 || voibuf[(*af << 1) + 2] == 1;
|
||||
if (allv || winv && *obound == 0) {
|
||||
/* APHASE: Phase synchronous window placement. */
|
||||
/* Get minimum lower index of the window. */
|
||||
i__ = (lrange + *ipitch - 1 - awin[((*af - 1) << 1) + 1]) / *ipitch;
|
||||
i__ *= *ipitch;
|
||||
i__ += awin[((*af - 1) << 1) + 1];
|
||||
/* L = the actual length of this frame's analysis window. */
|
||||
l = *maxwin;
|
||||
/* Calculate the location where a perfectly centered window would star
|
||||
t. */
|
||||
k = (vwin[(*af << 1) + 1] + vwin[(*af << 1) + 2] + 1 - l) / 2;
|
||||
/* Choose the actual location to be the pitch multiple closest to this
|
||||
. */
|
||||
r__1 = (real) (k - i__) / *ipitch;
|
||||
awin[(*af << 1) + 1] = i__ + i_nint(&r__1) * *ipitch;
|
||||
awin[(*af << 1) + 2] = awin[(*af << 1) + 1] + l - 1;
|
||||
/* If there is an onset bounding the right of the voicing window and t
|
||||
he */
|
||||
/* analysis window overlaps that, then move the analysis window backwa
|
||||
rd */
|
||||
/* to avoid this onset. */
|
||||
if (*obound >= 2 && awin[(*af << 1) + 2] > vwin[(*af << 1) + 2]) {
|
||||
awin[(*af << 1) + 1] -= *ipitch;
|
||||
awin[(*af << 1) + 2] -= *ipitch;
|
||||
}
|
||||
/* Similarly for the left of the voicing window. */
|
||||
if ((*obound == 1 || *obound == 3) && awin[(*af << 1) + 1] < vwin[(*
|
||||
af << 1) + 1]) {
|
||||
awin[(*af << 1) + 1] += *ipitch;
|
||||
awin[(*af << 1) + 2] += *ipitch;
|
||||
}
|
||||
/* If this placement puts the analysis window above HRANGE, then */
|
||||
/* move it backward an integer number of pitch periods. */
|
||||
while(awin[(*af << 1) + 2] > hrange) {
|
||||
awin[(*af << 1) + 1] -= *ipitch;
|
||||
awin[(*af << 1) + 2] -= *ipitch;
|
||||
}
|
||||
/* Similarly if the placement puts the analysis window below LRANGE.
|
||||
*/
|
||||
while(awin[(*af << 1) + 1] < lrange) {
|
||||
awin[(*af << 1) + 1] += *ipitch;
|
||||
awin[(*af << 1) + 2] += *ipitch;
|
||||
}
|
||||
/* Make Energy window be phase-synchronous. */
|
||||
ephase = TRUE_;
|
||||
/* Case 3 */
|
||||
} else {
|
||||
awin[(*af << 1) + 1] = vwin[(*af << 1) + 1];
|
||||
awin[(*af << 1) + 2] = vwin[(*af << 1) + 2];
|
||||
ephase = FALSE_;
|
||||
}
|
||||
/* RMS is computed over an integer number of pitch periods in the analysis
|
||||
*/
|
||||
/*window. When it is not placed phase-synchronously, it is placed as clos
|
||||
e*/
|
||||
/* as possible to onsets. */
|
||||
j = (awin[(*af << 1) + 2] - awin[(*af << 1) + 1] + 1) / *ipitch * *ipitch;
|
||||
if (j == 0 || ! winv) {
|
||||
ewin[(*af << 1) + 1] = vwin[(*af << 1) + 1];
|
||||
ewin[(*af << 1) + 2] = vwin[(*af << 1) + 2];
|
||||
} else if (! ephase && *obound == 2) {
|
||||
ewin[(*af << 1) + 1] = awin[(*af << 1) + 2] - j + 1;
|
||||
ewin[(*af << 1) + 2] = awin[(*af << 1) + 2];
|
||||
} else {
|
||||
ewin[(*af << 1) + 1] = awin[(*af << 1) + 1];
|
||||
ewin[(*af << 1) + 2] = awin[(*af << 1) + 1] + j - 1;
|
||||
}
|
||||
return 0;
|
||||
} /* placea_ */
|
||||
|
||||
|
||||
+264
-264
@@ -1,264 +1,264 @@
|
||||
/*
|
||||
|
||||
$Log: placev.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.2 2001/10/16 21:21:14 yurik
|
||||
Removed warnings on Windows CE. Submitted by Jehan Bing, jehan@bravobrava.com
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.1 1996/08/19 22:31:02 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int placev_(integer *osbuf, integer *osptr, integer *oslen, integer *obound, integer *vwin, integer *af, integer *lframe, integer *minwin, integer *maxwin, integer *dvwinl, integer *dvwinh);
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* ****************************************************************** */
|
||||
|
||||
/* PLACEV Version 48 */
|
||||
|
||||
/* $Log: placev.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.2 2001/10/16 21:21:14 yurik
|
||||
* Removed warnings on Windows CE. Submitted by Jehan Bing, jehan@bravobrava.com
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:31:02 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.6 1996/03/19 20:42:19 jaf */
|
||||
/* Added some conditions satisfied by the output values in VWIN. */
|
||||
|
||||
/* Revision 1.5 1996/03/19 18:37:56 jaf */
|
||||
/* Strengthened the specification of which indices of VWIN are read and */
|
||||
/* written. */
|
||||
|
||||
/* Revision 1.4 1996/03/15 16:38:33 jaf */
|
||||
/* One tiny comment added. */
|
||||
|
||||
/* Revision 1.3 1996/03/15 16:36:13 jaf */
|
||||
/* Added comments giving In/Out status of arguments. */
|
||||
|
||||
/* Revision 1.2 1996/03/12 23:56:01 jaf */
|
||||
/* Comments added explaining that none of the local variables of this */
|
||||
/* subroutine need to be saved from one invocation to the next. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:48:39 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ****************************************************************** */
|
||||
|
||||
/* Input: */
|
||||
/* OSBUF Buffer which holds sorted indexes of onsets */
|
||||
/* I believe that only indices 1 through OSPTR-1 can be read. */
|
||||
/* OSLEN */
|
||||
/* OSPTR Free pointer into OSBUF */
|
||||
/* AF */
|
||||
/* LFRAME */
|
||||
/* MINWIN */
|
||||
/* MAXWIN */
|
||||
/* DVWINL */
|
||||
/* DVWINH (This argument is never used. Should it be?) */
|
||||
/* Input/Output: */
|
||||
/* VWIN Buffer of Voicing Window Positions (Modified) */
|
||||
/* Index (2,AF-1) is read. */
|
||||
/* Indices (1,AF) and (2,AF) are written, */
|
||||
/* and then possibly read. */
|
||||
/* All other indices are unused. */
|
||||
/* In all cases, the final values will satsify the condition:*/
|
||||
/* VWIN(2,AF)-VWIN(1,AF)+1 .LE. MAXWIN */
|
||||
/* I'm not certain yet, but they may also satisfy: */
|
||||
/* MINWIN .LE. VWIN(2,AF)-VWIN(1,AF)+1 */
|
||||
/* Output: */
|
||||
/* OBOUND This variable is set by this procedure and used */
|
||||
/* in placing analysis windows (PLACEA). Bit 1 */
|
||||
/* indicates whether an onset bounds the left side */
|
||||
/* of the voicing window, and bit 2 indicates whether */
|
||||
/* an onset bounds the right side of the voicing window. */
|
||||
|
||||
/* This subroutine has no local state. */
|
||||
|
||||
/* Subroutine */ int placev_(integer *osbuf, integer *osptr, integer *oslen,
|
||||
integer *obound, integer *vwin, integer *af, integer *lframe, integer
|
||||
*minwin, integer *maxwin, integer *dvwinl, integer *dvwinh)
|
||||
{
|
||||
/* System generated locals */
|
||||
integer i__1, i__2;
|
||||
|
||||
/* Local variables */
|
||||
logical crit;
|
||||
integer i__, q, osptr1, hrange, lrange;
|
||||
|
||||
/* Arguments */
|
||||
/* Local variables that need not be saved */
|
||||
/* Variables */
|
||||
/* LRANGE, HRANGE Range in which window is placed */
|
||||
/* OSPTR1 OSPTR excluding samples in 3F */
|
||||
/* Local state */
|
||||
/* None */
|
||||
/* Voicing Window Placement */
|
||||
|
||||
/* __________________ __________________ ______________ */
|
||||
/* | | | */
|
||||
/* | 1F | 2F | 3F ... */
|
||||
/* |__________________|__________________|______________ */
|
||||
|
||||
/* Previous | */
|
||||
/* Window | */
|
||||
/* ...________| */
|
||||
|
||||
/* | | */
|
||||
/* ------>| This window's placement range |<------ */
|
||||
/* | | */
|
||||
|
||||
/* There are three cases. Note that these are different from those */
|
||||
/* given in the LPC-10e phase 1 report. */
|
||||
|
||||
/* 1. If there are no onsets in this range, then the voicing window */
|
||||
/* is centered in the pitch window. If such a placement is not within
|
||||
*/
|
||||
/* the window's placement range, then the window is placed in the left-
|
||||
*/
|
||||
/* most portion of the placement range. Its length is always MAXWIN. */
|
||||
|
||||
/* 2. If the first onset is in 2F and there is sufficient room to place
|
||||
*/
|
||||
/* the window immediately before this onset, then the window is placed
|
||||
*/
|
||||
/* there, and its length is set to the maximum possible under these */
|
||||
/* constraints. */
|
||||
|
||||
/* "Critical Region Exception": If there is another onset in 2F */
|
||||
/* such that a window can be placed between the two onsets, the */
|
||||
/* window is placed there (ie, as in case 3). */
|
||||
|
||||
/* 3. Otherwise, the window is placed immediately after the onset. The
|
||||
*/
|
||||
/* window's length */
|
||||
/* is the longest length that can fit in the range under these constraint
|
||||
s,*/
|
||||
/* except that the window may be shortened even further to avoid overlapp
|
||||
ing*/
|
||||
/* other onsets in the placement range. In any case, the window's length
|
||||
*/
|
||||
/* is at least MINWIN. */
|
||||
|
||||
/* Note that the values of MINWIN and LFRAME must be chosen such */
|
||||
/* that case 2 = false implies case 3 = true. This means that */
|
||||
/* MINWIN <= LFRAME/2. If this were not the case, then a fourth case */
|
||||
/* would have to be added for when the window cannot fit either before
|
||||
*/
|
||||
/* or after the onset. */
|
||||
|
||||
/* Note also that onsets which weren't in 2F last time may be in 1F this
|
||||
*/
|
||||
/* time, due to the filter delays in computing onsets. The result is tha
|
||||
t*/
|
||||
/* occasionally a voicing window will overlap that onset. The only way
|
||||
*/
|
||||
/* to circumvent this problem is to add more delay in processing input
|
||||
*/
|
||||
/* speech. In the trade-off between delay and window-placement, window
|
||||
*/
|
||||
/* placement lost. */
|
||||
/* Compute the placement range */
|
||||
/* Parameter adjustments */
|
||||
--osbuf;
|
||||
vwin -= 3;
|
||||
|
||||
/* Function Body */
|
||||
/* Computing MAX */
|
||||
i__1 = vwin[((*af - 1) << 1) + 2] + 1, i__2 = (*af - 2) * *lframe + 1;
|
||||
lrange = max(i__1,i__2);
|
||||
hrange = *af * *lframe;
|
||||
/* Compute OSPTR1, so the following code only looks at relevant onsets. */
|
||||
for (osptr1 = *osptr - 1; osptr1 >= 1; --osptr1) {
|
||||
if (osbuf[osptr1] <= hrange) {
|
||||
goto L90;
|
||||
}
|
||||
}
|
||||
L90:
|
||||
++osptr1;
|
||||
/* Check for case 1 first (fast case): */
|
||||
if (osptr1 <= 1 || osbuf[osptr1 - 1] < lrange) {
|
||||
/* Computing MAX */
|
||||
i__1 = vwin[((*af - 1) << 1) + 2] + 1;
|
||||
vwin[(*af << 1) + 1] = max(i__1,*dvwinl);
|
||||
vwin[(*af << 1) + 2] = vwin[(*af << 1) + 1] + *maxwin - 1;
|
||||
*obound = 0;
|
||||
} else {
|
||||
/* Search backward in OSBUF for first onset in range. */
|
||||
/* This code relies on the above check being performed first. */
|
||||
for (q = osptr1 - 1; q >= 1; --q) {
|
||||
if (osbuf[q] < lrange) {
|
||||
goto L100;
|
||||
}
|
||||
}
|
||||
L100:
|
||||
++q;
|
||||
/* Check for case 2 (placement before onset): */
|
||||
/* Check for critical region exception: */
|
||||
i__1 = osptr1 - 1;
|
||||
for (i__ = q + 1; i__ <= i__1; ++i__) {
|
||||
if (osbuf[i__] - osbuf[q] >= *minwin) {
|
||||
crit = TRUE_;
|
||||
goto L105;
|
||||
}
|
||||
}
|
||||
crit = FALSE_;
|
||||
L105:
|
||||
/* Computing MAX */
|
||||
i__1 = (*af - 1) * *lframe, i__2 = lrange + *minwin - 1;
|
||||
if (! crit && osbuf[q] > max(i__1,i__2)) {
|
||||
vwin[(*af << 1) + 2] = osbuf[q] - 1;
|
||||
/* Computing MAX */
|
||||
i__1 = lrange, i__2 = vwin[(*af << 1) + 2] - *maxwin + 1;
|
||||
vwin[(*af << 1) + 1] = max(i__1,i__2);
|
||||
*obound = 2;
|
||||
/* Case 3 (placement after onset) */
|
||||
} else {
|
||||
vwin[(*af << 1) + 1] = osbuf[q];
|
||||
L110:
|
||||
++q;
|
||||
if (q >= osptr1) {
|
||||
goto L120;
|
||||
}
|
||||
if (osbuf[q] > vwin[(*af << 1) + 1] + *maxwin) {
|
||||
goto L120;
|
||||
}
|
||||
if (osbuf[q] < vwin[(*af << 1) + 1] + *minwin) {
|
||||
goto L110;
|
||||
}
|
||||
vwin[(*af << 1) + 2] = osbuf[q] - 1;
|
||||
*obound = 3;
|
||||
return 0;
|
||||
L120:
|
||||
/* Computing MIN */
|
||||
i__1 = vwin[(*af << 1) + 1] + *maxwin - 1;
|
||||
vwin[(*af << 1) + 2] = min(i__1,hrange);
|
||||
*obound = 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
} /* placev_ */
|
||||
|
||||
/*
|
||||
|
||||
$Log: placev.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.2 2001/10/16 21:21:14 yurik
|
||||
Removed warnings on Windows CE. Submitted by Jehan Bing, jehan@bravobrava.com
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.1 1996/08/19 22:31:02 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int placev_(integer *osbuf, integer *osptr, integer *oslen, integer *obound, integer *vwin, integer *af, integer *lframe, integer *minwin, integer *maxwin, integer *dvwinl, integer *dvwinh);
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* ****************************************************************** */
|
||||
|
||||
/* PLACEV Version 48 */
|
||||
|
||||
/* $Log: placev.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.2 2001/10/16 21:21:14 yurik
|
||||
* Removed warnings on Windows CE. Submitted by Jehan Bing, jehan@bravobrava.com
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:31:02 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.6 1996/03/19 20:42:19 jaf */
|
||||
/* Added some conditions satisfied by the output values in VWIN. */
|
||||
|
||||
/* Revision 1.5 1996/03/19 18:37:56 jaf */
|
||||
/* Strengthened the specification of which indices of VWIN are read and */
|
||||
/* written. */
|
||||
|
||||
/* Revision 1.4 1996/03/15 16:38:33 jaf */
|
||||
/* One tiny comment added. */
|
||||
|
||||
/* Revision 1.3 1996/03/15 16:36:13 jaf */
|
||||
/* Added comments giving In/Out status of arguments. */
|
||||
|
||||
/* Revision 1.2 1996/03/12 23:56:01 jaf */
|
||||
/* Comments added explaining that none of the local variables of this */
|
||||
/* subroutine need to be saved from one invocation to the next. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:48:39 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ****************************************************************** */
|
||||
|
||||
/* Input: */
|
||||
/* OSBUF Buffer which holds sorted indexes of onsets */
|
||||
/* I believe that only indices 1 through OSPTR-1 can be read. */
|
||||
/* OSLEN */
|
||||
/* OSPTR Free pointer into OSBUF */
|
||||
/* AF */
|
||||
/* LFRAME */
|
||||
/* MINWIN */
|
||||
/* MAXWIN */
|
||||
/* DVWINL */
|
||||
/* DVWINH (This argument is never used. Should it be?) */
|
||||
/* Input/Output: */
|
||||
/* VWIN Buffer of Voicing Window Positions (Modified) */
|
||||
/* Index (2,AF-1) is read. */
|
||||
/* Indices (1,AF) and (2,AF) are written, */
|
||||
/* and then possibly read. */
|
||||
/* All other indices are unused. */
|
||||
/* In all cases, the final values will satsify the condition:*/
|
||||
/* VWIN(2,AF)-VWIN(1,AF)+1 .LE. MAXWIN */
|
||||
/* I'm not certain yet, but they may also satisfy: */
|
||||
/* MINWIN .LE. VWIN(2,AF)-VWIN(1,AF)+1 */
|
||||
/* Output: */
|
||||
/* OBOUND This variable is set by this procedure and used */
|
||||
/* in placing analysis windows (PLACEA). Bit 1 */
|
||||
/* indicates whether an onset bounds the left side */
|
||||
/* of the voicing window, and bit 2 indicates whether */
|
||||
/* an onset bounds the right side of the voicing window. */
|
||||
|
||||
/* This subroutine has no local state. */
|
||||
|
||||
/* Subroutine */ int placev_(integer *osbuf, integer *osptr, integer *oslen,
|
||||
integer *obound, integer *vwin, integer *af, integer *lframe, integer
|
||||
*minwin, integer *maxwin, integer *dvwinl, integer *dvwinh)
|
||||
{
|
||||
/* System generated locals */
|
||||
integer i__1, i__2;
|
||||
|
||||
/* Local variables */
|
||||
logical crit;
|
||||
integer i__, q, osptr1, hrange, lrange;
|
||||
|
||||
/* Arguments */
|
||||
/* Local variables that need not be saved */
|
||||
/* Variables */
|
||||
/* LRANGE, HRANGE Range in which window is placed */
|
||||
/* OSPTR1 OSPTR excluding samples in 3F */
|
||||
/* Local state */
|
||||
/* None */
|
||||
/* Voicing Window Placement */
|
||||
|
||||
/* __________________ __________________ ______________ */
|
||||
/* | | | */
|
||||
/* | 1F | 2F | 3F ... */
|
||||
/* |__________________|__________________|______________ */
|
||||
|
||||
/* Previous | */
|
||||
/* Window | */
|
||||
/* ...________| */
|
||||
|
||||
/* | | */
|
||||
/* ------>| This window's placement range |<------ */
|
||||
/* | | */
|
||||
|
||||
/* There are three cases. Note that these are different from those */
|
||||
/* given in the LPC-10e phase 1 report. */
|
||||
|
||||
/* 1. If there are no onsets in this range, then the voicing window */
|
||||
/* is centered in the pitch window. If such a placement is not within
|
||||
*/
|
||||
/* the window's placement range, then the window is placed in the left-
|
||||
*/
|
||||
/* most portion of the placement range. Its length is always MAXWIN. */
|
||||
|
||||
/* 2. If the first onset is in 2F and there is sufficient room to place
|
||||
*/
|
||||
/* the window immediately before this onset, then the window is placed
|
||||
*/
|
||||
/* there, and its length is set to the maximum possible under these */
|
||||
/* constraints. */
|
||||
|
||||
/* "Critical Region Exception": If there is another onset in 2F */
|
||||
/* such that a window can be placed between the two onsets, the */
|
||||
/* window is placed there (ie, as in case 3). */
|
||||
|
||||
/* 3. Otherwise, the window is placed immediately after the onset. The
|
||||
*/
|
||||
/* window's length */
|
||||
/* is the longest length that can fit in the range under these constraint
|
||||
s,*/
|
||||
/* except that the window may be shortened even further to avoid overlapp
|
||||
ing*/
|
||||
/* other onsets in the placement range. In any case, the window's length
|
||||
*/
|
||||
/* is at least MINWIN. */
|
||||
|
||||
/* Note that the values of MINWIN and LFRAME must be chosen such */
|
||||
/* that case 2 = false implies case 3 = true. This means that */
|
||||
/* MINWIN <= LFRAME/2. If this were not the case, then a fourth case */
|
||||
/* would have to be added for when the window cannot fit either before
|
||||
*/
|
||||
/* or after the onset. */
|
||||
|
||||
/* Note also that onsets which weren't in 2F last time may be in 1F this
|
||||
*/
|
||||
/* time, due to the filter delays in computing onsets. The result is tha
|
||||
t*/
|
||||
/* occasionally a voicing window will overlap that onset. The only way
|
||||
*/
|
||||
/* to circumvent this problem is to add more delay in processing input
|
||||
*/
|
||||
/* speech. In the trade-off between delay and window-placement, window
|
||||
*/
|
||||
/* placement lost. */
|
||||
/* Compute the placement range */
|
||||
/* Parameter adjustments */
|
||||
--osbuf;
|
||||
vwin -= 3;
|
||||
|
||||
/* Function Body */
|
||||
/* Computing MAX */
|
||||
i__1 = vwin[((*af - 1) << 1) + 2] + 1, i__2 = (*af - 2) * *lframe + 1;
|
||||
lrange = max(i__1,i__2);
|
||||
hrange = *af * *lframe;
|
||||
/* Compute OSPTR1, so the following code only looks at relevant onsets. */
|
||||
for (osptr1 = *osptr - 1; osptr1 >= 1; --osptr1) {
|
||||
if (osbuf[osptr1] <= hrange) {
|
||||
goto L90;
|
||||
}
|
||||
}
|
||||
L90:
|
||||
++osptr1;
|
||||
/* Check for case 1 first (fast case): */
|
||||
if (osptr1 <= 1 || osbuf[osptr1 - 1] < lrange) {
|
||||
/* Computing MAX */
|
||||
i__1 = vwin[((*af - 1) << 1) + 2] + 1;
|
||||
vwin[(*af << 1) + 1] = max(i__1,*dvwinl);
|
||||
vwin[(*af << 1) + 2] = vwin[(*af << 1) + 1] + *maxwin - 1;
|
||||
*obound = 0;
|
||||
} else {
|
||||
/* Search backward in OSBUF for first onset in range. */
|
||||
/* This code relies on the above check being performed first. */
|
||||
for (q = osptr1 - 1; q >= 1; --q) {
|
||||
if (osbuf[q] < lrange) {
|
||||
goto L100;
|
||||
}
|
||||
}
|
||||
L100:
|
||||
++q;
|
||||
/* Check for case 2 (placement before onset): */
|
||||
/* Check for critical region exception: */
|
||||
i__1 = osptr1 - 1;
|
||||
for (i__ = q + 1; i__ <= i__1; ++i__) {
|
||||
if (osbuf[i__] - osbuf[q] >= *minwin) {
|
||||
crit = TRUE_;
|
||||
goto L105;
|
||||
}
|
||||
}
|
||||
crit = FALSE_;
|
||||
L105:
|
||||
/* Computing MAX */
|
||||
i__1 = (*af - 1) * *lframe, i__2 = lrange + *minwin - 1;
|
||||
if (! crit && osbuf[q] > max(i__1,i__2)) {
|
||||
vwin[(*af << 1) + 2] = osbuf[q] - 1;
|
||||
/* Computing MAX */
|
||||
i__1 = lrange, i__2 = vwin[(*af << 1) + 2] - *maxwin + 1;
|
||||
vwin[(*af << 1) + 1] = max(i__1,i__2);
|
||||
*obound = 2;
|
||||
/* Case 3 (placement after onset) */
|
||||
} else {
|
||||
vwin[(*af << 1) + 1] = osbuf[q];
|
||||
L110:
|
||||
++q;
|
||||
if (q >= osptr1) {
|
||||
goto L120;
|
||||
}
|
||||
if (osbuf[q] > vwin[(*af << 1) + 1] + *maxwin) {
|
||||
goto L120;
|
||||
}
|
||||
if (osbuf[q] < vwin[(*af << 1) + 1] + *minwin) {
|
||||
goto L110;
|
||||
}
|
||||
vwin[(*af << 1) + 2] = osbuf[q] - 1;
|
||||
*obound = 3;
|
||||
return 0;
|
||||
L120:
|
||||
/* Computing MIN */
|
||||
i__1 = vwin[(*af << 1) + 1] + *maxwin - 1;
|
||||
vwin[(*af << 1) + 2] = min(i__1,hrange);
|
||||
*obound = 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
} /* placev_ */
|
||||
|
||||
|
||||
+133
-133
@@ -1,133 +1,133 @@
|
||||
/*
|
||||
|
||||
$Log: preemp.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.1 1996/08/19 22:30:58 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int preemp_(real *inbuf, real *pebuf, integer *nsamp, real *coef, real *z__);
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* ******************************************************************* */
|
||||
|
||||
/* PREEMP Version 55 */
|
||||
|
||||
/* $Log: preemp.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:30:58 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/14 23:16:29 jaf */
|
||||
/* Just added a few comments about which array indices of the arguments */
|
||||
/* are used, and mentioning that this subroutine has no local state. */
|
||||
|
||||
/* Revision 1.2 1996/03/11 23:23:34 jaf */
|
||||
/* Added a bunch of comments to an otherwise simple subroutine. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:48:48 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ******************************************************************* */
|
||||
|
||||
/* Preemphasize speech with a single-zero filter. */
|
||||
/* (When coef = .9375, preemphasis is as in LPC43.) */
|
||||
|
||||
/* Inputs: */
|
||||
/* NSAMP - Number of samples to filter */
|
||||
/* INBUF - Input speech buffer */
|
||||
/* Indices 1 through NSAMP are read. */
|
||||
/* COEF - Preemphasis coefficient */
|
||||
/* Input/Output: */
|
||||
/* Z - Filter state */
|
||||
/* Output: */
|
||||
/* PEBUF - Preemphasized speech buffer (can be equal to INBUF) */
|
||||
/* Indices 1 through NSAMP are modified. */
|
||||
|
||||
/* This subroutine has no local state. */
|
||||
|
||||
/* Subroutine */ int preemp_(real *inbuf, real *pebuf, integer *nsamp, real *
|
||||
coef, real *z__)
|
||||
{
|
||||
/* System generated locals */
|
||||
integer i__1;
|
||||
|
||||
/* Local variables */
|
||||
real temp;
|
||||
integer i__;
|
||||
|
||||
/* Arguments */
|
||||
/* Local variables */
|
||||
|
||||
/* None of these need to have their values saved from one */
|
||||
/* invocation to the next. */
|
||||
|
||||
/* Logically, this subroutine computes the output sequence */
|
||||
/* pebuf(1:nsamp) defined by: */
|
||||
|
||||
/* pebuf(i) = inbuf(i) - coef * inbuf(i-1) */
|
||||
|
||||
/* where inbuf(0) is defined by the value of z given as input to */
|
||||
/* this subroutine. */
|
||||
|
||||
/* What is this filter's frequency response and phase response? */
|
||||
|
||||
/* Why is this filter applied to the speech? */
|
||||
|
||||
/* Could it be more efficient to apply multiple filters */
|
||||
/* simultaneously, by combining them into one equivalent filter? */
|
||||
|
||||
/* Are there ever cases when "factoring" one high-order filter into
|
||||
*/
|
||||
/* multiple smaller-order filter actually reduces the number of */
|
||||
/* arithmetic operations needed to perform them? */
|
||||
/* When I first read this subroutine, I didn't understand why the */
|
||||
/* variable temp was used. It seemed that the statements in the do
|
||||
*/
|
||||
/* loop could be replaced with the following: */
|
||||
|
||||
/* pebuf(i) = inbuf(i) - coef * z */
|
||||
/* z = inbuf(i) */
|
||||
|
||||
/* The reason for temp is so that even if pebuf and inbuf are the */
|
||||
/* same arrays in memory (i.e., they are aliased), then this */
|
||||
/* subroutine will still work correctly. I didn't realize this */
|
||||
/* until seeing the comment after PEBUF above that says "(can be */
|
||||
/* equal to INBUF)". */
|
||||
/* Parameter adjustments */
|
||||
--pebuf;
|
||||
--inbuf;
|
||||
|
||||
/* Function Body */
|
||||
i__1 = *nsamp;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
temp = inbuf[i__] - *coef * *z__;
|
||||
*z__ = inbuf[i__];
|
||||
pebuf[i__] = temp;
|
||||
/* L10: */
|
||||
}
|
||||
return 0;
|
||||
} /* preemp_ */
|
||||
|
||||
/*
|
||||
|
||||
$Log: preemp.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.1 1996/08/19 22:30:58 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int preemp_(real *inbuf, real *pebuf, integer *nsamp, real *coef, real *z__);
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* ******************************************************************* */
|
||||
|
||||
/* PREEMP Version 55 */
|
||||
|
||||
/* $Log: preemp.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:30:58 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/14 23:16:29 jaf */
|
||||
/* Just added a few comments about which array indices of the arguments */
|
||||
/* are used, and mentioning that this subroutine has no local state. */
|
||||
|
||||
/* Revision 1.2 1996/03/11 23:23:34 jaf */
|
||||
/* Added a bunch of comments to an otherwise simple subroutine. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:48:48 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ******************************************************************* */
|
||||
|
||||
/* Preemphasize speech with a single-zero filter. */
|
||||
/* (When coef = .9375, preemphasis is as in LPC43.) */
|
||||
|
||||
/* Inputs: */
|
||||
/* NSAMP - Number of samples to filter */
|
||||
/* INBUF - Input speech buffer */
|
||||
/* Indices 1 through NSAMP are read. */
|
||||
/* COEF - Preemphasis coefficient */
|
||||
/* Input/Output: */
|
||||
/* Z - Filter state */
|
||||
/* Output: */
|
||||
/* PEBUF - Preemphasized speech buffer (can be equal to INBUF) */
|
||||
/* Indices 1 through NSAMP are modified. */
|
||||
|
||||
/* This subroutine has no local state. */
|
||||
|
||||
/* Subroutine */ int preemp_(real *inbuf, real *pebuf, integer *nsamp, real *
|
||||
coef, real *z__)
|
||||
{
|
||||
/* System generated locals */
|
||||
integer i__1;
|
||||
|
||||
/* Local variables */
|
||||
real temp;
|
||||
integer i__;
|
||||
|
||||
/* Arguments */
|
||||
/* Local variables */
|
||||
|
||||
/* None of these need to have their values saved from one */
|
||||
/* invocation to the next. */
|
||||
|
||||
/* Logically, this subroutine computes the output sequence */
|
||||
/* pebuf(1:nsamp) defined by: */
|
||||
|
||||
/* pebuf(i) = inbuf(i) - coef * inbuf(i-1) */
|
||||
|
||||
/* where inbuf(0) is defined by the value of z given as input to */
|
||||
/* this subroutine. */
|
||||
|
||||
/* What is this filter's frequency response and phase response? */
|
||||
|
||||
/* Why is this filter applied to the speech? */
|
||||
|
||||
/* Could it be more efficient to apply multiple filters */
|
||||
/* simultaneously, by combining them into one equivalent filter? */
|
||||
|
||||
/* Are there ever cases when "factoring" one high-order filter into
|
||||
*/
|
||||
/* multiple smaller-order filter actually reduces the number of */
|
||||
/* arithmetic operations needed to perform them? */
|
||||
/* When I first read this subroutine, I didn't understand why the */
|
||||
/* variable temp was used. It seemed that the statements in the do
|
||||
*/
|
||||
/* loop could be replaced with the following: */
|
||||
|
||||
/* pebuf(i) = inbuf(i) - coef * z */
|
||||
/* z = inbuf(i) */
|
||||
|
||||
/* The reason for temp is so that even if pebuf and inbuf are the */
|
||||
/* same arrays in memory (i.e., they are aliased), then this */
|
||||
/* subroutine will still work correctly. I didn't realize this */
|
||||
/* until seeing the comment after PEBUF above that says "(can be */
|
||||
/* equal to INBUF)". */
|
||||
/* Parameter adjustments */
|
||||
--pebuf;
|
||||
--inbuf;
|
||||
|
||||
/* Function Body */
|
||||
i__1 = *nsamp;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
temp = inbuf[i__] - *coef * *z__;
|
||||
*z__ = inbuf[i__];
|
||||
pebuf[i__] = temp;
|
||||
/* L10: */
|
||||
}
|
||||
return 0;
|
||||
} /* preemp_ */
|
||||
|
||||
|
||||
+106
-106
@@ -1,106 +1,106 @@
|
||||
/*
|
||||
|
||||
$Log: prepro.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.2 1996/08/20 20:40:51 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_encoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_encoder_state().
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:30:54 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int prepro_(real *speech, integer *length,
|
||||
struct lpc10_encoder_state *st)
|
||||
/*:ref: hp100_ 14 3 6 4 4 */
|
||||
/*:ref: inithp100_ 14 0 */
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* Table of constant values */
|
||||
|
||||
static integer c__1 = 1;
|
||||
|
||||
/* ********************************************************************* */
|
||||
|
||||
/* PREPRO Version 48 */
|
||||
|
||||
/* $Log: prepro.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:40:51 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_encoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_encoder_state().
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:30:54 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/14 23:22:56 jaf */
|
||||
/* Added comments about when INITPREPRO should be used. */
|
||||
|
||||
/* Revision 1.2 1996/03/14 23:09:27 jaf */
|
||||
/* Added an entry named INITPREPRO that initializes the local state of */
|
||||
/* this subroutine, and those it calls (if any). */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:48:54 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ********************************************************************* */
|
||||
|
||||
/* Pre-process input speech: */
|
||||
|
||||
/* Inputs: */
|
||||
/* LENGTH - Number of SPEECH samples */
|
||||
/* Input/Output: */
|
||||
/* SPEECH(LENGTH) - Speech data. */
|
||||
/* Indices 1 through LENGTH are read and modified. */
|
||||
|
||||
/* This subroutine has no local state maintained from one call to the */
|
||||
/* next, but HP100 does. If you want to switch to using a new audio */
|
||||
/* stream for this filter, or reinitialize its state for any other */
|
||||
/* reason, call the ENTRY INITPREPRO. */
|
||||
|
||||
/* Subroutine */ int prepro_(real *speech, integer *length,
|
||||
struct lpc10_encoder_state *st)
|
||||
{
|
||||
extern /* Subroutine */ int hp100_(real *, integer *, integer *, struct lpc10_encoder_state *);
|
||||
|
||||
/* Arguments */
|
||||
/* High Pass Filter at 100 Hz */
|
||||
/* Parameter adjustments */
|
||||
if (speech) {
|
||||
--speech;
|
||||
}
|
||||
|
||||
/* Function Body */
|
||||
hp100_(&speech[1], &c__1, length, st);
|
||||
return 0;
|
||||
} /* prepro_ */
|
||||
/*
|
||||
|
||||
$Log: prepro.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.2 1996/08/20 20:40:51 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_encoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_encoder_state().
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:30:54 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int prepro_(real *speech, integer *length,
|
||||
struct lpc10_encoder_state *st)
|
||||
/*:ref: hp100_ 14 3 6 4 4 */
|
||||
/*:ref: inithp100_ 14 0 */
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* Table of constant values */
|
||||
|
||||
static integer c__1 = 1;
|
||||
|
||||
/* ********************************************************************* */
|
||||
|
||||
/* PREPRO Version 48 */
|
||||
|
||||
/* $Log: prepro.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:40:51 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_encoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_encoder_state().
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:30:54 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/14 23:22:56 jaf */
|
||||
/* Added comments about when INITPREPRO should be used. */
|
||||
|
||||
/* Revision 1.2 1996/03/14 23:09:27 jaf */
|
||||
/* Added an entry named INITPREPRO that initializes the local state of */
|
||||
/* this subroutine, and those it calls (if any). */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:48:54 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ********************************************************************* */
|
||||
|
||||
/* Pre-process input speech: */
|
||||
|
||||
/* Inputs: */
|
||||
/* LENGTH - Number of SPEECH samples */
|
||||
/* Input/Output: */
|
||||
/* SPEECH(LENGTH) - Speech data. */
|
||||
/* Indices 1 through LENGTH are read and modified. */
|
||||
|
||||
/* This subroutine has no local state maintained from one call to the */
|
||||
/* next, but HP100 does. If you want to switch to using a new audio */
|
||||
/* stream for this filter, or reinitialize its state for any other */
|
||||
/* reason, call the ENTRY INITPREPRO. */
|
||||
|
||||
/* Subroutine */ int prepro_(real *speech, integer *length,
|
||||
struct lpc10_encoder_state *st)
|
||||
{
|
||||
extern /* Subroutine */ int hp100_(real *, integer *, integer *, struct lpc10_encoder_state *);
|
||||
|
||||
/* Arguments */
|
||||
/* High Pass Filter at 100 Hz */
|
||||
/* Parameter adjustments */
|
||||
if (speech) {
|
||||
--speech;
|
||||
}
|
||||
|
||||
/* Function Body */
|
||||
hp100_(&speech[1], &c__1, length, st);
|
||||
return 0;
|
||||
} /* prepro_ */
|
||||
|
||||
+114
-114
@@ -1,114 +1,114 @@
|
||||
/*
|
||||
|
||||
$Log: random.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.2 1996/08/20 20:41:32 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_decoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_decoder_state().
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:30:49 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern integer random_(struct lpc10_decoder_state *st);
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* ********************************************************************** */
|
||||
|
||||
/* RANDOM Version 49 */
|
||||
|
||||
/* $Log: random.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:41:32 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_decoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_decoder_state().
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:30:49 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/20 16:13:54 jaf */
|
||||
/* Rearranged comments a little bit, and added comments explaining that */
|
||||
/* even though there is local state here, there is no need to create an */
|
||||
/* ENTRY for reinitializing it. */
|
||||
|
||||
/* Revision 1.2 1996/03/14 22:25:29 jaf */
|
||||
/* Just rearranged the comments and local variable declarations a bit. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:49:01 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ********************************************************************* */
|
||||
|
||||
/* Pseudo random number generator based on Knuth, Vol 2, p. 27. */
|
||||
|
||||
/* Function Return: */
|
||||
/* RANDOM - Integer variable, uniformly distributed over -32768 to 32767 */
|
||||
|
||||
/* This subroutine maintains local state from one call to the next. */
|
||||
/* In the context of the LPC10 coder, there is no reason to reinitialize */
|
||||
/* this local state when switching between audio streams, because its */
|
||||
/* results are only used to generate noise for unvoiced frames. */
|
||||
|
||||
integer random_(struct lpc10_decoder_state *st)
|
||||
{
|
||||
/* Initialized data */
|
||||
|
||||
integer *j;
|
||||
integer *k;
|
||||
shortint *y;
|
||||
|
||||
/* System generated locals */
|
||||
integer ret_val;
|
||||
|
||||
/* Parameters/constants */
|
||||
/* Local state */
|
||||
/* The following is a 16 bit 2's complement addition, */
|
||||
/* with overflow checking disabled */
|
||||
|
||||
j = &(st->j);
|
||||
k = &(st->k);
|
||||
y = &(st->y[0]);
|
||||
|
||||
y[*k - 1] += y[*j - 1];
|
||||
ret_val = y[*k - 1];
|
||||
--(*k);
|
||||
if (*k <= 0) {
|
||||
*k = 5;
|
||||
}
|
||||
--(*j);
|
||||
if (*j <= 0) {
|
||||
*j = 5;
|
||||
}
|
||||
return ret_val;
|
||||
} /* random_ */
|
||||
|
||||
/*
|
||||
|
||||
$Log: random.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.2 1996/08/20 20:41:32 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_decoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_decoder_state().
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:30:49 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern integer random_(struct lpc10_decoder_state *st);
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* ********************************************************************** */
|
||||
|
||||
/* RANDOM Version 49 */
|
||||
|
||||
/* $Log: random.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:41:32 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_decoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_decoder_state().
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:30:49 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/20 16:13:54 jaf */
|
||||
/* Rearranged comments a little bit, and added comments explaining that */
|
||||
/* even though there is local state here, there is no need to create an */
|
||||
/* ENTRY for reinitializing it. */
|
||||
|
||||
/* Revision 1.2 1996/03/14 22:25:29 jaf */
|
||||
/* Just rearranged the comments and local variable declarations a bit. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:49:01 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ********************************************************************* */
|
||||
|
||||
/* Pseudo random number generator based on Knuth, Vol 2, p. 27. */
|
||||
|
||||
/* Function Return: */
|
||||
/* RANDOM - Integer variable, uniformly distributed over -32768 to 32767 */
|
||||
|
||||
/* This subroutine maintains local state from one call to the next. */
|
||||
/* In the context of the LPC10 coder, there is no reason to reinitialize */
|
||||
/* this local state when switching between audio streams, because its */
|
||||
/* results are only used to generate noise for unvoiced frames. */
|
||||
|
||||
integer random_(struct lpc10_decoder_state *st)
|
||||
{
|
||||
/* Initialized data */
|
||||
|
||||
integer *j;
|
||||
integer *k;
|
||||
shortint *y;
|
||||
|
||||
/* System generated locals */
|
||||
integer ret_val;
|
||||
|
||||
/* Parameters/constants */
|
||||
/* Local state */
|
||||
/* The following is a 16 bit 2's complement addition, */
|
||||
/* with overflow checking disabled */
|
||||
|
||||
j = &(st->j);
|
||||
k = &(st->k);
|
||||
y = &(st->y[0]);
|
||||
|
||||
y[*k - 1] += y[*j - 1];
|
||||
ret_val = y[*k - 1];
|
||||
--(*k);
|
||||
if (*k <= 0) {
|
||||
*k = 5;
|
||||
}
|
||||
--(*j);
|
||||
if (*j <= 0) {
|
||||
*j = 5;
|
||||
}
|
||||
return ret_val;
|
||||
} /* random_ */
|
||||
|
||||
|
||||
+108
-108
@@ -1,108 +1,108 @@
|
||||
/*
|
||||
|
||||
$Log: rcchk.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.1 1996/08/19 22:30:41 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int rcchk_(integer *order, real *rc1f, real *rc2f);
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* ********************************************************************* */
|
||||
|
||||
/* RCCHK Version 45G */
|
||||
|
||||
/* $Log: rcchk.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:30:41 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.4 1996/03/27 18:13:47 jaf */
|
||||
/* Commented out a call to subroutine ERROR. */
|
||||
|
||||
/* Revision 1.3 1996/03/18 15:48:53 jaf */
|
||||
/* Just added a few comments about which array indices of the arguments */
|
||||
/* are used, and mentioning that this subroutine has no local state. */
|
||||
|
||||
/* Revision 1.2 1996/03/13 16:55:22 jaf */
|
||||
/* Comments added explaining that none of the local variables of this */
|
||||
/* subroutine need to be saved from one invocation to the next. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:49:08 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ********************************************************************* */
|
||||
|
||||
/* Check RC's, repeat previous frame's RC's if unstable */
|
||||
|
||||
/* Input: */
|
||||
/* ORDER - Number of RC's */
|
||||
/* RC1F - Previous frame's RC's */
|
||||
/* Indices 1 through ORDER may be read. */
|
||||
/* Input/Output: */
|
||||
/* RC2F - Present frame's RC's */
|
||||
/* Indices 1 through ORDER may be read, and written. */
|
||||
|
||||
/* This subroutine has no local state. */
|
||||
|
||||
/* Subroutine */ int rcchk_(integer *order, real *rc1f, real *rc2f)
|
||||
{
|
||||
/* System generated locals */
|
||||
integer i__1;
|
||||
real r__1;
|
||||
|
||||
/* Local variables */
|
||||
integer i__;
|
||||
|
||||
/* Arguments */
|
||||
/* Local variables that need not be saved */
|
||||
/* Parameter adjustments */
|
||||
--rc2f;
|
||||
--rc1f;
|
||||
|
||||
/* Function Body */
|
||||
i__1 = *order;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
if ((r__1 = rc2f[i__], abs(r__1)) > .99f) {
|
||||
goto L10;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
/* Note: In version embedded in other software, all calls to ERROR
|
||||
*/
|
||||
/* should probably be removed. */
|
||||
L10:
|
||||
|
||||
/* This call to ERROR is only needed for debugging purposes. */
|
||||
|
||||
/* CALL ERROR('RCCHK',2,I) */
|
||||
i__1 = *order;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
rc2f[i__] = rc1f[i__];
|
||||
}
|
||||
return 0;
|
||||
} /* rcchk_ */
|
||||
|
||||
/*
|
||||
|
||||
$Log: rcchk.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.1 1996/08/19 22:30:41 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int rcchk_(integer *order, real *rc1f, real *rc2f);
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* ********************************************************************* */
|
||||
|
||||
/* RCCHK Version 45G */
|
||||
|
||||
/* $Log: rcchk.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:30:41 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.4 1996/03/27 18:13:47 jaf */
|
||||
/* Commented out a call to subroutine ERROR. */
|
||||
|
||||
/* Revision 1.3 1996/03/18 15:48:53 jaf */
|
||||
/* Just added a few comments about which array indices of the arguments */
|
||||
/* are used, and mentioning that this subroutine has no local state. */
|
||||
|
||||
/* Revision 1.2 1996/03/13 16:55:22 jaf */
|
||||
/* Comments added explaining that none of the local variables of this */
|
||||
/* subroutine need to be saved from one invocation to the next. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:49:08 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ********************************************************************* */
|
||||
|
||||
/* Check RC's, repeat previous frame's RC's if unstable */
|
||||
|
||||
/* Input: */
|
||||
/* ORDER - Number of RC's */
|
||||
/* RC1F - Previous frame's RC's */
|
||||
/* Indices 1 through ORDER may be read. */
|
||||
/* Input/Output: */
|
||||
/* RC2F - Present frame's RC's */
|
||||
/* Indices 1 through ORDER may be read, and written. */
|
||||
|
||||
/* This subroutine has no local state. */
|
||||
|
||||
/* Subroutine */ int rcchk_(integer *order, real *rc1f, real *rc2f)
|
||||
{
|
||||
/* System generated locals */
|
||||
integer i__1;
|
||||
real r__1;
|
||||
|
||||
/* Local variables */
|
||||
integer i__;
|
||||
|
||||
/* Arguments */
|
||||
/* Local variables that need not be saved */
|
||||
/* Parameter adjustments */
|
||||
--rc2f;
|
||||
--rc1f;
|
||||
|
||||
/* Function Body */
|
||||
i__1 = *order;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
if ((r__1 = rc2f[i__], abs(r__1)) > .99f) {
|
||||
goto L10;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
/* Note: In version embedded in other software, all calls to ERROR
|
||||
*/
|
||||
/* should probably be removed. */
|
||||
L10:
|
||||
|
||||
/* This call to ERROR is only needed for debugging purposes. */
|
||||
|
||||
/* CALL ERROR('RCCHK',2,I) */
|
||||
i__1 = *order;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
rc2f[i__] = rc1f[i__];
|
||||
}
|
||||
return 0;
|
||||
} /* rcchk_ */
|
||||
|
||||
|
||||
+395
-395
@@ -1,395 +1,395 @@
|
||||
/*
|
||||
|
||||
$Log: synths.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.2 1996/08/20 20:42:59 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_decoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_decoder_state().
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:30:33 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int synths_(integer *voice, integer *pitch, real *rms, real *rc, real *speech, integer *k, struct lpc10_decoder_state *st);
|
||||
/* comlen contrl_ 12 */
|
||||
/*:ref: pitsyn_ 14 12 4 4 4 6 6 4 4 4 6 6 4 6 */
|
||||
/*:ref: irc2pc_ 14 5 6 6 4 6 6 */
|
||||
/*:ref: bsynz_ 14 7 6 4 4 6 6 6 6 */
|
||||
/*:ref: deemp_ 14 2 6 4 */
|
||||
/*:ref: initpitsyn_ 14 0 */
|
||||
/*:ref: initbsynz_ 14 0 */
|
||||
/*:ref: initdeemp_ 14 0 */
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* Common Block Declarations */
|
||||
|
||||
extern struct {
|
||||
integer order, lframe;
|
||||
logical corrp;
|
||||
} contrl_;
|
||||
|
||||
#define contrl_1 contrl_
|
||||
|
||||
/* Table of constant values */
|
||||
|
||||
static real c_b2 = .7f;
|
||||
|
||||
/* ***************************************************************** */
|
||||
|
||||
/* SYNTHS Version 54 */
|
||||
|
||||
/* $Log: synths.c,v $
|
||||
/* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:42:59 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_decoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_decoder_state().
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:30:33 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.5 1996/03/26 19:31:58 jaf */
|
||||
/* Commented out trace statements. */
|
||||
|
||||
/* Revision 1.4 1996/03/25 19:41:01 jaf */
|
||||
/* Changed so that MAXFRM samples are always returned in the output array */
|
||||
/* SPEECH. */
|
||||
|
||||
/* This required delaying the returned samples by MAXFRM sample times, */
|
||||
/* and remembering any "left over" samples returned by PITSYN from one */
|
||||
/* call of SYNTHS to the next. */
|
||||
|
||||
/* Changed size of SPEECH from 2*MAXFRM to MAXFRM. Removed local */
|
||||
/* variable SOUT. Added local state variables BUF and BUFLEN. */
|
||||
|
||||
/* Revision 1.3 1996/03/25 19:20:10 jaf */
|
||||
/* Added comments about the range of possible return values for argument */
|
||||
/* K, and increased the size of the arrays filled in by PITSYN from 11 to */
|
||||
/* 16, as has been already done inside of PITSYN. */
|
||||
|
||||
/* Revision 1.2 1996/03/22 00:18:18 jaf */
|
||||
/* Added comments explaining meanings of input and output parameters, and */
|
||||
/* indicating which array indices can be read or written. */
|
||||
|
||||
/* Added entry INITSYNTHS, which does nothing except call the */
|
||||
/* corresponding initialization entries for subroutines PITSYN, BSYNZ, */
|
||||
/* and DEEMP. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:49:44 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ***************************************************************** */
|
||||
|
||||
/* The note below is from the distributed version of the LPC10 coder. */
|
||||
/* The version of the code below has been modified so that SYNTHS always */
|
||||
/* has a constant frame length output of MAXFRM. */
|
||||
|
||||
/* Also, BSYNZ and DEEMP need not be modified to work on variable */
|
||||
/* positions within an array. It is only necessary to pass the first */
|
||||
/* index desired as the array argument. What actually gets passed is the */
|
||||
/* address of that array position, which the subroutine treats as the */
|
||||
/* first index of the array. */
|
||||
|
||||
/* This technique is used in subroutine ANALYS when calling PREEMP, so it */
|
||||
/* appears that multiple people wrote different parts of this LPC10 code, */
|
||||
/* and that they didn't necessarily have equivalent knowledge of Fortran */
|
||||
/* (not surprising). */
|
||||
|
||||
/* NOTE: There is excessive buffering here, BSYNZ and DEEMP should be */
|
||||
/* changed to operate on variable positions within SOUT. Also, */
|
||||
/* the output length parameter is bogus, and PITSYN should be */
|
||||
/* rewritten to allow a constant frame length output. */
|
||||
|
||||
/* Input: */
|
||||
/* VOICE - Half frame voicing decisions */
|
||||
/* Indices 1 through 2 read. */
|
||||
/* Input/Output: */
|
||||
/* PITCH - Pitch */
|
||||
/* PITCH is restricted to range 20 to 156, inclusive, */
|
||||
/* before calling subroutine PITSYN, and then PITSYN */
|
||||
/* can modify it further under some conditions. */
|
||||
/* RMS - Energy */
|
||||
/* Only use is for debugging, and passed to PITSYN. */
|
||||
/* See comments there for how it can be modified. */
|
||||
/* RC - Reflection coefficients */
|
||||
/* Indices 1 through ORDER restricted to range -.99 to .99, */
|
||||
/* before calling subroutine PITSYN, and then PITSYN */
|
||||
/* can modify it further under some conditions. */
|
||||
/* Output: */
|
||||
/* SPEECH - Synthesized speech samples. */
|
||||
/* Indices 1 through the final value of K are written. */
|
||||
/* K - Number of samples placed into array SPEECH. */
|
||||
/* This is always MAXFRM. */
|
||||
|
||||
/* Subroutine */ int synths_(integer *voice, integer *pitch, real *
|
||||
rms, real *rc, real *speech, integer *k, struct lpc10_decoder_state *st)
|
||||
{
|
||||
/* Initialized data */
|
||||
|
||||
real *buf;
|
||||
integer *buflen;
|
||||
|
||||
/* System generated locals */
|
||||
integer i__1;
|
||||
real r__1, r__2;
|
||||
|
||||
/* Local variables */
|
||||
real rmsi[16];
|
||||
integer nout, ivuv[16], i__, j;
|
||||
extern /* Subroutine */ int deemp_(real *, integer *, struct lpc10_decoder_state *);
|
||||
real ratio;
|
||||
integer ipiti[16];
|
||||
extern /* Subroutine */ bsynz_(real *, integer *,
|
||||
integer *, real *, real *, real *, real *, struct lpc10_decoder_state *), irc2pc_(real *, real *
|
||||
, integer *, real *, real *);
|
||||
real g2pass;
|
||||
real pc[10];
|
||||
extern /* Subroutine */ int pitsyn_(integer *, integer *, integer *, real
|
||||
*, real *, integer *, integer *, integer *, real *, real *,
|
||||
integer *, real *, struct lpc10_decoder_state *);
|
||||
real rci[160] /* was [10][16] */;
|
||||
|
||||
/* $Log: synths.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:42:59 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_decoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_decoder_state().
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:30:33 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/29 22:03:47 jaf */
|
||||
/* Removed definitions for any constants that were no longer used. */
|
||||
|
||||
/* Revision 1.2 1996/03/26 19:34:33 jaf */
|
||||
/* Added comments indicating which constants are not needed in an */
|
||||
/* application that uses the LPC-10 coder. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:43:51 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
/* LPC Configuration parameters: */
|
||||
/* Frame size, Prediction order, Pitch period */
|
||||
/* Arguments */
|
||||
/* $Log: synths.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:42:59 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_decoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_decoder_state().
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:30:33 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/29 22:05:55 jaf */
|
||||
/* Commented out the common block variables that are not needed by the */
|
||||
/* embedded version. */
|
||||
|
||||
/* Revision 1.2 1996/03/26 19:34:50 jaf */
|
||||
/* Added comments indicating which constants are not needed in an */
|
||||
/* application that uses the LPC-10 coder. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:44:09 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
/* LPC Processing control variables: */
|
||||
|
||||
/* *** Read-only: initialized in setup */
|
||||
|
||||
/* Files for Speech, Parameter, and Bitstream Input & Output, */
|
||||
/* and message and debug outputs. */
|
||||
|
||||
/* Here are the only files which use these variables: */
|
||||
|
||||
/* lpcsim.f setup.f trans.f error.f vqsetup.f */
|
||||
|
||||
/* Many files which use fdebug are not listed, since it is only used in */
|
||||
/* those other files conditionally, to print trace statements. */
|
||||
/* integer fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
|
||||
/* LPC order, Frame size, Quantization rate, Bits per frame, */
|
||||
/* Error correction */
|
||||
/* Subroutine SETUP is the only place where order is assigned a value, */
|
||||
/* and that value is 10. It could increase efficiency 1% or so to */
|
||||
/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as
|
||||
*/
|
||||
/* a variable in a COMMON block, since it is used in many places in the */
|
||||
/* core of the coding and decoding routines. Actually, I take that back.
|
||||
*/
|
||||
/* At least when compiling with f2c, the upper bound of DO loops is */
|
||||
/* stored in a local variable before the DO loop begins, and then that is
|
||||
*/
|
||||
/* compared against on each iteration. */
|
||||
/* Similarly for lframe, which is given a value of MAXFRM in SETUP. */
|
||||
/* Similarly for quant, which is given a value of 2400 in SETUP. quant */
|
||||
/* is used in only a few places, and never in the core coding and */
|
||||
/* decoding routines, so it could be eliminated entirely. */
|
||||
/* nbits is similar to quant, and is given a value of 54 in SETUP. */
|
||||
/* corrp is given a value of .TRUE. in SETUP, and is only used in the */
|
||||
/* subroutines ENCODE and DECODE. It doesn't affect the speed of the */
|
||||
/* coder significantly whether it is .TRUE. or .FALSE., or whether it is
|
||||
*/
|
||||
/* a constant or a variable, since it is only examined once per frame. */
|
||||
/* Leaving it as a variable that is set to .TRUE. seems like a good */
|
||||
/* idea, since it does enable some error-correction capability for */
|
||||
/* unvoiced frames, with no change in the coding rate, and no noticeable
|
||||
*/
|
||||
/* quality difference in the decoded speech. */
|
||||
/* integer quant, nbits */
|
||||
/* *** Read/write: variables for debugging, not needed for LPC algorithm
|
||||
*/
|
||||
|
||||
/* Current frame, Unstable frames, Output clip count, Max onset buffer,
|
||||
*/
|
||||
/* Debug listing detail level, Line count on listing page */
|
||||
|
||||
/* nframe is not needed for an embedded LPC10 at all. */
|
||||
/* nunsfm is initialized to 0 in SETUP, and incremented in subroutine */
|
||||
/* ERROR, which is only called from RCCHK. When LPC10 is embedded into */
|
||||
/* an application, I would recommend removing the call to ERROR in RCCHK,
|
||||
*/
|
||||
/* and remove ERROR and nunsfm completely. */
|
||||
/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in
|
||||
*/
|
||||
/* sread.f. When LPC10 is embedded into an application, one might want */
|
||||
/* to cause it to be incremented in a routine that takes the output of */
|
||||
/* SYNTHS and sends it to an audio device. It could be optionally */
|
||||
/* displayed, for those that might want to know what it is. */
|
||||
/* maxosp is never initialized to 0 in SETUP, although it probably should
|
||||
*/
|
||||
/* be, and it is updated in subroutine ANALYS. I doubt that its value */
|
||||
/* would be of much interest to an application in which LPC10 is */
|
||||
/* embedded. */
|
||||
/* listl and lincnt are not needed for an embedded LPC10 at all. */
|
||||
/* integer nframe, nunsfm, iclip, maxosp, listl, lincnt */
|
||||
/* common /contrl/ fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
|
||||
/* common /contrl/ quant, nbits */
|
||||
/* common /contrl/ nframe, nunsfm, iclip, maxosp, listl, lincnt */
|
||||
/* Parameters/constants */
|
||||
/* Local variables that need not be saved */
|
||||
/* Local state */
|
||||
/* BUF is a buffer of speech samples that would have been returned
|
||||
*/
|
||||
/* by the older version of SYNTHS, but the newer version doesn't, */
|
||||
/* so that the newer version can always return MAXFRM samples on */
|
||||
/* every call. This has the effect of delaying the return of */
|
||||
/* samples for one additional frame time. */
|
||||
|
||||
/* Indices 1 through BUFLEN contain samples that are left over from
|
||||
*/
|
||||
/* the last call to SYNTHS. Given the way that PITSYN works, */
|
||||
/* BUFLEN should always be in the range MAXFRM-MAXPIT+1 through */
|
||||
/* MAXFRM, inclusive, after a call to SYNTHS is complete. */
|
||||
|
||||
/* On the first call to SYNTHS (or the first call after */
|
||||
/* reinitializing with the entry INITSYNTHS), BUFLEN is MAXFRM, and
|
||||
*/
|
||||
/* a frame of silence is always returned. */
|
||||
/* Parameter adjustments */
|
||||
if (voice) {
|
||||
--voice;
|
||||
}
|
||||
if (rc) {
|
||||
--rc;
|
||||
}
|
||||
if (speech) {
|
||||
--speech;
|
||||
}
|
||||
|
||||
/* Function Body */
|
||||
buf = &(st->buf[0]);
|
||||
buflen = &(st->buflen);
|
||||
|
||||
/* Computing MAX */
|
||||
i__1 = min(*pitch,156);
|
||||
*pitch = max(i__1,20);
|
||||
i__1 = contrl_1.order;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
/* Computing MAX */
|
||||
/* Computing MIN */
|
||||
r__2 = rc[i__];
|
||||
r__1 = min(r__2,.99f);
|
||||
rc[i__] = max(r__1,-.99f);
|
||||
}
|
||||
pitsyn_(&contrl_1.order, &voice[1], pitch, rms, &rc[1], &contrl_1.lframe,
|
||||
ivuv, ipiti, rmsi, rci, &nout, &ratio, st);
|
||||
if (nout > 0) {
|
||||
i__1 = nout;
|
||||
for (j = 1; j <= i__1; ++j) {
|
||||
|
||||
/* Add synthesized speech for pitch period J to the en
|
||||
d of */
|
||||
/* BUF. */
|
||||
|
||||
irc2pc_(&rci[j * 10 - 10], pc, &contrl_1.order, &c_b2, &g2pass);
|
||||
bsynz_(pc, &ipiti[j - 1], &ivuv[j - 1], &buf[*buflen], &rmsi[j - 1]
|
||||
, &ratio, &g2pass, st);
|
||||
deemp_(&buf[*buflen], &ipiti[j - 1], st);
|
||||
*buflen += ipiti[j - 1];
|
||||
}
|
||||
|
||||
/* Copy first MAXFRM samples from BUF to output array SPEECH
|
||||
*/
|
||||
/* (scaling them), and then remove them from the beginning of
|
||||
*/
|
||||
/* BUF. */
|
||||
|
||||
for (i__ = 1; i__ <= 180; ++i__) {
|
||||
speech[i__] = buf[i__ - 1] / 4096.f;
|
||||
}
|
||||
*k = 180;
|
||||
*buflen += -180;
|
||||
i__1 = *buflen;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
buf[i__ - 1] = buf[i__ + 179];
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
} /* synths_ */
|
||||
/*
|
||||
|
||||
$Log: synths.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.2 1996/08/20 20:42:59 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_decoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_decoder_state().
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:30:33 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int synths_(integer *voice, integer *pitch, real *rms, real *rc, real *speech, integer *k, struct lpc10_decoder_state *st);
|
||||
/* comlen contrl_ 12 */
|
||||
/*:ref: pitsyn_ 14 12 4 4 4 6 6 4 4 4 6 6 4 6 */
|
||||
/*:ref: irc2pc_ 14 5 6 6 4 6 6 */
|
||||
/*:ref: bsynz_ 14 7 6 4 4 6 6 6 6 */
|
||||
/*:ref: deemp_ 14 2 6 4 */
|
||||
/*:ref: initpitsyn_ 14 0 */
|
||||
/*:ref: initbsynz_ 14 0 */
|
||||
/*:ref: initdeemp_ 14 0 */
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* Common Block Declarations */
|
||||
|
||||
extern struct {
|
||||
integer order, lframe;
|
||||
logical corrp;
|
||||
} contrl_;
|
||||
|
||||
#define contrl_1 contrl_
|
||||
|
||||
/* Table of constant values */
|
||||
|
||||
static real c_b2 = .7f;
|
||||
|
||||
/* ***************************************************************** */
|
||||
|
||||
/* SYNTHS Version 54 */
|
||||
|
||||
/* $Log: synths.c,v $
|
||||
/* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:42:59 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_decoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_decoder_state().
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:30:33 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.5 1996/03/26 19:31:58 jaf */
|
||||
/* Commented out trace statements. */
|
||||
|
||||
/* Revision 1.4 1996/03/25 19:41:01 jaf */
|
||||
/* Changed so that MAXFRM samples are always returned in the output array */
|
||||
/* SPEECH. */
|
||||
|
||||
/* This required delaying the returned samples by MAXFRM sample times, */
|
||||
/* and remembering any "left over" samples returned by PITSYN from one */
|
||||
/* call of SYNTHS to the next. */
|
||||
|
||||
/* Changed size of SPEECH from 2*MAXFRM to MAXFRM. Removed local */
|
||||
/* variable SOUT. Added local state variables BUF and BUFLEN. */
|
||||
|
||||
/* Revision 1.3 1996/03/25 19:20:10 jaf */
|
||||
/* Added comments about the range of possible return values for argument */
|
||||
/* K, and increased the size of the arrays filled in by PITSYN from 11 to */
|
||||
/* 16, as has been already done inside of PITSYN. */
|
||||
|
||||
/* Revision 1.2 1996/03/22 00:18:18 jaf */
|
||||
/* Added comments explaining meanings of input and output parameters, and */
|
||||
/* indicating which array indices can be read or written. */
|
||||
|
||||
/* Added entry INITSYNTHS, which does nothing except call the */
|
||||
/* corresponding initialization entries for subroutines PITSYN, BSYNZ, */
|
||||
/* and DEEMP. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:49:44 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ***************************************************************** */
|
||||
|
||||
/* The note below is from the distributed version of the LPC10 coder. */
|
||||
/* The version of the code below has been modified so that SYNTHS always */
|
||||
/* has a constant frame length output of MAXFRM. */
|
||||
|
||||
/* Also, BSYNZ and DEEMP need not be modified to work on variable */
|
||||
/* positions within an array. It is only necessary to pass the first */
|
||||
/* index desired as the array argument. What actually gets passed is the */
|
||||
/* address of that array position, which the subroutine treats as the */
|
||||
/* first index of the array. */
|
||||
|
||||
/* This technique is used in subroutine ANALYS when calling PREEMP, so it */
|
||||
/* appears that multiple people wrote different parts of this LPC10 code, */
|
||||
/* and that they didn't necessarily have equivalent knowledge of Fortran */
|
||||
/* (not surprising). */
|
||||
|
||||
/* NOTE: There is excessive buffering here, BSYNZ and DEEMP should be */
|
||||
/* changed to operate on variable positions within SOUT. Also, */
|
||||
/* the output length parameter is bogus, and PITSYN should be */
|
||||
/* rewritten to allow a constant frame length output. */
|
||||
|
||||
/* Input: */
|
||||
/* VOICE - Half frame voicing decisions */
|
||||
/* Indices 1 through 2 read. */
|
||||
/* Input/Output: */
|
||||
/* PITCH - Pitch */
|
||||
/* PITCH is restricted to range 20 to 156, inclusive, */
|
||||
/* before calling subroutine PITSYN, and then PITSYN */
|
||||
/* can modify it further under some conditions. */
|
||||
/* RMS - Energy */
|
||||
/* Only use is for debugging, and passed to PITSYN. */
|
||||
/* See comments there for how it can be modified. */
|
||||
/* RC - Reflection coefficients */
|
||||
/* Indices 1 through ORDER restricted to range -.99 to .99, */
|
||||
/* before calling subroutine PITSYN, and then PITSYN */
|
||||
/* can modify it further under some conditions. */
|
||||
/* Output: */
|
||||
/* SPEECH - Synthesized speech samples. */
|
||||
/* Indices 1 through the final value of K are written. */
|
||||
/* K - Number of samples placed into array SPEECH. */
|
||||
/* This is always MAXFRM. */
|
||||
|
||||
/* Subroutine */ int synths_(integer *voice, integer *pitch, real *
|
||||
rms, real *rc, real *speech, integer *k, struct lpc10_decoder_state *st)
|
||||
{
|
||||
/* Initialized data */
|
||||
|
||||
real *buf;
|
||||
integer *buflen;
|
||||
|
||||
/* System generated locals */
|
||||
integer i__1;
|
||||
real r__1, r__2;
|
||||
|
||||
/* Local variables */
|
||||
real rmsi[16];
|
||||
integer nout, ivuv[16], i__, j;
|
||||
extern /* Subroutine */ int deemp_(real *, integer *, struct lpc10_decoder_state *);
|
||||
real ratio;
|
||||
integer ipiti[16];
|
||||
extern /* Subroutine */ bsynz_(real *, integer *,
|
||||
integer *, real *, real *, real *, real *, struct lpc10_decoder_state *), irc2pc_(real *, real *
|
||||
, integer *, real *, real *);
|
||||
real g2pass;
|
||||
real pc[10];
|
||||
extern /* Subroutine */ int pitsyn_(integer *, integer *, integer *, real
|
||||
*, real *, integer *, integer *, integer *, real *, real *,
|
||||
integer *, real *, struct lpc10_decoder_state *);
|
||||
real rci[160] /* was [10][16] */;
|
||||
|
||||
/* $Log: synths.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:42:59 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_decoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_decoder_state().
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:30:33 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/29 22:03:47 jaf */
|
||||
/* Removed definitions for any constants that were no longer used. */
|
||||
|
||||
/* Revision 1.2 1996/03/26 19:34:33 jaf */
|
||||
/* Added comments indicating which constants are not needed in an */
|
||||
/* application that uses the LPC-10 coder. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:43:51 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
/* LPC Configuration parameters: */
|
||||
/* Frame size, Prediction order, Pitch period */
|
||||
/* Arguments */
|
||||
/* $Log: synths.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.2 1996/08/20 20:42:59 jaf
|
||||
* Removed all static local variables that were SAVE'd in the Fortran
|
||||
* code, and put them in struct lpc10_decoder_state that is passed as an
|
||||
* argument.
|
||||
*
|
||||
* Removed init function, since all initialization is now done in
|
||||
* init_lpc10_decoder_state().
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:30:33 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/29 22:05:55 jaf */
|
||||
/* Commented out the common block variables that are not needed by the */
|
||||
/* embedded version. */
|
||||
|
||||
/* Revision 1.2 1996/03/26 19:34:50 jaf */
|
||||
/* Added comments indicating which constants are not needed in an */
|
||||
/* application that uses the LPC-10 coder. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:44:09 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
/* LPC Processing control variables: */
|
||||
|
||||
/* *** Read-only: initialized in setup */
|
||||
|
||||
/* Files for Speech, Parameter, and Bitstream Input & Output, */
|
||||
/* and message and debug outputs. */
|
||||
|
||||
/* Here are the only files which use these variables: */
|
||||
|
||||
/* lpcsim.f setup.f trans.f error.f vqsetup.f */
|
||||
|
||||
/* Many files which use fdebug are not listed, since it is only used in */
|
||||
/* those other files conditionally, to print trace statements. */
|
||||
/* integer fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
|
||||
/* LPC order, Frame size, Quantization rate, Bits per frame, */
|
||||
/* Error correction */
|
||||
/* Subroutine SETUP is the only place where order is assigned a value, */
|
||||
/* and that value is 10. It could increase efficiency 1% or so to */
|
||||
/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as
|
||||
*/
|
||||
/* a variable in a COMMON block, since it is used in many places in the */
|
||||
/* core of the coding and decoding routines. Actually, I take that back.
|
||||
*/
|
||||
/* At least when compiling with f2c, the upper bound of DO loops is */
|
||||
/* stored in a local variable before the DO loop begins, and then that is
|
||||
*/
|
||||
/* compared against on each iteration. */
|
||||
/* Similarly for lframe, which is given a value of MAXFRM in SETUP. */
|
||||
/* Similarly for quant, which is given a value of 2400 in SETUP. quant */
|
||||
/* is used in only a few places, and never in the core coding and */
|
||||
/* decoding routines, so it could be eliminated entirely. */
|
||||
/* nbits is similar to quant, and is given a value of 54 in SETUP. */
|
||||
/* corrp is given a value of .TRUE. in SETUP, and is only used in the */
|
||||
/* subroutines ENCODE and DECODE. It doesn't affect the speed of the */
|
||||
/* coder significantly whether it is .TRUE. or .FALSE., or whether it is
|
||||
*/
|
||||
/* a constant or a variable, since it is only examined once per frame. */
|
||||
/* Leaving it as a variable that is set to .TRUE. seems like a good */
|
||||
/* idea, since it does enable some error-correction capability for */
|
||||
/* unvoiced frames, with no change in the coding rate, and no noticeable
|
||||
*/
|
||||
/* quality difference in the decoded speech. */
|
||||
/* integer quant, nbits */
|
||||
/* *** Read/write: variables for debugging, not needed for LPC algorithm
|
||||
*/
|
||||
|
||||
/* Current frame, Unstable frames, Output clip count, Max onset buffer,
|
||||
*/
|
||||
/* Debug listing detail level, Line count on listing page */
|
||||
|
||||
/* nframe is not needed for an embedded LPC10 at all. */
|
||||
/* nunsfm is initialized to 0 in SETUP, and incremented in subroutine */
|
||||
/* ERROR, which is only called from RCCHK. When LPC10 is embedded into */
|
||||
/* an application, I would recommend removing the call to ERROR in RCCHK,
|
||||
*/
|
||||
/* and remove ERROR and nunsfm completely. */
|
||||
/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in
|
||||
*/
|
||||
/* sread.f. When LPC10 is embedded into an application, one might want */
|
||||
/* to cause it to be incremented in a routine that takes the output of */
|
||||
/* SYNTHS and sends it to an audio device. It could be optionally */
|
||||
/* displayed, for those that might want to know what it is. */
|
||||
/* maxosp is never initialized to 0 in SETUP, although it probably should
|
||||
*/
|
||||
/* be, and it is updated in subroutine ANALYS. I doubt that its value */
|
||||
/* would be of much interest to an application in which LPC10 is */
|
||||
/* embedded. */
|
||||
/* listl and lincnt are not needed for an embedded LPC10 at all. */
|
||||
/* integer nframe, nunsfm, iclip, maxosp, listl, lincnt */
|
||||
/* common /contrl/ fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
|
||||
/* common /contrl/ quant, nbits */
|
||||
/* common /contrl/ nframe, nunsfm, iclip, maxosp, listl, lincnt */
|
||||
/* Parameters/constants */
|
||||
/* Local variables that need not be saved */
|
||||
/* Local state */
|
||||
/* BUF is a buffer of speech samples that would have been returned
|
||||
*/
|
||||
/* by the older version of SYNTHS, but the newer version doesn't, */
|
||||
/* so that the newer version can always return MAXFRM samples on */
|
||||
/* every call. This has the effect of delaying the return of */
|
||||
/* samples for one additional frame time. */
|
||||
|
||||
/* Indices 1 through BUFLEN contain samples that are left over from
|
||||
*/
|
||||
/* the last call to SYNTHS. Given the way that PITSYN works, */
|
||||
/* BUFLEN should always be in the range MAXFRM-MAXPIT+1 through */
|
||||
/* MAXFRM, inclusive, after a call to SYNTHS is complete. */
|
||||
|
||||
/* On the first call to SYNTHS (or the first call after */
|
||||
/* reinitializing with the entry INITSYNTHS), BUFLEN is MAXFRM, and
|
||||
*/
|
||||
/* a frame of silence is always returned. */
|
||||
/* Parameter adjustments */
|
||||
if (voice) {
|
||||
--voice;
|
||||
}
|
||||
if (rc) {
|
||||
--rc;
|
||||
}
|
||||
if (speech) {
|
||||
--speech;
|
||||
}
|
||||
|
||||
/* Function Body */
|
||||
buf = &(st->buf[0]);
|
||||
buflen = &(st->buflen);
|
||||
|
||||
/* Computing MAX */
|
||||
i__1 = min(*pitch,156);
|
||||
*pitch = max(i__1,20);
|
||||
i__1 = contrl_1.order;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
/* Computing MAX */
|
||||
/* Computing MIN */
|
||||
r__2 = rc[i__];
|
||||
r__1 = min(r__2,.99f);
|
||||
rc[i__] = max(r__1,-.99f);
|
||||
}
|
||||
pitsyn_(&contrl_1.order, &voice[1], pitch, rms, &rc[1], &contrl_1.lframe,
|
||||
ivuv, ipiti, rmsi, rci, &nout, &ratio, st);
|
||||
if (nout > 0) {
|
||||
i__1 = nout;
|
||||
for (j = 1; j <= i__1; ++j) {
|
||||
|
||||
/* Add synthesized speech for pitch period J to the en
|
||||
d of */
|
||||
/* BUF. */
|
||||
|
||||
irc2pc_(&rci[j * 10 - 10], pc, &contrl_1.order, &c_b2, &g2pass);
|
||||
bsynz_(pc, &ipiti[j - 1], &ivuv[j - 1], &buf[*buflen], &rmsi[j - 1]
|
||||
, &ratio, &g2pass, st);
|
||||
deemp_(&buf[*buflen], &ipiti[j - 1], st);
|
||||
*buflen += ipiti[j - 1];
|
||||
}
|
||||
|
||||
/* Copy first MAXFRM samples from BUF to output array SPEECH
|
||||
*/
|
||||
/* (scaling them), and then remove them from the beginning of
|
||||
*/
|
||||
/* BUF. */
|
||||
|
||||
for (i__ = 1; i__ <= 180; ++i__) {
|
||||
speech[i__] = buf[i__ - 1] / 4096.f;
|
||||
}
|
||||
*k = 180;
|
||||
*buflen += -180;
|
||||
i__1 = *buflen;
|
||||
for (i__ = 1; i__ <= i__1; ++i__) {
|
||||
buf[i__ - 1] = buf[i__ + 179];
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
} /* synths_ */
|
||||
|
||||
+183
-183
@@ -1,183 +1,183 @@
|
||||
/*
|
||||
|
||||
$Log: tbdm.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.1 1996/08/19 22:30:26 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int tbdm_(real *speech, integer *lpita, integer *tau, integer *ltau, real *amdf, integer *minptr, integer *maxptr, integer *mintau);
|
||||
/*:ref: difmag_ 14 8 6 4 4 4 4 6 4 4 */
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* ********************************************************************** */
|
||||
|
||||
/* TBDM Version 49 */
|
||||
|
||||
/* $Log: tbdm.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:30:26 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/18 22:14:00 jaf */
|
||||
/* Just added a few comments about which array indices of the arguments */
|
||||
/* are used, and mentioning that this subroutine has no local state. */
|
||||
|
||||
/* Revision 1.2 1996/03/13 14:48:37 jaf */
|
||||
/* Comments added explaining that none of the local variables of this */
|
||||
/* subroutine need to be saved from one invocation to the next. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:49:54 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ********************************************************************* */
|
||||
|
||||
/*TURBO DIFMAG: Compute High Resolution Average Magnitude Difference Function
|
||||
*/
|
||||
|
||||
/* Note: There are several constants in here that appear to depend on a */
|
||||
/* particular TAU table. That's not a problem for the LPC10 coder, but */
|
||||
/* watch out if you change the contents of TAU in the subroutine ANALYS. */
|
||||
|
||||
/* Input: */
|
||||
/* SPEECH - Low pass filtered speech */
|
||||
/* Indices 1 through MAX+LPITA-1 are read, where: */
|
||||
/* MAX = (TAU(LTAU)-TAU(1))/2+1 */
|
||||
/* (If TAU(1) .LT. 39, then larger indices could be read */
|
||||
/* by the last call to DIFMAG below.) */
|
||||
/* LPITA - Length of speech buffer */
|
||||
/* TAU - Table of lags, sorted in increasing order. */
|
||||
/* Indices 1 through LTAU read. */
|
||||
/* LTAU - Number of lag values to compute */
|
||||
/* Output: */
|
||||
/* AMDF - Average Magnitude Difference for each lag in TAU */
|
||||
/* Indices 1 through LTAU written, and several might then be read.*/
|
||||
/* MINPTR - Index of minimum AMDF value */
|
||||
/* MAXPTR - Index of maximum AMDF value within +/- 1/2 octave of min */
|
||||
/* MINTAU - Lag corresponding to minimum AMDF value */
|
||||
|
||||
/* This subroutine has no local state. */
|
||||
|
||||
/* Subroutine */ int tbdm_(real *speech, integer *lpita, integer *tau,
|
||||
integer *ltau, real *amdf, integer *minptr, integer *maxptr, integer *
|
||||
mintau)
|
||||
{
|
||||
/* System generated locals */
|
||||
integer i__1, i__2, i__3, i__4;
|
||||
|
||||
/* Local variables */
|
||||
real amdf2[6];
|
||||
integer minp2, ltau2, maxp2, i__;
|
||||
extern /* Subroutine */ int difmag_(real *, integer *, integer *, integer
|
||||
*, integer *, real *, integer *, integer *);
|
||||
integer minamd, ptr, tau2[6];
|
||||
|
||||
/* Arguments */
|
||||
/* REAL SPEECH(LPITA+TAU(LTAU)), AMDF(LTAU) */
|
||||
/* Stupid TOAST doesn't understand expressions */
|
||||
/* Local variables that need not be saved */
|
||||
/* Local state */
|
||||
/* None */
|
||||
/* Compute full AMDF using log spaced lags, find coarse minimum */
|
||||
/* Parameter adjustments */
|
||||
--speech;
|
||||
--amdf;
|
||||
--tau;
|
||||
|
||||
/* Function Body */
|
||||
difmag_(&speech[1], lpita, &tau[1], ltau, &tau[*ltau], &amdf[1], minptr,
|
||||
maxptr);
|
||||
*mintau = tau[*minptr];
|
||||
minamd = (integer)amdf[*minptr];
|
||||
/* Build table containing all lags within +/- 3 of the AMDF minimum */
|
||||
/* excluding all that have already been computed */
|
||||
ltau2 = 0;
|
||||
ptr = *minptr - 2;
|
||||
/* Computing MAX */
|
||||
i__1 = *mintau - 3;
|
||||
/* Computing MIN */
|
||||
i__3 = *mintau + 3, i__4 = tau[*ltau] - 1;
|
||||
i__2 = min(i__3,i__4);
|
||||
for (i__ = max(i__1,41); i__ <= i__2; ++i__) {
|
||||
while(tau[ptr] < i__) {
|
||||
++ptr;
|
||||
}
|
||||
if (tau[ptr] != i__) {
|
||||
++ltau2;
|
||||
tau2[ltau2 - 1] = i__;
|
||||
}
|
||||
}
|
||||
/* Compute AMDF of the new lags, if there are any, and choose one */
|
||||
/* if it is better than the coarse minimum */
|
||||
if (ltau2 > 0) {
|
||||
difmag_(&speech[1], lpita, tau2, <au2, &tau[*ltau], amdf2, &minp2, &
|
||||
maxp2);
|
||||
if (amdf2[minp2 - 1] < (real) minamd) {
|
||||
*mintau = tau2[minp2 - 1];
|
||||
minamd = (integer)amdf2[minp2 - 1];
|
||||
}
|
||||
}
|
||||
/* Check one octave up, if there are any lags not yet computed */
|
||||
if (*mintau >= 80) {
|
||||
i__ = *mintau / 2;
|
||||
if ((i__ & 1) == 0) {
|
||||
ltau2 = 2;
|
||||
tau2[0] = i__ - 1;
|
||||
tau2[1] = i__ + 1;
|
||||
} else {
|
||||
ltau2 = 1;
|
||||
tau2[0] = i__;
|
||||
}
|
||||
difmag_(&speech[1], lpita, tau2, <au2, &tau[*ltau], amdf2, &minp2, &
|
||||
maxp2);
|
||||
if (amdf2[minp2 - 1] < (real) minamd) {
|
||||
*mintau = tau2[minp2 - 1];
|
||||
minamd = (integer)amdf2[minp2 - 1];
|
||||
*minptr += -20;
|
||||
}
|
||||
}
|
||||
/* Force minimum of the AMDF array to the high resolution minimum */
|
||||
amdf[*minptr] = (real) minamd;
|
||||
/* Find maximum of AMDF within 1/2 octave of minimum */
|
||||
/* Computing MAX */
|
||||
i__2 = *minptr - 5;
|
||||
*maxptr = max(i__2,1);
|
||||
/* Computing MIN */
|
||||
i__1 = *minptr + 5;
|
||||
i__2 = min(i__1,*ltau);
|
||||
for (i__ = *maxptr + 1; i__ <= i__2; ++i__) {
|
||||
if (amdf[i__] > amdf[*maxptr]) {
|
||||
*maxptr = i__;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
} /* tbdm_ */
|
||||
|
||||
/*
|
||||
|
||||
$Log: tbdm.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.1 1996/08/19 22:30:26 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int tbdm_(real *speech, integer *lpita, integer *tau, integer *ltau, real *amdf, integer *minptr, integer *maxptr, integer *mintau);
|
||||
/*:ref: difmag_ 14 8 6 4 4 4 4 6 4 4 */
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* ********************************************************************** */
|
||||
|
||||
/* TBDM Version 49 */
|
||||
|
||||
/* $Log: tbdm.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:30:26 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.3 1996/03/18 22:14:00 jaf */
|
||||
/* Just added a few comments about which array indices of the arguments */
|
||||
/* are used, and mentioning that this subroutine has no local state. */
|
||||
|
||||
/* Revision 1.2 1996/03/13 14:48:37 jaf */
|
||||
/* Comments added explaining that none of the local variables of this */
|
||||
/* subroutine need to be saved from one invocation to the next. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:49:54 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ********************************************************************* */
|
||||
|
||||
/*TURBO DIFMAG: Compute High Resolution Average Magnitude Difference Function
|
||||
*/
|
||||
|
||||
/* Note: There are several constants in here that appear to depend on a */
|
||||
/* particular TAU table. That's not a problem for the LPC10 coder, but */
|
||||
/* watch out if you change the contents of TAU in the subroutine ANALYS. */
|
||||
|
||||
/* Input: */
|
||||
/* SPEECH - Low pass filtered speech */
|
||||
/* Indices 1 through MAX+LPITA-1 are read, where: */
|
||||
/* MAX = (TAU(LTAU)-TAU(1))/2+1 */
|
||||
/* (If TAU(1) .LT. 39, then larger indices could be read */
|
||||
/* by the last call to DIFMAG below.) */
|
||||
/* LPITA - Length of speech buffer */
|
||||
/* TAU - Table of lags, sorted in increasing order. */
|
||||
/* Indices 1 through LTAU read. */
|
||||
/* LTAU - Number of lag values to compute */
|
||||
/* Output: */
|
||||
/* AMDF - Average Magnitude Difference for each lag in TAU */
|
||||
/* Indices 1 through LTAU written, and several might then be read.*/
|
||||
/* MINPTR - Index of minimum AMDF value */
|
||||
/* MAXPTR - Index of maximum AMDF value within +/- 1/2 octave of min */
|
||||
/* MINTAU - Lag corresponding to minimum AMDF value */
|
||||
|
||||
/* This subroutine has no local state. */
|
||||
|
||||
/* Subroutine */ int tbdm_(real *speech, integer *lpita, integer *tau,
|
||||
integer *ltau, real *amdf, integer *minptr, integer *maxptr, integer *
|
||||
mintau)
|
||||
{
|
||||
/* System generated locals */
|
||||
integer i__1, i__2, i__3, i__4;
|
||||
|
||||
/* Local variables */
|
||||
real amdf2[6];
|
||||
integer minp2, ltau2, maxp2, i__;
|
||||
extern /* Subroutine */ int difmag_(real *, integer *, integer *, integer
|
||||
*, integer *, real *, integer *, integer *);
|
||||
integer minamd, ptr, tau2[6];
|
||||
|
||||
/* Arguments */
|
||||
/* REAL SPEECH(LPITA+TAU(LTAU)), AMDF(LTAU) */
|
||||
/* Stupid TOAST doesn't understand expressions */
|
||||
/* Local variables that need not be saved */
|
||||
/* Local state */
|
||||
/* None */
|
||||
/* Compute full AMDF using log spaced lags, find coarse minimum */
|
||||
/* Parameter adjustments */
|
||||
--speech;
|
||||
--amdf;
|
||||
--tau;
|
||||
|
||||
/* Function Body */
|
||||
difmag_(&speech[1], lpita, &tau[1], ltau, &tau[*ltau], &amdf[1], minptr,
|
||||
maxptr);
|
||||
*mintau = tau[*minptr];
|
||||
minamd = (integer)amdf[*minptr];
|
||||
/* Build table containing all lags within +/- 3 of the AMDF minimum */
|
||||
/* excluding all that have already been computed */
|
||||
ltau2 = 0;
|
||||
ptr = *minptr - 2;
|
||||
/* Computing MAX */
|
||||
i__1 = *mintau - 3;
|
||||
/* Computing MIN */
|
||||
i__3 = *mintau + 3, i__4 = tau[*ltau] - 1;
|
||||
i__2 = min(i__3,i__4);
|
||||
for (i__ = max(i__1,41); i__ <= i__2; ++i__) {
|
||||
while(tau[ptr] < i__) {
|
||||
++ptr;
|
||||
}
|
||||
if (tau[ptr] != i__) {
|
||||
++ltau2;
|
||||
tau2[ltau2 - 1] = i__;
|
||||
}
|
||||
}
|
||||
/* Compute AMDF of the new lags, if there are any, and choose one */
|
||||
/* if it is better than the coarse minimum */
|
||||
if (ltau2 > 0) {
|
||||
difmag_(&speech[1], lpita, tau2, <au2, &tau[*ltau], amdf2, &minp2, &
|
||||
maxp2);
|
||||
if (amdf2[minp2 - 1] < (real) minamd) {
|
||||
*mintau = tau2[minp2 - 1];
|
||||
minamd = (integer)amdf2[minp2 - 1];
|
||||
}
|
||||
}
|
||||
/* Check one octave up, if there are any lags not yet computed */
|
||||
if (*mintau >= 80) {
|
||||
i__ = *mintau / 2;
|
||||
if ((i__ & 1) == 0) {
|
||||
ltau2 = 2;
|
||||
tau2[0] = i__ - 1;
|
||||
tau2[1] = i__ + 1;
|
||||
} else {
|
||||
ltau2 = 1;
|
||||
tau2[0] = i__;
|
||||
}
|
||||
difmag_(&speech[1], lpita, tau2, <au2, &tau[*ltau], amdf2, &minp2, &
|
||||
maxp2);
|
||||
if (amdf2[minp2 - 1] < (real) minamd) {
|
||||
*mintau = tau2[minp2 - 1];
|
||||
minamd = (integer)amdf2[minp2 - 1];
|
||||
*minptr += -20;
|
||||
}
|
||||
}
|
||||
/* Force minimum of the AMDF array to the high resolution minimum */
|
||||
amdf[*minptr] = (real) minamd;
|
||||
/* Find maximum of AMDF within 1/2 octave of minimum */
|
||||
/* Computing MAX */
|
||||
i__2 = *minptr - 5;
|
||||
*maxptr = max(i__2,1);
|
||||
/* Computing MIN */
|
||||
i__1 = *minptr + 5;
|
||||
i__2 = min(i__1,*ltau);
|
||||
for (i__ = *maxptr + 1; i__ <= i__2; ++i__) {
|
||||
if (amdf[i__] > amdf[*maxptr]) {
|
||||
*maxptr = i__;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
} /* tbdm_ */
|
||||
|
||||
|
||||
+770
-770
File diff suppressed because it is too large
Load Diff
+250
-250
@@ -1,250 +1,250 @@
|
||||
/*
|
||||
|
||||
$Log: vparms.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.1 1996/08/19 22:30:04 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int vparms_(integer *vwin, real *inbuf, real *lpbuf, integer *buflim, integer *half, real *dither, integer *mintau, integer *zc, integer *lbe, integer *fbe, real *qs, real *rc1, real *ar_b__, real *ar_f__);
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* Table of constant values */
|
||||
|
||||
static real c_b2 = 1.f;
|
||||
|
||||
/* ********************************************************************* */
|
||||
|
||||
/* VPARMS Version 50 */
|
||||
|
||||
/* $Log: vparms.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:30:04 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.6 1996/03/29 18:01:16 jaf */
|
||||
/* Added some more comments about the range of INBUF and LPBUF that can */
|
||||
/* be read. Note that it is possible for index VWIN(2)+1 to be read from */
|
||||
/* INBUF, which might be outside of its defined range, although that will */
|
||||
/* require more careful checking. */
|
||||
|
||||
/* Revision 1.5 1996/03/19 00:02:02 jaf */
|
||||
/* I just noticed that the argument DITHER is modified inside of this */
|
||||
/* subroutine. Comments were added explaining the possible final values. */
|
||||
|
||||
/* Revision 1.4 1996/03/18 22:22:59 jaf */
|
||||
/* Finishing the job I said I did with the last check-in comments. */
|
||||
|
||||
/* Revision 1.3 1996/03/18 22:22:17 jaf */
|
||||
/* Just added a few comments about which array indices of the arguments */
|
||||
/* are used, and mentioning that this subroutine has no local state. */
|
||||
|
||||
/* Revision 1.2 1996/03/13 15:02:58 jaf */
|
||||
/* Comments added explaining that none of the local variables of this */
|
||||
/* subroutine need to be saved from one invocation to the next. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:50:42 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ********************************************************************* */
|
||||
|
||||
/* Calculate voicing parameters: */
|
||||
|
||||
/* Input: */
|
||||
/* VWIN - Voicing window limits */
|
||||
/* Indices 1 through 2 read. */
|
||||
/* INBUF - Input speech buffer */
|
||||
/* Indices START-1 through STOP read, */
|
||||
/* where START and STOP are defined in the code (only written once).
|
||||
*/
|
||||
/* Note that STOP can be as large as VWIN(2)+1 ! */
|
||||
/* LPBUF - Low pass filtered speech */
|
||||
/* Indices START-MINTAU through STOP+MINTAU read, */
|
||||
/* where START and STOP are defined in the code (only written once).
|
||||
*/
|
||||
/* BUFLIM - Array bounds for INBUF and LPBUF */
|
||||
/* Indices 1 through 4 read. */
|
||||
/* HALF - Half frame (1 or 2) */
|
||||
/* MINTAU - Lag corresponding to minimum AMDF value (pitch estimate) */
|
||||
/* Input/Output: */
|
||||
/* DITHER - Zero crossing threshold */
|
||||
/* The resulting value might be the negation of the input */
|
||||
/* value. It might always be the same as the input value, */
|
||||
/* if the DO loop below always executes an even number of times. */
|
||||
/* Output: (all of them are written on every call) */
|
||||
/* ZC - Zero crossing rate */
|
||||
/* LBE - Low band energy (sum of magnitudes - SM) */
|
||||
/* FBE - Full band energy (SM) */
|
||||
/* QS - Ratio of 6 dB/oct preemphasized energy to full band energy */
|
||||
/* RC1 - First reflection coefficient */
|
||||
/* AR_B - Product of the causal forward and reverse pitch */
|
||||
/* prediction gains */
|
||||
/* AR_F - Product of the noncausal forward and reverse pitch */
|
||||
/* prediction gains */
|
||||
/* Internal: */
|
||||
/* OLDSGN - Previous sign of dithered signal */
|
||||
/* VLEN - Length of voicing window */
|
||||
/* START - Lower address of current half of voicing window */
|
||||
/* STOP - Upper address of current half of voicing window */
|
||||
/* E_0 - Energy of LPF speech (sum of squares - SS) */
|
||||
/* E_B - Energy of LPF speech backward one pitch period (SS) */
|
||||
/* E_F - Energy of LPF speech forward one pitch period (SS) */
|
||||
/* R_B - Autocovariance of LPF speech backward one pitch period */
|
||||
/* R_F - Autocovariance of LPF speech forward one pitch period */
|
||||
/* LP_RMS - Energy of LPF speech (sum of magnitudes - SM) */
|
||||
/* AP_RMS - Energy of all-pass speech (SM) */
|
||||
/* E_PRE - Energy of 6dB preemphasized speech (SM) */
|
||||
/* E0AP - Energy of all-pass speech (SS) */
|
||||
|
||||
/* This subroutine has no local state. */
|
||||
|
||||
/* Subroutine */ int vparms_(integer *vwin, real *inbuf, real *lpbuf, integer
|
||||
*buflim, integer *half, real *dither, integer *mintau, integer *zc,
|
||||
integer *lbe, integer *fbe, real *qs, real *rc1, real *ar_b__, real *
|
||||
ar_f__)
|
||||
{
|
||||
/* System generated locals */
|
||||
integer inbuf_offset, lpbuf_offset, i__1;
|
||||
real r__1, r__2;
|
||||
|
||||
/* Builtin functions */
|
||||
double r_sign(real *, real *);
|
||||
integer i_nint(real *);
|
||||
|
||||
/* Local variables */
|
||||
integer vlen, stop, i__;
|
||||
real e_pre__;
|
||||
integer start;
|
||||
real ap_rms__, e_0__, oldsgn, lp_rms__, e_b__, e_f__, r_b__, r_f__, e0ap;
|
||||
|
||||
/* Arguments */
|
||||
/* Local variables that need not be saved */
|
||||
/* Calculate zero crossings (ZC) and several energy and correlation */
|
||||
/* measures on low band and full band speech. Each measure is taken */
|
||||
/* over either the first or the second half of the voicing window, */
|
||||
/* depending on the variable HALF. */
|
||||
/* Parameter adjustments */
|
||||
--vwin;
|
||||
--buflim;
|
||||
lpbuf_offset = buflim[3];
|
||||
lpbuf -= lpbuf_offset;
|
||||
inbuf_offset = buflim[1];
|
||||
inbuf -= inbuf_offset;
|
||||
|
||||
/* Function Body */
|
||||
lp_rms__ = 0.f;
|
||||
ap_rms__ = 0.f;
|
||||
e_pre__ = 0.f;
|
||||
e0ap = 0.f;
|
||||
*rc1 = 0.f;
|
||||
e_0__ = 0.f;
|
||||
e_b__ = 0.f;
|
||||
e_f__ = 0.f;
|
||||
r_f__ = 0.f;
|
||||
r_b__ = 0.f;
|
||||
*zc = 0;
|
||||
vlen = vwin[2] - vwin[1] + 1;
|
||||
start = vwin[1] + (*half - 1) * vlen / 2 + 1;
|
||||
stop = start + vlen / 2 - 1;
|
||||
|
||||
/* I'll use the symbol HVL in the table below to represent the value */
|
||||
/* VLEN/2. Note that if VLEN is odd, then HVL should be rounded down, */
|
||||
/* i.e., HVL = (VLEN-1)/2. */
|
||||
|
||||
/* HALF START STOP */
|
||||
|
||||
/* 1 VWIN(1)+1 VWIN(1)+HVL */
|
||||
/* 2 VWIN(1)+HVL+1 VWIN(1)+2*HVL */
|
||||
|
||||
/* Note that if VLEN is even and HALF is 2, then STOP will be */
|
||||
/* VWIN(1)+VLEN = VWIN(2)+1. That could be bad, if that index of INBUF */
|
||||
/* is undefined. */
|
||||
|
||||
r__1 = inbuf[start - 1] - *dither;
|
||||
oldsgn = (real)r_sign(&c_b2, &r__1);
|
||||
i__1 = stop;
|
||||
for (i__ = start; i__ <= i__1; ++i__) {
|
||||
lp_rms__ += (r__1 = lpbuf[i__], abs(r__1));
|
||||
ap_rms__ += (r__1 = inbuf[i__], abs(r__1));
|
||||
e_pre__ += (r__1 = inbuf[i__] - inbuf[i__ - 1], abs(r__1));
|
||||
/* Computing 2nd power */
|
||||
r__1 = inbuf[i__];
|
||||
e0ap += r__1 * r__1;
|
||||
*rc1 += inbuf[i__] * inbuf[i__ - 1];
|
||||
/* Computing 2nd power */
|
||||
r__1 = lpbuf[i__];
|
||||
e_0__ += r__1 * r__1;
|
||||
/* Computing 2nd power */
|
||||
r__1 = lpbuf[i__ - *mintau];
|
||||
e_b__ += r__1 * r__1;
|
||||
/* Computing 2nd power */
|
||||
r__1 = lpbuf[i__ + *mintau];
|
||||
e_f__ += r__1 * r__1;
|
||||
r_f__ += lpbuf[i__] * lpbuf[i__ + *mintau];
|
||||
r_b__ += lpbuf[i__] * lpbuf[i__ - *mintau];
|
||||
r__1 = inbuf[i__] + *dither;
|
||||
if (r_sign(&c_b2, &r__1) != oldsgn) {
|
||||
++(*zc);
|
||||
oldsgn = -oldsgn;
|
||||
}
|
||||
*dither = -(*dither);
|
||||
}
|
||||
/* Normalized short-term autocovariance coefficient at unit sample delay
|
||||
*/
|
||||
*rc1 /= max(e0ap,1.f);
|
||||
/* Ratio of the energy of the first difference signal (6 dB/oct preemphas
|
||||
is)*/
|
||||
/* to the energy of the full band signal */
|
||||
/* Computing MAX */
|
||||
r__1 = ap_rms__ * 2.f;
|
||||
*qs = e_pre__ / max(r__1,1.f);
|
||||
/* aR_b is the product of the forward and reverse prediction gains, */
|
||||
/* looking backward in time (the causal case). */
|
||||
*ar_b__ = r_b__ / max(e_b__,1.f) * (r_b__ / max(e_0__,1.f));
|
||||
/* aR_f is the same as aR_b, but looking forward in time (non causal case
|
||||
).*/
|
||||
*ar_f__ = r_f__ / max(e_f__,1.f) * (r_f__ / max(e_0__,1.f));
|
||||
/* Normalize ZC, LBE, and FBE to old fixed window length of 180. */
|
||||
/* (The fraction 90/VLEN has a range of .58 to 1) */
|
||||
r__2 = (real) (*zc << 1);
|
||||
r__1 = r__2 * (90.f / vlen);
|
||||
*zc = i_nint(&r__1);
|
||||
/* Computing MIN */
|
||||
r__1 = lp_rms__ / 4 * (90.f / vlen);
|
||||
i__1 = i_nint(&r__1);
|
||||
*lbe = min(i__1,32767);
|
||||
/* Computing MIN */
|
||||
r__1 = ap_rms__ / 4 * (90.f / vlen);
|
||||
i__1 = i_nint(&r__1);
|
||||
*fbe = min(i__1,32767);
|
||||
return 0;
|
||||
} /* vparms_ */
|
||||
|
||||
/*
|
||||
|
||||
$Log: vparms.c,v $
|
||||
Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
Initial version
|
||||
|
||||
Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
|
||||
Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
Added LPC-10 2400bps codec
|
||||
|
||||
* Revision 1.1 1996/08/19 22:30:04 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int vparms_(integer *vwin, real *inbuf, real *lpbuf, integer *buflim, integer *half, real *dither, integer *mintau, integer *zc, integer *lbe, integer *fbe, real *qs, real *rc1, real *ar_b__, real *ar_f__);
|
||||
#endif
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
/* Table of constant values */
|
||||
|
||||
static real c_b2 = 1.f;
|
||||
|
||||
/* ********************************************************************* */
|
||||
|
||||
/* VPARMS Version 50 */
|
||||
|
||||
/* $Log: vparms.c,v $
|
||||
* Revision 1.1 2004/05/04 11:16:43 csoutheren
|
||||
* Initial version
|
||||
*
|
||||
* Revision 1.2 2002/02/15 03:57:55 yurik
|
||||
* Warnings removed during compilation, patch courtesy of Jehan Bing, jehan@bravobrava.com
|
||||
*
|
||||
* Revision 1.1 2000/06/05 04:45:12 robertj
|
||||
* Added LPC-10 2400bps codec
|
||||
*
|
||||
* Revision 1.1 1996/08/19 22:30:04 jaf
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
/* Revision 1.6 1996/03/29 18:01:16 jaf */
|
||||
/* Added some more comments about the range of INBUF and LPBUF that can */
|
||||
/* be read. Note that it is possible for index VWIN(2)+1 to be read from */
|
||||
/* INBUF, which might be outside of its defined range, although that will */
|
||||
/* require more careful checking. */
|
||||
|
||||
/* Revision 1.5 1996/03/19 00:02:02 jaf */
|
||||
/* I just noticed that the argument DITHER is modified inside of this */
|
||||
/* subroutine. Comments were added explaining the possible final values. */
|
||||
|
||||
/* Revision 1.4 1996/03/18 22:22:59 jaf */
|
||||
/* Finishing the job I said I did with the last check-in comments. */
|
||||
|
||||
/* Revision 1.3 1996/03/18 22:22:17 jaf */
|
||||
/* Just added a few comments about which array indices of the arguments */
|
||||
/* are used, and mentioning that this subroutine has no local state. */
|
||||
|
||||
/* Revision 1.2 1996/03/13 15:02:58 jaf */
|
||||
/* Comments added explaining that none of the local variables of this */
|
||||
/* subroutine need to be saved from one invocation to the next. */
|
||||
|
||||
/* Revision 1.1 1996/02/07 14:50:42 jaf */
|
||||
/* Initial revision */
|
||||
|
||||
|
||||
/* ********************************************************************* */
|
||||
|
||||
/* Calculate voicing parameters: */
|
||||
|
||||
/* Input: */
|
||||
/* VWIN - Voicing window limits */
|
||||
/* Indices 1 through 2 read. */
|
||||
/* INBUF - Input speech buffer */
|
||||
/* Indices START-1 through STOP read, */
|
||||
/* where START and STOP are defined in the code (only written once).
|
||||
*/
|
||||
/* Note that STOP can be as large as VWIN(2)+1 ! */
|
||||
/* LPBUF - Low pass filtered speech */
|
||||
/* Indices START-MINTAU through STOP+MINTAU read, */
|
||||
/* where START and STOP are defined in the code (only written once).
|
||||
*/
|
||||
/* BUFLIM - Array bounds for INBUF and LPBUF */
|
||||
/* Indices 1 through 4 read. */
|
||||
/* HALF - Half frame (1 or 2) */
|
||||
/* MINTAU - Lag corresponding to minimum AMDF value (pitch estimate) */
|
||||
/* Input/Output: */
|
||||
/* DITHER - Zero crossing threshold */
|
||||
/* The resulting value might be the negation of the input */
|
||||
/* value. It might always be the same as the input value, */
|
||||
/* if the DO loop below always executes an even number of times. */
|
||||
/* Output: (all of them are written on every call) */
|
||||
/* ZC - Zero crossing rate */
|
||||
/* LBE - Low band energy (sum of magnitudes - SM) */
|
||||
/* FBE - Full band energy (SM) */
|
||||
/* QS - Ratio of 6 dB/oct preemphasized energy to full band energy */
|
||||
/* RC1 - First reflection coefficient */
|
||||
/* AR_B - Product of the causal forward and reverse pitch */
|
||||
/* prediction gains */
|
||||
/* AR_F - Product of the noncausal forward and reverse pitch */
|
||||
/* prediction gains */
|
||||
/* Internal: */
|
||||
/* OLDSGN - Previous sign of dithered signal */
|
||||
/* VLEN - Length of voicing window */
|
||||
/* START - Lower address of current half of voicing window */
|
||||
/* STOP - Upper address of current half of voicing window */
|
||||
/* E_0 - Energy of LPF speech (sum of squares - SS) */
|
||||
/* E_B - Energy of LPF speech backward one pitch period (SS) */
|
||||
/* E_F - Energy of LPF speech forward one pitch period (SS) */
|
||||
/* R_B - Autocovariance of LPF speech backward one pitch period */
|
||||
/* R_F - Autocovariance of LPF speech forward one pitch period */
|
||||
/* LP_RMS - Energy of LPF speech (sum of magnitudes - SM) */
|
||||
/* AP_RMS - Energy of all-pass speech (SM) */
|
||||
/* E_PRE - Energy of 6dB preemphasized speech (SM) */
|
||||
/* E0AP - Energy of all-pass speech (SS) */
|
||||
|
||||
/* This subroutine has no local state. */
|
||||
|
||||
/* Subroutine */ int vparms_(integer *vwin, real *inbuf, real *lpbuf, integer
|
||||
*buflim, integer *half, real *dither, integer *mintau, integer *zc,
|
||||
integer *lbe, integer *fbe, real *qs, real *rc1, real *ar_b__, real *
|
||||
ar_f__)
|
||||
{
|
||||
/* System generated locals */
|
||||
integer inbuf_offset, lpbuf_offset, i__1;
|
||||
real r__1, r__2;
|
||||
|
||||
/* Builtin functions */
|
||||
double r_sign(real *, real *);
|
||||
integer i_nint(real *);
|
||||
|
||||
/* Local variables */
|
||||
integer vlen, stop, i__;
|
||||
real e_pre__;
|
||||
integer start;
|
||||
real ap_rms__, e_0__, oldsgn, lp_rms__, e_b__, e_f__, r_b__, r_f__, e0ap;
|
||||
|
||||
/* Arguments */
|
||||
/* Local variables that need not be saved */
|
||||
/* Calculate zero crossings (ZC) and several energy and correlation */
|
||||
/* measures on low band and full band speech. Each measure is taken */
|
||||
/* over either the first or the second half of the voicing window, */
|
||||
/* depending on the variable HALF. */
|
||||
/* Parameter adjustments */
|
||||
--vwin;
|
||||
--buflim;
|
||||
lpbuf_offset = buflim[3];
|
||||
lpbuf -= lpbuf_offset;
|
||||
inbuf_offset = buflim[1];
|
||||
inbuf -= inbuf_offset;
|
||||
|
||||
/* Function Body */
|
||||
lp_rms__ = 0.f;
|
||||
ap_rms__ = 0.f;
|
||||
e_pre__ = 0.f;
|
||||
e0ap = 0.f;
|
||||
*rc1 = 0.f;
|
||||
e_0__ = 0.f;
|
||||
e_b__ = 0.f;
|
||||
e_f__ = 0.f;
|
||||
r_f__ = 0.f;
|
||||
r_b__ = 0.f;
|
||||
*zc = 0;
|
||||
vlen = vwin[2] - vwin[1] + 1;
|
||||
start = vwin[1] + (*half - 1) * vlen / 2 + 1;
|
||||
stop = start + vlen / 2 - 1;
|
||||
|
||||
/* I'll use the symbol HVL in the table below to represent the value */
|
||||
/* VLEN/2. Note that if VLEN is odd, then HVL should be rounded down, */
|
||||
/* i.e., HVL = (VLEN-1)/2. */
|
||||
|
||||
/* HALF START STOP */
|
||||
|
||||
/* 1 VWIN(1)+1 VWIN(1)+HVL */
|
||||
/* 2 VWIN(1)+HVL+1 VWIN(1)+2*HVL */
|
||||
|
||||
/* Note that if VLEN is even and HALF is 2, then STOP will be */
|
||||
/* VWIN(1)+VLEN = VWIN(2)+1. That could be bad, if that index of INBUF */
|
||||
/* is undefined. */
|
||||
|
||||
r__1 = inbuf[start - 1] - *dither;
|
||||
oldsgn = (real)r_sign(&c_b2, &r__1);
|
||||
i__1 = stop;
|
||||
for (i__ = start; i__ <= i__1; ++i__) {
|
||||
lp_rms__ += (r__1 = lpbuf[i__], abs(r__1));
|
||||
ap_rms__ += (r__1 = inbuf[i__], abs(r__1));
|
||||
e_pre__ += (r__1 = inbuf[i__] - inbuf[i__ - 1], abs(r__1));
|
||||
/* Computing 2nd power */
|
||||
r__1 = inbuf[i__];
|
||||
e0ap += r__1 * r__1;
|
||||
*rc1 += inbuf[i__] * inbuf[i__ - 1];
|
||||
/* Computing 2nd power */
|
||||
r__1 = lpbuf[i__];
|
||||
e_0__ += r__1 * r__1;
|
||||
/* Computing 2nd power */
|
||||
r__1 = lpbuf[i__ - *mintau];
|
||||
e_b__ += r__1 * r__1;
|
||||
/* Computing 2nd power */
|
||||
r__1 = lpbuf[i__ + *mintau];
|
||||
e_f__ += r__1 * r__1;
|
||||
r_f__ += lpbuf[i__] * lpbuf[i__ + *mintau];
|
||||
r_b__ += lpbuf[i__] * lpbuf[i__ - *mintau];
|
||||
r__1 = inbuf[i__] + *dither;
|
||||
if (r_sign(&c_b2, &r__1) != oldsgn) {
|
||||
++(*zc);
|
||||
oldsgn = -oldsgn;
|
||||
}
|
||||
*dither = -(*dither);
|
||||
}
|
||||
/* Normalized short-term autocovariance coefficient at unit sample delay
|
||||
*/
|
||||
*rc1 /= max(e0ap,1.f);
|
||||
/* Ratio of the energy of the first difference signal (6 dB/oct preemphas
|
||||
is)*/
|
||||
/* to the energy of the full band signal */
|
||||
/* Computing MAX */
|
||||
r__1 = ap_rms__ * 2.f;
|
||||
*qs = e_pre__ / max(r__1,1.f);
|
||||
/* aR_b is the product of the forward and reverse prediction gains, */
|
||||
/* looking backward in time (the causal case). */
|
||||
*ar_b__ = r_b__ / max(e_b__,1.f) * (r_b__ / max(e_0__,1.f));
|
||||
/* aR_f is the same as aR_b, but looking forward in time (non causal case
|
||||
).*/
|
||||
*ar_f__ = r_f__ / max(e_f__,1.f) * (r_f__ / max(e_0__,1.f));
|
||||
/* Normalize ZC, LBE, and FBE to old fixed window length of 180. */
|
||||
/* (The fraction 90/VLEN has a range of .58 to 1) */
|
||||
r__2 = (real) (*zc << 1);
|
||||
r__1 = r__2 * (90.f / vlen);
|
||||
*zc = i_nint(&r__1);
|
||||
/* Computing MIN */
|
||||
r__1 = lp_rms__ / 4 * (90.f / vlen);
|
||||
i__1 = i_nint(&r__1);
|
||||
*lbe = min(i__1,32767);
|
||||
/* Computing MIN */
|
||||
r__1 = ap_rms__ / 4 * (90.f / vlen);
|
||||
i__1 = i_nint(&r__1);
|
||||
*fbe = min(i__1,32767);
|
||||
return 0;
|
||||
} /* vparms_ */
|
||||
|
||||
|
||||
@@ -222,14 +222,25 @@
|
||||
<File RelativePath="setup_once.h"></File>
|
||||
<File RelativePath="socks.h"></File>
|
||||
<File RelativePath="config-win32.h"></File>
|
||||
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Resource Files"
|
||||
Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
|
||||
>
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
||||
|
||||
|
||||
</Filter>
|
||||
|
||||
<Filter
|
||||
|
||||
Name="Resource Files"
|
||||
|
||||
Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
|
||||
|
||||
>
|
||||
|
||||
</Filter>
|
||||
|
||||
</Files>
|
||||
|
||||
<Globals>
|
||||
|
||||
</Globals>
|
||||
|
||||
</VisualStudioProject>
|
||||
|
||||
|
||||
@@ -1 +1,79 @@
|
||||
/**************** BEGIN GUSI CONFIGURATION ****************************
*
* GUSI Configuration section generated by GUSI Configurator
* last modified: Mon Oct 29 15:41:51 2001
*
* This section will be overwritten by the next run of Configurator.
*/
#define GUSI_SOURCE
#include <GUSIConfig.h>
#include <sys/cdefs.h>
/* Declarations of Socket Factories */
__BEGIN_DECLS
void GUSIwithInetSockets();
void GUSIwithLocalSockets();
void GUSIwithMTInetSockets();
void GUSIwithMTTcpSockets();
void GUSIwithMTUdpSockets();
void GUSIwithOTInetSockets();
void GUSIwithOTTcpSockets();
void GUSIwithOTUdpSockets();
void GUSIwithPPCSockets();
void GUSISetupFactories();
__END_DECLS
/* Configure Socket Factories */
void GUSISetupFactories()
{
#ifdef GUSISetupFactories_BeginHook
GUSISetupFactories_BeginHook
#endif
GUSIwithInetSockets();
#ifdef GUSISetupFactories_EndHook
GUSISetupFactories_EndHook
#endif
}
/* Declarations of File Devices */
__BEGIN_DECLS
void GUSIwithNullSockets();
void GUSISetupDevices();
__END_DECLS
/* Configure File Devices */
void GUSISetupDevices()
{
#ifdef GUSISetupDevices_BeginHook
GUSISetupDevices_BeginHook
#endif
GUSIwithNullSockets();
#ifdef GUSISetupDevices_EndHook
GUSISetupDevices_EndHook
#endif
}
#ifndef __cplusplus
#error GUSISetupConfig() needs to be written in C++
#endif
GUSIConfiguration::FileSuffix sSuffices[] = {
"", '????', '????'
};
extern "C" void GUSISetupConfig()
{
GUSIConfiguration * config =
GUSIConfiguration::CreateInstance(GUSIConfiguration::kNoResource);
config->ConfigureDefaultTypeCreator('TEXT', 'CWIE');
config->ConfigureSuffices(
sizeof(sSuffices)/sizeof(GUSIConfiguration::FileSuffix)-1, sSuffices);
}
/**************** END GUSI CONFIGURATION *************************/
|
||||
/**************** BEGIN GUSI CONFIGURATION ****************************
|
||||
*
|
||||
* GUSI Configuration section generated by GUSI Configurator
|
||||
* last modified: Mon Oct 29 15:41:51 2001
|
||||
*
|
||||
* This section will be overwritten by the next run of Configurator.
|
||||
*/
|
||||
|
||||
#define GUSI_SOURCE
|
||||
#include <GUSIConfig.h>
|
||||
#include <sys/cdefs.h>
|
||||
|
||||
/* Declarations of Socket Factories */
|
||||
|
||||
__BEGIN_DECLS
|
||||
void GUSIwithInetSockets();
|
||||
void GUSIwithLocalSockets();
|
||||
void GUSIwithMTInetSockets();
|
||||
void GUSIwithMTTcpSockets();
|
||||
void GUSIwithMTUdpSockets();
|
||||
void GUSIwithOTInetSockets();
|
||||
void GUSIwithOTTcpSockets();
|
||||
void GUSIwithOTUdpSockets();
|
||||
void GUSIwithPPCSockets();
|
||||
void GUSISetupFactories();
|
||||
__END_DECLS
|
||||
|
||||
/* Configure Socket Factories */
|
||||
|
||||
void GUSISetupFactories()
|
||||
{
|
||||
#ifdef GUSISetupFactories_BeginHook
|
||||
GUSISetupFactories_BeginHook
|
||||
#endif
|
||||
GUSIwithInetSockets();
|
||||
#ifdef GUSISetupFactories_EndHook
|
||||
GUSISetupFactories_EndHook
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Declarations of File Devices */
|
||||
|
||||
__BEGIN_DECLS
|
||||
void GUSIwithNullSockets();
|
||||
void GUSISetupDevices();
|
||||
__END_DECLS
|
||||
|
||||
/* Configure File Devices */
|
||||
|
||||
void GUSISetupDevices()
|
||||
{
|
||||
#ifdef GUSISetupDevices_BeginHook
|
||||
GUSISetupDevices_BeginHook
|
||||
#endif
|
||||
GUSIwithNullSockets();
|
||||
#ifdef GUSISetupDevices_EndHook
|
||||
GUSISetupDevices_EndHook
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifndef __cplusplus
|
||||
#error GUSISetupConfig() needs to be written in C++
|
||||
#endif
|
||||
|
||||
GUSIConfiguration::FileSuffix sSuffices[] = {
|
||||
"", '????', '????'
|
||||
};
|
||||
|
||||
extern "C" void GUSISetupConfig()
|
||||
{
|
||||
GUSIConfiguration * config =
|
||||
GUSIConfiguration::CreateInstance(GUSIConfiguration::kNoResource);
|
||||
|
||||
config->ConfigureDefaultTypeCreator('TEXT', 'CWIE');
|
||||
config->ConfigureSuffices(
|
||||
sizeof(sSuffices)/sizeof(GUSIConfiguration::FileSuffix)-1, sSuffices);
|
||||
}
|
||||
|
||||
/**************** END GUSI CONFIGURATION *************************/
|
||||
|
||||
@@ -1 +1,44 @@
|
||||
/* =========================================================================
Copyright (C) 2001 Eric Lavigne
Permission is granted to anyone to use this software for any purpose on any
computer system, and to redistribute it freely, subject to the following
restrictions:
- The author is not responsible for the consequences of use of this
software, no matter how awful, even if they arise from defects in it.
- The origin of this software must not be misrepresented, either by
explicit claim or by omission.
- You are allowed to distributed modified copies of the software, in source
and binary form, provided they are marked plainly as altered versions, and
are not misrepresented as being the original software.
========================================================================= */
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <Memory.h>
#include <GUSICommandLine.h>
#include <stdlib.h>
/* ========================================================================= */
DECLARE_MAIN(curl)
REGISTER_MAIN_START
REGISTER_MAIN(curl)
REGISTER_MAIN_END
/* ========================================================================= */
int main()
{
::MaxApplZone();
for (int i = 1; i <= 10; i++)
::MoreMasters();
(void) exec_commands();
return 0;
}
|
||||
/* =========================================================================
|
||||
Copyright (C) 2001 Eric Lavigne
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose on any
|
||||
computer system, and to redistribute it freely, subject to the following
|
||||
restrictions:
|
||||
- The author is not responsible for the consequences of use of this
|
||||
software, no matter how awful, even if they arise from defects in it.
|
||||
- The origin of this software must not be misrepresented, either by
|
||||
explicit claim or by omission.
|
||||
- You are allowed to distributed modified copies of the software, in source
|
||||
and binary form, provided they are marked plainly as altered versions, and
|
||||
are not misrepresented as being the original software.
|
||||
========================================================================= */
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <Memory.h>
|
||||
#include <GUSICommandLine.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
/* ========================================================================= */
|
||||
|
||||
DECLARE_MAIN(curl)
|
||||
|
||||
REGISTER_MAIN_START
|
||||
REGISTER_MAIN(curl)
|
||||
REGISTER_MAIN_END
|
||||
|
||||
/* ========================================================================= */
|
||||
|
||||
int main()
|
||||
{
|
||||
::MaxApplZone();
|
||||
for (int i = 1; i <= 10; i++)
|
||||
::MoreMasters();
|
||||
|
||||
(void) exec_commands();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -230,8 +230,8 @@ extern char iax_pref_codec_add(struct iax_session *session, unsigned int format)
|
||||
extern void iax_pref_codec_del(struct iax_session *session, unsigned int format);
|
||||
extern int iax_pref_codec_get(struct iax_session *session, unsigned int *array, int len);
|
||||
|
||||
/* Fine tune jitterbuffer */
|
||||
extern void iax_set_jb_target_extra( long value );
|
||||
/* Fine tune jitterbuffer */
|
||||
extern void iax_set_jb_target_extra( long value );
|
||||
|
||||
extern char *iax_get_peer_ip(struct iax_session *session);
|
||||
extern char *iax_event_get_apparent_ip(struct iax_event *event);
|
||||
|
||||
+1
-1
@@ -8,7 +8,7 @@
|
||||
* Mark Spencer <markster@linux-support.net>
|
||||
*
|
||||
* This program is free software, distributed under the terms of
|
||||
* the GNU Lesser (Library) General Public License
|
||||
* the GNU Lesser (Library) General Public License
|
||||
*/
|
||||
|
||||
#ifndef _IAX_H
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
* Mark Spencer <markster@digium.com>
|
||||
*
|
||||
* This program is free software, distributed under the terms of
|
||||
* the GNU Lesser (Library) General Public License
|
||||
* the GNU Lesser (Library) General Public License
|
||||
*/
|
||||
|
||||
#ifndef _IAX2_PARSER_H
|
||||
|
||||
+1
-1
@@ -8,7 +8,7 @@
|
||||
* Mark Spencer <markster@linux-support.net>
|
||||
*
|
||||
* This program is free software, distributed under the terms of
|
||||
* the GNU Lesser (Library) General Public License
|
||||
* the GNU Lesser (Library) General Public License
|
||||
*/
|
||||
|
||||
#ifndef _IAX2_H
|
||||
|
||||
+834
-834
File diff suppressed because it is too large
Load Diff
+162
-162
@@ -1,162 +1,162 @@
|
||||
/*
|
||||
* jitterbuf: an application-independent jitterbuffer
|
||||
*
|
||||
* Copyrights:
|
||||
* Copyright (C) 2004-2005, Horizon Wimba, Inc.
|
||||
*
|
||||
* Contributors:
|
||||
* Steve Kann <stevek@stevek.com>
|
||||
*
|
||||
* This program is free software, distributed under the terms of
|
||||
* the GNU Lesser (Library) General Public License
|
||||
*
|
||||
* Copyright on this file is disclaimed to Digium for inclusion in Asterisk
|
||||
*/
|
||||
|
||||
#ifndef _JITTERBUF_H_
|
||||
#define _JITTERBUF_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* configuration constants */
|
||||
/* Number of historical timestamps to use in calculating jitter and drift */
|
||||
#define JB_HISTORY_SZ 500
|
||||
/* what percentage of timestamps should we drop from the history when we examine it;
|
||||
* this might eventually be something made configurable */
|
||||
#define JB_HISTORY_DROPPCT 3
|
||||
/* the maximum droppct we can handle (say it was configurable). */
|
||||
#define JB_HISTORY_DROPPCT_MAX 4
|
||||
/* the size of the buffer we use to keep the top and botton timestamps for dropping */
|
||||
#define JB_HISTORY_MAXBUF_SZ JB_HISTORY_SZ * JB_HISTORY_DROPPCT_MAX / 100
|
||||
/* amount of additional jitterbuffer adjustment */
|
||||
#define JB_TARGET_EXTRA 40
|
||||
/* ms between growing and shrinking; may not be honored if jitterbuffer runs out of space */
|
||||
#define JB_ADJUST_DELAY 40
|
||||
|
||||
enum jb_return_code {
|
||||
/* return codes */
|
||||
JB_OK, /* 0 */
|
||||
JB_EMPTY, /* 1 */
|
||||
JB_NOFRAME, /* 2 */
|
||||
JB_INTERP, /* 3 */
|
||||
JB_DROP, /* 4 */
|
||||
JB_SCHED /* 5 */
|
||||
};
|
||||
|
||||
enum jb_frame_type {
|
||||
/* frame types */
|
||||
JB_TYPE_CONTROL, /* 0 */
|
||||
JB_TYPE_VOICE, /* 1 */
|
||||
JB_TYPE_VIDEO, /* 2 - reserved */
|
||||
JB_TYPE_SILENCE /* 3 */
|
||||
};
|
||||
|
||||
typedef struct jb_conf {
|
||||
/* settings */
|
||||
long max_jitterbuf; /* defines a hard clamp to use in setting the jitter buffer delay */
|
||||
long resync_threshold; /* the jb will resync when delay increases to (2 * jitter) + this param */
|
||||
long max_contig_interp; /* the max interp frames to return in a row */
|
||||
long target_extra; /* amount of additional jitterbuffer adjustment, overrides JB_TARGET_EXTRA */
|
||||
} jb_conf;
|
||||
|
||||
typedef struct jb_info {
|
||||
jb_conf conf;
|
||||
|
||||
/* statistics */
|
||||
long frames_in; /* number of frames input to the jitterbuffer.*/
|
||||
long frames_out; /* number of frames output from the jitterbuffer.*/
|
||||
long frames_late; /* number of frames which were too late, and dropped.*/
|
||||
long frames_lost; /* number of missing frames.*/
|
||||
long frames_dropped; /* number of frames dropped (shrinkage) */
|
||||
long frames_ooo; /* number of frames received out-of-order */
|
||||
long frames_cur; /* number of frames presently in jb, awaiting delivery.*/
|
||||
time_in_ms_t jitter; /* jitter measured within current history interval*/
|
||||
time_in_ms_t min; /* minimum lateness within current history interval */
|
||||
time_in_ms_t current; /* the present jitterbuffer adjustment */
|
||||
time_in_ms_t target; /* the target jitterbuffer adjustment */
|
||||
long losspct; /* recent lost frame percentage (* 1000) */
|
||||
time_in_ms_t next_voice_ts; /* the ts of the next frame to be read from the jb - in receiver's time */
|
||||
long last_voice_ms; /* the duration of the last voice frame */
|
||||
time_in_ms_t silence_begin_ts; /* the time of the last CNG frame, when in silence */
|
||||
time_in_ms_t last_adjustment; /* the time of the last adjustment */
|
||||
time_in_ms_t last_delay; /* the last now added to history */
|
||||
long cnt_delay_discont; /* the count of discontinuous delays */
|
||||
time_in_ms_t resync_offset; /* the amount to offset ts to support resyncs */
|
||||
long cnt_contig_interp; /* the number of contiguous interp frames returned */
|
||||
} jb_info;
|
||||
|
||||
typedef struct jb_frame {
|
||||
void *data; /* the frame data */
|
||||
time_in_ms_t ts; /* the relative delivery time expected */
|
||||
long ms; /* the time covered by this frame, in sec/8000 */
|
||||
enum jb_frame_type type; /* the type of frame */
|
||||
struct jb_frame *next, *prev;
|
||||
} jb_frame;
|
||||
|
||||
typedef struct jitterbuf {
|
||||
jb_info info;
|
||||
|
||||
/* history */
|
||||
time_in_ms_t history[JB_HISTORY_SZ]; /* history */
|
||||
int hist_ptr; /* points to index in history for next entry */
|
||||
time_in_ms_t hist_maxbuf[JB_HISTORY_MAXBUF_SZ]; /* a sorted buffer of the max delays (highest first) */
|
||||
time_in_ms_t hist_minbuf[JB_HISTORY_MAXBUF_SZ]; /* a sorted buffer of the min delays (lowest first) */
|
||||
int hist_maxbuf_valid; /* are the "maxbuf"/minbuf valid? */
|
||||
|
||||
jb_frame *frames; /* queued frames */
|
||||
jb_frame *free; /* free frames (avoid malloc?) */
|
||||
} jitterbuf;
|
||||
|
||||
|
||||
/* new jitterbuf */
|
||||
jitterbuf * jb_new(void);
|
||||
|
||||
/* destroy jitterbuf */
|
||||
void jb_destroy(jitterbuf *jb);
|
||||
|
||||
/* reset jitterbuf */
|
||||
/* NOTE: The jitterbuffer should be empty before you call this, otherwise
|
||||
* you will leak queued frames, and some internal structures */
|
||||
void jb_reset(jitterbuf *jb);
|
||||
|
||||
/* queue a frame data=frame data, timings (in ms): ms=length of frame (for voice), ts=ts (sender's time)
|
||||
* now=now (in receiver's time) return value is one of
|
||||
* JB_OK: Frame added. Last call to jb_next() still valid
|
||||
* JB_DROP: Drop this frame immediately
|
||||
* JB_SCHED: Frame added. Call jb_next() to get a new time for the next frame
|
||||
*/
|
||||
enum jb_return_code jb_put(jitterbuf *jb, void *data, const enum jb_frame_type type, long ms, time_in_ms_t ts, time_in_ms_t now);
|
||||
|
||||
/* get a frame for time now (receiver's time) return value is one of
|
||||
* JB_OK: You've got frame!
|
||||
* JB_DROP: Here's an audio frame you should just drop. Ask me again for this time..
|
||||
* JB_NOFRAME: There's no frame scheduled for this time.
|
||||
* JB_INTERP: Please interpolate an interpl-length frame for this time (either we need to grow, or there was a lost frame)
|
||||
* JB_EMPTY: The jb is empty.
|
||||
*/
|
||||
enum jb_return_code jb_get(jitterbuf *jb, jb_frame *frame, time_in_ms_t now, long interpl);
|
||||
|
||||
/* unconditionally get frames from jitterbuf until empty */
|
||||
enum jb_return_code jb_getall(jitterbuf *jb, jb_frame *frameout);
|
||||
|
||||
/* when is the next frame due out, in receiver's time (0=EMPTY)
|
||||
* This value may change as frames are added (esp non-audio frames) */
|
||||
time_in_ms_t jb_next(jitterbuf *jb);
|
||||
|
||||
/* get jitterbuf info: only "statistics" may be valid */
|
||||
enum jb_return_code jb_getinfo(jitterbuf *jb, jb_info *stats);
|
||||
|
||||
/* set jitterbuf conf */
|
||||
enum jb_return_code jb_setconf(jitterbuf *jb, jb_conf *conf);
|
||||
|
||||
typedef void (*jb_output_function_t)(const char *fmt, ...);
|
||||
extern void jb_setoutput(jb_output_function_t err, jb_output_function_t warn, jb_output_function_t dbg);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#endif
|
||||
/*
|
||||
* jitterbuf: an application-independent jitterbuffer
|
||||
*
|
||||
* Copyrights:
|
||||
* Copyright (C) 2004-2005, Horizon Wimba, Inc.
|
||||
*
|
||||
* Contributors:
|
||||
* Steve Kann <stevek@stevek.com>
|
||||
*
|
||||
* This program is free software, distributed under the terms of
|
||||
* the GNU Lesser (Library) General Public License
|
||||
*
|
||||
* Copyright on this file is disclaimed to Digium for inclusion in Asterisk
|
||||
*/
|
||||
|
||||
#ifndef _JITTERBUF_H_
|
||||
#define _JITTERBUF_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* configuration constants */
|
||||
/* Number of historical timestamps to use in calculating jitter and drift */
|
||||
#define JB_HISTORY_SZ 500
|
||||
/* what percentage of timestamps should we drop from the history when we examine it;
|
||||
* this might eventually be something made configurable */
|
||||
#define JB_HISTORY_DROPPCT 3
|
||||
/* the maximum droppct we can handle (say it was configurable). */
|
||||
#define JB_HISTORY_DROPPCT_MAX 4
|
||||
/* the size of the buffer we use to keep the top and botton timestamps for dropping */
|
||||
#define JB_HISTORY_MAXBUF_SZ JB_HISTORY_SZ * JB_HISTORY_DROPPCT_MAX / 100
|
||||
/* amount of additional jitterbuffer adjustment */
|
||||
#define JB_TARGET_EXTRA 40
|
||||
/* ms between growing and shrinking; may not be honored if jitterbuffer runs out of space */
|
||||
#define JB_ADJUST_DELAY 40
|
||||
|
||||
enum jb_return_code {
|
||||
/* return codes */
|
||||
JB_OK, /* 0 */
|
||||
JB_EMPTY, /* 1 */
|
||||
JB_NOFRAME, /* 2 */
|
||||
JB_INTERP, /* 3 */
|
||||
JB_DROP, /* 4 */
|
||||
JB_SCHED /* 5 */
|
||||
};
|
||||
|
||||
enum jb_frame_type {
|
||||
/* frame types */
|
||||
JB_TYPE_CONTROL, /* 0 */
|
||||
JB_TYPE_VOICE, /* 1 */
|
||||
JB_TYPE_VIDEO, /* 2 - reserved */
|
||||
JB_TYPE_SILENCE /* 3 */
|
||||
};
|
||||
|
||||
typedef struct jb_conf {
|
||||
/* settings */
|
||||
long max_jitterbuf; /* defines a hard clamp to use in setting the jitter buffer delay */
|
||||
long resync_threshold; /* the jb will resync when delay increases to (2 * jitter) + this param */
|
||||
long max_contig_interp; /* the max interp frames to return in a row */
|
||||
long target_extra; /* amount of additional jitterbuffer adjustment, overrides JB_TARGET_EXTRA */
|
||||
} jb_conf;
|
||||
|
||||
typedef struct jb_info {
|
||||
jb_conf conf;
|
||||
|
||||
/* statistics */
|
||||
long frames_in; /* number of frames input to the jitterbuffer.*/
|
||||
long frames_out; /* number of frames output from the jitterbuffer.*/
|
||||
long frames_late; /* number of frames which were too late, and dropped.*/
|
||||
long frames_lost; /* number of missing frames.*/
|
||||
long frames_dropped; /* number of frames dropped (shrinkage) */
|
||||
long frames_ooo; /* number of frames received out-of-order */
|
||||
long frames_cur; /* number of frames presently in jb, awaiting delivery.*/
|
||||
time_in_ms_t jitter; /* jitter measured within current history interval*/
|
||||
time_in_ms_t min; /* minimum lateness within current history interval */
|
||||
time_in_ms_t current; /* the present jitterbuffer adjustment */
|
||||
time_in_ms_t target; /* the target jitterbuffer adjustment */
|
||||
long losspct; /* recent lost frame percentage (* 1000) */
|
||||
time_in_ms_t next_voice_ts; /* the ts of the next frame to be read from the jb - in receiver's time */
|
||||
long last_voice_ms; /* the duration of the last voice frame */
|
||||
time_in_ms_t silence_begin_ts; /* the time of the last CNG frame, when in silence */
|
||||
time_in_ms_t last_adjustment; /* the time of the last adjustment */
|
||||
time_in_ms_t last_delay; /* the last now added to history */
|
||||
long cnt_delay_discont; /* the count of discontinuous delays */
|
||||
time_in_ms_t resync_offset; /* the amount to offset ts to support resyncs */
|
||||
long cnt_contig_interp; /* the number of contiguous interp frames returned */
|
||||
} jb_info;
|
||||
|
||||
typedef struct jb_frame {
|
||||
void *data; /* the frame data */
|
||||
time_in_ms_t ts; /* the relative delivery time expected */
|
||||
long ms; /* the time covered by this frame, in sec/8000 */
|
||||
enum jb_frame_type type; /* the type of frame */
|
||||
struct jb_frame *next, *prev;
|
||||
} jb_frame;
|
||||
|
||||
typedef struct jitterbuf {
|
||||
jb_info info;
|
||||
|
||||
/* history */
|
||||
time_in_ms_t history[JB_HISTORY_SZ]; /* history */
|
||||
int hist_ptr; /* points to index in history for next entry */
|
||||
time_in_ms_t hist_maxbuf[JB_HISTORY_MAXBUF_SZ]; /* a sorted buffer of the max delays (highest first) */
|
||||
time_in_ms_t hist_minbuf[JB_HISTORY_MAXBUF_SZ]; /* a sorted buffer of the min delays (lowest first) */
|
||||
int hist_maxbuf_valid; /* are the "maxbuf"/minbuf valid? */
|
||||
|
||||
jb_frame *frames; /* queued frames */
|
||||
jb_frame *free; /* free frames (avoid malloc?) */
|
||||
} jitterbuf;
|
||||
|
||||
|
||||
/* new jitterbuf */
|
||||
jitterbuf * jb_new(void);
|
||||
|
||||
/* destroy jitterbuf */
|
||||
void jb_destroy(jitterbuf *jb);
|
||||
|
||||
/* reset jitterbuf */
|
||||
/* NOTE: The jitterbuffer should be empty before you call this, otherwise
|
||||
* you will leak queued frames, and some internal structures */
|
||||
void jb_reset(jitterbuf *jb);
|
||||
|
||||
/* queue a frame data=frame data, timings (in ms): ms=length of frame (for voice), ts=ts (sender's time)
|
||||
* now=now (in receiver's time) return value is one of
|
||||
* JB_OK: Frame added. Last call to jb_next() still valid
|
||||
* JB_DROP: Drop this frame immediately
|
||||
* JB_SCHED: Frame added. Call jb_next() to get a new time for the next frame
|
||||
*/
|
||||
enum jb_return_code jb_put(jitterbuf *jb, void *data, const enum jb_frame_type type, long ms, time_in_ms_t ts, time_in_ms_t now);
|
||||
|
||||
/* get a frame for time now (receiver's time) return value is one of
|
||||
* JB_OK: You've got frame!
|
||||
* JB_DROP: Here's an audio frame you should just drop. Ask me again for this time..
|
||||
* JB_NOFRAME: There's no frame scheduled for this time.
|
||||
* JB_INTERP: Please interpolate an interpl-length frame for this time (either we need to grow, or there was a lost frame)
|
||||
* JB_EMPTY: The jb is empty.
|
||||
*/
|
||||
enum jb_return_code jb_get(jitterbuf *jb, jb_frame *frame, time_in_ms_t now, long interpl);
|
||||
|
||||
/* unconditionally get frames from jitterbuf until empty */
|
||||
enum jb_return_code jb_getall(jitterbuf *jb, jb_frame *frameout);
|
||||
|
||||
/* when is the next frame due out, in receiver's time (0=EMPTY)
|
||||
* This value may change as frames are added (esp non-audio frames) */
|
||||
time_in_ms_t jb_next(jitterbuf *jb);
|
||||
|
||||
/* get jitterbuf info: only "statistics" may be valid */
|
||||
enum jb_return_code jb_getinfo(jitterbuf *jb, jb_info *stats);
|
||||
|
||||
/* set jitterbuf conf */
|
||||
enum jb_return_code jb_setconf(jitterbuf *jb, jb_conf *conf);
|
||||
|
||||
typedef void (*jb_output_function_t)(const char *fmt, ...);
|
||||
extern void jb_setoutput(jb_output_function_t err, jb_output_function_t warn, jb_output_function_t dbg);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
Executable → Regular
Executable → Regular
@@ -34,18 +34,18 @@
|
||||
#else
|
||||
# if HAVE_STDINT_H
|
||||
# include <stdint.h>
|
||||
# else
|
||||
# ifndef uint32_t
|
||||
# ifdef WIN32
|
||||
typedef unsigned __int8 uint8_t;
|
||||
typedef unsigned __int16 uint16_t;
|
||||
typedef unsigned __int32 uint32_t;
|
||||
typedef unsigned __int64 uint64_t;
|
||||
typedef __int8 int8_t;
|
||||
typedef __int16 int16_t;
|
||||
typedef __int32 int32_t;
|
||||
typedef __int64 int64_t;
|
||||
typedef unsigned long in_addr_t;
|
||||
# else
|
||||
# ifndef uint32_t
|
||||
# ifdef WIN32
|
||||
typedef unsigned __int8 uint8_t;
|
||||
typedef unsigned __int16 uint16_t;
|
||||
typedef unsigned __int32 uint32_t;
|
||||
typedef unsigned __int64 uint64_t;
|
||||
typedef __int8 int8_t;
|
||||
typedef __int16 int16_t;
|
||||
typedef __int32 int32_t;
|
||||
typedef __int64 int64_t;
|
||||
typedef unsigned long in_addr_t;
|
||||
# endif
|
||||
# endif
|
||||
# endif
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,170 +1,170 @@
|
||||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="7.10"
|
||||
Name="readmsg"
|
||||
ProjectGUID="{5FEA913A-5CE4-4DEB-B6BE-B8EA1BF6F653}"
|
||||
Keyword="Win32Proj">
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"/>
|
||||
</Platforms>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
OutputDirectory="Debug"
|
||||
IntermediateDirectory="Debug"
|
||||
ConfigurationType="1"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories="../include/libetpan/;../include;../../src/gnu"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_MBCS"
|
||||
MinimalRebuild="TRUE"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="3"
|
||||
UsePrecompiledHeader="0"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="TRUE"
|
||||
DebugInformationFormat="4"
|
||||
CompileAs="1"
|
||||
ForcedIncludeFiles="../../StdAfx.h"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="libetpan.lib"
|
||||
OutputFile="../Debug/readmsg.exe"
|
||||
LinkIncremental="2"
|
||||
AdditionalLibraryDirectories="..\Debug"
|
||||
IgnoreDefaultLibraryNames="C"
|
||||
GenerateDebugInformation="TRUE"
|
||||
ProgramDatabaseFile="$(OutDir)/readmsg.pdb"
|
||||
SubSystem="1"
|
||||
TargetMachine="1"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory="Release"
|
||||
IntermediateDirectory="Release"
|
||||
ConfigurationType="1"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories="../include/libetpan/;../include;../../src/gnu"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
||||
RuntimeLibrary="2"
|
||||
UsePrecompiledHeader="0"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="TRUE"
|
||||
DebugInformationFormat="0"
|
||||
ForcedIncludeFiles="../StdAfx.h"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="libetpan.lib"
|
||||
OutputFile="../Release/readmsg.exe"
|
||||
LinkIncremental="1"
|
||||
AdditionalLibraryDirectories="..\Release"
|
||||
IgnoreDefaultLibraryNames="C"
|
||||
GenerateDebugInformation="TRUE"
|
||||
SubSystem="1"
|
||||
OptimizeReferences="2"
|
||||
EnableCOMDATFolding="2"
|
||||
TargetMachine="1"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<References>
|
||||
</References>
|
||||
<Files>
|
||||
<Filter
|
||||
Name="Source Files"
|
||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
||||
<File
|
||||
RelativePath="..\..\src\bsd\getopt.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\bsd\getopt_long.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\tests\Makefile">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32"
|
||||
ExcludedFromBuild="TRUE">
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32"
|
||||
ExcludedFromBuild="TRUE">
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\tests\option-parser.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\tests\readmsg-common.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\tests\readmsg.c">
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files"
|
||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Resource Files"
|
||||
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
|
||||
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
||||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="7.10"
|
||||
Name="readmsg"
|
||||
ProjectGUID="{5FEA913A-5CE4-4DEB-B6BE-B8EA1BF6F653}"
|
||||
Keyword="Win32Proj">
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"/>
|
||||
</Platforms>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
OutputDirectory="Debug"
|
||||
IntermediateDirectory="Debug"
|
||||
ConfigurationType="1"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories="../include/libetpan/;../include;../../src/gnu"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_MBCS"
|
||||
MinimalRebuild="TRUE"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="3"
|
||||
UsePrecompiledHeader="0"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="TRUE"
|
||||
DebugInformationFormat="4"
|
||||
CompileAs="1"
|
||||
ForcedIncludeFiles="../../StdAfx.h"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="libetpan.lib"
|
||||
OutputFile="../Debug/readmsg.exe"
|
||||
LinkIncremental="2"
|
||||
AdditionalLibraryDirectories="..\Debug"
|
||||
IgnoreDefaultLibraryNames="C"
|
||||
GenerateDebugInformation="TRUE"
|
||||
ProgramDatabaseFile="$(OutDir)/readmsg.pdb"
|
||||
SubSystem="1"
|
||||
TargetMachine="1"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory="Release"
|
||||
IntermediateDirectory="Release"
|
||||
ConfigurationType="1"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories="../include/libetpan/;../include;../../src/gnu"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
||||
RuntimeLibrary="2"
|
||||
UsePrecompiledHeader="0"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="TRUE"
|
||||
DebugInformationFormat="0"
|
||||
ForcedIncludeFiles="../StdAfx.h"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="libetpan.lib"
|
||||
OutputFile="../Release/readmsg.exe"
|
||||
LinkIncremental="1"
|
||||
AdditionalLibraryDirectories="..\Release"
|
||||
IgnoreDefaultLibraryNames="C"
|
||||
GenerateDebugInformation="TRUE"
|
||||
SubSystem="1"
|
||||
OptimizeReferences="2"
|
||||
EnableCOMDATFolding="2"
|
||||
TargetMachine="1"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<References>
|
||||
</References>
|
||||
<Files>
|
||||
<Filter
|
||||
Name="Source Files"
|
||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
||||
<File
|
||||
RelativePath="..\..\src\bsd\getopt.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\bsd\getopt_long.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\tests\Makefile">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32"
|
||||
ExcludedFromBuild="TRUE">
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32"
|
||||
ExcludedFromBuild="TRUE">
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\tests\option-parser.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\tests\readmsg-common.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\tests\readmsg.c">
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files"
|
||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Resource Files"
|
||||
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
|
||||
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
||||
|
||||
@@ -1,164 +1,164 @@
|
||||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="7.10"
|
||||
Name="smtpsend"
|
||||
ProjectGUID="{FF9F45C9-74A0-4B4E-99E9-6ADE0EB6D8AC}"
|
||||
Keyword="Win32Proj">
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"/>
|
||||
</Platforms>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
OutputDirectory="Debug"
|
||||
IntermediateDirectory="Debug"
|
||||
ConfigurationType="1"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories="../include/libetpan/;../include;../../src/gnu"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_MBCS"
|
||||
MinimalRebuild="TRUE"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="3"
|
||||
UsePrecompiledHeader="0"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="TRUE"
|
||||
DebugInformationFormat="4"
|
||||
CompileAs="1"
|
||||
ForcedIncludeFiles="../../StdAfx.h"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="libetpan.lib"
|
||||
OutputFile="../Debug/smtpsend.exe"
|
||||
LinkIncremental="2"
|
||||
AdditionalLibraryDirectories="..\Debug"
|
||||
IgnoreDefaultLibraryNames="C"
|
||||
GenerateDebugInformation="TRUE"
|
||||
ProgramDatabaseFile="$(OutDir)/smtpsend.pdb"
|
||||
SubSystem="1"
|
||||
TargetMachine="1"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory="Release"
|
||||
IntermediateDirectory="Release"
|
||||
ConfigurationType="1"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories="../include/libetpan/;../include;../../src/gnu"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
||||
RuntimeLibrary="2"
|
||||
UsePrecompiledHeader="0"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="TRUE"
|
||||
DebugInformationFormat="0"
|
||||
ForcedIncludeFiles="../StdAfx.h"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="libetpan.lib"
|
||||
OutputFile="../Release/smtpsend.exe"
|
||||
LinkIncremental="1"
|
||||
AdditionalLibraryDirectories="..\Release"
|
||||
IgnoreDefaultLibraryNames="C"
|
||||
GenerateDebugInformation="TRUE"
|
||||
SubSystem="1"
|
||||
OptimizeReferences="2"
|
||||
EnableCOMDATFolding="2"
|
||||
TargetMachine="1"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<References>
|
||||
</References>
|
||||
<Files>
|
||||
<Filter
|
||||
Name="Source Files"
|
||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
||||
<File
|
||||
RelativePath="..\..\src\bsd\getopt.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\bsd\getopt_long.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\tests\Makefile">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32"
|
||||
ExcludedFromBuild="TRUE">
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32"
|
||||
ExcludedFromBuild="TRUE">
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\tests\smtpsend.c">
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files"
|
||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Resource Files"
|
||||
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
|
||||
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
||||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="7.10"
|
||||
Name="smtpsend"
|
||||
ProjectGUID="{FF9F45C9-74A0-4B4E-99E9-6ADE0EB6D8AC}"
|
||||
Keyword="Win32Proj">
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"/>
|
||||
</Platforms>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
OutputDirectory="Debug"
|
||||
IntermediateDirectory="Debug"
|
||||
ConfigurationType="1"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories="../include/libetpan/;../include;../../src/gnu"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_MBCS"
|
||||
MinimalRebuild="TRUE"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="3"
|
||||
UsePrecompiledHeader="0"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="TRUE"
|
||||
DebugInformationFormat="4"
|
||||
CompileAs="1"
|
||||
ForcedIncludeFiles="../../StdAfx.h"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="libetpan.lib"
|
||||
OutputFile="../Debug/smtpsend.exe"
|
||||
LinkIncremental="2"
|
||||
AdditionalLibraryDirectories="..\Debug"
|
||||
IgnoreDefaultLibraryNames="C"
|
||||
GenerateDebugInformation="TRUE"
|
||||
ProgramDatabaseFile="$(OutDir)/smtpsend.pdb"
|
||||
SubSystem="1"
|
||||
TargetMachine="1"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory="Release"
|
||||
IntermediateDirectory="Release"
|
||||
ConfigurationType="1"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories="../include/libetpan/;../include;../../src/gnu"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
||||
RuntimeLibrary="2"
|
||||
UsePrecompiledHeader="0"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="TRUE"
|
||||
DebugInformationFormat="0"
|
||||
ForcedIncludeFiles="../StdAfx.h"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="libetpan.lib"
|
||||
OutputFile="../Release/smtpsend.exe"
|
||||
LinkIncremental="1"
|
||||
AdditionalLibraryDirectories="..\Release"
|
||||
IgnoreDefaultLibraryNames="C"
|
||||
GenerateDebugInformation="TRUE"
|
||||
SubSystem="1"
|
||||
OptimizeReferences="2"
|
||||
EnableCOMDATFolding="2"
|
||||
TargetMachine="1"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<References>
|
||||
</References>
|
||||
<Files>
|
||||
<Filter
|
||||
Name="Source Files"
|
||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
||||
<File
|
||||
RelativePath="..\..\src\bsd\getopt.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\bsd\getopt_long.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\tests\Makefile">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32"
|
||||
ExcludedFromBuild="TRUE">
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32"
|
||||
ExcludedFromBuild="TRUE">
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\tests\smtpsend.c">
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files"
|
||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Resource Files"
|
||||
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
|
||||
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
||||
|
||||
@@ -1,137 +1,137 @@
|
||||
// ---------------------------------------------------------------------------------------
|
||||
|
||||
#include <iostream>
|
||||
#include <cmath>
|
||||
#include <cassert>
|
||||
#include <cstddef>
|
||||
#include "portaudiocpp/PortAudioCpp.hxx"
|
||||
|
||||
// ---------------------------------------------------------------------------------------
|
||||
|
||||
// Some constants:
|
||||
const int NUM_SECONDS = 5;
|
||||
const double SAMPLE_RATE = 44100.0;
|
||||
const int FRAMES_PER_BUFFER = 64;
|
||||
const int TABLE_SIZE = 200;
|
||||
|
||||
// ---------------------------------------------------------------------------------------
|
||||
|
||||
// SineGenerator class:
|
||||
class SineGenerator
|
||||
{
|
||||
public:
|
||||
SineGenerator(int tableSize) : tableSize_(tableSize), leftPhase_(0), rightPhase_(0)
|
||||
{
|
||||
const double PI = 3.14159265;
|
||||
table_ = new float[tableSize];
|
||||
for (int i = 0; i < tableSize; ++i)
|
||||
{
|
||||
table_[i] = 0.125f * (float)sin(((double)i/(double)tableSize)*PI*2.);
|
||||
}
|
||||
}
|
||||
|
||||
~SineGenerator()
|
||||
{
|
||||
delete[] table_;
|
||||
}
|
||||
|
||||
int generate(const void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer,
|
||||
const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags)
|
||||
{
|
||||
assert(outputBuffer != NULL);
|
||||
|
||||
float **out = static_cast<float **>(outputBuffer);
|
||||
|
||||
for (unsigned int i = 0; i < framesPerBuffer; ++i)
|
||||
{
|
||||
out[0][i] = table_[leftPhase_];
|
||||
out[1][i] = table_[rightPhase_];
|
||||
|
||||
leftPhase_ += 1;
|
||||
if (leftPhase_ >= tableSize_)
|
||||
leftPhase_ -= tableSize_;
|
||||
|
||||
rightPhase_ += 3;
|
||||
if (rightPhase_ >= tableSize_)
|
||||
rightPhase_ -= tableSize_;
|
||||
}
|
||||
|
||||
return paContinue;
|
||||
}
|
||||
|
||||
private:
|
||||
float *table_;
|
||||
int tableSize_;
|
||||
int leftPhase_;
|
||||
int rightPhase_;
|
||||
};
|
||||
|
||||
// ---------------------------------------------------------------------------------------
|
||||
|
||||
// main:
|
||||
int main(int, char *[]);
|
||||
int main(int, char *[])
|
||||
{
|
||||
try
|
||||
{
|
||||
// Create a SineGenerator object:
|
||||
SineGenerator sineGenerator(TABLE_SIZE);
|
||||
|
||||
std::cout << "Setting up PortAudio..." << std::endl;
|
||||
|
||||
// Set up the System:
|
||||
portaudio::AutoSystem autoSys;
|
||||
portaudio::System &sys = portaudio::System::instance();
|
||||
|
||||
// Set up the parameters required to open a (Callback)Stream:
|
||||
portaudio::DirectionSpecificStreamParameters outParams(sys.defaultOutputDevice(), 2, portaudio::FLOAT32, false, sys.defaultOutputDevice().defaultLowOutputLatency(), NULL);
|
||||
portaudio::StreamParameters params(portaudio::DirectionSpecificStreamParameters::null(), outParams, SAMPLE_RATE, FRAMES_PER_BUFFER, paClipOff);
|
||||
|
||||
std::cout << "Opening stereo output stream..." << std::endl;
|
||||
|
||||
// Create (and open) a new Stream, using the SineGenerator::generate function as a callback:
|
||||
portaudio::MemFunCallbackStream<SineGenerator> stream(params, sineGenerator, &SineGenerator::generate);
|
||||
|
||||
std::cout << "Starting playback for " << NUM_SECONDS << " seconds." << std::endl;
|
||||
|
||||
// Start the Stream (audio playback starts):
|
||||
stream.start();
|
||||
|
||||
// Wait for 5 seconds:
|
||||
sys.sleep(NUM_SECONDS * 1000);
|
||||
|
||||
std::cout << "Closing stream..." <<std::endl;
|
||||
|
||||
// Stop the Stream (not strictly needed as termintating the System will also stop all open Streams):
|
||||
stream.stop();
|
||||
|
||||
// Close the Stream (not strictly needed as terminating the System will also close all open Streams):
|
||||
stream.close();
|
||||
|
||||
// Terminate the System (not strictly needed as the AutoSystem will also take care of this when it
|
||||
// goes out of scope):
|
||||
sys.terminate();
|
||||
|
||||
std::cout << "Test finished." << std::endl;
|
||||
}
|
||||
catch (const portaudio::PaException &e)
|
||||
{
|
||||
std::cout << "A PortAudio error occured: " << e.paErrorText() << std::endl;
|
||||
}
|
||||
catch (const portaudio::PaCppException &e)
|
||||
{
|
||||
std::cout << "A PortAudioCpp error occured: " << e.what() << std::endl;
|
||||
}
|
||||
catch (const std::exception &e)
|
||||
{
|
||||
std::cout << "A generic exception occured: " << e.what() << std::endl;
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
std::cout << "An unknown exception occured." << std::endl;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
// ---------------------------------------------------------------------------------------
|
||||
|
||||
#include <iostream>
|
||||
#include <cmath>
|
||||
#include <cassert>
|
||||
#include <cstddef>
|
||||
#include "portaudiocpp/PortAudioCpp.hxx"
|
||||
|
||||
// ---------------------------------------------------------------------------------------
|
||||
|
||||
// Some constants:
|
||||
const int NUM_SECONDS = 5;
|
||||
const double SAMPLE_RATE = 44100.0;
|
||||
const int FRAMES_PER_BUFFER = 64;
|
||||
const int TABLE_SIZE = 200;
|
||||
|
||||
// ---------------------------------------------------------------------------------------
|
||||
|
||||
// SineGenerator class:
|
||||
class SineGenerator
|
||||
{
|
||||
public:
|
||||
SineGenerator(int tableSize) : tableSize_(tableSize), leftPhase_(0), rightPhase_(0)
|
||||
{
|
||||
const double PI = 3.14159265;
|
||||
table_ = new float[tableSize];
|
||||
for (int i = 0; i < tableSize; ++i)
|
||||
{
|
||||
table_[i] = 0.125f * (float)sin(((double)i/(double)tableSize)*PI*2.);
|
||||
}
|
||||
}
|
||||
|
||||
~SineGenerator()
|
||||
{
|
||||
delete[] table_;
|
||||
}
|
||||
|
||||
int generate(const void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer,
|
||||
const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags)
|
||||
{
|
||||
assert(outputBuffer != NULL);
|
||||
|
||||
float **out = static_cast<float **>(outputBuffer);
|
||||
|
||||
for (unsigned int i = 0; i < framesPerBuffer; ++i)
|
||||
{
|
||||
out[0][i] = table_[leftPhase_];
|
||||
out[1][i] = table_[rightPhase_];
|
||||
|
||||
leftPhase_ += 1;
|
||||
if (leftPhase_ >= tableSize_)
|
||||
leftPhase_ -= tableSize_;
|
||||
|
||||
rightPhase_ += 3;
|
||||
if (rightPhase_ >= tableSize_)
|
||||
rightPhase_ -= tableSize_;
|
||||
}
|
||||
|
||||
return paContinue;
|
||||
}
|
||||
|
||||
private:
|
||||
float *table_;
|
||||
int tableSize_;
|
||||
int leftPhase_;
|
||||
int rightPhase_;
|
||||
};
|
||||
|
||||
// ---------------------------------------------------------------------------------------
|
||||
|
||||
// main:
|
||||
int main(int, char *[]);
|
||||
int main(int, char *[])
|
||||
{
|
||||
try
|
||||
{
|
||||
// Create a SineGenerator object:
|
||||
SineGenerator sineGenerator(TABLE_SIZE);
|
||||
|
||||
std::cout << "Setting up PortAudio..." << std::endl;
|
||||
|
||||
// Set up the System:
|
||||
portaudio::AutoSystem autoSys;
|
||||
portaudio::System &sys = portaudio::System::instance();
|
||||
|
||||
// Set up the parameters required to open a (Callback)Stream:
|
||||
portaudio::DirectionSpecificStreamParameters outParams(sys.defaultOutputDevice(), 2, portaudio::FLOAT32, false, sys.defaultOutputDevice().defaultLowOutputLatency(), NULL);
|
||||
portaudio::StreamParameters params(portaudio::DirectionSpecificStreamParameters::null(), outParams, SAMPLE_RATE, FRAMES_PER_BUFFER, paClipOff);
|
||||
|
||||
std::cout << "Opening stereo output stream..." << std::endl;
|
||||
|
||||
// Create (and open) a new Stream, using the SineGenerator::generate function as a callback:
|
||||
portaudio::MemFunCallbackStream<SineGenerator> stream(params, sineGenerator, &SineGenerator::generate);
|
||||
|
||||
std::cout << "Starting playback for " << NUM_SECONDS << " seconds." << std::endl;
|
||||
|
||||
// Start the Stream (audio playback starts):
|
||||
stream.start();
|
||||
|
||||
// Wait for 5 seconds:
|
||||
sys.sleep(NUM_SECONDS * 1000);
|
||||
|
||||
std::cout << "Closing stream..." <<std::endl;
|
||||
|
||||
// Stop the Stream (not strictly needed as termintating the System will also stop all open Streams):
|
||||
stream.stop();
|
||||
|
||||
// Close the Stream (not strictly needed as terminating the System will also close all open Streams):
|
||||
stream.close();
|
||||
|
||||
// Terminate the System (not strictly needed as the AutoSystem will also take care of this when it
|
||||
// goes out of scope):
|
||||
sys.terminate();
|
||||
|
||||
std::cout << "Test finished." << std::endl;
|
||||
}
|
||||
catch (const portaudio::PaException &e)
|
||||
{
|
||||
std::cout << "A PortAudio error occured: " << e.paErrorText() << std::endl;
|
||||
}
|
||||
catch (const portaudio::PaCppException &e)
|
||||
{
|
||||
std::cout << "A PortAudioCpp error occured: " << e.what() << std::endl;
|
||||
}
|
||||
catch (const std::exception &e)
|
||||
{
|
||||
std::cout << "A generic exception occured: " << e.what() << std::endl;
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
std::cout << "An unknown exception occured." << std::endl;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user