📄 cod_ld8a.c
字号:
/*
ITU-T G.729 Annex C - Reference C code for floating point
implementation of G.729 Annex A
Version 1.01 of 15.September.98
*/
/*
----------------------------------------------------------------------
COPYRIGHT NOTICE
----------------------------------------------------------------------
ITU-T G.729 Annex C ANSI C source code
Copyright (C) 1998, AT&T, France Telecom, NTT, University of
Sherbrooke. All rights reserved.
----------------------------------------------------------------------
*/
/*
File : COD_LD8A.C
Used for the floating point version of G.729A only
(not for G.729 main body)
*/
/*-----------------------------------------------------------------*
* Functions coder_ld8a and init_coder_ld8a *
* ~~~~~~~~~~ ~~~~~~~~~~~~~~~ *
* *
* init_coder_ld8a(void); *
* *
* ->Initialization of variables for the coder section. *
* *
* *
* coder_ld8a(Short ana[]); *
* *
* ->Main coder function. *
* *
* *
* Input: *
* *
* 80 speech data should have beee copy to vector new_speech[]. *
* This vector is global and is declared in this function. *
* *
* Ouputs: *
* *
* ana[] ->analysis parameters. *
* *
*-----------------------------------------------------------------*/
#include <math.h>
#include "typedef.h"
#include "ld8a.h"
/*-----------------------------------------------------------*
* Coder constant parameters (defined in "ld8a.h") *
*-----------------------------------------------------------*
* L_WINDOW : LPC analysis window size. *
* L_NEXT : Samples of next frame needed for autocor. *
* L_FRAME : Frame size. *
* L_SUBFR : Sub-frame size. *
* M : LPC order. *
* MP1 : LPC order+1 *
* L_TOTAL : Total size of speech buffer. *
* PIT_MIN : Minimum pitch lag. *
* PIT_MAX : Maximum pitch lag. *
* L_INTERPOL : Length of filter for interpolation *
*-----------------------------------------------------------*/
/*--------------------------------------------------------*
* Static memory allocation. *
*--------------------------------------------------------*/
/* Speech vector */
static FLOAT old_speech[L_TOTAL];
static FLOAT *speech, *p_window;
FLOAT *new_speech; /* Global variable */
/* Weighted speech vector */
static FLOAT old_wsp[L_FRAME+PIT_MAX];
static FLOAT *wsp;
/* Excitation vector */
static FLOAT old_exc[L_FRAME+PIT_MAX+L_INTERPOL];
static FLOAT *exc;
/* LSP Line spectral frequencies */
static FLOAT lsp_old[M] =
{ (F)0.9595, (F)0.8413, (F)0.6549, (F)0.4154, (F)0.1423,
(F)-0.1423, (F)-0.4154, (F)-0.6549, (F)-0.8413, (F)-0.9595};
static FLOAT lsp_old_q[M];
/* Filter's memory */
static FLOAT mem_w0[M], mem_w[M], mem_zero[M];
static FLOAT sharp;
/*-----------------------------------------------------------------*
* Function init_coder_ld8a *
* ~~~~~~~~~~~~~~~ *
* *
* init_coder_ld8a(void); *
* *
* ->Initialization of variables for the coder section. *
* - initialize pointers to speech buffer *
* - initialize static pointers *
* - set static vectors to zero *
*-----------------------------------------------------------------*/
void init_coder_ld8a(void)
{
/*----------------------------------------------------------------------*
* Initialize pointers to speech vector. *
* *
* *
* |--------------------|-------------|-------------|------------| *
* previous speech sf1 sf2 L_NEXT *
* *
* <---------------- Total speech vector (L_TOTAL) -----------> *
* <---------------- LPC analysis window (L_WINDOW) -----------> *
* | <-- present frame (L_FRAME) --> *
* old_speech | <-- new speech (L_FRAME) --> *
* p_window | | *
* speech | *
* new_speech *
*-----------------------------------------------------------------------*/
new_speech = old_speech + L_TOTAL - L_FRAME; /* New speech */
speech = new_speech - L_NEXT; /* Present frame */
p_window = old_speech + L_TOTAL - L_WINDOW; /* For LPC window */
/* Initialize static pointers */
wsp = old_wsp + PIT_MAX;
exc = old_exc + PIT_MAX + L_INTERPOL;
/* Static vectors to zero */
set_zero(old_speech, L_TOTAL);
set_zero(old_exc, PIT_MAX+L_INTERPOL);
set_zero(old_wsp, PIT_MAX);
set_zero(mem_w, M);
set_zero(mem_w0, M);
set_zero(mem_zero, M);
sharp = SHARPMIN;
copy(lsp_old, lsp_old_q, M);
lsp_encw_reset() ;
init_exc_err();
return;
}
/*-----------------------------------------------------------------*
* Function coder_ld8a *
* ~~~~~~~~~~ *
* coder_ld8a(int ana[]); *
* *
* ->Main coder function. *
* *
* *
* Input: *
* *
* 80 speech data should have beee copy to vector new_speech[]. *
* This vector is global and is declared in this function. *
* *
* Ouputs: *
* *
* ana[] ->analysis parameters. *
* *
*-----------------------------------------------------------------*/
void coder_ld8a(
int ana[] /* output: analysis parameters */
)
{
/* LPC coefficients */
FLOAT Aq_t[(MP1)*2]; /* A(z) quantized for the 2 subframes */
FLOAT Ap_t[(MP1)*2]; /* A(z) with spectral expansion */
FLOAT *Aq, *Ap; /* Pointer on Aq_t and Ap_t */
/* Other vectors */
FLOAT h1[L_SUBFR]; /* Impulse response h1[] */
FLOAT xn[L_SUBFR]; /* Target vector for pitch search */
FLOAT xn2[L_SUBFR]; /* Target vector for codebook search */
FLOAT code[L_SUBFR]; /* Fixed codebook excitation */
FLOAT y1[L_SUBFR]; /* Filtered adaptive excitation */
FLOAT y2[L_SUBFR]; /* Filtered fixed codebook excitation */
FLOAT g_coeff[5]; /* Correlations between xn, y1, & y2:
<y1,y1>, <xn,y1>, <y2,y2>, <xn,y2>,<y1,y2>*/
/* Scalars */
int i, j, i_subfr;
int T_op, T0, T0_min, T0_max, T0_frac;
int index;
FLOAT gain_pit, gain_code;
int taming;
/*------------------------------------------------------------------------*
* - Perform LPC analysis: *
* * autocorrelation + lag windowing *
* * Levinson-durbin algorithm to find a[] *
* * convert a[] to lsp[] *
* * quantize and code the LSPs *
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -