00001
00002
00003
00004
00005
00006
00007
00008
00009 #include <stdio.h>
00010 #include <assert.h>
00011
00012 #include "private.h"
00013
00014 #include "gsm.h"
00015 #include "proto.h"
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 void Gsm_Preprocess P3((S, s, so),
00035 struct gsm_state * S,
00036 word * s,
00037 word * so )
00038 {
00039
00040 word z1 = S->z1;
00041 longword L_z2 = S->L_z2;
00042 word mp = S->mp;
00043
00044 word s1;
00045
00046
00047 word SO;
00048
00049 longword ltmp;
00050 ulongword utmp;
00051
00052 register int k = 160;
00053
00054 while (k--) {
00055
00056
00057
00058
00059 SO = SASR( *s, 1 ) & ~3;
00060 s++;
00061
00062 assert (SO >= -0x4000);
00063 assert (SO <= 0x3FFC);
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076 s1 = SO - z1;
00077 z1 = SO;
00078
00079 assert(s1 != MIN_WORD);
00080
00081
00082
00083
00084
00085
00086
00087
00088 {
00089 word msp, lsp;
00090 longword L_s2;
00091 longword L_temp;
00092
00093 L_s2 = s1;
00094 L_s2 <<= 15;
00095 #ifndef __GNUC__
00096 msp = SASR( L_z2, 15 );
00097 lsp = L_z2 & 0x7fff;
00098
00099 L_s2 += GSM_MULT_R( lsp, 32735 );
00100 L_temp = (longword)msp * 32735;
00101 L_z2 = GSM_L_ADD( L_temp, L_s2 );
00102
00103 #else
00104 L_z2 = ((long long)L_z2*32735 + 0x4000)>>15;
00105
00106
00107
00108
00109
00110
00111 L_z2 = GSM_L_ADD(L_z2,L_s2);
00112 #endif
00113
00114
00115 L_temp = GSM_L_ADD( L_z2, 16384 );
00116
00117
00118
00119
00120 msp = GSM_MULT_R( mp, -28180 );
00121 mp = SASR( L_temp, 15 );
00122 *so++ = GSM_ADD( mp, msp );
00123 }
00124 }
00125
00126 S->z1 = z1;
00127 S->L_z2 = L_z2;
00128 S->mp = mp;
00129 }