📄 gsm_bits_convert.c
字号:
#define GSM_MAGIC 0xD /* 13 kbit/s RPE-LTP */
//
// XM is an RPE sequence containing 13 samples. There is one
// RPE sequence per sub-frame. This is typedefed in order to
// facilitate passing the array thru function calls.
//
static short g_LARc[8], g_Nc[4], g_Mc[4], g_bc[4], g_xmaxc[4], g_xmc[52];
void PackFrame0
(
unsigned char ab[],
short LAR[],
short N[],
short b[],
short M[],
short Xmax[],
short X[]
)
{
int i;
// Pack the LAR[1..8] into the first 4.5 bytes
ab[0] = ((LAR[0] ) & 0x3F) | ((LAR[1] << 6) & 0xC0);
ab[1] = ((LAR[1] >> 2) & 0x0F) | ((LAR[2] << 4) & 0xF0);
ab[2] = ((LAR[2] >> 4) & 0x01) | ((LAR[3] << 1) & 0x3E) | ((LAR[4] << 6) & 0xC0);
ab[3] = ((LAR[4] >> 2) & 0x03) | ((LAR[5] << 2) & 0x3C) | ((LAR[6] << 6) & 0xC0);
ab[4] = ((LAR[6] >> 2) & 0x01) | ((LAR[7] << 1) & 0x0E);
// Pack N, b, M, Xmax, and X for each of the 4 sub-frames
for (i=0; i<4; i++)
{
ab[4+i*7+0] |= ((N[i] << 4) & 0xF0);
ab[4+i*7+1] = ((N[i] >> 4) & 0x07) | ((b[i] << 3) & 0x18) | ((M[i] << 5) & 0x60) | ((Xmax[i] << 7) & 0x80);
ab[4+i*7+2] = ((Xmax[i] >> 1) & 0x1F) | ((X[i*13+0] << 5) & 0xE0);
ab[4+i*7+3] = (X[i*13+1] & 0x07) | ((X[i*13+2] << 3) & 0x38) | ((X[i*13+3] << 6) & 0xC0);
ab[4+i*7+4] = ((X[i*13+3] >> 2) & 0x01) | ((X[i*13+4] << 1) & 0x0E) | ((X[i*13+5] << 4) & 0x70) | ((X[i*13+6] << 7) & 0x80);
ab[4+i*7+5] = ((X[i*13+6] >> 1) & 0x03) | ((X[i*13+7] << 2) & 0x1C) | ((X[i*13+8] << 5) & 0xE0);
ab[4+i*7+6] = (X[i*13+9] & 0x07) | ((X[i*13+10] << 3) & 0x38) | ((X[i*13+11] << 6) & 0xC0);
ab[4+i*7+7] = ((X[i*13+11] >> 2) & 0x01) | ((X[i*13+12] << 1) & 0x0E);
}
return;
}
void PackFrame1
(
unsigned char ab[],
short LAR[],
short N[],
short b[],
short M[],
short Xmax[],
short X[]
)
{
int i;
// Pack the LAR[1..8] into the first 4.5 bytes, starting with the
// more significant nibble of the first byte.
ab[32] |= ((LAR[0] << 4) & 0xF0);
ab[33] = ((LAR[0] >> 4) & 0x03) | ((LAR[1] << 2) & 0xFC);
ab[34] = ((LAR[2] ) & 0x1F) | ((LAR[3] << 5) & 0xE0);
ab[35] = ((LAR[3] >> 3) & 0x03) | ((LAR[4] << 2) & 0x3C) | ((LAR[5] << 6) & 0xC0);
ab[36] = ((LAR[5] >> 2) & 0x03) | ((LAR[6] << 2) & 0x1C) | ((LAR[7] << 5) & 0xE0);
// Pack N, b, M, Xmax, and X for each of the 4 sub-frames
for (i=0; i<4; i++)
{
ab[37+i*7+0] = (N[i] & 0x7F) | ((b[i] << 7) & 0x80);
ab[37+i*7+1] = ((b[i] >> 1) & 0x01) | ((M[i] << 1) & 0x06) | ((Xmax[i] << 3) & 0xF8);
ab[37+i*7+2] = ((Xmax[i] >> 5) & 0x01) | ((X[i*13+0] << 1) & 0x0E) | ((X[i*13+1] << 4) & 0x70) | ((X[i*13+2] << 7) & 0x80);
ab[37+i*7+3] = ((X[i*13+2] >> 1) & 0x03) | ((X[i*13+3] << 2) & 0x1C) | ((X[i*13+4] << 5) & 0xE0);
ab[37+i*7+4] = ((X[i*13+5] ) & 0x07) | ((X[i*13+6] << 3) & 0x38) | ((X[i*13+7] << 6) & 0xC0);
ab[37+i*7+5] = ((X[i*13+7] >> 2) & 0x01) | ((X[i*13+8] << 1) & 0x0E) | ((X[i*13+9] << 4) & 0x70) | ((X[i*13+10] << 7) & 0x80);
ab[37+i*7+6] = ((X[i*13+10] >> 1) & 0x03) | ((X[i*13+11] << 2) & 0x1C) | ((X[i*13+12] << 5) & 0xE0);
}
return;
}
void UnpackFrame0
(
const unsigned char ab[],
short LAR[],
short N[],
short b[],
short M[],
short Xmax[],
short X[]
)
{
unsigned int i;
// Unpack the LAR[1..8] from the first 4.5 bytes
LAR[0] = (ab[0] & 0x3F);
LAR[1] = ((ab[0] & 0xC0) >> 6) | ((ab[1] & 0x0F) << 2);
LAR[2] = ((ab[1] & 0xF0) >> 4) | ((ab[2] & 0x01) << 4);
LAR[3] = ((ab[2] & 0x3E) >> 1);
LAR[4] = ((ab[2] & 0xC0) >> 6) | ((ab[3] & 0x03) << 2);
LAR[5] = ((ab[3] & 0x3C) >> 2);
LAR[6] = ((ab[3] & 0xC0) >> 6) | ((ab[4] & 0x01) << 2);
LAR[7] = ((ab[4] & 0x0E) >> 1);
// Unpack N, b, M, Xmax, and X for each of the four sub-frames
for (i=0; i<4; i++)
{
// A convenient macro for getting bytes out of the array for
// construction of the subframe parameters
#define sfb(x) (ab[4+i*7+x])
N[i] = ((sfb(0) & 0xF0) >> 4) | ((sfb(1) & 0x07) << 4);
b[i] = ((sfb(1) & 0x18) >> 3);
M[i] = ((sfb(1) & 0x60) >> 5);
Xmax[i] = ((sfb(1) & 0x80) >> 7) | ((sfb(2) & 0x1F) << 1);
X[i*13+0] = ((sfb(2) & 0xE0) >> 5);
X[i*13+1] = (sfb(3) & 0x07);
X[i*13+2] = ((sfb(3) & 0x3C) >> 3);
X[i*13+3] = ((sfb(3) & 0xC0) >> 6) | ((sfb(4) & 0x01) << 2);
X[i*13+4] = ((sfb(4) & 0x0E) >> 1);
X[i*13+5] = ((sfb(4) & 0x70) >> 4);
X[i*13+6] = ((sfb(4) & 0x80) >> 7) | ((sfb(5) & 0x03) << 1);
X[i*13+7] = ((sfb(5) & 0x1C) >> 2);
X[i*13+8] = ((sfb(5) & 0xE0) >> 5);
X[i*13+9] = (sfb(6) & 0x07);
X[i*13+10] = ((sfb(6) & 0x38) >> 3);
X[i*13+11] = ((sfb(6) & 0xC0) >> 6) | ((sfb(7) & 0x01) << 2);
X[i*13+12] = ((sfb(7) & 0x0E) >> 1);
#undef sfb
}
return;
}
void UnpackFrame1
(
const unsigned char ab[],
short LAR[],
short N[],
short b[],
short M[],
short Xmax[],
short X[]
)
{
unsigned int i;
// Unpack the LAR[1..8] from the first 4.5 bytes
LAR[0] = ((ab[32] & 0xF0) >> 4) | ((ab[33] & 0x03) << 4);
LAR[1] = ((ab[33] & 0xFC) >> 2);
LAR[2] = ((ab[34] & 0x1F) );
LAR[3] = ((ab[34] & 0xE0) >> 5) | ((ab[35] & 0x03) << 3);
LAR[4] = ((ab[35] & 0x3C) >> 2);
LAR[5] = ((ab[35] & 0xC0) >> 6) | ((ab[36] & 0x03) << 2);
LAR[6] = ((ab[36] & 0x1C) >> 2);
LAR[7] = ((ab[36] & 0xE0) >> 5);
// Unpack N, b, M, Xmax, and X for each of the four sub-frames
for (i=0; i<4; i++)
{
// A convenient macro for getting bytes out of the array for
// construction of the subframe parameters
#define sfb(x) (ab[37+i*7+x])
N[i] = sfb(0) & 0x7F;
b[i] = ((sfb(0) & 0x80) >> 7) | ((sfb(1) & 0x01) << 1);
M[i] = ((sfb(1) & 0x06) >> 1);
Xmax[i] = ((sfb(1) & 0xF8) >> 3) | ((sfb(2) & 0x01) << 5);
X[i*13+0] = ((sfb(2) & 0x0E) >> 1);
X[i*13+1] = ((sfb(2) & 0x70) >> 4);
X[i*13+2] = ((sfb(2) & 0x80) >> 7) | ((sfb(3) & 0x03) << 1);
X[i*13+3] = ((sfb(3) & 0x1C) >> 2);
X[i*13+4] = ((sfb(3) & 0xE0) >> 5);
X[i*13+5] = ((sfb(4) & 0x07) );
X[i*13+6] = ((sfb(4) & 0x38) >> 3);
X[i*13+7] = ((sfb(4) & 0xC0) >> 6) | ((sfb(5) & 0x01) << 2);
X[i*13+8] = ((sfb(5) & 0x0E) >> 1);
X[i*13+9] = ((sfb(5) & 0x70) >> 4);
X[i*13+10] = ((sfb(5) & 0x80) >> 7) | ((sfb(6) & 0x03) << 1);
X[i*13+11] = ((sfb(6) & 0x1C) >> 2);
X[i*13+12] = ((sfb(6) & 0xE0) >> 5);
#undef sfb
}
return;
}
void Gsm_PackFrame(unsigned char * c, short LARc[8], short Nc[4], short Mc[4], short bc[4], short xmaxc[4], short xmc[52])
{
/* variable size
GSM_MAGIC 4
LARc[0] 6
LARc[1] 6
LARc[2] 5
LARc[3] 5
LARc[4] 4
LARc[5] 4
LARc[6] 3
LARc[7] 3
Nc[0] 7
bc[0] 2
Mc[0] 2
xmaxc[0] 6
xmc[0] 3
xmc[1] 3
xmc[2] 3
xmc[3] 3
xmc[4] 3
xmc[5] 3
xmc[6] 3
xmc[7] 3
xmc[8] 3
xmc[9] 3
xmc[10] 3
xmc[11] 3
xmc[12] 3
Nc[1] 7
bc[1] 2
Mc[1] 2
xmaxc[1] 6
xmc[13] 3
xmc[14] 3
xmc[15] 3
xmc[16] 3
xmc[17] 3
xmc[18] 3
xmc[19] 3
xmc[20] 3
xmc[21] 3
xmc[22] 3
xmc[23] 3
xmc[24] 3
xmc[25] 3
Nc[2] 7
bc[2] 2
Mc[2] 2
xmaxc[2] 6
xmc[26] 3
xmc[27] 3
xmc[28] 3
xmc[29] 3
xmc[30] 3
xmc[31] 3
xmc[32] 3
xmc[33] 3
xmc[34] 3
xmc[35] 3
xmc[36] 3
xmc[37] 3
xmc[38] 3
Nc[3] 7
bc[3] 2
Mc[3] 2
xmaxc[3] 6
xmc[39] 3
xmc[40] 3
xmc[41] 3
xmc[42] 3
xmc[43] 3
xmc[44] 3
xmc[45] 3
xmc[46] 3
xmc[47] 3
xmc[48] 3
xmc[49] 3
xmc[50] 3
xmc[51] 3
*/
*c++ = ((GSM_MAGIC & 0xF) << 4) /* 1 */
| ((LARc[0] >> 2) & 0xF);
*c++ = ((LARc[0] & 0x3) << 6)
| (LARc[1] & 0x3F);
*c++ = ((LARc[2] & 0x1F) << 3)
| ((LARc[3] >> 2) & 0x7);
*c++ = ((LARc[3] & 0x3) << 6)
| ((LARc[4] & 0xF) << 2)
| ((LARc[5] >> 2) & 0x3);
*c++ = ((LARc[5] & 0x3) << 6)
| ((LARc[6] & 0x7) << 3)
| (LARc[7] & 0x7);
*c++ = ((Nc[0] & 0x7F) << 1)
| ((bc[0] >> 1) & 0x1);
*c++ = ((bc[0] & 0x1) << 7)
| ((Mc[0] & 0x3) << 5)
| ((xmaxc[0] >> 1) & 0x1F);
*c++ = ((xmaxc[0] & 0x1) << 7)
| ((xmc[0] & 0x7) << 4)
| ((xmc[1] & 0x7) << 1)
| ((xmc[2] >> 2) & 0x1);
*c++ = ((xmc[2] & 0x3) << 6)
| ((xmc[3] & 0x7) << 3)
| (xmc[4] & 0x7);
*c++ = ((xmc[5] & 0x7) << 5) /* 10 */
| ((xmc[6] & 0x7) << 2)
| ((xmc[7] >> 1) & 0x3);
*c++ = ((xmc[7] & 0x1) << 7)
| ((xmc[8] & 0x7) << 4)
| ((xmc[9] & 0x7) << 1)
| ((xmc[10] >> 2) & 0x1);
*c++ = ((xmc[10] & 0x3) << 6)
| ((xmc[11] & 0x7) << 3)
| (xmc[12] & 0x7);
*c++ = ((Nc[1] & 0x7F) << 1)
| ((bc[1] >> 1) & 0x1);
*c++ = ((bc[1] & 0x1) << 7)
| ((Mc[1] & 0x3) << 5)
| ((xmaxc[1] >> 1) & 0x1F);
*c++ = ((xmaxc[1] & 0x1) << 7)
| ((xmc[13] & 0x7) << 4)
| ((xmc[14] & 0x7) << 1)
| ((xmc[15] >> 2) & 0x1);
*c++ = ((xmc[15] & 0x3) << 6)
| ((xmc[16] & 0x7) << 3)
| (xmc[17] & 0x7);
*c++ = ((xmc[18] & 0x7) << 5)
| ((xmc[19] & 0x7) << 2)
| ((xmc[20] >> 1) & 0x3);
*c++ = ((xmc[20] & 0x1) << 7)
| ((xmc[21] & 0x7) << 4)
| ((xmc[22] & 0x7) << 1)
| ((xmc[23] >> 2) & 0x1);
*c++ = ((xmc[23] & 0x3) << 6)
| ((xmc[24] & 0x7) << 3)
| (xmc[25] & 0x7);
*c++ = ((Nc[2] & 0x7F) << 1) /* 20 */
| ((bc[2] >> 1) & 0x1);
*c++ = ((bc[2] & 0x1) << 7)
| ((Mc[2] & 0x3) << 5)
| ((xmaxc[2] >> 1) & 0x1F);
*c++ = ((xmaxc[2] & 0x1) << 7)
| ((xmc[26] & 0x7) << 4)
| ((xmc[27] & 0x7) << 1)
| ((xmc[28] >> 2) & 0x1);
*c++ = ((xmc[28] & 0x3) << 6)
| ((xmc[29] & 0x7) << 3)
| (xmc[30] & 0x7);
*c++ = ((xmc[31] & 0x7) << 5)
| ((xmc[32] & 0x7) << 2)
| ((xmc[33] >> 1) & 0x3);
*c++ = ((xmc[33] & 0x1) << 7)
| ((xmc[34] & 0x7) << 4)
| ((xmc[35] & 0x7) << 1)
| ((xmc[36] >> 2) & 0x1);
*c++ = ((xmc[36] & 0x3) << 6)
| ((xmc[37] & 0x7) << 3)
| (xmc[38] & 0x7);
*c++ = ((Nc[3] & 0x7F) << 1)
| ((bc[3] >> 1) & 0x1);
*c++ = ((bc[3] & 0x1) << 7)
| ((Mc[3] & 0x3) << 5)
| ((xmaxc[3] >> 1) & 0x1F);
*c++ = ((xmaxc[3] & 0x1) << 7)
| ((xmc[39] & 0x7) << 4)
| ((xmc[40] & 0x7) << 1)
| ((xmc[41] >> 2) & 0x1);
*c++ = ((xmc[41] & 0x3) << 6) /* 30 */
| ((xmc[42] & 0x7) << 3)
| (xmc[43] & 0x7);
*c++ = ((xmc[44] & 0x7) << 5)
| ((xmc[45] & 0x7) << 2)
| ((xmc[46] >> 1) & 0x3);
*c++ = ((xmc[46] & 0x1) << 7)
| ((xmc[47] & 0x7) << 4)
| ((xmc[48] & 0x7) << 1)
| ((xmc[49] >> 2) & 0x1);
*c++ = ((xmc[49] & 0x3) << 6)
| ((xmc[50] & 0x7) << 3)
| (xmc[51] & 0x7);
}
void Gsm_UnpackFrame(const unsigned char * c, short LARc[8], short Nc[4], short Mc[4], short bc[4], short xmaxc[4], short xmc[52])
{
LARc[0] = (*c++ & 0xF) << 2; /* 1 */
LARc[0] |= (*c >> 6) & 0x3;
LARc[1] = *c++ & 0x3F;
LARc[2] = (*c >> 3) & 0x1F;
LARc[3] = (*c++ & 0x7) << 2;
LARc[3] |= (*c >> 6) & 0x3;
LARc[4] = (*c >> 2) & 0xF;
LARc[5] = (*c++ & 0x3) << 2;
LARc[5] |= (*c >> 6) & 0x3;
LARc[6] = (*c >> 3) & 0x7;
LARc[7] = *c++ & 0x7;
Nc[0] = (*c >> 1) & 0x7F;
bc[0] = (*c++ & 0x1) << 1;
bc[0] |= (*c >> 7) & 0x1;
Mc[0] = (*c >> 5) & 0x3;
xmaxc[0] = (*c++ & 0x1F) << 1;
xmaxc[0] |= (*c >> 7) & 0x1;
xmc[0] = (*c >> 4) & 0x7;
xmc[1] = (*c >> 1) & 0x7;
xmc[2] = (*c++ & 0x1) << 2;
xmc[2] |= (*c >> 6) & 0x3;
xmc[3] = (*c >> 3) & 0x7;
xmc[4] = *c++ & 0x7;
xmc[5] = (*c >> 5) & 0x7;
xmc[6] = (*c >> 2) & 0x7;
xmc[7] = (*c++ & 0x3) << 1; /* 10 */
xmc[7] |= (*c >> 7) & 0x1;
xmc[8] = (*c >> 4) & 0x7;
xmc[9] = (*c >> 1) & 0x7;
xmc[10] = (*c++ & 0x1) << 2;
xmc[10] |= (*c >> 6) & 0x3;
xmc[11] = (*c >> 3) & 0x7;
xmc[12] = *c++ & 0x7;
Nc[1] = (*c >> 1) & 0x7F;
bc[1] = (*c++ & 0x1) << 1;
bc[1] |= (*c >> 7) & 0x1;
Mc[1] = (*c >> 5) & 0x3;
xmaxc[1] = (*c++ & 0x1F) << 1;
xmaxc[1] |= (*c >> 7) & 0x1;
xmc[13] = (*c >> 4) & 0x7;
xmc[14] = (*c >> 1) & 0x7;
xmc[15] = (*c++ & 0x1) << 2;
xmc[15] |= (*c >> 6) & 0x3;
xmc[16] = (*c >> 3) & 0x7;
xmc[17] = *c++ & 0x7;
xmc[18] = (*c >> 5) & 0x7;
xmc[19] = (*c >> 2) & 0x7;
xmc[20] = (*c++ & 0x3) << 1;
xmc[20] |= (*c >> 7) & 0x1;
xmc[21] = (*c >> 4) & 0x7;
xmc[22] = (*c >> 1) & 0x7;
xmc[23] = (*c++ & 0x1) << 2;
xmc[23] |= (*c >> 6) & 0x3;
xmc[24] = (*c >> 3) & 0x7;
xmc[25] = *c++ & 0x7;
Nc[2] = (*c >> 1) & 0x7F;
bc[2] = (*c++ & 0x1) << 1; /* 20 */
bc[2] |= (*c >> 7) & 0x1;
Mc[2] = (*c >> 5) & 0x3;
xmaxc[2] = (*c++ & 0x1F) << 1;
xmaxc[2] |= (*c >> 7) & 0x1;
xmc[26] = (*c >> 4) & 0x7;
xmc[27] = (*c >> 1) & 0x7;
xmc[28] = (*c++ & 0x1) << 2;
xmc[28] |= (*c >> 6) & 0x3;
xmc[29] = (*c >> 3) & 0x7;
xmc[30] = *c++ & 0x7;
xmc[31] = (*c >> 5) & 0x7;
xmc[32] = (*c >> 2) & 0x7;
xmc[33] = (*c++ & 0x3) << 1;
xmc[33] |= (*c >> 7) & 0x1;
xmc[34] = (*c >> 4) & 0x7;
xmc[35] = (*c >> 1) & 0x7;
xmc[36] = (*c++ & 0x1) << 2;
xmc[36] |= (*c >> 6) & 0x3;
xmc[37] = (*c >> 3) & 0x7;
xmc[38] = *c++ & 0x7;
Nc[3] = (*c >> 1) & 0x7F;
bc[3] = (*c++ & 0x1) << 1;
bc[3] |= (*c >> 7) & 0x1;
Mc[3] = (*c >> 5) & 0x3;
xmaxc[3] = (*c++ & 0x1F) << 1;
xmaxc[3] |= (*c >> 7) & 0x1;
xmc[39] = (*c >> 4) & 0x7;
xmc[40] = (*c >> 1) & 0x7;
xmc[41] = (*c++ & 0x1) << 2;
xmc[41] |= (*c >> 6) & 0x3;
xmc[42] = (*c >> 3) & 0x7;
xmc[43] = *c++ & 0x7; /* 30 */
xmc[44] = (*c >> 5) & 0x7;
xmc[45] = (*c >> 2) & 0x7;
xmc[46] = (*c++ & 0x3) << 1;
xmc[46] |= (*c >> 7) & 0x1;
xmc[47] = (*c >> 4) & 0x7;
xmc[48] = (*c >> 1) & 0x7;
xmc[49] = (*c++ & 0x1) << 2;
xmc[49] |= (*c >> 6) & 0x3;
xmc[50] = (*c >> 3) & 0x7;
xmc[51] = *c & 0x7; /* 33 */
}
void gsm_bits_ms2normal(const unsigned char * pMS, unsigned char * pNormal1, unsigned char * pNormal2)
{
UnpackFrame0(pMS, g_LARc, g_Nc, g_bc, g_Mc, g_xmaxc, g_xmc);
Gsm_PackFrame(pNormal1, g_LARc, g_Nc, g_Mc, g_bc, g_xmaxc, g_xmc);
UnpackFrame1(pMS, g_LARc, g_Nc, g_bc, g_Mc, g_xmaxc, g_xmc);
Gsm_PackFrame(pNormal2, g_LARc, g_Nc, g_Mc, g_bc, g_xmaxc, g_xmc);
}
void gsm_bits_normal2ms(const unsigned char * pNormal1, const unsigned char * pNormal2, unsigned char * pMS)
{
Gsm_UnpackFrame(pNormal1, g_LARc, g_Nc, g_Mc, g_bc, g_xmaxc, g_xmc);
PackFrame0(pMS, g_LARc, g_Nc, g_bc, g_Mc, g_xmaxc, g_xmc);
Gsm_UnpackFrame(pNormal2, g_LARc, g_Nc, g_Mc, g_bc, g_xmaxc, g_xmc);
PackFrame1(pMS, g_LARc, g_Nc, g_bc, g_Mc, g_xmaxc, g_xmc);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -