📄 c3_14pf.cpp
字号:
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 + -