1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* 2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische 3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Universitaet Berlin. See the accompanying file "COPYRIGHT" for 4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. 5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* $Header: /tmp_amd/presto/export/kbs/jutta/src/gsm/RCS/preprocess.c,v 1.2 1994/05/10 20:18:45 jutta Exp $ */ 8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdio.h> 10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <assert.h> 11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "private.h" 13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "gsm.h" 15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "proto.h" 16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* 4.2.0 .. 4.2.3 PREPROCESSING SECTION 18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * After A-law to linear conversion (or directly from the 20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Ato D converter) the following scaling is assumed for 21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * input to the RPE-LTP algorithm: 22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * in: 0.1.....................12 24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * S.v.v.v.v.v.v.v.v.v.v.v.v.*.*.* 25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Where S is the sign bit, v a valid bit, and * a "don't care" bit. 27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The original signal is called sop[..] 28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * out: 0.1................... 12 30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * S.S.v.v.v.v.v.v.v.v.v.v.v.v.0.0 31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid Gsm_Preprocess P3((S, s, so), 35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project struct gsm_state * S, 36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project word * s, 37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project word * so ) /* [0..159] IN/OUT */ 38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ 39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project word z1 = S->z1; 41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project longword L_z2 = S->L_z2; 42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project word mp = S->mp; 43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project word s1; 45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project longword L_s2; 46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project longword L_temp; 48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project word msp, lsp; 50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project word SO; 51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project longword ltmp; /* for ADD */ 53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ulongword utmp; /* for L_ADD */ 54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project register int k = 160; 56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project while (k--) { 58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* 4.2.1 Downscaling of the input signal 60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SO = SASR( *s, 3 ) << 2; 62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project s++; 63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project assert (SO >= -0x4000); /* downscaled by */ 65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project assert (SO <= 0x3FFC); /* previous routine. */ 66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* 4.2.2 Offset compensation 69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This part implements a high-pass filter and requires extended 71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * arithmetic precision for the recursive part of this filter. 72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The input of this procedure is the array so[0...159] and the 73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * output the array sof[ 0...159 ]. 74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* Compute the non-recursive part 76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project s1 = SO - z1; /* s1 = gsm_sub( *so, z1 ); */ 79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project z1 = SO; 80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project assert(s1 != MIN_WORD); 82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* Compute the recursive part 84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project L_s2 = s1; 86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project L_s2 <<= 15; 87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* Execution of a 31 bv 16 bits multiplication 89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project msp = SASR( L_z2, 15 ); 92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lsp = L_z2-((longword)msp<<15); /* gsm_L_sub(L_z2,(msp<<15)); */ 93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project L_s2 += GSM_MULT_R( lsp, 32735 ); 95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project L_temp = (longword)msp * 32735; /* GSM_L_MULT(msp,32735) >> 1;*/ 96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project L_z2 = GSM_L_ADD( L_temp, L_s2 ); 97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* Compute sof[k] with rounding 99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project L_temp = GSM_L_ADD( L_z2, 16384 ); 101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* 4.2.3 Preemphasis 103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project msp = GSM_MULT_R( mp, -28180 ); 106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mp = SASR( L_temp, 15 ); 107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *so++ = GSM_ADD( mp, msp ); 108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project S->z1 = z1; 111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project S->L_z2 = L_z2; 112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project S->mp = mp; 113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project