00001
00002 #include "sr_lpc10.h"
00003 #include <math.h>
00004
00005
00006
00007 static INDEX G_detab7[32] = {
00008 4, 11, 18, 25, 32, 39, 46, 53, 60, 66, 72, 77, 82, 87, 92, 96, 101,
00009 104, 108, 111, 114, 115, 117, 119, 121, 122, 123, 124, 125, 126,
00010 127, 127
00011 };
00012
00013 #define F FLOAT
00014 static FLOAT G_descl[8] = {
00015 (F).6953, (F).6250, (F).5781, (F).5469,
00016 (F).5312, (F).5391, (F).4688, (F).3828
00017 };
00018
00019 static FLOAT G_deadd[8] = {
00020 (F)1152, (F)-2816, (F)-1536, (F)-3584,
00021 (F)-1280, (F)-2432, (F)768, (F)-1920
00022 };
00023 #undef F
00024
00025 static INDEX G_qb[8] = {
00026 511, 511, 1023, 1023, 1023, 1023, 2047, 4095
00027 };
00028
00029 static INDEX G_nbit[10] = {
00030 6, 6, 9, 9, 10, 10, 10, 10, 11, 12
00031 };
00032
00033
00034
00035 VOID unquant ( INDEX itab[13], BOOL voice[2],
00036 INT * pitch, FLOAT * rms, FLOAT rc[ORDER])
00037 {
00038 #define SCALERC (FLOAT)6.103515625e-05
00039 INDEX i;
00040 #ifdef NEGTRUNC
00041 FLOAT ftemp;
00042 INDEX itemp;
00043 #endif
00044
00045
00046 *pitch = ITAB13_IPITCH;
00047 voice[1] = (ITAB13_IVOICE & 0x01);
00048 voice[0] = (ITAB13_IVOICE > 1);
00049
00050
00051 *rms = (FLOAT)(G_rmst[(31 - ITAB13_IRMS) * 2]);
00052
00053
00054 for (i = 0; i <= 1; i++) {
00055 INDEX i2 = ITAB13_IRC(i);
00056 if (i2 < 0)
00057 i2 = -G_detab7[2 * (-i2)];
00058 else
00059 i2 = G_detab7[2 * i2];
00060 rc[i] = (i2 * (2 << G_nbit[i])) * SCALERC;
00061 }
00062
00063
00064 for (i = 2; i < ORDER; i++) {
00065 INDEX i2 = ITAB13_IRC(i);
00066 i2 *= (2 << G_nbit[i]);
00067 i2 += G_qb[i - 2];
00068 #ifdef NEGTRUNC
00069 ftemp = i2 * G_descl[i-2] + G_deadd[i-2];
00070 if (ftemp < 0) {
00071 ftemp = -ftemp;
00072 itemp = ftemp;
00073 rc[i] = (-itemp) * SCALERC;
00074 }
00075 else
00076 rc[i] = (INDEX)ftemp * SCALERC;
00077 #else
00078 rc[i] = (INDEX)(i2 * G_descl[i-2] + G_deadd[i-2]) * SCALERC;
00079 #endif
00080 }
00081 }
00082
00083