00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include "sr_lpc10.h"
00032 #include <math.h>
00033
00034
00035
00036 static INDEX bit[10] = {
00037 16, 16, 16, 16, 8, 8, 8, 8, 4, 2
00038 };
00039
00040
00041 INT ivtab[32] =
00042 {
00043 24960, 24960, 24960, 24960, 25480, 25480, 25483, 25480,
00044 16640, 1560, 1560, 1560, 16640, 1816, 1563,
00045 1560, 24960, 24960, 24859, 24856, 26001,
00046 25881, 25915, 25913, 1560, 1560, 7800,
00047 3640, 1561, 1561, 3643, 3641
00048 };
00049 #define F FLOAT
00050 FLOAT corth[4][8] =
00051 {
00052 {(F)32767., (F)32767., (F)32., (F)32., (F)32., (F)32., (F)16., (F)16.},
00053 {(F)10., (F)8., (F)6.4, (F)6.4, (F)11.2, (F)11.2, (F)5.6, (F)5.6},
00054 {(F)5., (F)4., (F)3.2, (F)3.2, (F)6.4, (F)6.4, (F)3.2, (F)3.2},
00055 {(F)0., (F)0., (F)0., (F)0., (F)0., (F)0., (F)0., (F)0.}
00056 };
00057 #undef F
00058 INT detau[128] =
00059 {
00060 0, 0, 0, 3, 0, 3, 3, 31, 0, 3, 3, 21, 3, 3, 29, 30,
00061 0, 3, 3, 20, 3, 25, 27, 26, 3, 23, 58, 22, 3, 24, 28, 3,
00062 0, 3, 3, 3, 3, 39, 33, 32, 3, 37, 35, 36, 3, 38, 34, 3,
00063 3, 42, 46, 44, 50, 40, 48, 3, 54, 3, 56, 3, 52, 3, 3, 1,
00064 0, 3, 3, 108, 3, 78, 100, 104, 3, 84, 92, 88, 156, 80, 96, 3,
00065 3, 74, 70, 72, 66, 76, 68, 3, 62, 3, 60, 3, 64, 3, 3, 1,
00066 3, 116, 132, 112, 148, 152, 3, 3, 140, 3, 136, 3, 144, 3, 3, 1,
00067 124, 120, 128, 3, 3, 3, 3, 1, 3, 3, 3, 1, 3, 1, 1, 1
00068 };
00069 INT zrc[ORDER] =
00070 {0, 0, 0, 0, 0, 3, 0, 2, 0, 0};
00071 INT abit[5] =
00072 {2, 4, 8, 16, 32};
00073
00074
00075 void decode_2400 ( INDEX itab[13], BOOL voice[2],
00076 INT * pitch, FLOAT * rms, FLOAT rc[ORDER])
00077 {
00078 INT ivoic;
00079 static INT ivp2h = 0, erate = 0, iovoic = 0;
00080 INT i, i1, i2, i4, iavgp = 60, icorf, index, iout;
00081 INT ipit, ixcor, lsb;
00082 INT errcnt;
00083 INT ethrs = 2048, ethrs1 = 128, ethrs2 = 1024, ethrs3 = 2048;
00084 INT fut = 0, pres = 1, past = 2;
00085 static short first = 1;
00086
00087
00088
00089 for (i = 0; i < ORDER; i++)
00090 if ((ITAB13_IRC(i) & bit[i]) != 0)
00091 ITAB13_IRC(i) -= (bit[i] << 1);
00092
00093
00094 i4 = detau[ITAB13_IPITCH];
00095
00096
00097 if (i4 > 4) {
00098 g_dpit[fut] = i4;
00099 ivoic = 2;
00100 iavgp = (INT)((15 * iavgp + i4 + 8) * 0.0625);
00101 }
00102 else {
00103 ivoic = i4;
00104 g_dpit[fut] = iavgp;
00105 }
00106 g_drms[fut] = ITAB13_IRMS;
00107
00108 for (i = 0; i < ORDER; i++)
00109 g_drc[fut][i] = ITAB13_IRC(i);
00110
00111
00112
00113
00114 index = 16 * ivp2h + 4 * iovoic + ivoic + 1;
00115 i1 = ivtab[index - 1];
00116 ipit = i1 & 3;
00117 icorf = (INT)(i1 * 0.125);
00118 if (erate < ethrs)
00119 icorf = (INT)(icorf * 0.015625);
00120
00121
00122 ixcor = 4;
00123 if (erate < ethrs3)
00124 ixcor = 3;
00125 if (erate < ethrs2)
00126 ixcor = 2;
00127 if (erate < ethrs1)
00128 ixcor = 1;
00129
00130
00131
00132 ITAB13_IVOICE = icorf & 3;
00133
00134
00135
00136 if (first)
00137 first = 0;
00138 else {
00139
00140
00141
00142
00143
00144
00145 if ((icorf & abit[3]) != 0)
00146 {
00147 errcnt = 0;
00148 lsb = g_drms[pres] & 1;
00149 index = (INT)(g_drc[pres][7] * 16 + g_drms[pres] * 0.5);
00150 ham84 (index, &iout, &errcnt);
00151 g_drms[pres] = g_drms[past];
00152 if (iout >= 0)
00153 g_drms[pres] = iout * 2 + lsb;
00154
00155 for (i = 1; i <= 4; i++)
00156 {
00157 if (i == 1)
00158 i1 = (g_drc[pres][8] & 7) * 2 + (g_drc[pres][9] & 1);
00159 else
00160 i1 = g_drc[pres][8 - i] & 15;
00161
00162 i2 = g_drc[pres][4 - i] & 31;
00163 lsb = i2 & 1;
00164 index = (INT)(16 * i1 + i2 * 0.5);
00165 ham84 (index, &iout, &errcnt);
00166 if (iout >= 0)
00167 {
00168 iout = iout * 2 + lsb;
00169 if ((iout & 16) == 16)
00170 iout = iout - 32;
00171 }
00172 else
00173 iout = g_drc[past][4 - i];
00174 g_drc[pres][4 - i] = iout;
00175 }
00176
00177
00178 erate = (INT)(erate * .96875 + errcnt * 102);
00179 }
00180
00181
00182
00183 ITAB13_IRMS = g_drms[pres];
00184
00185 for (i = 0; i < ORDER; i++)
00186 ITAB13_IRC(i) = g_drc[pres][i];
00187 if (ipit == 1)
00188 g_dpit[pres] = g_dpit[past];
00189 if (ipit == 3)
00190 g_dpit[pres] = g_dpit[fut];
00191 ITAB13_IPITCH = g_dpit[pres];
00192
00193
00194
00195 if ((icorf & abit[1]) != 0)
00196 {
00197 if (fabs ((g_drms[pres] - g_drms[fut])) >= corth[ixcor - 1][1]
00198 && fabs ((g_drms[pres] - g_drms[past])) >= corth[ixcor - 1][1])
00199 ITAB13_IRMS = median (g_drms[past], g_drms[pres], g_drms[fut]);
00200
00201 for (i = 0; i < 6; i++)
00202 if (fabs ((g_drc[pres][i] - g_drc[fut][i])) >= corth[ixcor - 1][i + 2]
00203 && fabs ((g_drc[pres][i] - g_drc[past][i])) >= corth[ixcor - 1][i + 2])
00204 ITAB13_IRC(i) = median (g_drc[past][i], g_drc[pres][i], g_drc[fut][i]);
00205 }
00206
00207
00208
00209 if ((icorf & abit[2]) != 0)
00210 {
00211 if (fabs ((g_dpit[pres] - g_dpit[fut])) >= corth[ixcor - 1][0]
00212 && fabs ((g_dpit[pres] - g_dpit[past])) >= corth[ixcor - 1][0])
00213 ITAB13_IPITCH = median (g_dpit[past], g_dpit[pres], g_dpit[fut]);
00214 }
00215
00216
00217
00218
00219 }
00220 if ((icorf & abit[4]) != 0)
00221 for (i = 4; i < ORDER; i++)
00222 ITAB13_IRC(i) = zrc[i];
00223
00224
00225
00226
00227
00228 iovoic = ivoic;
00229 ivp2h = ITAB13_IVOICE & 1;
00230 g_dpit[past] = g_dpit[pres];
00231 g_dpit[pres] = g_dpit[fut];
00232 g_drms[past] = g_drms[pres];
00233 g_drms[pres] = g_drms[fut];
00234
00235 for (i = 1; i <= ORDER; i++)
00236 {
00237 g_drc[past][i - 1] = g_drc[pres][i - 1];
00238 g_drc[pres][i - 1] = g_drc[fut][i - 1];
00239 }
00240
00241 unquant (itab,voice,pitch,rms,rc);
00242 }