📄 bwfwfunc.c
字号:
/* ITU-T G.729 Annex C+ - Reference C code for floating point implementation of G.729 Annex C+ (integration of Annexes B, D and E) Version 2.1 of October 1999*//* File : BWFWFUNC.C */#include <stdio.h>#include <math.h>#include "typedef.h"#include "ld8k.h"#include "ld8cp.h"#include "tabld8cp.h"void init_bwd_dominant(struct bwd_state_t *state){ state->count_bwd2 = 0; state->count_fwd2 = 0;}/* -------------------------------------------------------------------- *//* TST_BWD_DOMINANT *//* -------------------------------------------------------------------- *//* Test if backward mode is dominant : *//* Nbre of Backward frames > 4 * Nbre of Forward frames *//* It is used for the choice of the perceptual weighting filter *//* Backward dominant : music or stationnary background noise : *//* Quantized filter (30 coef.) + strong weighting *//* No backward dominant => Non Stationnary signal (mainly speech) : *//* Unquantized filter (10 coef.) + normal weighting *//* -------------------------------------------------------------------- */void tst_bwd_dominant( struct bwd_state_t *state, int *bwd_dominant, /* O Dominant backward mode indication */ int mode /* I Selected LPC mode */){ int tmp, count_all; if (mode == 0) state->count_fwd2++; else state->count_bwd2++; count_all = state->count_bwd2 + state->count_fwd2; if (count_all == 100) { count_all = count_all >> 1; state->count_bwd2 = state->count_bwd2 >> 1; state->count_fwd2 = state->count_fwd2 >> 1; } *bwd_dominant = 0; if (count_all >= 10) { tmp = state->count_fwd2 << 2; if (state->count_bwd2 > tmp) *bwd_dominant = 1; }}void int_bwd( FLOAT *a_bwd, /* I/O LPC backward filter */ FLOAT *prev_filter, /* I previous frame filter */ FLOAT *C_int /* I/O interpolation coefficient */){ int i; FLOAT tmp1, tmp2; FLOAT *pa_bwd; FLOAT C_int_loc; pa_bwd = a_bwd + M_BWDP1; /* Calculate the interpolated filters */ /* ---------------------------------- */ C_int_loc = *C_int - (F)0.1; if( C_int_loc < 0) C_int_loc = 0; for (i=0; i<M_BWDP1; i++) { tmp1 = pa_bwd[i] * ((F)1. - C_int_loc); tmp2 = prev_filter[i] * C_int_loc; pa_bwd[i] = tmp1 + tmp2; } for (i=0; i<M_BWDP1; i++) { a_bwd[i] = (F)0.5 * (pa_bwd[i] + prev_filter[i]); } *C_int = C_int_loc;}/* ---------------------------------------------------------------------- *//* ENER_DB *//* *//* COMPUTATION OF THE ENERGY *//* *//* ---------------------------------------------------------------------- */FLOAT ener_dB(FLOAT *synth, int L){ int i; FLOAT energy; FLOAT tmp, edB; INT32 k, Ltmp; int n; for (i=0, energy=(F)0.0001; i<L; i++) { energy += synth[i] * synth[i]; } edB = (FLOAT)log10(energy); tmp = edB * INV_LOG2; n = (int) tmp; if(tmp >= (F)4.) { if(energy > (F)2147483647.) energy = (F)93.1814; else { k = (INT32)energy; Ltmp = -(1L << (n-4)); k &= Ltmp; tmp = (FLOAT)k; energy = (F)10. * (FLOAT)log10(tmp); } } else energy = (F)0.005; return(energy);}/* ----------------------------------------------------------------------- *//* *//* HYBRID WINDOW *//* (as in G728) *//* *//* 1st part (0..35) is sine(i*c) where c = 0.047783 *//* 2nd part (36....) is b*exp((i-35)*log(a)) *//* where b=sine(35*c) *//* and a=0.9928337491 is such as a^^40 = 0.75 *//* a^^(2*L_FRAME) = 0.75^^4 = 0.31640625 *//* *//* ------------------------------------------------------------------------ *//*------------------------------------------------------------------------------*//* Compute the autocorrelation of speech using hybrid window (as in G.728) *//*------------------------------------------------------------------------------*/void autocorr_hyb_window( FLOAT *x, /* (in) synthetized speech signal */ FLOAT *r_bwd, /* (out) Autocorrelations */ FLOAT *rexp /* (in/out) */){ FLOAT tmp; int i, n, k; FLOAT w_s[L_ANA_BWD]; for (n=L_ANA_BWD_M1, k=0; n>=0; n--, k++) w_s[n] = x[n] * hw[k]; for (i=0; i<=M_BWD; i++) { tmp = 0; for (n=M_BWD; n<N1; n++) tmp += w_s[n] * w_s[n-i]; rexp[i] = W_FACT * rexp[i] + tmp; } for (i=0; i<=M_BWD; i++) { r_bwd[i] = rexp[i]; for (n=N1; n<L_ANA_BWD; n++) r_bwd[i] += w_s[n] * w_s[n-i]; } } /* end of autocorr_hyb_windowing() *//* ---------------------------------------------------------------------- *//* *//* LAG_WINDOW_BWD *//* *//* Fixed-point Lag Windowing for backward analysis correlations *//* (values of lag_h_bwd and lag_l_bwd in tab_ld8k.h) *//* *//* ---------------------------------------------------------------------- */void lag_window_bwd(FLOAT *r_bwd){ int i; for (i=1; i<= M_BWD; i++) { /* !!! la fenetre debute en 0 pour un terme != de 1 */ r_bwd[i] *= lag_bwd[i-1]; } if (r_bwd[0]<(F)1.0) r_bwd[0]=(F)1.0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -