123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261 |
- /* ------------------------------------------------------------------
- * 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.
- * -------------------------------------------------------------------
- */
- /*
- ------------------------------------------------------------------------------
- PacketVideo Corp.
- MP3 Decoder Library
- Filename: pvmp3_alias_reduction.cpp
- Date: 09/21/2007
- ------------------------------------------------------------------------------
- REVISION HISTORY
- Description:
- ------------------------------------------------------------------------------
- INPUT AND OUTPUT DEFINITIONS
- Input
- int32 *input_buffer, Ptr to fequency lines of current channel
- struct gr_info_s *gr_info, structure with granuke information for the
- input
- mp3Header *info mp3 header information
- ------------------------------------------------------------------------------
- FUNCTION DESCRIPTION
- Alias Reduction
- Alias reduction before processing by the IMDCT
- Csi +
- >---------0---------0-------->
- \ / -
- Cai \ /
- \ /
- \ /
- \
- / \
- Cai / \
- / \ +
- >--------0---------0---------->
- Csi +
- Aliasing Butterfly
- Alias reduction is not applied to short blocks
- ------------------------------------------------------------------------------
- REQUIREMENTS
- ------------------------------------------------------------------------------
- REFERENCES
- [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
- ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
- ------------------------------------------------------------------------------
- PSEUDO-CODE
- 1 ci
- csi = ---------------- csi = ----------------
- sqrt( 1 + (ci^2)) sqrt( 1 + (ci^2))
- ci = -0.6, -0.535, -0.33, -0.185, -0.095, -0.041, -0.0142, -0.0037
- ------------------------------------------------------------------------------
- */
- /*----------------------------------------------------------------------------
- ; INCLUDES
- ----------------------------------------------------------------------------*/
- #include "pvmp3_alias_reduction.h"
- #include "pv_mp3dec_fxd_op.h"
- /*----------------------------------------------------------------------------
- ; MACROS
- ; Define module specific macros here
- ----------------------------------------------------------------------------*/
- /*----------------------------------------------------------------------------
- ; DEFINES
- ; Include all pre-processor statements here. Include conditional
- ; compile variables also.
- ----------------------------------------------------------------------------*/
- #define NUM_BUTTERFLIES 8
- #define Q31_fmt(a) (int32(double(0x7FFFFFFF)*a))
- /*----------------------------------------------------------------------------
- ; LOCAL FUNCTION DEFINITIONS
- ; Function Prototype declaration
- ----------------------------------------------------------------------------*/
- /*----------------------------------------------------------------------------
- ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
- ; Variable declaration - defined here and used outside this module
- ----------------------------------------------------------------------------*/
- const int32 c_signal [ NUM_BUTTERFLIES ] =
- {
- Q31_fmt(0.85749292571254f), Q31_fmt(0.88174199731771f),
- Q31_fmt(0.94962864910273f), Q31_fmt(0.98331459249179f),
- Q31_fmt(0.99551781606759f), Q31_fmt(0.99916055817815f),
- Q31_fmt(0.99989919524445f), Q31_fmt(0.99999315507028f)
- };
- const int32 c_alias [ NUM_BUTTERFLIES ] =
- {
- Q31_fmt(-0.51449575542753f), Q31_fmt(-0.47173196856497f),
- Q31_fmt(-0.31337745420390f), Q31_fmt(-0.18191319961098f),
- Q31_fmt(-0.09457419252642f), Q31_fmt(-0.04096558288530f),
- Q31_fmt(-0.01419856857247f), Q31_fmt(-0.00369997467376f)
- };
- /*----------------------------------------------------------------------------
- ; 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 pvmp3_alias_reduction(int32 *input_buffer, /* Ptr to spec values of current channel */
- granuleInfo *gr_info,
- int32 *used_freq_lines,
- mp3Header *info)
- {
- int32 *ptr1;
- int32 *ptr2;
- int32 *ptr3;
- int32 *ptr4;
- const int32 *ptr_csi;
- const int32 *ptr_csa;
- int32 sblim;
- int32 i, j;
- *used_freq_lines = fxp_mul32_Q32(*used_freq_lines << 16, (int32)(0x7FFFFFFF / (float)18 - 1.0f)) >> 15;
- if (gr_info->window_switching_flag && gr_info->block_type == 2)
- {
- if (gr_info->mixed_block_flag)
- {
- sblim = ((info->version_x == MPEG_2_5) && (info->sampling_frequency == 2)) ? 3 : 1;
- }
- else
- {
- return; /* illegal parameter */
- }
- }
- else
- {
- sblim = *used_freq_lines + 1;
- if (sblim > SUBBANDS_NUMBER - 1)
- {
- sblim = SUBBANDS_NUMBER - 1; /* default */
- }
- }
- ptr3 = &input_buffer[17];
- ptr4 = &input_buffer[18];
- ptr_csi = c_signal;
- ptr_csa = c_alias;
- /* NUM_BUTTERFLIES (=8) butterflies between each pair of sub-bands*/
- for (i = NUM_BUTTERFLIES >> 1; i != 0; i--)
- {
- int32 csi1 = *ptr_csi++;
- int32 csi2 = *ptr_csi++;
- int32 csa1 = *ptr_csa++;
- int32 csa2 = *ptr_csa++;
- ptr1 = ptr3;
- ptr3 -= 2;
- ptr2 = ptr4;
- ptr4 += 2;
- /*
- * "sblim" alias-reduction operations between each
- * pair of sub-bands
- */
- for (j = sblim >> 1; j != 0; j--)
- {
- int32 y = *ptr2;
- int32 x = *ptr1 << 1;
- *ptr1-- = fxp_msb32_Q32(fxp_mul32_Q32(x, csi1), y << 1, csa1);
- *ptr2++ = fxp_mac32_Q32(fxp_mul32_Q32(y << 1, csi1), x, csa1);
- y = *ptr2;
- x = *ptr1 << 1;
- *ptr1 = fxp_msb32_Q32(fxp_mul32_Q32(x, csi2), y << 1, csa2);
- *ptr2 = fxp_mac32_Q32(fxp_mul32_Q32(y << 1, csi2), x, csa2);
- ptr1 += 19;
- ptr2 += 17;
- y = *ptr2;
- x = *ptr1 << 1;
- *ptr1-- = fxp_msb32_Q32(fxp_mul32_Q32(x, csi1), y << 1, csa1);
- *ptr2++ = fxp_mac32_Q32(fxp_mul32_Q32(y << 1, csi1), x, csa1);
- y = *ptr2;
- x = *ptr1 << 1;
- *ptr1 = fxp_msb32_Q32(fxp_mul32_Q32(x, csi2), y << 1, csa2);
- *ptr2 = fxp_mac32_Q32(fxp_mul32_Q32(y << 1, csi2), x, csa2);
- ptr1 += 19;
- ptr2 += 17;
- }
- if (sblim & 1)
- {
- int32 x = *ptr1 << 1;
- int32 y = *ptr2;
- *ptr1-- = fxp_msb32_Q32(fxp_mul32_Q32(x, csi1), y << 1, csa1);
- *ptr2++ = fxp_mac32_Q32(fxp_mul32_Q32(y << 1, csi1), x, csa1);
- x = *ptr1 << 1;
- y = *ptr2;
- *ptr1 = fxp_msb32_Q32(fxp_mul32_Q32(x, csi2), y << 1, csa2);
- *ptr2 = fxp_mac32_Q32(fxp_mul32_Q32(y << 1, csi2), x, csa2);
- }
- }
- }
|