blob: 2786dcccf2ac07106dfc74d7f49bd46086673cc1 [file] [log] [blame]
/* ------------------------------------------------------------------
* Copyright (C) 1998-2009 PacketVideo
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied.
* See the License for the specific language governing permissions
* and limitations under the License.
* -------------------------------------------------------------------
*/
/*
Filename: analysis_sub_band.c
------------------------------------------------------------------------------
REVISION HISTORY
Who: Date: MM/DD/YYYY
Description:
------------------------------------------------------------------------------
INPUT AND OUTPUT DEFINITIONS
Int32 vec[], Input vector, 32-bit
const Int32 *cosTerms, Cosine Terms
Int maxbands number of bands used
Int32 *scratch_mem Scratch memory
------------------------------------------------------------------------------
FUNCTION DESCRIPTION
Implement root squared of a number
------------------------------------------------------------------------------
REQUIREMENTS
------------------------------------------------------------------------------
REFERENCES
------------------------------------------------------------------------------
PSEUDO-CODE
------------------------------------------------------------------------------
*/
/*----------------------------------------------------------------------------
; INCLUDES
----------------------------------------------------------------------------*/
#ifdef AAC_PLUS
#include "analysis_sub_band.h"
#include "dst32.h"
#include "idct32.h"
#include "mdst.h"
#include "aac_mem_funcs.h"
#include "pv_audio_type_defs.h"
#include "fxp_mul32.h"
/*----------------------------------------------------------------------------
; MACROS
; Define module specific macros here
----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------
; DEFINES
; 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
----------------------------------------------------------------------------*/
#ifdef HQ_SBR
const Int32 exp_1_5_phi[32] =
{
0x7FEA04B6, 0x7F380E1C, 0x7DD6176E, 0x7BC6209F,
0x790A29A4, 0x75A6326E, 0x719E3AF3, 0x6CF94326,
0x67BD4AFB, 0x61F15269, 0x5B9D5964, 0x54CA5FE4,
0x4D8165DE, 0x45CD6B4B, 0x3DB87023, 0x354E7460,
0x2C9977FB, 0x23A77AEF, 0x1A837D3A, 0x113A7ED6,
0x07D97FC2, 0xFE6E7FFE, 0xF5057F87, 0xEBAB7E60,
0xE26D7C89, 0xD9587A06, 0xD07976D9, 0xC7DB7308,
0xBF8C6E97, 0xB796698C, 0xB00563EF, 0xA8E25DC8,
};
#endif
/*----------------------------------------------------------------------------
; 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
----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------
; FUNCTION CODE
----------------------------------------------------------------------------*/
void analysis_sub_band_LC(Int32 vec[64],
Int32 cosine_total[],
Int32 maxBand,
Int32 scratch_mem[][64])
{
Int32 i;
Int32 *cosine_term = &scratch_mem[0][0];
Int32 *sine_term = &scratch_mem[0][32];
Int32 *pt_cos_t;
Int32 *pt_vec = &vec[0];
Int32 *pt_vec_32 = &vec[32];
Int32 *pt_cos = cosine_term;
Int32 *pt_sin = sine_term;
for (i = 8; i != 0; i--)
{
Int32 tmp1 = *(pt_vec_32++);
Int32 tmp3 = *(pt_vec_32++);
Int32 tmp2 = *(pt_vec++);
Int32 tmp4 = *(pt_vec++);
*(pt_cos++) = (tmp1 - tmp2) >> 1;
*(pt_cos++) = (tmp3 - tmp4) >> 1;
*(pt_sin++) = (tmp1 + tmp2);
*(pt_sin++) = (tmp3 + tmp4);
tmp1 = *(pt_vec_32++);
tmp3 = *(pt_vec_32++);
tmp2 = *(pt_vec++);
tmp4 = *(pt_vec++);
*(pt_cos++) = (tmp1 - tmp2) >> 1;
*(pt_cos++) = (tmp3 - tmp4) >> 1;
*(pt_sin++) = (tmp1 + tmp2);
*(pt_sin++) = (tmp3 + tmp4);
}
idct_32(cosine_term, scratch_mem[1]);
dst_32(sine_term, scratch_mem[1]);
pt_cos = cosine_term;
pt_sin = sine_term;
pt_cos_t = cosine_total;
for (i = 0; i < maxBand; i += 4)
{
*(pt_cos_t++) = (*(pt_cos++) + *(pt_sin++));
*(pt_cos_t++) = (-*(pt_cos++) + *(pt_sin++));
*(pt_cos_t++) = (-*(pt_cos++) - *(pt_sin++));
*(pt_cos_t++) = (*(pt_cos++) - *(pt_sin++));
}
pt_cos_t = &cosine_total[maxBand];
for (i = (32 - maxBand); i != 0; i--)
{
*(pt_cos_t++) = 0;
}
}
#ifdef HQ_SBR
void analysis_sub_band(Int32 vec[64],
Int32 cosine_total[],
Int32 sine_total[],
Int32 maxBand,
Int32 scratch_mem[][64])
{
Int32 i;
Int32 *sine_term1 = &scratch_mem[0][0];
Int32 *sine_term2 = &scratch_mem[0][32];
Int32 temp1;
Int32 temp2;
Int32 temp3;
Int32 temp4;
const Int32 *pt_exp;
Int32 exp_1_5;
Int32 *pt_vec = &vec[0];
Int32 *pt_vec_32 = &vec[32];
Int32 *pt_cos1 = pt_vec;
Int32 *pt_sin1 = sine_term1;
Int32 *pt_cos2 = pt_vec_32;
Int32 *pt_sin2 = sine_term2;
pv_memcpy(sine_term1, vec, 64*sizeof(*vec));
mdst_32(sine_term1, scratch_mem[1]);
mdst_32(sine_term2, scratch_mem[1]);
mdct_32(&vec[ 0]);
mdct_32(&vec[32]);
pt_cos1 = &vec[ 0];
pt_cos2 = &vec[32];
pt_sin1 = sine_term1;
pt_sin2 = sine_term2;
pt_vec = cosine_total;
pt_vec_32 = sine_total;
pt_exp = exp_1_5_phi;
temp3 = (*(pt_cos1++) - *(pt_sin2++));
temp4 = (*(pt_sin1++) + *(pt_cos2++));
for (i = 0; i < maxBand; i += 2)
{
exp_1_5 = *(pt_exp++);
temp1 = cmplx_mul32_by_16(temp3, temp4, exp_1_5);
temp2 = cmplx_mul32_by_16(temp4, -temp3, exp_1_5);
*(pt_vec++) = shft_lft_1(temp1);
*(pt_vec_32++) = shft_lft_1(temp2);
temp3 = (*(pt_cos1++) + *(pt_sin2++));
temp4 = (*(pt_sin1++) - *(pt_cos2++));
exp_1_5 = *(pt_exp++);
temp1 = cmplx_mul32_by_16(temp3, temp4, exp_1_5);
temp2 = cmplx_mul32_by_16(temp4, -temp3, exp_1_5);
*(pt_vec++) = shft_lft_1(temp1);
*(pt_vec_32++) = shft_lft_1(temp2);
temp3 = (*(pt_cos1++) - *(pt_sin2++));
temp4 = (*(pt_sin1++) + *(pt_cos2++));
}
pt_cos1 = &cosine_total[maxBand]; /* in the chance that maxband is not even */
pt_sin1 = &sine_total[maxBand];
for (i = (32 - maxBand); i != 0; i--)
{
*(pt_cos1++) = 0;
*(pt_sin1++) = 0;
}
}
#endif
#endif