15e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh/* 25e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische 35e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * Universitaet Berlin. See the accompanying file "COPYRIGHT" for 45e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. 55e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 65e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 75e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh/* $Header: /tmp_amd/presto/export/kbs/jutta/src/gsm/RCS/rpe.c,v 1.3 1994/05/10 20:18:46 jutta Exp $ */ 85e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 95e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#include <stdio.h> 105e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#include <assert.h> 115e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 125e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#include "private.h" 135e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 145e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#include "gsm.h" 155e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#include "proto.h" 165e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 175e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh/* 4.2.13 .. 4.2.17 RPE ENCODING SECTION 185e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 195e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 205e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh/* 4.2.13 */ 215e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 225e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yehstatic void Weighting_filter P2((e, x), 235e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register word * e, /* signal [-5..0.39.44] IN */ 245e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * x /* signal [0..39] OUT */ 255e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh) 265e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh/* 275e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * The coefficients of the weighting filter are stored in a table 285e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * (see table 4.4). The following scaling is used: 295e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * 305e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * H[0..10] = integer( real_H[ 0..10] * 8192 ); 315e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 325e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh{ 335e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* word wt[ 50 ]; */ 345e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 355e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register longword L_result; 365e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register int k /* , i */ ; 375e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 385e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Initialization of a temporary working array wt[0...49] 395e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 405e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 415e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* for (k = 0; k <= 4; k++) wt[k] = 0; 425e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * for (k = 5; k <= 44; k++) wt[k] = *e++; 435e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * for (k = 45; k <= 49; k++) wt[k] = 0; 445e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * 455e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * (e[-5..-1] and e[40..44] are allocated by the caller, 465e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * are initially zero and are not written anywhere.) 475e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 485e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh e -= 5; 495e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 505e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Compute the signal x[0..39] 515e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 525e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (k = 0; k <= 39; k++) { 535e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 545e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_result = 8192 >> 1; 555e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 565e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* for (i = 0; i <= 10; i++) { 575e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * L_temp = GSM_L_MULT( wt[k+i], gsm_H[i] ); 585e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * L_result = GSM_L_ADD( L_result, L_temp ); 595e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * } 605e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 615e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 625e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#undef STEP 635e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#define STEP( i, H ) (e[ k + i ] * (longword)H) 645e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 655e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Every one of these multiplications is done twice -- 665e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * but I don't see an elegant way to optimize this. 675e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * Do you? 685e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 695e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 705e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#ifdef STUPID_COMPILER 715e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_result += STEP( 0, -134 ) ; 725e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_result += STEP( 1, -374 ) ; 735e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* + STEP( 2, 0 ) */ 745e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_result += STEP( 3, 2054 ) ; 755e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_result += STEP( 4, 5741 ) ; 765e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_result += STEP( 5, 8192 ) ; 775e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_result += STEP( 6, 5741 ) ; 785e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_result += STEP( 7, 2054 ) ; 795e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* + STEP( 8, 0 ) */ 805e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_result += STEP( 9, -374 ) ; 815e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_result += STEP( 10, -134 ) ; 825e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#else 835e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_result += 845e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh STEP( 0, -134 ) 855e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh + STEP( 1, -374 ) 865e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* + STEP( 2, 0 ) */ 875e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh + STEP( 3, 2054 ) 885e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh + STEP( 4, 5741 ) 895e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh + STEP( 5, 8192 ) 905e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh + STEP( 6, 5741 ) 915e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh + STEP( 7, 2054 ) 925e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* + STEP( 8, 0 ) */ 935e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh + STEP( 9, -374 ) 945e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh + STEP(10, -134 ) 955e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh ; 965e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#endif 975e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 985e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* L_result = GSM_L_ADD( L_result, L_result ); (* scaling(x2) *) 995e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * L_result = GSM_L_ADD( L_result, L_result ); (* scaling(x4) *) 1005e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * 1015e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * x[k] = SASR( L_result, 16 ); 1025e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 1035e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 1045e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* 2 adds vs. >>16 => 14, minus one shift to compensate for 1055e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * those we lost when replacing L_MULT by '*'. 1065e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 1075e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 1085e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_result = SASR( L_result, 13 ); 1095e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh x[k] = ( L_result < MIN_WORD ? MIN_WORD 1105e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh : (L_result > MAX_WORD ? MAX_WORD : L_result )); 1115e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 1125e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh} 1135e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 1145e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh/* 4.2.14 */ 1155e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 1165e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yehstatic void RPE_grid_selection P3((x,xM,Mc_out), 1175e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * x, /* [0..39] IN */ 1185e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * xM, /* [0..12] OUT */ 1195e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * Mc_out /* OUT */ 1205e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh) 1215e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh/* 1225e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * The signal x[0..39] is used to select the RPE grid which is 1235e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * represented by Mc. 1245e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 1255e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh{ 1265e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* register word temp1; */ 1275e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register int /* m, */ i; 1285e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register longword L_result, L_temp; 1295e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh longword EM; /* xxx should be L_EM? */ 1305e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word Mc; 1315e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 1325e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh longword L_common_0_3; 1335e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 1345e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh EM = 0; 1355e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh Mc = 0; 1365e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 1375e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* for (m = 0; m <= 3; m++) { 1385e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * L_result = 0; 1395e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * 1405e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * 1415e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * for (i = 0; i <= 12; i++) { 1425e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * 1435e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * temp1 = SASR( x[m + 3*i], 2 ); 1445e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * 1455e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * assert(temp1 != MIN_WORD); 1465e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * 1475e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * L_temp = GSM_L_MULT( temp1, temp1 ); 1485e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * L_result = GSM_L_ADD( L_temp, L_result ); 1495e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * } 1505e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * 1515e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * if (L_result > EM) { 1525e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * Mc = m; 1535e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * EM = L_result; 1545e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * } 1555e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * } 1565e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 1575e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 1585e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#undef STEP 1595e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#define STEP( m, i ) L_temp = SASR( x[m + 3 * i], 2 ); \ 1605e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_result += L_temp * L_temp; 1615e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 1625e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* common part of 0 and 3 */ 1635e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 1645e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_result = 0; 1655e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh STEP( 0, 1 ); STEP( 0, 2 ); STEP( 0, 3 ); STEP( 0, 4 ); 1665e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh STEP( 0, 5 ); STEP( 0, 6 ); STEP( 0, 7 ); STEP( 0, 8 ); 1675e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh STEP( 0, 9 ); STEP( 0, 10); STEP( 0, 11); STEP( 0, 12); 1685e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_common_0_3 = L_result; 1695e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 1705e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* i = 0 */ 1715e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 1725e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh STEP( 0, 0 ); 1735e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_result <<= 1; /* implicit in L_MULT */ 1745e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh EM = L_result; 1755e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 1765e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* i = 1 */ 1775e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 1785e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_result = 0; 1795e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh STEP( 1, 0 ); 1805e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh STEP( 1, 1 ); STEP( 1, 2 ); STEP( 1, 3 ); STEP( 1, 4 ); 1815e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh STEP( 1, 5 ); STEP( 1, 6 ); STEP( 1, 7 ); STEP( 1, 8 ); 1825e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh STEP( 1, 9 ); STEP( 1, 10); STEP( 1, 11); STEP( 1, 12); 1835e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_result <<= 1; 1845e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (L_result > EM) { 1855e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh Mc = 1; 1865e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh EM = L_result; 1875e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 1885e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 1895e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* i = 2 */ 1905e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 1915e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_result = 0; 1925e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh STEP( 2, 0 ); 1935e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh STEP( 2, 1 ); STEP( 2, 2 ); STEP( 2, 3 ); STEP( 2, 4 ); 1945e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh STEP( 2, 5 ); STEP( 2, 6 ); STEP( 2, 7 ); STEP( 2, 8 ); 1955e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh STEP( 2, 9 ); STEP( 2, 10); STEP( 2, 11); STEP( 2, 12); 1965e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_result <<= 1; 1975e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (L_result > EM) { 1985e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh Mc = 2; 1995e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh EM = L_result; 2005e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 2015e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2025e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* i = 3 */ 2035e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2045e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_result = L_common_0_3; 2055e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh STEP( 3, 12 ); 2065e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_result <<= 1; 2075e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (L_result > EM) { 2085e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh Mc = 3; 2095e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh EM = L_result; 2105e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 2115e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2125e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /**/ 2135e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2145e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Down-sampling by a factor 3 to get the selected xM[0..12] 2155e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * RPE sequence. 2165e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 2175e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (i = 0; i <= 12; i ++) xM[i] = x[Mc + 3*i]; 2185e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *Mc_out = Mc; 2195e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh} 2205e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2215e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh/* 4.12.15 */ 2225e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2235e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yehstatic void APCM_quantization_xmaxc_to_exp_mant P3((xmaxc,exp_out,mant_out), 2245e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word xmaxc, /* IN */ 2255e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * exp_out, /* OUT */ 2265e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * mant_out ) /* OUT */ 2275e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh{ 2285e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word exp, mant; 2295e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2305e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Compute exponent and mantissa of the decoded version of xmaxc 2315e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 2325e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2335e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh exp = 0; 2345e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (xmaxc > 15) exp = SASR(xmaxc, 3) - 1; 2355e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh mant = xmaxc - (exp << 3); 2365e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2375e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (mant == 0) { 2385e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh exp = -4; 2395e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh mant = 7; 2405e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 2415e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh else { 2425e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh while (mant <= 7) { 2435e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh mant = mant << 1 | 1; 2445e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh exp--; 2455e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 2465e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh mant -= 8; 2475e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 2485e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2495e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh assert( exp >= -4 && exp <= 6 ); 2505e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh assert( mant >= 0 && mant <= 7 ); 2515e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2525e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *exp_out = exp; 2535e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *mant_out = mant; 2545e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh} 2555e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2565e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yehstatic void APCM_quantization P5((xM,xMc,mant_out,exp_out,xmaxc_out), 2575e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * xM, /* [0..12] IN */ 2585e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2595e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * xMc, /* [0..12] OUT */ 2605e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * mant_out, /* OUT */ 2615e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * exp_out, /* OUT */ 2625e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * xmaxc_out /* OUT */ 2635e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh) 2645e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh{ 2655e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh int i, itest; 2665e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2675e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word xmax, xmaxc, temp, temp1, temp2; 2685e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word exp, mant; 2695e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2705e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2715e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Find the maximum absolute value xmax of xM[0..12]. 2725e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 2735e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2745e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh xmax = 0; 2755e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (i = 0; i <= 12; i++) { 2765e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh temp = xM[i]; 2775e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh temp = GSM_ABS(temp); 2785e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (temp > xmax) xmax = temp; 2795e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 2805e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2815e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Qantizing and coding of xmax to get xmaxc. 2825e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 2835e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2845e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh exp = 0; 2855e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh temp = SASR( xmax, 9 ); 2865e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh itest = 0; 2875e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2885e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (i = 0; i <= 5; i++) { 2895e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2905e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh itest |= (temp <= 0); 2915e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh temp = SASR( temp, 1 ); 2925e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2935e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh assert(exp <= 5); 2945e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (itest == 0) exp++; /* exp = add (exp, 1) */ 2955e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 2965e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2975e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh assert(exp <= 6 && exp >= 0); 2985e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh temp = exp + 5; 2995e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 3005e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh assert(temp <= 11 && temp >= 0); 3015e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh xmaxc = gsm_add( SASR(xmax, temp), exp << 3 ); 3025e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 3035e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Quantizing and coding of the xM[0..12] RPE sequence 3045e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * to get the xMc[0..12] 3055e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 3065e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 3075e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh APCM_quantization_xmaxc_to_exp_mant( xmaxc, &exp, &mant ); 3085e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 3095e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* This computation uses the fact that the decoded version of xmaxc 3105e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * can be calculated by using the exponent and the mantissa part of 3115e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * xmaxc (logarithmic table). 3125e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * So, this method avoids any division and uses only a scaling 3135e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * of the RPE samples by a function of the exponent. A direct 3145e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * multiplication by the inverse of the mantissa (NRFAC[0..7] 3155e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * found in table 4.5) gives the 3 bit coded version xMc[0..12] 3165e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * of the RPE samples. 3175e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 3185e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 3195e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 3205e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Direct computation of xMc[0..12] using table 4.5 3215e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 3225e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 3235e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh assert( exp <= 4096 && exp >= -4096); 3245e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh assert( mant >= 0 && mant <= 7 ); 3255e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 3265e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh temp1 = 6 - exp; /* normalization by the exponent */ 3275e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh temp2 = gsm_NRFAC[ mant ]; /* inverse mantissa */ 3285e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 3295e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (i = 0; i <= 12; i++) { 3305e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 3315e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh assert(temp1 >= 0 && temp1 < 16); 3325e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 3335e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh temp = xM[i] << temp1; 3345e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh temp = GSM_MULT( temp, temp2 ); 3355e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh temp = SASR(temp, 12); 3365e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh xMc[i] = temp + 4; /* see note below */ 3375e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 3385e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 3395e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* NOTE: This equation is used to make all the xMc[i] positive. 3405e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 3415e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 3425e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *mant_out = mant; 3435e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *exp_out = exp; 3445e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *xmaxc_out = xmaxc; 3455e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh} 3465e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 3475e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh/* 4.2.16 */ 3485e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 3495e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yehstatic void APCM_inverse_quantization P4((xMc,mant,exp,xMp), 3505e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register word * xMc, /* [0..12] IN */ 3515e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word mant, 3525e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word exp, 3535e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register word * xMp) /* [0..12] OUT */ 3545e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh/* 3555e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * This part is for decoding the RPE sequence of coded xMc[0..12] 3565e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * samples to obtain the xMp[0..12] array. Table 4.6 is used to get 3575e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * the mantissa of xmaxc (FAC[0..7]). 3585e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 3595e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh{ 3605e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh int i; 3615e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word temp, temp1, temp2, temp3; 3625e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh longword ltmp; 3635e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 3645e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh assert( mant >= 0 && mant <= 7 ); 3655e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 3665e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh temp1 = gsm_FAC[ mant ]; /* see 4.2-15 for mant */ 3675e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh temp2 = gsm_sub( 6, exp ); /* see 4.2-15 for exp */ 3685e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh temp3 = gsm_asl( 1, gsm_sub( temp2, 1 )); 3695e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 3705e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (i = 13; i--;) { 3715e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 3725e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh assert( *xMc <= 7 && *xMc >= 0 ); /* 3 bit unsigned */ 3735e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 3745e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* temp = gsm_sub( *xMc++ << 1, 7 ); */ 3755e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh temp = (*xMc++ << 1) - 7; /* restore sign */ 3765e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh assert( temp <= 7 && temp >= -7 ); /* 4 bit signed */ 3775e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 3785e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh temp <<= 12; /* 16 bit signed */ 3795e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh temp = GSM_MULT_R( temp1, temp ); 3805e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh temp = GSM_ADD( temp, temp3 ); 3815e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *xMp++ = gsm_asr( temp, temp2 ); 3825e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 3835e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh} 3845e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 3855e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh/* 4.2.17 */ 3865e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 3875e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yehstatic void RPE_grid_positioning P3((Mc,xMp,ep), 3885e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word Mc, /* grid position IN */ 3895e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register word * xMp, /* [0..12] IN */ 3905e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register word * ep /* [0..39] OUT */ 3915e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh) 3925e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh/* 3935e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * This procedure computes the reconstructed long term residual signal 3945e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * ep[0..39] for the LTP analysis filter. The inputs are the Mc 3955e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * which is the grid position selection and the xMp[0..12] decoded 3965e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * RPE samples which are upsampled by a factor of 3 by inserting zero 3975e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * values. 3985e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 3995e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh{ 4005e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh int i = 13; 4015e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 4025e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh assert(0 <= Mc && Mc <= 3); 4035e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 4045e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh switch (Mc) { 4055e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh case 3: *ep++ = 0; 4065e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh case 2: do { 4075e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *ep++ = 0; 4085e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh case 1: *ep++ = 0; 4095e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh case 0: *ep++ = *xMp++; 4105e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } while (--i); 4115e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 4125e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh while (++Mc < 4) *ep++ = 0; 4135e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 4145e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* 4155e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 4165e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh int i, k; 4175e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (k = 0; k <= 39; k++) ep[k] = 0; 4185e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (i = 0; i <= 12; i++) { 4195e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh ep[ Mc + (3*i) ] = xMp[i]; 4205e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 4215e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 4225e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh} 4235e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 4245e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh/* 4.2.18 */ 4255e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 4265e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh/* This procedure adds the reconstructed long term residual signal 4275e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * ep[0..39] to the estimated signal dpp[0..39] from the long term 4285e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * analysis filter to compute the reconstructed short term residual 4295e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * signal dp[-40..-1]; also the reconstructed short term residual 4305e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * array dp[-120..-41] is updated. 4315e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 4325e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 4335e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#if 0 /* Has been inlined in code.c */ 4345e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yehvoid Gsm_Update_of_reconstructed_short_time_residual_signal P3((dpp, ep, dp), 4355e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * dpp, /* [0...39] IN */ 4365e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * ep, /* [0...39] IN */ 4375e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * dp) /* [-120...-1] IN/OUT */ 4385e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh{ 4395e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh int k; 4405e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 4415e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (k = 0; k <= 79; k++) 4425e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh dp[ -120 + k ] = dp[ -80 + k ]; 4435e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 4445e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (k = 0; k <= 39; k++) 4455e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh dp[ -40 + k ] = gsm_add( ep[k], dpp[k] ); 4465e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh} 4475e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#endif /* Has been inlined in code.c */ 4485e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 4495e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yehvoid Gsm_RPE_Encoding P5((S,e,xmaxc,Mc,xMc), 4505e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 4515e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh struct gsm_state * S, 4525e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 4535e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * e, /* -5..-1][0..39][40..44 IN/OUT */ 4545e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * xmaxc, /* OUT */ 4555e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * Mc, /* OUT */ 4565e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * xMc) /* [0..12] OUT */ 4575e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh{ 4585e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word x[40]; 4595e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word xM[13], xMp[13]; 4605e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word mant, exp; 4615e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 4625e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh Weighting_filter(e, x); 4635e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh RPE_grid_selection(x, xM, Mc); 4645e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 4655e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh APCM_quantization( xM, xMc, &mant, &exp, xmaxc); 4665e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh APCM_inverse_quantization( xMc, mant, exp, xMp); 4675e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 4685e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh RPE_grid_positioning( *Mc, xMp, e ); 4695e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 4705e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh} 4715e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 4725e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yehvoid Gsm_RPE_Decoding P5((S, xmaxcr, Mcr, xMcr, erp), 4735e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh struct gsm_state * S, 4745e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 4755e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word xmaxcr, 4765e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word Mcr, 4775e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * xMcr, /* [0..12], 3 bits IN */ 4785e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * erp /* [0..39] OUT */ 4795e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh) 4805e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh{ 4815e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word exp, mant; 4825e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word xMp[ 13 ]; 4835e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 4845e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh APCM_quantization_xmaxc_to_exp_mant( xmaxcr, &exp, &mant ); 4855e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh APCM_inverse_quantization( xMcr, mant, exp, xMp ); 4865e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh RPE_grid_positioning( Mcr, xMp, erp ); 4875e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 4885e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh} 489