📄 c4_17pf.c
字号:
sq1 = mult(ps1, ps1); alp_16 = round(alp1); s = L_msu(L_mult(alp, sq1), sq, alp_16); test (); if (s > 0) { sq = sq1; move16 (); ps = ps1; move16 (); alp = alp_16; move16 (); ix = i1; move16 (); } } i1 = ix; move16 (); /*----------------------------------------------------------------* * i2 loop: 8 positions. * *----------------------------------------------------------------*/ ps0 = ps; move16 (); alp0 = L_mult(alp, _1_4); sq = -1; move16 (); alp = 1; move16 (); ps = 0; move16 (); ix = ipos[2]; move16 (); /* initialize 4 index for next loop (see i1 loop) */ move16 (); /* account for ptr. init. (rr[i2]) */ move16 (); /* account for ptr. init. (rr[i1]) */ move16 (); /* account for ptr. init. (dn[i2]) */ move16 (); /* account for ptr. init. (rr[io]) */ for (i2 = ipos[2]; i2 < L_CODE; i2 += STEP) { ps1 = add(ps0, dn[i2]); /* index increment = STEP */ /* alp1 = alp0 + rr[i0][i2] + rr[i1][i2] + 1/2*rr[i2][i2]; */ alp1 = L_mac(alp0, rr[i2][i2], _1_16); /* idx incr = STEP */ alp1 = L_mac(alp1, rr[i1][i2], _1_8); /* idx incr = STEP */ alp1 = L_mac(alp1, rr[i0][i2], _1_8); /* idx incr = STEP */ sq1 = mult(ps1, ps1); alp_16 = round(alp1); s = L_msu(L_mult(alp, sq1), sq, alp_16); test (); if (s > 0) { sq = sq1; move16 (); ps = ps1; move16 (); alp = alp_16; move16 (); ix = i2; move16 (); } } i2 = ix; move16 (); /*----------------------------------------------------------------* * i3 loop: 8 positions. * *----------------------------------------------------------------*/ ps0 = ps; move16 (); alp0 = L_deposit_h(alp); sq = -1; move16 (); alp = 1; move16 (); ps = 0; move16 (); ix = ipos[3]; move16 (); /* initialize 5 index for next loop (see i1 loop) */ move16 (); /* account for ptr. init. (rr[i3]) */ move16 (); /* account for ptr. init. (rr[i2]) */ move16 (); /* account for ptr. init. (rr[i1]) */ move16 (); /* account for ptr. init. (dn[i3]) */ move16 (); /* account for ptr. init. (rr[io]) */ for (i3 = ipos[3]; i3 < L_CODE; i3 += STEP) { ps1 = add(ps0, dn[i3]); /* index increment = STEP */ /* alp1 = alp0 + rr[i0][i3] + rr[i1][i3] + rr[i2][i3] + 1/2*rr[i3][i3]; */ alp1 = L_mac(alp0, rr[i3][i3], _1_16); /* idx incr = STEP */ alp1 = L_mac(alp1, rr[i2][i3], _1_8); /* idx incr = STEP */ alp1 = L_mac(alp1, rr[i1][i3], _1_8); /* idx incr = STEP */ alp1 = L_mac(alp1, rr[i0][i3], _1_8); /* idx incr = STEP */ sq1 = mult(ps1, ps1); alp_16 = round(alp1); s = L_msu(L_mult(alp, sq1), sq, alp_16); test (); if (s > 0) { sq = sq1; move16 (); ps = ps1; move16 (); alp = alp_16; move16 (); ix = i3; move16 (); } } /*----------------------------------------------------------------* * memorise codevector if this one is better than the last one. * *----------------------------------------------------------------*/ s = L_msu(L_mult(alpk, sq), psk, alp); test (); if (s > 0) { psk = sq; move16 (); alpk = alp; move16 (); codvec[0] = i0; move16 (); codvec[1] = i1; move16 (); codvec[2] = i2; move16 (); codvec[3] = ix; move16 (); } } } /*----------------------------------------------------------------* * Cyclic permutation of i0,i1,i2 and i3. * *----------------------------------------------------------------*/ pos = ipos[3]; move16 (); ipos[3] = ipos[2]; move16 (); ipos[2] = ipos[1]; move16 (); ipos[1] = ipos[0]; move16 (); ipos[0] = pos; move16 (); } } return;}/************************************************************************* * * FUNCTION: build_code() * * PURPOSE: Builds the codeword, the filtered codeword and index of the * codevector, based on the signs and positions of 4 pulses. * *************************************************************************/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 : index of 4 pulses (sign+position) */){ Word16 i, j, k, track, index, _sign[NB_PULSE], indx, rsign; Word16 *p0, *p1, *p2, *p3; Word32 s; for (i = 0; i < L_CODE; i++) { cod[i] = 0; move16 (); } indx = 0; move16 (); rsign = 0; move16 (); for (k = 0; k < NB_PULSE; k++) { i = codvec[k]; move16 (); /* read pulse position */ j = dn_sign[i]; move16 (); /* read sign */ index = mult(i, 6554); /* index = pos/5 */ /* track = pos%5 */ track = sub(i, extract_l(L_shr(L_mult(index, 5), 1))); index = gray[index]; move16 (); test (); if (sub(track, 1) == 0) index = shl(index, 3); else if (sub(track, 2) == 0) { test (); index = shl(index, 6); } else if (sub(track, 3) == 0) { test ();test (); index = shl(index, 10); } else if (sub(track, 4) == 0) { test ();test ();test (); track = 3; move16 (); index = add(shl(index, 10), 512); } test (); if (j > 0) { cod[i] = 8191; move16 (); _sign[k] = 32767; move16 (); rsign = add(rsign, shl(1, track)); } else { cod[i] = -8192; move16 (); _sign[k] = (Word16) - 32768L; move16 (); } indx = add(indx, index); } *sign = rsign; move16 (); p0 = h - codvec[0]; move16 (); p1 = h - codvec[1]; move16 (); p2 = h - codvec[2]; move16 (); p3 = h - codvec[3]; move16 (); for (i = 0; i < L_CODE; i++) { s = 0; move32 (); s = L_mac(s, *p0++, _sign[0]); s = L_mac(s, *p1++, _sign[1]); s = L_mac(s, *p2++, _sign[2]); s = L_mac(s, *p3++, _sign[3]); y[i] = round(s); move16 (); } return indx;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -