예제 #1
0
void idct_8(Int32 vec[])
{

    Int32 tmp0;
    Int32 tmp1;
    Int32 tmp2;
    Int32 tmp3;
    Int32 tmp4;
    Int32 tmp5;
    Int32 tmp6;
    Int32 tmp7;
    Int32 tmp8;


    tmp5 = fxp_mul32_by_16(vec[4] << 1, Qfmt15(0.70710678118655F));

    tmp1 =  vec[0] + tmp5;
    tmp5 =  vec[0] - tmp5;

    tmp3 = fxp_mul32_by_16(vec[2] << 1, Qfmt15(0.54119610014620F));		/* (1/(2*cos(2*phi)));*/
    tmp7 = fxp_mul32_Q29(vec[6], Qfmt(1.30656296487638F));		/* (1/(2*cos(6*phi)));*/

    tmp0  = fxp_mul32_by_16((tmp3 - tmp7) << 1, Qfmt15(0.70710678118655F));	/* (1/(2*cos(2*phi)));  */
    tmp7 = (tmp3 + tmp7) + tmp0;

    vec[0] = tmp1 + tmp7;
    tmp2 = fxp_mul32_by_16(vec[1] << 1, Qfmt15(0.50979557910416F));		/* (1/(2*cos(  phi)));*/
    vec[1] = tmp5 + tmp0;
    vec[2] = tmp5 - tmp0;
    tmp4 = fxp_mul32_by_16(vec[3] << 1, Qfmt15(0.60134488693505F));		/* (1/(2*cos(3*phi)));*/
    vec[3] = tmp1 - tmp7;

    tmp6 = fxp_mul32_by_16(vec[5] << 1, Qfmt15(0.89997622313642F));		/* (1/(2*cos(5*phi)));*/
    tmp8 = fxp_mul32_Q29(vec[7], Qfmt(2.56291544774151F));		/* (1/(2*cos(7*phi)));*/

    tmp7  =  tmp2 + tmp8;
    tmp5  = fxp_mul32_by_16((tmp2 - tmp8) << 1, Qfmt15(0.54119610014620F));
    tmp8  =  tmp4 + tmp6;
    tmp6  = fxp_mul32_Q29((tmp4 - tmp6), Qfmt(1.30656296487638F));

    tmp0 =  tmp7 + tmp8;
    tmp2 = fxp_mul32_by_16((tmp7 - tmp8) << 1, Qfmt15(0.70710678118655F));

    tmp3 = fxp_mul32_by_16((tmp5 - tmp6) << 1, Qfmt15(0.70710678118655F));
    tmp1 = (tmp5 + tmp6) + tmp3;

    tmp5 = tmp0 + tmp1;
    tmp6 = tmp1 + tmp2;
    tmp7 = tmp2 + tmp3;

    vec[7]  = vec[0] - tmp5;
    vec[0] +=          tmp5;
    vec[6]  = vec[1] - tmp6;
    vec[1] +=          tmp6;
    vec[5]  = vec[2] - tmp7;
    vec[2] +=          tmp7;
    vec[4]  = vec[3] - tmp3;
    vec[3] +=          tmp3;

}
/*----------------------------------------------------------------------------
; DEFINES
; Include all pre-processor statements here. Include conditional
; compile variables also.
----------------------------------------------------------------------------*/


#define R_SHIFT     28
#define Qfmt(x)     (Int32)(x*((Int32)1<<R_SHIFT) + (x>=0?0.5F:-0.5F))
#define Qfmt31(x)   (Int32)(x*(0x7FFFFFFF) + (x>=0?0.5F:-0.5F))

const Int32 CosTable_8i[8] =
{
    Qfmt31(0.50241928618816F),   Qfmt31(0.52249861493969F),
    Qfmt31(0.56694403481636F),   Qfmt31(0.64682178335999F),
    Qfmt(0.78815462345125F),   Qfmt(1.06067768599035F),
    Qfmt(1.72244709823833F),   Qfmt(5.10114861868916F)
};



/*----------------------------------------------------------------------------
; LOCAL FUNCTION DEFINITIONS
; Function Prototype declaration
----------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------
; LOCAL STORE/BUFFER/POINTER DEFINITIONS
; Variable declaration - defined here and used outside this module
----------------------------------------------------------------------------*/
예제 #3
0
; Function Prototype declaration
----------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------
; LOCAL STORE/BUFFER/POINTER DEFINITIONS
; Variable declaration - defined here and used outside this module
----------------------------------------------------------------------------*/
const int32 CosTable_dct32[16] =
{
    Qfmt_31(0.50060299823520F) ,  Qfmt_31(0.50547095989754F) ,
    Qfmt_31(0.51544730992262F) ,  Qfmt_31(0.53104259108978F) ,
    Qfmt_31(0.55310389603444F) ,  Qfmt_31(0.58293496820613F) ,
    Qfmt_31(0.62250412303566F) ,  Qfmt_31(0.67480834145501F) ,
    Qfmt_31(0.74453627100230F) ,  Qfmt_31(0.83934964541553F) ,

    Qfmt(0.97256823786196F) ,  Qfmt(1.16943993343288F) ,
    Qfmt(1.48416461631417F) ,  Qfmt(2.05778100995341F) ,
    Qfmt(3.40760841846872F) ,  Qfmt(10.19000812354803F)
};


/*----------------------------------------------------------------------------
; EXTERNAL FUNCTION REFERENCES
; Declare functions defined elsewhere and referenced in this module
----------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------
; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
; Declare variables used in this module but defined elsewhere
----------------------------------------------------------------------------*/
; Declare functions defined elsewhere and referenced in this module
----------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------
; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
; Declare variables used in this module but defined elsewhere
----------------------------------------------------------------------------*/


#include "pv_audio_type_defs.h"
#include "fxp_mul32.h"

#define R_SHIFT     29
#define Qfmt(x)   (Int32)(x*((Int32)1<<R_SHIFT) + (x>=0?0.5F:-0.5F))

const Int32 InvFiltFactors[5] = {Qfmt(0.00f),    /* OFF_LEVEL */
                                 Qfmt(0.60f),     /* TRANSITION_LEVEL */
                                 Qfmt(0.75f),     /* LOW_LEVEL */
                                 Qfmt(0.90f),     /* MID_LEVEL */
                                 Qfmt(0.98f)
                                };    /* HIGH_LEVEL */

/*----------------------------------------------------------------------------
; FUNCTION CODE
----------------------------------------------------------------------------*/

void sbr_inv_filt_levelemphasis(INVF_MODE *invFiltMode,
                                INVF_MODE *prevInvFiltMode,
                                Int32 nNfb,
                                Int32  BwVector[MAX_NUM_PATCHES],
                                Int32  BwVectorOld[MAX_NUM_PATCHES])
; Include all pre-processor statements here. Include conditional
; compile variables also.
----------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------
; LOCAL FUNCTION DEFINITIONS
; Function Prototype declaration
----------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------
; LOCAL STORE/BUFFER/POINTER DEFINITIONS
; Variable declaration - defined here and used outside this module
----------------------------------------------------------------------------*/
const int32 cosTerms_dct18[9] =
{
    Qfmt(0.50190991877167f),   Qfmt(0.51763809020504f),   Qfmt(0.55168895948125f),
    Qfmt(0.61038729438073f),   Qfmt(0.70710678118655f),   Qfmt(0.87172339781055f),
    Qfmt(1.18310079157625f),   Qfmt(1.93185165257814f),   Qfmt(5.73685662283493f)
};


const int32 cosTerms_1_ov_cos_phi[18] =
{

    Qfmt1(0.50047634258166f),  Qfmt1(0.50431448029008f),  Qfmt1(0.51213975715725f),
    Qfmt1(0.52426456257041f),  Qfmt1(0.54119610014620f),  Qfmt1(0.56369097343317f),
    Qfmt1(0.59284452371708f),  Qfmt1(0.63023620700513f),  Qfmt1(0.67817085245463f),

    Qfmt2(0.74009361646113f),  Qfmt2(0.82133981585229f),  Qfmt2(0.93057949835179f),
    Qfmt2(1.08284028510010f),  Qfmt2(1.30656296487638f),  Qfmt2(1.66275476171152f),
    Qfmt2(2.31011315767265f),  Qfmt2(3.83064878777019f),  Qfmt2(11.46279281302667f)
----------------------------------------------------------------------------*/


/*----------------------------------------------------------------------------
; DEFINES
; Include all pre-processor statements here. Include conditional
; compile variables also.
----------------------------------------------------------------------------*/


#define R_SHIFT     28
#define Qfmt(x)   (Int32)(x*((Int32)1<<R_SHIFT) + (x>=0?0.5F:-0.5F))

const Int32 CosTable_8[8] =
{
    Qfmt(0.50241928618816F),   Qfmt(0.52249861493969F),
    Qfmt(0.56694403481636F),   Qfmt(0.64682178335999F),
    Qfmt(0.78815462345125F),   Qfmt(1.06067768599035F),
    Qfmt(1.72244709823833F),   Qfmt(5.10114861868916F)
};

/*----------------------------------------------------------------------------
; LOCAL FUNCTION DEFINITIONS
; Function Prototype declaration
----------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------
; LOCAL STORE/BUFFER/POINTER DEFINITIONS
; Variable declaration - defined here and used outside this module
----------------------------------------------------------------------------*/
void sbr_envelope_unmapping(SBR_FRAME_DATA * hFrameData1,
                            SBR_FRAME_DATA * hFrameData2)

{
    Int32 i;
    Int32 tempLeft;
    Int32 tempRight;

    Int32 tmp;
    Int32 *iEnvelopeLeft_man    = hFrameData1->iEnvelope_man;
    Int32 *iEnvelopeLeft_exp    = hFrameData1->iEnvelope_exp;
    Int32 *noiseFloorLeft_man   = hFrameData1->sbrNoiseFloorLevel_man;
    Int32 *noiseFloorLeft_exp   = hFrameData1->sbrNoiseFloorLevel_exp;

    Int32 *iEnvelopeRight_man   = hFrameData2->iEnvelope_man;
    Int32 *iEnvelopeRight_exp   = hFrameData2->iEnvelope_exp;
    Int32 *noiseFloorRight_man  = hFrameData2->sbrNoiseFloorLevel_man;
    Int32 *noiseFloorRight_exp  = hFrameData2->sbrNoiseFloorLevel_exp;


    if (hFrameData2->ampRes)
    {
        for (i = 0; i < hFrameData1->nScaleFactors; i++)
        {
            tempRight = iEnvelopeRight_man[i];
            tempLeft  = iEnvelopeLeft_man[i];
            /*  iEnvelope[i] always positive  6 bits max */

            iEnvelopeLeft_exp[i] = tempLeft + 7;

            iEnvelopeRight_exp[i] = tempRight - 12;
            iEnvelopeRight_man[i] = Qfmt(1.000F);

            /*
             *  iEnvelopeRight[i] = tempLeft / (1 + tempRight);
             *  iEnvelopeLeft[i]  = tempRight * iEnvelopeRight[i];
             *
             *
             *   iEnvelopeRight[i] = k*2^n/(1+2^m) =  k*2^(n-m)/(1 + 2^-m);
             *   where k = 1 or sqrt(2)
             */
            if (iEnvelopeRight_exp[i] >= 0)
            {
                if (iEnvelopeRight_exp[i] < 11)
                {
                    iEnvelopeRight_man[i] = one_over_one_plus_two_to_n[ iEnvelopeRight_exp[i]];
                }
                else        /*  1/(1+2^-m) == 1 - 2^-m ;  for m >= 10  */
                {
                    iEnvelopeRight_man[i] -= (Qfmt(1.000F) >> iEnvelopeRight_exp[i]);
                }
                iEnvelopeRight_exp[i] = iEnvelopeLeft_exp[i] - iEnvelopeRight_exp[i];
            }
            else
            {
                if (iEnvelopeRight_exp[i] > -11)
                {
                    iEnvelopeRight_man[i] -= one_over_one_plus_two_to_n[ -iEnvelopeRight_exp[i]];
                    iEnvelopeRight_exp[i] = iEnvelopeLeft_exp[i] - iEnvelopeRight_exp[i];

                }
                else        /*  1/(1+2^m) == 2^-m ;  for m >= 10  */
                {
                    iEnvelopeRight_exp[i] = iEnvelopeLeft_exp[i];
                    iEnvelopeLeft_exp[i] = 0;
                }
            }

            iEnvelopeLeft_man[i]  = iEnvelopeRight_man[i];
        }
    }
----------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------
; LOCAL STORE/BUFFER/POINTER DEFINITIONS
; Variable declaration - defined here and used outside this module
----------------------------------------------------------------------------*/

#define R_SHIFT     30
#define Qfmt(x)   (Int32)(x*((Int32)1<<R_SHIFT) + (x>=0?0.5F:-0.5F))

/*
 *  1./(1+2.^-[0:10])
 */
const Int32 one_over_one_plus_two_to_n[11] =
{
    Qfmt(0.50000000000000F), Qfmt(0.66666666666667F), Qfmt(0.80000000000000F),
    Qfmt(0.88888888888889F), Qfmt(0.94117647058824F), Qfmt(0.96969696969697F),
    Qfmt(0.98461538461538F), Qfmt(0.99224806201550F), Qfmt(0.99610894941634F),
    Qfmt(0.99805068226121F), Qfmt(0.99902439024390F)
};

/*
 *  1./(1+2.^[0.5:-1:-10.5])
 */
const Int32 one_over_one_plus_sq_2_by_two_to_n[12] =
{
    Qfmt(0.41421356237310F), Qfmt(0.58578643762690F), Qfmt(0.73879612503626F),
    Qfmt(0.84977889517767F), Qfmt(0.91878969685839F), Qfmt(0.95767628767521F),
    Qfmt(0.97838063800882F), Qfmt(0.98907219289563F), Qfmt(0.99450607818892F),
    Qfmt(0.99724547251514F), Qfmt(0.99862083678608F), Qfmt(0.99930994254211F)
};