📄 c4t64fx.c
字号:
}
/* scale h[] down (/2) when energy of h[] is high with many pulses used */
L_tmp = 0;
for (i = 0; i < L_SUBFR; i++)
L_tmp = L_mac(L_tmp, H[i], H[i]);
val = extract_h(L_tmp);
h_shift = 0; move16();
test();test();
if ((sub(nb_pulse, 12) >= 0) && (sub(val, 1024) > 0))
{
h_shift = 1; move16();
}
for (i = 0; i < L_SUBFR; i++)
{
h[i] = shr(H[i], h_shift); move16();
h_inv[i] = negate(h[i]); move16();
}
/*------------------------------------------------------------*
* Compute rrixix[][] needed for the codebook search. *
* This algorithm compute impulse response energy of all *
* positions (16) in each track (4). Total = 4x16 = 64. *
*------------------------------------------------------------*/
/* storage order --> i3i3, i2i2, i1i1, i0i0 */
/* Init pointers to last position of rrixix[] */
p0 = &rrixix[0][NB_POS - 1]; move16();
p1 = &rrixix[1][NB_POS - 1]; move16();
p2 = &rrixix[2][NB_POS - 1]; move16();
p3 = &rrixix[3][NB_POS - 1]; move16();
ptr_h1 = h; move16();
cor = 0x00008000L; move32(); /* for rounding */
for (i = 0; i < NB_POS; i++)
{
cor = L_mac(cor, *ptr_h1, *ptr_h1);
ptr_h1++;
*p3-- = extract_h(cor); move16();
cor = L_mac(cor, *ptr_h1, *ptr_h1);
ptr_h1++;
*p2-- = extract_h(cor); move16();
cor = L_mac(cor, *ptr_h1, *ptr_h1);
ptr_h1++;
*p1-- = extract_h(cor); move16();
cor = L_mac(cor, *ptr_h1, *ptr_h1);
ptr_h1++;
*p0-- = extract_h(cor); move16();
}
/*------------------------------------------------------------*
* Compute rrixiy[][] needed for the codebook search. *
* This algorithm compute correlation between 2 pulses *
* (2 impulses responses) in 4 possible adjacents tracks. *
* (track 0-1, 1-2, 2-3 and 3-0). Total = 4x16x16 = 1024. *
*------------------------------------------------------------*/
/* storage order --> i2i3, i1i2, i0i1, i3i0 */
pos = MSIZE - 1; move16();
ptr_hf = h + 1; move16();
for (k = 0; k < NB_POS; k++)
{
p3 = &rrixiy[2][pos]; move16();
p2 = &rrixiy[1][pos]; move16();
p1 = &rrixiy[0][pos]; move16();
p0 = &rrixiy[3][pos - NB_POS]; move16();
cor = 0x00008000L; move32(); /* for rounding */
ptr_h1 = h; move16();
ptr_h2 = ptr_hf; move16();
for (i = add(k, 1); i < NB_POS; i++)
{
cor = L_mac(cor, *ptr_h1, *ptr_h2);
ptr_h1++;
ptr_h2++;
*p3 = extract_h(cor); move16();
cor = L_mac(cor, *ptr_h1, *ptr_h2);
ptr_h1++;
ptr_h2++;
*p2 = extract_h(cor); move16();
cor = L_mac(cor, *ptr_h1, *ptr_h2);
ptr_h1++;
ptr_h2++;
*p1 = extract_h(cor); move16();
cor = L_mac(cor, *ptr_h1, *ptr_h2);
ptr_h1++;
ptr_h2++;
*p0 = extract_h(cor); move16();
p3 -= (NB_POS + 1);
p2 -= (NB_POS + 1);
p1 -= (NB_POS + 1);
p0 -= (NB_POS + 1);
}
cor = L_mac(cor, *ptr_h1, *ptr_h2);
ptr_h1++;
ptr_h2++;
*p3 = extract_h(cor); move16();
cor = L_mac(cor, *ptr_h1, *ptr_h2);
ptr_h1++;
ptr_h2++;
*p2 = extract_h(cor); move16();
cor = L_mac(cor, *ptr_h1, *ptr_h2);
ptr_h1++;
ptr_h2++;
*p1 = extract_h(cor); move16();
pos -= NB_POS;
ptr_hf += STEP;
}
/* storage order --> i3i0, i2i3, i1i2, i0i1 */
pos = MSIZE - 1; move16();
ptr_hf = h + 3; move16();
for (k = 0; k < NB_POS; k++)
{
p3 = &rrixiy[3][pos]; move16();
p2 = &rrixiy[2][pos - 1]; move16();
p1 = &rrixiy[1][pos - 1]; move16();
p0 = &rrixiy[0][pos - 1]; move16();
cor = 0x00008000L; move32(); /* for rounding */
ptr_h1 = h; move16();
ptr_h2 = ptr_hf; move16();
for (i = add(k, 1); i < NB_POS; i++)
{
cor = L_mac(cor, *ptr_h1, *ptr_h2);
ptr_h1++;
ptr_h2++;
*p3 = extract_h(cor); move16();
cor = L_mac(cor, *ptr_h1, *ptr_h2);
ptr_h1++;
ptr_h2++;
*p2 = extract_h(cor); move16();
cor = L_mac(cor, *ptr_h1, *ptr_h2);
ptr_h1++;
ptr_h2++;
*p1 = extract_h(cor); move16();
cor = L_mac(cor, *ptr_h1, *ptr_h2);
ptr_h1++;
ptr_h2++;
*p0 = extract_h(cor); move16();
p3 -= (NB_POS + 1);
p2 -= (NB_POS + 1);
p1 -= (NB_POS + 1);
p0 -= (NB_POS + 1);
}
cor = L_mac(cor, *ptr_h1, *ptr_h2);
ptr_h1++;
ptr_h2++;
*p3 = extract_h(cor); move16();
pos--;
ptr_hf += STEP;
}
/*------------------------------------------------------------*
* Modification of rrixiy[][] to take signs into account. *
*------------------------------------------------------------*/
p0 = &rrixiy[0][0]; move16();
for (k = 0; k < NB_TRACK; k++)
{
for (i = k; i < L_SUBFR; i += STEP)
{
psign = sign; move16();
test();
if (psign[i] < 0)
{
psign = vec; move16();
}
for (j = (Word16) ((k + 1) % NB_TRACK); j < L_SUBFR; j += STEP)
{
*p0 = mult(*p0, psign[j]); move16();
p0++;
}
}
}
/*-------------------------------------------------------------------*
* Deep first search *
*-------------------------------------------------------------------*/
psk = -1; move16();
alpk = 1; move16();
for (k = 0; k < nbiter; k++)
{
for (i = 0; i < nb_pulse; i++)
ipos[i] = tipos[(k * 4) + i];
test();test();test();
if (sub(nbbits, 20) == 0)
{
pos = 0; move16();
ps = 0; move16();
alp = 0; move16();
for (i = 0; i < L_SUBFR; i++)
{
vec[i] = 0; move16();
}
} else if ((sub(nbbits, 36) == 0) || (sub(nbbits, 44) == 0))
{
/* first stage: fix 2 pulses */
pos = 2;
ix = ind[0] = pos_max[ipos[0]];move16();move16();
iy = ind[1] = pos_max[ipos[1]];move16();move16();
ps = add(dn[ix], dn[iy]);
i = shr(ix, 2); /* ix / STEP */
j = shr(iy, 2); /* iy / STEP */
s = L_mult(rrixix[ipos[0]][i], 4096);
s = L_mac(s, rrixix[ipos[1]][j], 4096);
i = add(shl(i, 4), j); /* (ix/STEP)*NB_POS + (iy/STEP) */
s = L_mac(s, rrixiy[ipos[0]][i], 8192);
alp = round(s);
test();move16();move16();
if (sign[ix] < 0)
p0 = h_inv - ix;
else
p0 = h - ix;
test();move16();move16();
if (sign[iy] < 0)
p1 = h_inv - iy;
else
p1 = h - iy;
for (i = 0; i < L_SUBFR; i++)
{
vec[i] = add(*p0++, *p1++);move16();
}
test();
if (sub(nbbits, 44) == 0)
{
ipos[8] = 0; move16();
ipos[9] = 1; move16();
}
} else
{
/* first stage: fix 4 pulses */
pos = 4;
ix = ind[0] = pos_max[ipos[0]]; move16();move16();
iy = ind[1] = pos_max[ipos[1]]; move16();move16();
i = ind[2] = pos_max[ipos[2]]; move16();move16();
j = ind[3] = pos_max[ipos[3]]; move16();move16();
ps = add(add(add(dn[ix], dn[iy]), dn[i]), dn[j]);
test();move16();move16();
if (sign[ix] < 0)
p0 = h_inv - ix;
else
p0 = h - ix;
test();move16();move16();
if (sign[iy] < 0)
p1 = h_inv - iy;
else
p1 = h - iy;
test();move16();move16();
if (sign[i] < 0)
p2 = h_inv - i;
else
p2 = h - i;
test();move16();move16();
if (sign[j] < 0)
p3 = h_inv - j;
else
p3 = h - j;
for (i = 0; i < L_SUBFR; i++)
{
vec[i] = add(add(add(*p0++, *p1++), *p2++), *p3++);
move16();
}
L_tmp = 0L; move32();
for (i = 0; i < L_SUBFR; i++)
L_tmp = L_mac(L_tmp, vec[i], vec[i]);
alp = round(L_shr(L_tmp, 3));
if (sub(nbbits, 72) == 0)
{
ipos[16] = 0; move16();
ipos[17] = 1; move16();
}
}
/* other stages of 2 pulses */
for (j = pos, st = 0; j < nb_pulse; j += 2, st++)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -