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 + -
显示快捷键?