view libgsmfr2/enc_main.c @ 274:52c667f17d2c

libgsmfr2: implement gsmfr_0610_encode_frame() wrapper
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 14 Apr 2024 02:57:18 +0000
parents a7b593e68ac3
children
line wrap: on
line source

/*
 * This C source file has been adapted from TU-Berlin libgsm source
 * (src/code.c), original notice follows:
 *
 * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
 * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
 * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
 */

#include <stdint.h>
#include <string.h>
#include "tw_gsmfr.h"
#include "typedef.h"
#include "ed_state.h"
#include "ed_internal.h"

/*
 *  4.2 FIXED POINT IMPLEMENTATION OF THE RPE-LTP CODER
 */

void gsmfr_0610_encode_params(struct gsmfr_0610_state *S, const int16_t *s,
			      struct gsmfr_param_frame *outp)
{
	int	k;
	word	* dp  = S->dp0 + 120;	/* [ -120...-1 ] */
	word	* dpp = dp;		/* [ 0...39 ]	 */

	word	so[160];

	Gsm_Preprocess			(S, s, so);
	Gsm_LPC_Analysis		(S, so, outp->LARc);
	Gsm_Short_Term_Analysis_Filter	(S, outp->LARc, so);

	for (k = 0; k <= 3; k++) {

		Gsm_Long_Term_Predictor	( S,
					 so+k*40, /* d      [0..39] IN	*/
					 dp,	  /* dp  [-120..-1] IN	*/
					S->e + 5, /* e      [0..39] OUT	*/
					dpp,	  /* dpp    [0..39] OUT */
					&outp->Nc[k],
					&outp->bc[k]);

		Gsm_RPE_Encoding	( S,
					S->e + 5,/* e	  ][0..39][ IN/OUT */
					&outp->xmaxc[k], &outp->Mc[k],
					outp->xMc[k] );
		/*
		 * Gsm_Update_of_reconstructed_short_time_residual_signal
		 *			( dpp, S->e + 5, dp );
		 */

		{ register int i;
		  register longword ltmp;
		  for (i = 0; i <= 39; i++)
			dp[ i ] = GSM_ADD( S->e[5 + i], dpp[i] );
		}
		dp  += 40;
		dpp += 40;

	}
	(void)memcpy( (char *)S->dp0, (char *)(S->dp0 + 160),
		120 * sizeof(*S->dp0) );
}