1 /* 2 * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische 3 * Universitaet Berlin. See the accompanying file "COPYRIGHT" for 4 * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. 5 */ 6 7 /* $Header: /tmp_amd/presto/export/kbs/jutta/src/gsm/RCS/preprocess.c,v 1.2 1994/05/10 20:18:45 jutta Exp $ */ 8 9 #include <stdio.h> 10 #include <assert.h> 11 12 #include "private.h" 13 14 #include "gsm.h" 15 #include "proto.h" 16 17 /* 4.2.0 .. 4.2.3 PREPROCESSING SECTION 18 * 19 * After A-law to linear conversion (or directly from the 20 * Ato D converter) the following scaling is assumed for 21 * input to the RPE-LTP algorithm: 22 * 23 * in: 0.1.....................12 24 * S.v.v.v.v.v.v.v.v.v.v.v.v.*.*.* 25 * 26 * Where S is the sign bit, v a valid bit, and * a "don't care" bit. 27 * The original signal is called sop[..] 28 * 29 * out: 0.1................... 12 30 * S.S.v.v.v.v.v.v.v.v.v.v.v.v.0.0 31 */ 32 33 34 void Gsm_Preprocess P3((S, s, so), 35 struct gsm_state * S, 36 word * s, 37 word * so ) /* [0..159] IN/OUT */ 38 { 39 40 word z1 = S->z1; 41 longword L_z2 = S->L_z2; 42 word mp = S->mp; 43 44 word s1; 45 longword L_s2; 46 47 longword L_temp; 48 49 word msp, lsp; 50 word SO; 51 52 longword ltmp; /* for ADD */ 53 ulongword utmp; /* for L_ADD */ 54 55 register int k = 160; 56 57 while (k--) { 58 59 /* 4.2.1 Downscaling of the input signal 60 */ 61 SO = SASR( *s, 3 ) << 2; 62 s++; 63 64 assert (SO >= -0x4000); /* downscaled by */ 65 assert (SO <= 0x3FFC); /* previous routine. */ 66 67 68 /* 4.2.2 Offset compensation 69 * 70 * This part implements a high-pass filter and requires extended 71 * arithmetic precision for the recursive part of this filter. 72 * The input of this procedure is the array so[0...159] and the 73 * output the array sof[ 0...159 ]. 74 */ 75 /* Compute the non-recursive part 76 */ 77 78 s1 = SO - z1; /* s1 = gsm_sub( *so, z1 ); */ 79 z1 = SO; 80 81 assert(s1 != MIN_WORD); 82 83 /* Compute the recursive part 84 */ 85 L_s2 = s1; 86 L_s2 <<= 15; 87 88 /* Execution of a 31 bv 16 bits multiplication 89 */ 90 91 msp = SASR( L_z2, 15 ); 92 lsp = L_z2-((longword)msp<<15); /* gsm_L_sub(L_z2,(msp<<15)); */ 93 94 L_s2 += GSM_MULT_R( lsp, 32735 ); 95 L_temp = (longword)msp * 32735; /* GSM_L_MULT(msp,32735) >> 1;*/ 96 L_z2 = GSM_L_ADD( L_temp, L_s2 ); 97 98 /* Compute sof[k] with rounding 99 */ 100 L_temp = GSM_L_ADD( L_z2, 16384 ); 101 102 /* 4.2.3 Preemphasis 103 */ 104 105 msp = GSM_MULT_R( mp, -28180 ); 106 mp = SASR( L_temp, 15 ); 107 *so++ = GSM_ADD( mp, msp ); 108 } 109 110 S->z1 = z1; 111 S->L_z2 = L_z2; 112 S->mp = mp; 113 } 114