Remove strtol use in favor of bit shifting.

This commit is contained in:
balr0g 2013-11-24 17:15:01 -05:00
parent 0adb87be17
commit 0a70716cf6
1 changed files with 67 additions and 79 deletions

View File

@ -86,6 +86,8 @@ mbe_eccAmbe3600x2250C0 (char ambe_fr[4][24])
in[j] = ambe_fr[0][j + 1]; in[j] = ambe_fr[0][j + 1];
} }
errs = mbe_golay2312 (in, out); errs = mbe_golay2312 (in, out);
// ambe_fr[0][0] should be the C0 golay24 parity bit.
// TODO: actually test that here...
for (j = 0; j < 23; j++) for (j = 0; j < 23; j++)
{ {
ambe_fr[0][j + 1] = out[j]; ambe_fr[0][j + 1] = out[j];
@ -147,7 +149,6 @@ mbe_decodeAmbe2250Parms (char *ambe_d, mbe_parms * cur_mp, mbe_parms * prev_mp)
int b0, b1, b2, b3, b4, b5, b6, b7, b8; int b0, b1, b2, b3, b4, b5, b6, b7, b8;
float f0, Cik[5][18], flokl[57], deltal[57]; float f0, Cik[5][18], flokl[57], deltal[57];
float Sum42, Sum43, Tl[57], Gm[9], Ri[9], sum, c1, c2; float Sum42, Sum43, Tl[57], Gm[9], Ri[9], sum, c1, c2;
char tmpstr[13];
int silence; int silence;
int Ji[5], jl; int Ji[5], jl;
float deltaGamma, BigGamma; float deltaGamma, BigGamma;
@ -163,23 +164,22 @@ mbe_decodeAmbe2250Parms (char *ambe_d, mbe_parms * cur_mp, mbe_parms * prev_mp)
cur_mp->repeat = prev_mp->repeat; cur_mp->repeat = prev_mp->repeat;
// decode fundamental frequency w0 from b0 // decode fundamental frequency w0 from b0
tmpstr[7] = 0; b0 = 0;
tmpstr[0] = ambe_d[0] + 48; b0 |= ambe_d[0]<<6;
tmpstr[1] = ambe_d[1] + 48; b0 |= ambe_d[1]<<5;
tmpstr[2] = ambe_d[2] + 48; b0 |= ambe_d[2]<<4;
tmpstr[3] = ambe_d[3] + 48; b0 |= ambe_d[3]<<3;
tmpstr[4] = ambe_d[37] + 48; b0 |= ambe_d[37]<<2;
tmpstr[5] = ambe_d[38] + 48; b0 |= ambe_d[38]<<1;
tmpstr[6] = ambe_d[39] + 48; b0 |= ambe_d[39];
b0 = strtol (tmpstr, NULL, 2); if ((b0 >= 120) && (b0 <= 123)) // if w0 bits are 1111000, 1111001, 1111010 or 1111011, frame is erasure
if ((b0 >= 120) && (b0 <= 123))
{ {
#ifdef AMBE_DEBUG #ifdef AMBE_DEBUG
printf ("Erasure Frame\n"); printf ("Erasure Frame\n");
#endif #endif
return (2); return (2);
} }
else if ((b0 == 124) || (b0 == 125)) else if ((b0 == 124) || (b0 == 125)) // if w0 bits are 1111100 or 1111101, frame is silence
{ {
#ifdef AMBE_DEBUG #ifdef AMBE_DEBUG
printf ("Silence Frame\n"); printf ("Silence Frame\n");
@ -194,7 +194,7 @@ mbe_decodeAmbe2250Parms (char *ambe_d, mbe_parms * cur_mp, mbe_parms * prev_mp)
cur_mp->Vl[l] = 0; cur_mp->Vl[l] = 0;
} }
} }
else if ((b0 == 126) || (b0 == 127)) else if ((b0 == 126) || (b0 == 127)) // if w0 bits are 1111110 or 1111111, frame is tone
{ {
#ifdef AMBE_DEBUG #ifdef AMBE_DEBUG
printf ("Tone Frame\n"); printf ("Tone Frame\n");
@ -222,7 +222,7 @@ mbe_decodeAmbe2250Parms (char *ambe_d, mbe_parms * cur_mp, mbe_parms * prev_mp)
// L from specification document // L from specification document
// lookup L in tabl3 // lookup L in tabl3
L = AmbeLtable[b0]; L = AmbeLtable[b0];
// L formula form patent filings // L formula from patent filings
//L=(int)((float)0.4627 / f0); //L=(int)((float)0.4627 / f0);
cur_mp->L = L; cur_mp->L = L;
} }
@ -230,13 +230,12 @@ mbe_decodeAmbe2250Parms (char *ambe_d, mbe_parms * cur_mp, mbe_parms * prev_mp)
// decode V/UV parameters // decode V/UV parameters
// load b1 from ambe_d // load b1 from ambe_d
tmpstr[5] = 0; b1 = 0;
tmpstr[0] = ambe_d[4] + 48; b1 |= ambe_d[4]<<4;
tmpstr[1] = ambe_d[5] + 48; b1 |= ambe_d[5]<<3;
tmpstr[2] = ambe_d[6] + 48; b1 |= ambe_d[6]<<2;
tmpstr[3] = ambe_d[7] + 48; b1 |= ambe_d[7]<<1;
tmpstr[4] = ambe_d[35] + 48; b1 |= ambe_d[35];
b1 = strtol (tmpstr, NULL, 2);
for (l = 1; l <= L; l++) for (l = 1; l <= L; l++)
{ {
@ -259,13 +258,12 @@ mbe_decodeAmbe2250Parms (char *ambe_d, mbe_parms * cur_mp, mbe_parms * prev_mp)
// decode gain vector // decode gain vector
// load b2 from ambe_d // load b2 from ambe_d
tmpstr[5] = 0; b2 = 0;
tmpstr[0] = ambe_d[8] + 48; b2 |= ambe_d[8]<<4;
tmpstr[1] = ambe_d[9] + 48; b2 |= ambe_d[9]<<3;
tmpstr[2] = ambe_d[10] + 48; b2 |= ambe_d[10]<<2;
tmpstr[3] = ambe_d[11] + 48; b2 |= ambe_d[11]<<1;
tmpstr[4] = ambe_d[36] + 48; b2 |= ambe_d[36];
b2 = strtol (tmpstr, NULL, 2);
deltaGamma = AmbeDg[b2]; deltaGamma = AmbeDg[b2];
cur_mp->gamma = deltaGamma + ((float) 0.5 * prev_mp->gamma); cur_mp->gamma = deltaGamma + ((float) 0.5 * prev_mp->gamma);
@ -278,31 +276,29 @@ mbe_decodeAmbe2250Parms (char *ambe_d, mbe_parms * cur_mp, mbe_parms * prev_mp)
Gm[1] = 0; Gm[1] = 0;
// load b3 from ambe_d // load b3 from ambe_d
tmpstr[9] = 0; b3 = 0;
tmpstr[0] = ambe_d[12] + 48; b3 |= ambe_d[12]<<8;
tmpstr[1] = ambe_d[13] + 48; b3 |= ambe_d[13]<<7;
tmpstr[2] = ambe_d[14] + 48; b3 |= ambe_d[14]<<6;
tmpstr[3] = ambe_d[15] + 48; b3 |= ambe_d[15]<<5;
tmpstr[4] = ambe_d[16] + 48; b3 |= ambe_d[16]<<4;
tmpstr[5] = ambe_d[17] + 48; b3 |= ambe_d[17]<<3;
tmpstr[6] = ambe_d[18] + 48; b3 |= ambe_d[18]<<2;
tmpstr[7] = ambe_d[19] + 48; b3 |= ambe_d[19]<<1;
tmpstr[8] = ambe_d[40] + 48; b3 |= ambe_d[40];
b3 = strtol (tmpstr, NULL, 2);
Gm[2] = AmbePRBA24[b3][0]; Gm[2] = AmbePRBA24[b3][0];
Gm[3] = AmbePRBA24[b3][1]; Gm[3] = AmbePRBA24[b3][1];
Gm[4] = AmbePRBA24[b3][2]; Gm[4] = AmbePRBA24[b3][2];
// load b4 from ambe_d // load b4 from ambe_d
tmpstr[7] = 0; b4 = 0;
tmpstr[0] = ambe_d[20] + 48; b4 |= ambe_d[20]<<6;
tmpstr[1] = ambe_d[21] + 48; b4 |= ambe_d[21]<<5;
tmpstr[2] = ambe_d[22] + 48; b4 |= ambe_d[22]<<4;
tmpstr[3] = ambe_d[23] + 48; b4 |= ambe_d[23]<<3;
tmpstr[4] = ambe_d[41] + 48; b4 |= ambe_d[41]<<2;
tmpstr[5] = ambe_d[42] + 48; b4 |= ambe_d[42]<<1;
tmpstr[6] = ambe_d[43] + 48; b4 |= ambe_d[43];
b4 = strtol (tmpstr, NULL, 2);
Gm[5] = AmbePRBA58[b4][0]; Gm[5] = AmbePRBA58[b4][0];
Gm[6] = AmbePRBA58[b4][1]; Gm[6] = AmbePRBA58[b4][1];
Gm[7] = AmbePRBA58[b4][2]; Gm[7] = AmbePRBA58[b4][2];
@ -351,36 +347,32 @@ mbe_decodeAmbe2250Parms (char *ambe_d, mbe_parms * cur_mp, mbe_parms * prev_mp)
// decode HOC // decode HOC
// load b5 from ambe_d // load b5 from ambe_d
tmpstr[5] = 0; b5 = 0;
tmpstr[0] = ambe_d[24] + 48; b5 |= ambe_d[24]<<4;
tmpstr[1] = ambe_d[25] + 48; b5 |= ambe_d[25]<<3;
tmpstr[2] = ambe_d[26] + 48; b5 |= ambe_d[26]<<2;
tmpstr[3] = ambe_d[27] + 48; b5 |= ambe_d[27]<<1;
tmpstr[4] = ambe_d[44] + 48; b5 |= ambe_d[44];
b5 = strtol (tmpstr, NULL, 2);
// load b6 from ambe_d // load b6 from ambe_d
tmpstr[4] = 0; b6 = 0;
tmpstr[0] = ambe_d[28] + 48; b6 |= ambe_d[28]<<3;
tmpstr[1] = ambe_d[29] + 48; b6 |= ambe_d[29]<<2;
tmpstr[2] = ambe_d[30] + 48; b6 |= ambe_d[30]<<1;
tmpstr[3] = ambe_d[45] + 48; b6 |= ambe_d[45];
b6 = strtol (tmpstr, NULL, 2);
// load b7 from ambe_d // load b7 from ambe_d
tmpstr[4] = 0; b7 = 0;
tmpstr[0] = ambe_d[31] + 48; b7 |= ambe_d[31]<<3;
tmpstr[1] = ambe_d[32] + 48; b7 |= ambe_d[32]<<2;
tmpstr[2] = ambe_d[33] + 48; b7 |= ambe_d[33]<<1;
tmpstr[3] = ambe_d[46] + 48; b7 |= ambe_d[46];
b7 = strtol (tmpstr, NULL, 2);
// load b8 from ambe_d // load b8 from ambe_d
tmpstr[3] = 0; b8 = 0;
tmpstr[0] = ambe_d[34] + 48; b8 |= ambe_d[34]<<2;
tmpstr[1] = ambe_d[47] + 48; b8 |= ambe_d[47]<<1;
tmpstr[2] = ambe_d[48] + 48; b8 |= ambe_d[48];
b8 = strtol (tmpstr, NULL, 2);
// lookup Ji // lookup Ji
Ji[1] = AmbeLmprbl[L][0]; Ji[1] = AmbeLmprbl[L][0];
@ -566,18 +558,14 @@ mbe_demodulateAmbe3600x2250Data (char ambe_fr[4][24])
{ {
int i, j, k; int i, j, k;
unsigned short pr[115]; unsigned short pr[115];
unsigned short foo; unsigned short foo = 0;
char tmpstr[25];
// create pseudo-random modulator // create pseudo-random modulator
j = 0;
tmpstr[12] = 0;
for (i = 23; i >= 12; i--) for (i = 23; i >= 12; i--)
{ {
tmpstr[j] = (ambe_fr[0][i] + 48); foo <<= 1;
j++; foo |= ambe_fr[0][i];
} }
foo = strtol (tmpstr, NULL, 2);
pr[0] = (16 * foo); pr[0] = (16 * foo);
for (i = 1; i < 24; i++) for (i = 1; i < 24; i++)
{ {