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