⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c3_14pf.cpp

📁 实现3GPP的GSM中AMR语音的CODECS。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    alpk = 1;    for (i = 0; i < NB_PULSE; i++)    {        *(p_codvec++) = i;    }    for (track1 = 1; track1 < 4; track1 += 2)    {        for (track2 = 2; track2 < 5; track2 += 2)        {            /* fix starting position */            ipos[0] = 0;            ipos[1] = track1;            ipos[2] = track2;            /*------------------------------------------------------------------*             * main loop: try 3 tracks.                                         *             *------------------------------------------------------------------*/            for (i = 0; i < NB_PULSE; i++)            {                /*----------------------------------------------------------------*                 * i0 loop: try 8 positions.                                      *                 *----------------------------------------------------------------*/                /* account for ptr. init. (rr[io]) */                for (i0 = ipos[0]; i0 < L_CODE; i0 += STEP)                {                    if (dn2[i0] >= 0)                    {                        ps0 = dn[i0];                        /* alp0 = L_mult(rr[i0][i0],_1_4, pOverflow); */                        alp0 = (Word32) rr[i0][i0] << 14;                        /*----------------------------------------------------------------*                         * i1 loop: 8 positions.                                          *                         *----------------------------------------------------------------*/                        sq = -1;                        alp = 1;                        ps = 0;                        ix = ipos[1];                        /* initialize 4 index for next loop. */                        /*-------------------------------------------------------------------*                         *  These index have low complexity address computation because      *                         *  they are, in fact, pointers with fixed increment.  For example,  *                         *  "rr[i0][i2]" is a pointer initialized to "&rr[i0][ipos[2]]"      *                         *  and incremented by "STEP".                                       *                         *-------------------------------------------------------------------*/                        for (i1 = ipos[1]; i1 < L_CODE; i1 += STEP)                        {                            /* idx increment = STEP */                            /* ps1 = add(ps0, dn[i1], pOverflow); */                            ps1 = ps0 + dn[i1];                            /* alp1 = alp0 + rr[i0][i1] + 1/2*rr[i1][i1]; */                            /* idx incr = STEP */                            /* alp1 = L_mac(alp0, rr[i1][i1], _1_4, pOverflow); */                            alp1 = alp0 + ((Word32) rr[i1][i1] << 14);                            /* idx incr = STEP */                            /* alp1 = L_mac(alp1, rr[i0][i1], _1_2, pOverflow); */                            alp1 += (Word32) rr[i0][i1] << 15;                            /* sq1 = mult(ps1, ps1, pOverflow); */                            sq1 = (Word16)(((Word32) ps1 * ps1) >> 15);                            /* alp_16 = pv_round(alp1, pOverflow); */                            alp_16 = (Word16)((alp1 + (Word32) 0x00008000L) >> 16);                            /* s = L_mult(alp, sq1, pOverflow); */                            s = ((Word32) alp * sq1) << 1;                            /* s = L_msu(s, sq, alp_16, pOverflow); */                            s -= (((Word32) sq * alp_16) << 1);                            if (s > 0)                            {                                sq = sq1;                                ps = ps1;                                alp = alp_16;                                ix = i1;                            }                        }                        i1 = ix;                        /*----------------------------------------------------------------*                         * i2 loop: 8 positions.                                          *                         *----------------------------------------------------------------*/                        ps0 = ps;                        /* alp0 = L_mult(alp, _1_4, pOverflow); */                        alp0 = (Word32) alp << 14;                        sq = -1;                        alp = 1;                        ps = 0;                        ix = ipos[2];                        /* initialize 4 index for next loop (see i1 loop) */                        for (i2 = ipos[2]; i2 < L_CODE; i2 += STEP)                        {                            /* index increment = STEP */                            /* ps1 = add(ps0, dn[i2], pOverflow); */                            ps1 = ps0 + dn[i2];                            /* alp1 = alp0 + rr[i0][i2] + rr[i1][i2] + 1/2*rr[i2][i2]; */                            /* idx incr = STEP */                            /* alp1 = L_mac(alp0, rr[i2][i2], _1_16, pOverflow); */                            alp1 = alp0 + ((Word32) rr[i2][i2] << 12);                            /* idx incr = STEP */                            /* alp1 = L_mac(alp1, rr[i1][i2], _1_8, pOverflow); */                            alp1 += (Word32) rr[i1][i2] << 13;                            /* idx incr = STEP */                            /* alp1 = L_mac(alp1,rr[i0][i2], _1_8, pOverflow); */                            alp1 += (Word32) rr[i0][i2] << 13;                            /* sq1 = mult(ps1, ps1, pOverflow); */                            sq1 = (Word16)(((Word32) ps1 * ps1) >> 15);                            /* alp_16 = pv_round(alp1, pOverflow); */                            alp_16 = (Word16)((alp1 + (Word32) 0x00008000L) >> 16);                            /* s = L_mult(alp, sq1, pOverflow); */                            s = ((Word32) alp * sq1) << 1;                            /* s = L_msu(s, sq, alp_16, pOverflow); */                            s -= (((Word32) sq * alp_16) << 1);                            if (s > 0)                            {                                sq = sq1;                                ps = ps1;                                alp = alp_16;                                ix = i2;                            }                        }                        i2 = ix;                        /* memorize codevector if this one                         * is better than the last one.                         */                        s = L_mult(alpk, sq, pOverflow);                        //s = ((Word32) alpk * sq) << 1;                        s = L_msu(s, psk, alp, pOverflow);                        //s -= (((Word32) psk * alp) << 1);                        if (s > 0)                        {                            psk = sq;                            alpk = alp;                            p_codvec = &codvec[0];                            *(p_codvec++) = i0;                            *(p_codvec++) = i1;                            *(p_codvec) = i2;                        }                    }                }                /*----------------------------------------------------------------*                 * Cyclic permutation of i0, i1 and i2.                           *                 *----------------------------------------------------------------*/                pos = ipos[2];                ipos[2] = ipos[1];                ipos[1] = ipos[0];                ipos[0] = pos;            }        }    }    return;}/****************************************************************************//*------------------------------------------------------------------------------ FUNCTION NAME:  build_code()------------------------------------------------------------------------------ INPUT AND OUTPUT DEFINITIONS Inputs:    codvec[]   Array of type Word16 -- position of pulses    dn_sign[]  Array of type Word16 -- sign of pulses    h[]        Array of type Word16 -- impulse response of                                       weighted synthesis filter Outputs:    cod[]  Array of type Word16 -- innovative code vector    y[]    Array of type Word16 -- filtered innovative code    sign[] Array of type Word16 -- sign of 3 pulses    pOverflow  Pointer to Flag  -- set when overflow occurs Returns:    indx Global Variables Used:    None Local Variables Needed:    None------------------------------------------------------------------------------ FUNCTION DESCRIPTION PURPOSE: Builds the codeword, the filtered codeword and index of the          codevector, based on the signs and positions of 3 pulses.------------------------------------------------------------------------------ REQUIREMENTS None------------------------------------------------------------------------------ REFERENCES [1] c3_14pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001------------------------------------------------------------------------------ PSEUDO-CODE------------------------------------------------------------------------------ RESOURCES USED [optional] When the code is written for a specific target processor the the resources used should be documented below. HEAP MEMORY USED: x bytes STACK MEMORY USED: x bytes CLOCK CYCLES: (cycle count equation for this function) + (variable                used to represent cycle count for each subroutine                called)     where: (cycle count variable) = cycle count for [subroutine                                     name]------------------------------------------------------------------------------ CAUTION [optional] [State any special notes, constraints or cautions for users of this function]------------------------------------------------------------------------------*/static Word16build_code(    Word16 codvec[],  /* i : position of pulses                            */    Word16 dn_sign[], /* i : sign of pulses                                */    Word16 cod[],     /* o : innovative code vector                        */    Word16 h[],       /* i : impulse response of weighted synthesis filter */    Word16 y[],       /* o : filtered innovative code                      */    Word16 sign[],    /* o : sign of 3 pulses                              */    Flag  *pOverflow  /* o : Flag set when overflow occurs                 */){    Word16 i;    Word16 j;    Word16 k;    Word16 track;    Word16 index;    Word16 _sign[NB_PULSE];    Word16 indx;    Word16 rsign;    Word16 *p0;    Word16 *p1;    Word16 *p2;    Word32 s;    for (i = 0; i < L_CODE; i++)    {        cod[i] = 0;    }    indx = 0;    rsign = 0;    for (k = 0; k < NB_PULSE; k++)    {        i = codvec[k];  /* read pulse position */        j = dn_sign[i];  /* read sign           */        /* index = pos/5 */        /* index = mult(i, 6554, pOverflow); */        index = (Word16)(((Word32) i * 6554) >> 15);        /* track = pos%5 */        /* s = L_mult(index, 5, pOverflow); */        s = ((Word32) index * 5) << 1;        /* s = L_shr(s, 1, pOverflow); */        s >>= 1;        /* track = sub(i, (Word16) s, pOverflow); */        track = i - (Word16) s;        if (track == 1)        {            /* index = shl(index, 4, pOverflow); */            index <<= 4;        }        else if (track == 2)        {            track = 2;            /* index = shl(index, 8, pOverflow); */            index <<= 8;        }        else if (track == 3)        {            track = 1;            /* index = shl(index, 4, pOverflow); */            index <<= 4;            /* index = add(index, 8, pOverflow); */            index += 8;        }        else if (track == 4)        {            track = 2;            /* index = shl(index, 8, pOverflow); */            index <<= 8;            /* index = add(index, 128, pOverflow); */            index += 128;        }        if (j > 0)        {            cod[i] = 8191;            _sign[k] = 32767;            /* track = shl(1, track, pOverflow); */            track = 1 << track;            /* rsign = add(rsign, track, pOverflow); */            rsign += track;        }        else        {            cod[i] = -8192;            _sign[k] = (Word16) - 32768L;        }        /* indx = add(indx, index, pOverflow); */        indx += index;    }    *sign = rsign;    p0 = h - codvec[0];    p1 = h - codvec[1];    p2 = h - codvec[2];    for (i = 0; i < L_CODE; i++)    {        s = 0;        s =            L_mac(                s,                *p0++,                _sign[0],                pOverflow);        s =            L_mac(                s,                *p1++,                _sign[1],                pOverflow);        s =            L_mac(                s,                *p2++,                _sign[2],                pOverflow);        y[i] =            pv_round(                s,                pOverflow);    }    return indx;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -