📄 pitchcp.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 : PITCHCP.C*//*****************************************************************************//* Long Term Prediction Routines *//*****************************************************************************/#include <math.h>#include "typedef.h"#include "ld8k.h"#include "tab_ld8k.h"#include "ld8cp.h"/* prototypes for local functions */static void norm_corr(FLOAT exc[], FLOAT xn[], FLOAT h[], int l_subfr, int t_min, int t_max, FLOAT corr_norm[]);static FLOAT interpol_3(FLOAT cor[], int frac);static int lag_max(FLOAT signal[],int L_frame,int pit_max, int pit_min, FLOAT *cor_max);static FLOAT inv_sqrt( FLOAT x );/*---------------------------------------------------------------------------- * pitch_ol - compute the open loop pitch lag *---------------------------------------------------------------------------- */int pitch_ol( /* output: open-loop pitch lag */ FLOAT signal[], /* input : signal to compute pitch */ /* s[-PIT_MAX : l_frame-1] */ int pit_min, /* input : minimum pitch lag */ int pit_max, /* input : maximum pitch lag */ int l_frame /* input : error minimization window */){ FLOAT max1, max2, max3; int p_max1, p_max2, p_max3; /*--------------------------------------------------------------------* * The pitch lag search is divided in three sections. * * Each section cannot have a pitch multiple. * * We find a maximum for each section. * * We compare the maxima of each section by favoring small lag. * * * * First section: lag delay = PIT_MAX to 80 * * Second section: lag delay = 79 to 40 * * Third section: lag delay = 39 to 20 * *--------------------------------------------------------------------*/ p_max1 = lag_max(signal, l_frame, pit_max, 80 , &max1); p_max2 = lag_max(signal, l_frame, 79 , 40 , &max2); p_max3 = lag_max(signal, l_frame, 39 , pit_min , &max3); /*--------------------------------------------------------------------* * Compare the 3 sections maxima, and favor small lag. * *--------------------------------------------------------------------*/ if ( max1 * THRESHPIT < max2 ) { max1 = max2; p_max1 = p_max2; } if ( max1 * THRESHPIT < max3 ) p_max1 = p_max3; return (p_max1);}/*----------------------------------------------------------------------------* lag_max - Find the lag that has maximum correlation*----------------------------------------------------------------------------*/static int lag_max( /* output: lag found */ FLOAT signal[], /* input : Signal to compute the open loop pitch signal[-142:-1] should be known. */ int l_frame, /* input : Length of frame to compute pitch */ int lagmax, /* input : maximum lag */ int lagmin, /* input : minimum lag */ FLOAT *cor_max /* input : normalized correlation of selected lag */){ int i, j; FLOAT *p, *p1; FLOAT max, t0; int p_max; max = FLT_MIN_G729; p_max = lagmax; /* to avoid visual warning */ for (i = lagmax; i >= lagmin; i--) { p = signal; p1 = &signal[-i]; t0 = (F)0.0; for (j=0; j<l_frame; j++) { t0 += *p++ * *p1++; } if (t0 >= max) { max = t0; p_max = i; } } /* compute energy */ t0 = (F)0.01; /* to avoid division by zero */ p = &signal[-p_max]; for(i=0; i<l_frame; i++, p++) { t0 += *p * *p; } t0 = inv_sqrt(t0); /* 1/sqrt(energy) */ *cor_max = max * t0; /* max/sqrt(energy) */ return(p_max);}/*----------------------------------------------------------------------------* pitch_fr3cp - find the pitch period with 1/3 subsample resolution*----------------------------------------------------------------------------*/int pitch_fr3cp( /* output: integer part of pitch period */ FLOAT exc[], /* input : excitation buffer */ FLOAT xn[], /* input : target vector */ FLOAT h[], /* input : impulse response of filters. */ int l_subfr, /* input : Length of frame to compute pitch */ int t0_min, /* input : minimum value in the searched range */ int t0_max, /* input : maximum value in the searched range */ int i_subfr, /* input : indicator for first subframe */ int *pit_frac, /* output: chosen fraction */ int rate){ int i, frac; int lag, t_min, t_max; FLOAT max; FLOAT corr_int; FLOAT corr_v[10+2*L_INTER4]; /* size: 2*L_INTER4+t0_max-t0_min+1 */ FLOAT *corr; int midLag; /* Find interval to compute normalized correlation */ t_min = t0_min - L_INTER4; t_max = t0_max + L_INTER4; corr = &corr_v[-t_min]; /* corr[t_min:t_max] */ /* Compute normalized correlation between target and filtered excitation */ norm_corr(exc, xn, h, l_subfr, t_min, t_max, corr); /* find integer pitch */ max = corr[t0_min]; lag = t0_min; for(i= t0_min+1; i<=t0_max; i++) { if( corr[i] >= max) { max = corr[i]; lag = i; } } /* If first subframe and lag > 84 do not search fractionnal pitch */ if( (i_subfr == 0) && (lag > 84) ) { *pit_frac = 0; return(lag); } /* test the fractions around lag and choose the one which maximizes the interpolated normalized correlation */ if (rate == G729D) { /* 6.4 kbps */ if (i_subfr == 0) { max = interpol_3(&corr[lag], -2); frac = -2; for (i = -1; i <= 2; i++) { corr_int = interpol_3(&corr[lag], i); if(corr_int > max) { max = corr_int; frac = i; } } } else { midLag = t0_max - 4; if ((lag == midLag - 1) || lag == midLag) { max = interpol_3(&corr[lag], -2); frac = -2; for (i = -1; i <= 2; i++) { corr_int = interpol_3(&corr[lag], i); if(corr_int > max) { max = corr_int; frac = i; } } } else if (lag == midLag - 2) { max = interpol_3(&corr[lag], 0); frac = 0; for (i = 1; i <= 2; i++) { corr_int = interpol_3(&corr[lag], i); if(corr_int > max) { max = corr_int; frac = i; } } } else if (lag == midLag + 1) { max = interpol_3(&corr[lag], -2); frac = -2; for (i = -1; i <= 0; i++) { corr_int = interpol_3(&corr[lag], i); if(corr_int > max) { max = corr_int; frac = i; } } } else frac = 0; } } else { max = interpol_3(&corr[lag], -2); frac = -2;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -