| /* ------------------------------------------------------------------ |
| * 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: mdst.c |
| |
| ------------------------------------------------------------------------------ |
| REVISION HISTORY |
| |
| |
| Who: Date: MM/DD/YYYY |
| Description: |
| |
| ------------------------------------------------------------------------------ |
| INPUT AND OUTPUT DEFINITIONS |
| |
| Int32 x 32-bit integer input length 64 |
| |
| |
| ------------------------------------------------------------------------------ |
| FUNCTION DESCRIPTION |
| |
| mdst |
| |
| ------------------------------------------------------------------------------ |
| REQUIREMENTS |
| |
| |
| ------------------------------------------------------------------------------ |
| REFERENCES |
| |
| ------------------------------------------------------------------------------ |
| PSEUDO-CODE |
| |
| ------------------------------------------------------------------------------ |
| */ |
| |
| |
| /*---------------------------------------------------------------------------- |
| ; INCLUDES |
| ----------------------------------------------------------------------------*/ |
| |
| #ifdef AAC_PLUS |
| |
| #include "pv_audio_type_defs.h" |
| #include "synthesis_sub_band.h" |
| #include "dct16.h" |
| #include "dct64.h" |
| #include "mdst.h" |
| |
| #ifdef HQ_SBR |
| |
| |
| /*---------------------------------------------------------------------------- |
| ; MACROS |
| ; Define module specific macros here |
| ----------------------------------------------------------------------------*/ |
| |
| |
| /*---------------------------------------------------------------------------- |
| ; DEFINES |
| ; Include all pre-processor statements here. Include conditional |
| ; compile variables also. |
| ----------------------------------------------------------------------------*/ |
| |
| #include "fxp_mul32.h" |
| #include "dst32.h" |
| |
| |
| #define Qfmt1(a) (Int32)(a*0x7FFFFFFF + (a>=0?0.5F:-0.5F)) |
| #define Qfmt(a) (Int32)(a*((Int32)1<<27) + (a>=0?0.5F:-0.5F)) |
| |
| const Int32 CosTable_32[32] = |
| { |
| Qfmt1(0.50015063602065F), Qfmt1(0.50135845244641F), |
| Qfmt1(0.50378872568104F), Qfmt1(0.50747117207256F), |
| Qfmt1(0.51245147940822F), Qfmt1(0.51879271310533F), |
| Qfmt1(0.52657731515427F), Qfmt1(0.53590981690799F), |
| Qfmt1(0.54692043798551F), Qfmt1(0.55976981294708F), |
| Qfmt1(0.57465518403266F), Qfmt1(0.59181853585742F), |
| Qfmt1(0.61155734788251F), Qfmt1(0.63423893668840F), |
| Qfmt1(0.66031980781371F), Qfmt1(0.69037212820021F), |
| Qfmt1(0.72512052237720F), Qfmt1(0.76549416497309F), |
| Qfmt1(0.81270209081449F), Qfmt1(0.86834471522335F), |
| Qfmt(0.93458359703641F), Qfmt(1.01440826499705F), |
| Qfmt(1.11207162057972F), Qfmt(1.23383273797657F), |
| Qfmt(1.38929395863283F), Qfmt(1.59397228338563F), |
| Qfmt(1.87467598000841F), Qfmt(2.28205006800516F), |
| Qfmt(2.92462842815822F), Qfmt(4.08461107812925F), |
| Qfmt(6.79675071167363F), Qfmt(10.18693908361573F) |
| }; |
| |
| |
| |
| /*---------------------------------------------------------------------------- |
| ; LOCAL FUNCTION DEFINITIONS |
| ; Function Prototype declaration |
| ----------------------------------------------------------------------------*/ |
| |
| /*---------------------------------------------------------------------------- |
| ; LOCAL STORE/BUFFER/POINTER DEFINITIONS |
| ; Variable declaration - defined here and used outside this module |
| ----------------------------------------------------------------------------*/ |
| |
| /*---------------------------------------------------------------------------- |
| ; 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 |
| ----------------------------------------------------------------------------*/ |
| |
| /*---------------------------------------------------------------------------- |
| ; mdst_32 |
| ----------------------------------------------------------------------------*/ |
| |
| void mdst_32(Int32 vec[], Int32 scratch_mem[]) |
| { |
| |
| Int i; |
| const Int32 *pt_cos = CosTable_32; |
| Int32 *pt_vec = vec; |
| Int32 tmp1; |
| Int32 tmp2; |
| |
| |
| |
| Int32 tmp3; |
| |
| tmp3 = *(pt_vec++); |
| tmp2 = *(pt_vec); |
| |
| for (i = 5; i != 0; i--) |
| { |
| *(pt_vec++) += tmp3; |
| tmp1 = *(pt_vec); |
| *(pt_vec++) += tmp2; |
| tmp3 = *(pt_vec); |
| *(pt_vec++) += tmp1; |
| tmp2 = *(pt_vec); |
| *(pt_vec++) += tmp3; |
| tmp1 = *(pt_vec); |
| *(pt_vec++) += tmp2; |
| tmp3 = *(pt_vec); |
| *(pt_vec++) += tmp1; |
| tmp2 = *(pt_vec); |
| } |
| |
| *(pt_vec) += tmp3; |
| |
| dst_32(vec, scratch_mem); |
| |
| pt_vec = vec; |
| |
| for (i = 5; i != 0; i--) |
| { |
| *(pt_vec) = fxp_mul32_Q31((*(pt_vec) << 1) + tmp2, *(pt_cos++)); |
| pt_vec++; |
| *(pt_vec) = fxp_mul32_Q31((*(pt_vec) << 1) - tmp2, *(pt_cos++)); |
| pt_vec++; |
| *(pt_vec) = fxp_mul32_Q31((*(pt_vec) << 1) + tmp2, *(pt_cos++)); |
| pt_vec++; |
| *(pt_vec) = fxp_mul32_Q31((*(pt_vec) << 1) - tmp2, *(pt_cos++)); |
| pt_vec++; |
| } |
| |
| tmp2 >>= 1; |
| for (i = 3; i != 0; i--) |
| { |
| *(pt_vec) = fxp_mul32_Q27((*(pt_vec) + tmp2), *(pt_cos++)); |
| pt_vec++; |
| *(pt_vec) = fxp_mul32_Q27((*(pt_vec) - tmp2), *(pt_cos++)); |
| pt_vec++; |
| *(pt_vec) = fxp_mul32_Q27((*(pt_vec) + tmp2), *(pt_cos++)); |
| pt_vec++; |
| *(pt_vec) = fxp_mul32_Q27((*(pt_vec) - tmp2), *(pt_cos++)); |
| pt_vec++; |
| } |
| |
| *(pt_vec - 1) <<= 1; |
| |
| } |
| |
| |
| |
| /*---------------------------------------------------------------------------- |
| ; mdct_32 |
| ----------------------------------------------------------------------------*/ |
| |
| void mdct_32(Int32 vec[]) |
| { |
| Int i; |
| Int32 *pt_vec = vec; |
| Int32 tmp1, tmp2; |
| |
| |
| const Int32 *pt_CosTable = CosTable_32; |
| |
| |
| for (i = 5; i != 0; i--) |
| { |
| *(pt_vec) = fxp_mul32_Q31(*(pt_vec) << 1, *(pt_CosTable++)); |
| pt_vec++; |
| *(pt_vec) = fxp_mul32_Q31(*(pt_vec) << 1, *(pt_CosTable++)); |
| pt_vec++; |
| *(pt_vec) = fxp_mul32_Q31(*(pt_vec) << 1, *(pt_CosTable++)); |
| pt_vec++; |
| *(pt_vec) = fxp_mul32_Q31(*(pt_vec) << 1, *(pt_CosTable++)); |
| pt_vec++; |
| } |
| for (i = 3; i != 0; i--) |
| { |
| *(pt_vec) = fxp_mul32_Q27(*(pt_vec), *(pt_CosTable++)); |
| pt_vec++; |
| *(pt_vec) = fxp_mul32_Q27(*(pt_vec), *(pt_CosTable++)); |
| pt_vec++; |
| *(pt_vec) = fxp_mul32_Q27(*(pt_vec), *(pt_CosTable++)); |
| pt_vec++; |
| *(pt_vec) = fxp_mul32_Q27(*(pt_vec), *(pt_CosTable++)); |
| pt_vec++; |
| } |
| *(pt_vec - 1) <<= 1; |
| |
| |
| dct_32(vec); |
| |
| |
| pt_vec = &vec[31]; |
| |
| tmp1 = *(pt_vec--); |
| |
| for (i = 5; i != 0; i--) |
| { |
| tmp2 = *(pt_vec); |
| *(pt_vec--) += tmp1; |
| tmp1 = *(pt_vec); |
| *(pt_vec--) += tmp2; |
| tmp2 = *(pt_vec); |
| *(pt_vec--) += tmp1; |
| tmp1 = *(pt_vec); |
| *(pt_vec--) += tmp2; |
| tmp2 = *(pt_vec); |
| *(pt_vec--) += tmp1; |
| tmp1 = *(pt_vec); |
| *(pt_vec--) += tmp2; |
| } |
| |
| *(pt_vec) += tmp1; |
| |
| } |
| |
| #endif /* HQ_SBR */ |
| |
| |
| /*---------------------------------------------------------------------------- |
| ; dct_32 |
| ----------------------------------------------------------------------------*/ |
| |
| |
| void dct_32(Int32 vec[]) |
| { |
| |
| pv_split(&vec[16]); |
| |
| dct_16(&vec[16], 0); |
| dct_16(vec, 1); // Even terms |
| |
| pv_merge_in_place_N32(vec); |
| } |
| |
| #endif /* AAC_PLUS */ |
| |
| |