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/decode.c,v 1.1 1992/10/28 00:15:50 jutta Exp $ */ 85e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 95e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#include <stdio.h> 105e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 115e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#include "private.h" 125e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#include "gsm.h" 135e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#include "proto.h" 145e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 155e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh/* 165e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * 4.3 FIXED POINT IMPLEMENTATION OF THE RPE-LTP DECODER 175e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 185e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 195e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yehstatic void Postprocessing P2((S,s), 205e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh struct gsm_state * S, 215e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register word * s) 225e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh{ 235e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register int k; 245e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register word msr = S->msr; 255e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register longword ltmp; /* for GSM_ADD */ 265e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register word tmp; 275e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 285e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (k = 160; k--; s++) { 295e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh tmp = GSM_MULT_R( msr, 28180 ); 305e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh msr = GSM_ADD(*s, tmp); /* Deemphasis */ 315e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *s = GSM_ADD(msr, msr) & 0xFFF8; /* Truncation & Upscaling */ 325e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 335e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh S->msr = msr; 345e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh} 355e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 365e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yehvoid Gsm_Decoder P8((S,LARcr, Ncr,bcr,Mcr,xmaxcr,xMcr,s), 375e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh struct gsm_state * S, 385e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 395e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * LARcr, /* [0..7] IN */ 405e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 415e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * Ncr, /* [0..3] IN */ 425e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * bcr, /* [0..3] IN */ 435e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * Mcr, /* [0..3] IN */ 445e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * xmaxcr, /* [0..3] IN */ 455e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * xMcr, /* [0..13*4] IN */ 465e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 475e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * s) /* [0..159] OUT */ 485e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh{ 495e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh int j, k; 505e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word erp[40], wt[160]; 515e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * drp = S->dp0 + 120; 525e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 535e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (j=0; j <= 3; j++, xmaxcr++, bcr++, Ncr++, Mcr++, xMcr += 13) { 545e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 555e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh Gsm_RPE_Decoding( S, *xmaxcr, *Mcr, xMcr, erp ); 565e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh Gsm_Long_Term_Synthesis_Filtering( S, *Ncr, *bcr, erp, drp ); 575e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 585e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (k = 0; k <= 39; k++) wt[ j * 40 + k ] = drp[ k ]; 595e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 605e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 615e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh Gsm_Short_Term_Synthesis_Filter( S, LARcr, wt, s ); 625e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh Postprocessing(S, s); 635e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh} 64