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/code.c,v 1.3 1996/07/02 09:59:05 jutta Exp $ */
85e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
95e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#include	"config.h"
105e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
115e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
125fa09236b165ef5773a1503349ca8d04fbf82099Elliott Hughes#ifdef	HAS_STRING_H
135fa09236b165ef5773a1503349ca8d04fbf82099Elliott Hughes#include	<string.h>
145e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#else
155e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#	include "proto.h"
165e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	extern char	* memcpy P((char *, char *, int));
175e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#endif
185e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
195e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#include	"private.h"
205e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#include	"gsm.h"
215e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#include	"proto.h"
225e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
235e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh/*
245e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *  4.2 FIXED POINT IMPLEMENTATION OF THE RPE-LTP CODER
255e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */
265e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
275e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yehvoid Gsm_Coder P8((S,s,LARc,Nc,bc,Mc,xmaxc,xMc),
285e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
295e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	struct gsm_state	* S,
305e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
315e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	word	* s,	/* [0..159] samples		  	IN	*/
325e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
335e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh/*
345e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * The RPE-LTD coder works on a frame by frame basis.  The length of
355e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * the frame is equal to 160 samples.  Some computations are done
365e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * once per frame to produce at the output of the coder the
375e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * LARc[1..8] parameters which are the coded LAR coefficients and
385e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * also to realize the inverse filtering operation for the entire
395e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * frame (160 samples of signal d[0..159]).  These parts produce at
405e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * the output of the coder:
415e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */
425e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
435e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	word	* LARc,	/* [0..7] LAR coefficients		OUT	*/
445e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
455e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh/*
465e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * Procedure 4.2.11 to 4.2.18 are to be executed four times per
475e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * frame.  That means once for each sub-segment RPE-LTP analysis of
485e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * 40 samples.  These parts produce at the output of the coder:
495e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */
505e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
515e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	word	* Nc,	/* [0..3] LTP lag			OUT 	*/
525e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	word	* bc,	/* [0..3] coded LTP gain		OUT 	*/
535e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	word	* Mc,	/* [0..3] RPE grid selection		OUT     */
545e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	word	* xmaxc,/* [0..3] Coded maximum amplitude	OUT	*/
555e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	word	* xMc	/* [13*4] normalized RPE samples	OUT	*/
565e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh)
575e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh{
585e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	int	k;
595e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	word	* dp  = S->dp0 + 120;	/* [ -120...-1 ] */
605e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	word	* dpp = dp;		/* [ 0...39 ]	 */
615e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
625e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	word	so[160];
635e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
645e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	Gsm_Preprocess			(S, s, so);
655e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	Gsm_LPC_Analysis		(S, so, LARc);
665e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	Gsm_Short_Term_Analysis_Filter	(S, LARc, so);
675e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
685e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	for (k = 0; k <= 3; k++, xMc += 13) {
695e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
705e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		Gsm_Long_Term_Predictor	( S,
715e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh					 so+k*40, /* d      [0..39] IN	*/
725e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh					 dp,	  /* dp  [-120..-1] IN	*/
735e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh					S->e + 5, /* e      [0..39] OUT	*/
745e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh					dpp,	  /* dpp    [0..39] OUT */
755e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh					 Nc++,
765e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh					 bc++);
775e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
785e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		Gsm_RPE_Encoding	( S,
795e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh					S->e + 5,/* e	  ][0..39][ IN/OUT */
805e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh					  xmaxc++, Mc++, xMc );
815e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		/*
825e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		 * Gsm_Update_of_reconstructed_short_time_residual_signal
835e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		 *			( dpp, S->e + 5, dp );
845e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		 */
855e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
865e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		{ register int i;
875e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		  register longword ltmp;
885e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		  for (i = 0; i <= 39; i++)
895e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh			dp[ i ] = GSM_ADD( S->e[5 + i], dpp[i] );
905e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		}
915e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		dp  += 40;
925e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		dpp += 40;
935e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
945e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	}
955e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	(void)memcpy( (char *)S->dp0, (char *)(S->dp0 + 160),
965e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		120 * sizeof(*S->dp0) );
975e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh}
98