autocorr.c
来自「君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图」· C语言 代码 · 共 198 行
C
198 行
/*********************************************************************************** GSM AMR-NB speech codec R98 Version 7.6.0 December 12, 2001* R99 Version 3.3.0 * REL-4 Version 4.1.0 *********************************************************************************** File : autocorr.c**********************************************************************************//********************************************************************************** MODULE INCLUDE FILE AND VERSION ID*********************************************************************************/#include "autocorr.h"const char autocorr_id[] = "@(#)$Id $" autocorr_h; /********************************************************************************** INCLUDE FILES*********************************************************************************/#include "typedef.h"#include "basic_op.h"#include "oper_32b.h"#include "count.h"#include "cnst.h"//add for jzmedia accerative instruction sets#ifdef JZ4740_MXU_OPT#include "jzmedia.h"#endif#include "uclib.h"/********************************************************************************** LOCAL VARIABLES AND TABLES*********************************************************************************/ /********************************************************************************** PUBLIC PROGRAM CODE*********************************************************************************//***************************************************************************** Function : autocorr* Purpose : Compute autocorrelations of signal with windowing****************************************************************************/Word16 Autocorr ( Word16 x[], /* (i) : Input signal (L_WINDOW) */ Word16 m, /* (i) : LPC order */ Word16 r_h[], /* (o) : Autocorrelations (msb) */ Word16 r_l[], /* (o) : Autocorrelations (lsb) */ const Word16 wind[] /* (i) : window for LPC analysis (L_WINDOW) */){ Word16 i, j, norm; Word16 y[L_WINDOW]; Word16 y_tmp[L_WINDOW]; Word32 sum; Word16 overfl, overfl_shft; /* Windowing of signal */#ifdef JZ4740_MXU_OPT Word16 *p_x, *p_wind, *p_y,*p_y1; Word32 ref_re1; p_x = x - 2; p_wind = wind - 2; p_y = y - 2; for( i = 0; i < L_WINDOW / 2; i++){ S32LDI(xr1, p_x, 0x04); S32LDI(xr2, p_wind, 0x04); D16MULF_WW(xr3, xr1, xr2); S32SDI(xr3, p_y, 0x04); }#else for (i = 0; i < L_WINDOW; i++) { y[i] = mult_r (x[i], wind[i]); move16 (); }#endif /* Compute r[0] and test for overflow */ overfl_shft = 0; //move16 (); do { overfl = 0; //move16 (); #if 0//#ifdef JZ4740_MXU_OPT p_y = y - 2; D32SLR(xr1, xr0, xr0, xr3, 0); for( i = 0; i < L_WINDOW / 2; i++){ S32LDI(xr2, p_y, 0x04); D16MAC_AA_WW(xr1, xr2, xr2,xr3); } D32SLL(xr2,xr1,xr3,xr4,1); D32ADD_AA(xr1,xr2, xr4,xr0); sum = S32M2I(xr1);#else sum = 0L; //move32 (); for (i = 0; i < L_WINDOW; i++) { sum = L_mac (sum, y[i], y[i]); }#endif /* If overflow divide y[] by 4 */ // test (); #if 0//#ifdef JZ4740_MXU_OPT if (sum < 0L)#else if (L_sub (sum, MAX_32) == 0L)#endif { overfl_shft = add (overfl_shft, 4); overfl = 1; move16 (); /* Set the overflow flag */#if 0//#ifdef JZ4740_MXU_OPT printf(" overflow in %s.\n", __FUNCTION__); p_y = y - 2; for(i = 0; i < L_WINDOW / 2; i++){ S32LDI(xr1, p_y, 0x04); D32SAR(xr2, xr1, xr0, xr0,2); S32STD(xr2, p_y, 0x00); }#else for (i = 0; i < L_WINDOW; i++) { y[i] = shr (y[i], 2); //move16 (); }#endif } //test (); } while (overfl != 0); sum = L_add (sum, 1L); /* Avoid the case of all zeros */ /* Normalization of r[0] */ norm = norm_l (sum); sum = L_shl (sum, norm); L_Extract (sum, &r_h[0], &r_l[0]); /* Put in DPF format (see oper_32b) */ /* r[1] to r[m] */ for (i = 1; i <= m; i++) {#ifdef JZ4740_MXU_OPT p_y = y - 2; p_y1 = (unsigned int)(y + i - 2) & 0xFFFFFFFC; ref_re1 = 4 - (unsigned int)(y + i - 2) & 0x03; D32SLR(xr10,xr0,xr0,xr11,0); //sum = 0; S32LDI(xr12, p_y1, 0x04); for (j = 0; j < (L_WINDOW - i)/2; j++) { S32LDI(xr1, p_y, 0x04); S32LDI(xr2, p_y1, 0x04); S32ALN(xr3, xr12, xr2,ref_re1); D32SLR(xr12, xr2, xr0,xr0,0); D16MAC_AA_WW(xr10,xr1,xr3,xr11); } if( i % 2 == 1){ S32LDI(xr1, p_y, 0x04); S32ALN(xr3, xr12, xr0,ref_re1); D16MAC_AA_WW(xr10,xr1,xr3,xr0); } D32ADD_AA(xr1, xr10, xr11,xr0); D32SLL(xr2,xr1,xr0,xr0,1); sum = S32M2I(xr2);#else sum = 0; //move32 (); for (j = 0; j < L_WINDOW - i; j++) { sum = L_mac (sum, y[j], y[j + i]); }#endif sum = L_shl (sum, norm); L_Extract (sum, &r_h[i], &r_l[i]); } norm = sub (norm, overfl_shft); return norm;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?