262 lines
8.1 KiB
C++
262 lines
8.1 KiB
C++
/* ------------------------------------------------------------------
|
|
* 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);
|
|
}
|
|
}
|
|
|
|
}
|