ref: 69c20d751aafe341e65c0304dbf4f2b6a584e38f
dir: /amr-wb/deemph.c/
/*-------------------------------------------------------------------*
* DEEMPH.C *
*-------------------------------------------------------------------*
* Deemphasis: filtering through 1/(1-mu z^-1) *
* *
* Deemph2 --> signal is divided by 2. *
* Deemph_32 --> for 32 bits signal. *
*-------------------------------------------------------------------*/
#include "typedef.h"
#include "basic_op.h"
#include "math_op.h"
#include "count.h"
void Deemph(
Word16 x[], /* (i/o) : input signal overwritten by the output */
Word16 mu, /* (i) Q15 : deemphasis factor */
Word16 L, /* (i) : vector size */
Word16 * mem /* (i/o) : memory (y[-1]) */
)
{
Word16 i;
Word32 L_tmp;
L_tmp = L_deposit_h(x[0]);
L_tmp = L_mac(L_tmp, *mem, mu);
x[0] = round(L_tmp); move16();
for (i = 1; i < L; i++)
{
L_tmp = L_deposit_h(x[i]);
L_tmp = L_mac(L_tmp, x[i - 1], mu);
x[i] = round(L_tmp); move16();
}
*mem = x[L - 1]; move16();
return;
}
void Deemph2(
Word16 x[], /* (i/o) : input signal overwritten by the output */
Word16 mu, /* (i) Q15 : deemphasis factor */
Word16 L, /* (i) : vector size */
Word16 * mem /* (i/o) : memory (y[-1]) */
)
{
Word16 i;
Word32 L_tmp;
/* saturation can occur in L_mac() */
L_tmp = L_mult(x[0], 16384);
L_tmp = L_mac(L_tmp, *mem, mu);
x[0] = round(L_tmp); move16();
for (i = 1; i < L; i++)
{
L_tmp = L_mult(x[i], 16384);
L_tmp = L_mac(L_tmp, x[i - 1], mu);
x[i] = round(L_tmp); move16();
}
*mem = x[L - 1]; move16();
return;
}
void Deemph_32(
Word16 x_hi[], /* (i) : input signal (bit31..16) */
Word16 x_lo[], /* (i) : input signal (bit15..4) */
Word16 y[], /* (o) : output signal (x16) */
Word16 mu, /* (i) Q15 : deemphasis factor */
Word16 L, /* (i) : vector size */
Word16 * mem /* (i/o) : memory (y[-1]) */
)
{
Word16 i, fac;
Word32 L_tmp;
fac = shr(mu, 1); /* Q15 --> Q14 */
/* L_tmp = hi<<16 + lo<<4 */
L_tmp = L_deposit_h(x_hi[0]);
L_tmp = L_mac(L_tmp, x_lo[0], 8);
L_tmp = L_shl(L_tmp, 3);
L_tmp = L_mac(L_tmp, *mem, fac);
L_tmp = L_shl(L_tmp, 1); /* saturation can occur here */
y[0] = round(L_tmp); move16();
for (i = 1; i < L; i++)
{
L_tmp = L_deposit_h(x_hi[i]);
L_tmp = L_mac(L_tmp, x_lo[i], 8);
L_tmp = L_shl(L_tmp, 3);
L_tmp = L_mac(L_tmp, y[i - 1], fac);
L_tmp = L_shl(L_tmp, 1); /* saturation can occur here */
y[i] = round(L_tmp); move16();
}
*mem = y[L - 1]; move16();
return;
}