📄 q_pulse.c
字号:
i = 0; move16();
j = 0; move16();
for (k = 0; k < 4; k++)
{
test();logic16();
if ((pos[k] & nb_pos) == 0)
{
posA[i++] = pos[k]; move16();
} else
{
posB[j++] = pos[k]; move16();
}
}
switch (i)
{
case 0:
tmp = sub(shl(N, 2), 3); /* index = 1 << ((4*N)-3); */
index = L_shl(1L, tmp);
/* index += quant_4p_4N1(posB[0], posB[1], posB[2], posB[3], n_1); */
index = L_add(index, quant_4p_4N1(posB[0], posB[1], posB[2], posB[3], n_1));
break;
case 1:
/* index = quant_1p_N1(posA[0], n_1) << ((3*n_1)+1); */
tmp = add(extract_l(L_shr(L_mult(3, n_1), 1)), 1);
index = L_shl(quant_1p_N1(posA[0], n_1), tmp);
/* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1); */
index = L_add(index, quant_3p_3N1(posB[0], posB[1], posB[2], n_1));
break;
case 2:
tmp = add(shl(n_1, 1), 1); /* index = quant_2p_2N1(posA[0], posA[1], n_1) << ((2*n_1)+1); */
index = L_shl(quant_2p_2N1(posA[0], posA[1], n_1), tmp);
/* index += quant_2p_2N1(posB[0], posB[1], n_1); */
index = L_add(index, quant_2p_2N1(posB[0], posB[1], n_1));
break;
case 3:
/* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << N; */
index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), N);
index = L_add(index, quant_1p_N1(posB[0], n_1)); /* index += quant_1p_N1(posB[0], n_1); */
break;
case 4:
index = quant_4p_4N1(posA[0], posA[1], posA[2], posA[3], n_1);
break;
default:
index = 0;
fprintf(stderr, "Error in function quant_4p_4N\n");
}
tmp = sub(shl(N, 2), 2); /* index += (i & 3) << ((4*N)-2); */
index = L_add(index, L_shl((L_deposit_l(i) & (3L)), tmp)); logic16();
return (index);
}
void dec_4p_4N(Word32 index, Word16 N, Word16 offset, Word16 pos[])
{
Word16 j, n_1, tmp;
/*-------------------------------------------------------*
* Decode 4 pulses with 4*N bits: *
*-------------------------------------------------------*/
n_1 = (Word16) (N - 1); move16();
j = add(offset, shl(1, n_1)); /* j = offset + (1 << n_1); */
tmp = sub(shl(N, 2), 2);
test();logic16();
switch (L_shr(index, tmp) & 3)
{ /* ((index >> ((4*N)-2)) & 3) */
case 0:
tmp = add(shl(n_1, 2), 1);
test();logic16();
if ((L_shr(index, tmp) & 1) == 0)
{ /* (((index >> ((4*n_1)+1)) & 1) == 0) */
dec_4p_4N1(index, n_1, offset, pos);
} else
{
dec_4p_4N1(index, n_1, j, pos);
}
break;
case 1:
tmp = add(extract_l(L_shr(L_mult(3, n_1), 1)), 1); /* dec_1p_N1((index>>((3*n_1)+1)), n_1, offset, pos) */
dec_1p_N1(L_shr(index, tmp), n_1, offset, pos);
dec_3p_3N1(index, n_1, j, pos + 1);move16();
break;
case 2:
tmp = add(shl(n_1, 1), 1); /* dec_2p_2N1((index>>((2*n_1)+1)), n_1, offset, pos); */
dec_2p_2N1(L_shr(index, tmp), n_1, offset, pos);
dec_2p_2N1(index, n_1, j, pos + 2);move16();
break;
case 3:
tmp = add(n_1, 1); /* dec_3p_3N1((index>>(n_1+1)), n_1, offset, pos); */
dec_3p_3N1(L_shr(index, tmp), n_1, offset, pos);
dec_1p_N1(index, n_1, j, pos + 3); move16();
break;
}
return;
}
Word32 quant_5p_5N( /* (o) return 5*N bits */
Word16 pos[], /* (i) position of the pulse 1..5 */
Word16 N) /* (i) number of bits for position */
{
Word16 i, j, k, nb_pos, n_1, tmp;
Word16 posA[5], posB[5];
Word32 index, tmp2;
n_1 = (Word16) (N - 1); move16();
nb_pos = shl(1, n_1); /* nb_pos = (1<<n_1); */
i = 0; move16();
j = 0; move16();
for (k = 0; k < 5; k++)
{
test();logic16();
if ((pos[k] & nb_pos) == 0)
{
posA[i++] = pos[k]; move16();
} else
{
posB[j++] = pos[k]; move16();
}
}
switch (i)
{
case 0:
tmp = sub(extract_l(L_shr(L_mult(5, N), 1)), 1); /* ((5*N)-1)) */
index = L_shl(1L, tmp); /* index = 1 << ((5*N)-1); */
tmp = add(shl(N, 1), 1); /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1) << ((2*N)+1);*/
tmp2 = L_shl(quant_3p_3N1(posB[0], posB[1], posB[2], n_1), tmp);
index = L_add(index, tmp2);
index = L_add(index, quant_2p_2N1(posB[3], posB[4], N)); /* index += quant_2p_2N1(posB[3], posB[4], N); */
break;
case 1:
tmp = sub(extract_l(L_shr(L_mult(5, N), 1)), 1); /* index = 1 << ((5*N)-1); */
index = L_shl(1L, tmp);
tmp = add(shl(N, 1), 1); /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1) <<((2*N)+1); */
tmp2 = L_shl(quant_3p_3N1(posB[0], posB[1], posB[2], n_1), tmp);
index = L_add(index, tmp2);
index = L_add(index, quant_2p_2N1(posB[3], posA[0], N)); /* index += quant_2p_2N1(posB[3], posA[0], N); */
break;
case 2:
tmp = sub(extract_l(L_shr(L_mult(5, N), 1)), 1); /* ((5*N)-1)) */
index = L_shl(1L, tmp); /* index = 1 << ((5*N)-1); */
tmp = add(shl(N, 1), 1); /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1) << ((2*N)+1); */
tmp2 = L_shl(quant_3p_3N1(posB[0], posB[1], posB[2], n_1), tmp);
index = L_add(index, tmp2);
index = L_add(index, quant_2p_2N1(posA[0], posA[1], N)); /* index += quant_2p_2N1(posA[0], posA[1], N); */
break;
case 3:
tmp = add(shl(N, 1), 1); /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((2*N)+1); */
index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), tmp);
index = L_add(index, quant_2p_2N1(posB[0], posB[1], N)); /* index += quant_2p_2N1(posB[0], posB[1], N); */
break;
case 4:
tmp = add(shl(N, 1), 1); /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((2*N)+1); */
index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), tmp);
index = L_add(index, quant_2p_2N1(posA[3], posB[0], N)); /* index += quant_2p_2N1(posA[3], posB[0], N); */
break;
case 5:
tmp = add(shl(N, 1), 1); /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((2*N)+1); */
index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), tmp);
index = L_add(index, quant_2p_2N1(posA[3], posA[4], N)); /* index += quant_2p_2N1(posA[3], posA[4], N); */
break;
default:
index = 0;
fprintf(stderr, "Error in function quant_5p_5N\n");
}
return (index);
}
void dec_5p_5N(Word32 index, Word16 N, Word16 offset, Word16 pos[])
{
Word16 j, n_1, tmp;
Word32 idx;
/*-------------------------------------------------------*
* Decode 5 pulses with 5*N bits: *
*-------------------------------------------------------*/
n_1 = (Word16) (N - 1); move16();
j = add(offset, shl(1, n_1)); /* j = offset + (1 << n_1); */
tmp = add(shl(N, 1), 1); /* idx = (index >> ((2*N)+1)); */
idx = L_shr(index, tmp);
tmp = sub(extract_l(L_shr(L_mult(5, N), 1)), 1); /* ((5*N)-1)) */
test();logic16();
if ((L_shr(index, tmp) & 1) == 0) /* ((index >> ((5*N)-1)) & 1) */
{
dec_3p_3N1(idx, n_1, offset, pos);
dec_2p_2N1(index, N, offset, pos + 3); move16();
} else
{
dec_3p_3N1(idx, n_1, j, pos);
dec_2p_2N1(index, N, offset, pos + 3); move16();
}
return;
}
Word32 quant_6p_6N_2( /* (o) return (6*N)-2 bits */
Word16 pos[], /* (i) position of the pulse 1..6 */
Word16 N) /* (i) number of bits for position */
{
Word16 i, j, k, nb_pos, n_1;
Word16 posA[6], posB[6];
Word32 index;
/* !! N and n_1 are constants -> it doesn't need to be operated by Basic Operators */
n_1 = (Word16) (N - 1); move16();
nb_pos = shl(1, n_1); /* nb_pos = (1<<n_1); */
i = 0; move16();
j = 0; move16();
for (k = 0; k < 6; k++)
{
test();logic16();
if ((pos[k] & nb_pos) == 0)
{
posA[i++] = pos[k]; move16();
} else
{
posB[j++] = pos[k]; move16();
}
}
switch (i)
{
case 0:
index = L_shl(1L, (Word16) (6 * N - 5)); /* index = 1 << ((6*N)-5); */
index = L_add(index, L_shl(quant_5p_5N(posB, n_1), N)); /* index += quant_5p_5N(posB, n_1) << N; */
index = L_add(index, quant_1p_N1(posB[5], n_1)); /* index += quant_1p_N1(posB[5], n_1); */
break;
case 1:
index = L_shl(1L, (Word16) (6 * N - 5)); /* index = 1 << ((6*N)-5); */
index = L_add(index, L_shl(quant_5p_5N(posB, n_1), N)); /* index += quant_5p_5N(posB, n_1) << N; */
index = L_add(index, quant_1p_N1(posA[0], n_1)); /* index += quant_1p_N1(posA[0], n_1); */
break;
case 2:
index = L_shl(1L, (Word16) (6 * N - 5)); /* index = 1 << ((6*N)-5); */
/* index += quant_4p_4N(posB, n_1) << ((2*n_1)+1); */
index = L_add(index, L_shl(quant_4p_4N(posB, n_1), (Word16) (2 * n_1 + 1)));
index = L_add(index, quant_2p_2N1(posA[0], posA[1], n_1)); /* index += quant_2p_2N1(posA[0], posA[1], n_1); */
break;
case 3:
index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), (Word16) (3 * n_1 + 1)); /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((3*n_1)+1); */
index = L_add(index, quant_3p_3N1(posB[0], posB[1], posB[2], n_1)); /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1); */
break;
case 4:
i = 2; move16();
index = L_shl(quant_4p_4N(posA, n_1), (Word16) (2 * n_1 + 1)); /* index = quant_4p_4N(posA, n_1) << ((2*n_1)+1); */
index = L_add(index, quant_2p_2N1(posB[0], posB[1], n_1)); /* index += quant_2p_2N1(posB[0], posB[1], n_1); */
break;
case 5:
i = 1; move16();
index = L_shl(quant_5p_5N(posA, n_1), N); /* index = quant_5p_5N(posA, n_1) << N; */
index = L_add(index, quant_1p_N1(posB[0], n_1)); /* index += quant_1p_N1(posB[0], n_1); */
break;
case 6:
i = 0; move16();
index = L_shl(quant_5p_5N(posA, n_1), N); /* index = quant_5p_5N(posA, n_1) << N; */
index = L_add(index, quant_1p_N1(posA[5], n_1)); /* index += quant_1p_N1(posA[5], n_1); */
break;
default:
index = 0;
fprintf(stderr, "Error in function quant_6p_6N_2\n");
}
index = L_add(index, L_shl((L_deposit_l(i) & 3L), (Word16) (6 * N - 4))); logic16();/* index += (i & 3) << ((6*N)-4); */
return (index);
}
void dec_6p_6N_2(Word32 index, Word16 N, Word16 offset, Word16 pos[])
{
Word16 j, n_1, offsetA, offsetB;
n_1 = (Word16) (N - 1); move16();
j = add(offset, shl(1, n_1)); /* j = offset + (1 << n_1); */
/* !! N and n_1 are constants -> it doesn't need to be operated by Basic Operators */
offsetA = offsetB = j; move16();move16();
test();logic16();
if ((L_shr(index, (Word16) (6 * N - 5)) & 1L) == 0)
{ /* if (((index >> ((6*N)-5)) & 1) == 0) */
offsetA = offset; move16();
} else
{
offsetB = offset; move16();
}
test();logic16();
switch (L_shr(index, (Word16) (6 * N - 4)) & 3)
{ /* (index >> ((6*N)-4)) & 3 */
case 0:
dec_5p_5N(L_shr(index, N), n_1, offsetA, pos); /* dec_5p_5N(index>>N, n_1, offsetA, pos); */
dec_1p_N1(index, n_1, offsetA, pos + 5); move16();
break;
case 1:
dec_5p_5N(L_shr(index, N), n_1, offsetA, pos); /* dec_5p_5N(index>>N, n_1, offsetA, pos); */
dec_1p_N1(index, n_1, offsetB, pos + 5); move16();
break;
case 2:
dec_4p_4N(L_shr(index, (Word16) (2 * n_1 + 1)), n_1, offsetA, pos); /* dec_4p_4N(index>>((2*n_1)+1 ), n_1, offsetA, pos); */
dec_2p_2N1(index, n_1, offsetB, pos + 4); move16();
break;
case 3:
dec_3p_3N1(L_shr(index, (Word16) (3 * n_1 + 1)), n_1, offset, pos); /* dec_3p_3N1(index>>((3*n_1)+ 1), n_1, offset, pos); */
dec_3p_3N1(index, n_1, j, pos + 3);move16();
break;
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -