1d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/* ------------------------------------------------------------------ 2d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * Copyright (C) 1998-2009 PacketVideo 3d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * 4d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * you may not use this file except in compliance with the License. 6d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * You may obtain a copy of the License at 7d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * 8d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * 10d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * Unless required by applicable law or agreed to in writing, software 11d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 13d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * express or implied. 14d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * See the License for the specific language governing permissions 15d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * and limitations under the License. 16d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * ------------------------------------------------------------------- 17d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber */ 18d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/* 19d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------ 20d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 21d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber PacketVideo Corp. 22d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber MP3 Decoder Library 23d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 24d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Filename: pvmp3_imdct_synth.cpp 25d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 26d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Date: 09/21/2007 27d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 28d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------ 29d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REVISION HISTORY 30d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 31d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 32d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Description: 33d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 34d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------ 35d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber INPUT AND OUTPUT DEFINITIONS 36d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 37d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Input 38d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber int32 in[], Pointer to spec values of current channel 39d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber int32 overlap[], Pointer to overlap values of current channel 40d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber uint32 blk_type, Block type 41d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber int16 mx_band, In case of mixed blocks, # of bands with long 42d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber blocks (2 or 4) else 0 43d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber int32 *Scratch_mem 44d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Returns 45d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 46d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber int32 in[], 47d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 48d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------ 49d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber FUNCTION DESCRIPTION 50d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 51d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber The frequency lines are preprocessed by the "alias reduction" scheme 52d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber and fed into the IMDCT matrix, each 18 into one transform block. 53d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber The first half of the output values are added to the stored overlap 54d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber values from the last block. These values are new output values and 55d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber are input values for the polyphase filterbank. The second half of the 56d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber output values is stored for overlap with the next data granule. 57d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber The number of windowed samples is 12 for short blocks, and 36 for long 58d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber blocks 59d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 60d9618f23226f46c752e56f712bc4b505117d8b4bAndreas HuberWindowing 61d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 62d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Depending on window_switching_flag[gr][ch], block_type[gr][ch] and 63d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber mixed_block_flag[gr][ch] different shapes of windows are used. 64d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber normal window 65d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber start window 66d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber stop window 67d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber short windows 68d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Each of the three short blocks is windowed separately. 69d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber The windowed short blocks must be overlapped and concatenated. 70d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 71d9618f23226f46c752e56f712bc4b505117d8b4bAndreas HuberOverlapping and adding with previous block 72d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 73d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber The first half (18 values) of the current block (36 values) has to be 74d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber overlapped with the second half of the previous block. The second half 75d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber of the current block has to be stored for overlapping with the next block 76d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 77d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------ 78d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REQUIREMENTS 79d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 80d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 81d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------ 82d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REFERENCES 83d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 84d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber [1] ISO MPEG Audio Subgroup Software Simulation Group (1996) 85d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension 86d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 87d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------ 88d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber PSEUDO-CODE 89d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 90d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------ 91d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber*/ 92d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 93d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 94d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*---------------------------------------------------------------------------- 95d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; INCLUDES 96d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/ 97d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 98d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pvmp3_imdct_synth.h" 99d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pv_mp3dec_fxd_op.h" 100d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pvmp3_dec_defs.h" 101d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pvmp3_mdct_18.h" 102d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pvmp3_mdct_6.h" 103d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "mp3_mem_funcs.h" 104d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 105d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 106d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 107d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*---------------------------------------------------------------------------- 108d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; MACROS 109d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Define module specific macros here 110d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/ 111d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 112d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 113d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*---------------------------------------------------------------------------- 114d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; DEFINES 115d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Include all pre-processor statements here. Include conditional 116d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; compile variables also. 117d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/ 118d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#define LONG 0 119d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#define START 1 120d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#define SHORT 2 121d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#define STOP 3 122d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 123d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*---------------------------------------------------------------------------- 124d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; LOCAL FUNCTION DEFINITIONS 125d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Function Prototype declaration 126d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/ 127d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 128d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*---------------------------------------------------------------------------- 129d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS 130d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Variable declaration - defined here and used outside this module 131d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/ 132d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/* 133d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * sin(pi/36*(k+0.5)),k=0..35 134d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber */ 135d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 136d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huberconst int32 normal_win[36] = 137d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{ 138d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Qfmt_31(0.08723877473068f), Qfmt_31(0.26105238444010f), Qfmt_31(0.43287922787620f), 139d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Qfmt_31(0.60141159900854f), Qfmt_31(0.76536686473018f), Qfmt_31(0.92349722647006f), 140d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Qfmt_31(0.53729960834682f), Qfmt_31(0.60876142900872f), Qfmt_31(0.67559020761566f), 141d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Qfmt_31(-0.73727733681012f), Qfmt_31(-0.79335334029124f), Qfmt_31(0.84339144581289f), 142d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Qfmt_31(0.88701083317822f), Qfmt_31(0.92387953251129f), Qfmt_31(-0.95371695074823f), 143d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Qfmt_31(-0.97629600711993f), Qfmt_31(-0.99144486137381f), Qfmt_31(-0.99904822158186f), 144d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Qfmt_31(0.99904822158186f), Qfmt_31(0.99144486137381f), Qfmt_31(0.97629600711993f), 145d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Qfmt_31(0.95371695074823f), Qfmt_31(0.92387953251129f), Qfmt_31(0.88701083317822f), 146d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Qfmt_31(0.84339144581289f), Qfmt_31(0.79335334029124f), Qfmt_31(0.73727733681012f), 147d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Qfmt_31(0.67559020761566f), Qfmt_31(0.60876142900872f), Qfmt_31(0.53729960834682f), 148d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Qfmt_31(0.46174861323503f), Qfmt_31(0.38268343236509f), Qfmt_31(0.30070579950427f), 149d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Qfmt_31(0.21643961393810f), Qfmt_31(0.13052619222005f), Qfmt_31(0.04361938736534f) 150d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}; 151d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 152d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 153d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huberconst int32 start_win[36] = 154d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{ 155d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber /* k=0..17 sin(pi/36*(k+0.5)), */ 156d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Qfmt_31(0.08723877473068f), Qfmt_31(0.26105238444010f), Qfmt_31(0.43287922787620f), 157d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Qfmt_31(0.60141159900854f), Qfmt_31(0.76536686473018f), Qfmt_31(0.92349722647006f), 158d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Qfmt_31(0.53729960834682f), Qfmt_31(0.60876142900872f), Qfmt_31(0.67559020761566f), 159d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Qfmt_31(-0.73727733681012f), Qfmt_31(-0.79335334029124f), Qfmt_31(0.84339144581289f), 160d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Qfmt_31(0.88701083317822f), Qfmt_31(0.92387953251129f), Qfmt_31(-0.95371695074823f), 161d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Qfmt_31(-0.97629600711993f), Qfmt_31(-0.99144486137381f), Qfmt_31(-0.99904822158186f), 162d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 163d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Qfmt_31(0.99999990000000f), Qfmt_31(0.99999990000000f), Qfmt_31(0.99999990000000f), 164d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Qfmt_31(0.99999990000000f), Qfmt_31(0.99999990000000f), Qfmt_31(0.99999990000000f), 165d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber /* k=24..29; sin(pi/12*(k-18+0.5)) */ 166d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Qfmt_31(0.99144486137381f), Qfmt_31(0.92387953251129f), Qfmt_31(0.79335334029124f), 167d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Qfmt_31(0.60876142900872f), Qfmt_31(0.38268343236509f), Qfmt_31(0.13052619222005f), 168d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 169d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Qfmt_31(0.00000000000000f), Qfmt_31(0.00000000000000f), Qfmt_31(0.00000000000000f), 170d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Qfmt_31(0.00000000000000f), Qfmt_31(0.00000000000000f), Qfmt_31(0.00000000000000f) 171d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}; 172d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 173d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 174d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huberconst int32 stop_win[36] = 175d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{ 176d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Qfmt_31(0.00000000000000f), Qfmt_31(0.00000000000000f), Qfmt_31(0.00000000000000f), 177d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Qfmt_31(0.00000000000000f), Qfmt_31(0.00000000000000f), Qfmt_31(0.00000000000000f), 178d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber /* k=6..11; sin(pi/12*(k-6+0.5)) */ 179d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Qfmt_31(0.13052619222005f), Qfmt_31(0.38268343236509f), Qfmt_31(0.60876142900872f), 180d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Qfmt_31(-0.79335334029124f), Qfmt_31(-0.92387953251129f), Qfmt_31(0.99144486137381f), 181d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 182d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Qfmt_31(0.99999990000000f), Qfmt_31(0.99999990000000f), Qfmt_31(-0.99999990000000f), 183d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Qfmt_31(-0.99999990000000f), Qfmt_31(-0.99999990000000f), Qfmt_31(-0.99999990000000f), 184d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber /* k=18..35 sin(pi/36*(k+0.5)), */ 185d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Qfmt_31(0.99904822158186f), Qfmt_31(0.99144486137381f), Qfmt_31(0.97629600711993f), 186d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Qfmt_31(0.95371695074823f), Qfmt_31(0.92387953251129f), Qfmt_31(0.88701083317822f), 187d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Qfmt_31(0.84339144581289f), Qfmt_31(0.79335334029124f), Qfmt_31(0.73727733681012f), 188d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Qfmt_31(0.67559020761566f), Qfmt_31(0.60876142900872f), Qfmt_31(0.53729960834682f), 189d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Qfmt_31(0.46174861323503f), Qfmt_31(0.38268343236509f), Qfmt_31(0.30070579950427f), 190d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Qfmt_31(0.21643961393810f), Qfmt_31(0.13052619222005f), Qfmt_31(0.04361938736534f) 191d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}; 192d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 193d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 194d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huberconst int32 short_win[12] = 195d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{ 196d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber /* k=0..11; sin(pi/12*(k+0.5)) */ 197d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Qfmt_31(0.13052619222005f), Qfmt_31(0.38268343236509f), Qfmt_31(0.60876142900872f), 198d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Qfmt_31(0.79335334029124f), Qfmt_31(0.92387953251129f), Qfmt_31(0.99144486137381f), 199d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Qfmt_31(0.99144486137381f), Qfmt_31(0.92387953251129f), Qfmt_31(0.79335334029124f), 200d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Qfmt_31(0.60876142900872f), Qfmt_31(0.38268343236509f), Qfmt_31(0.13052619222005f), 201d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}; 202d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*---------------------------------------------------------------------------- 203d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; EXTERNAL FUNCTION REFERENCES 204d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Declare functions defined elsewhere and referenced in this module 205d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/ 206d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 207d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*---------------------------------------------------------------------------- 208d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES 209d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Declare variables used in this module but defined elsewhere 210d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/ 211d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 212d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*---------------------------------------------------------------------------- 213d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; FUNCTION CODE 214d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/ 215d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 216d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Hubervoid pvmp3_imdct_synth(int32 in[SUBBANDS_NUMBER*FILTERBANK_BANDS], 217d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber int32 overlap[SUBBANDS_NUMBER*FILTERBANK_BANDS], 218d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber uint32 blk_type, 219d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber int16 mx_band, 220d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber int32 used_freq_lines, 221d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber int32 *Scratch_mem) 222d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{ 223d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 224d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber int32 band; 225d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber int32 bands2process = used_freq_lines + 2; 226d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 227d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber if (bands2process > SUBBANDS_NUMBER) 228d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 229d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber bands2process = SUBBANDS_NUMBER; /* default */ 230d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 231d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 232d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 233d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber /* 234d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * in case of mx_poly_band> 0, do 235d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * long transforms 236d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber */ 237d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 238d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 239d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber for (band = 0; band < bands2process; band++) 240d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 241d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber uint32 current_blk_type = (band < mx_band) ? LONG : blk_type; 242d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 243d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber int32 * out = in + (band * FILTERBANK_BANDS); 244d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber int32 * history = overlap + (band * FILTERBANK_BANDS); 245d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 246d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber switch (current_blk_type) 247d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 248d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber case LONG: 249d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 250d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber pvmp3_mdct_18(out, history, normal_win); 251d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 252d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber break; 253d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 254d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber case START: 255d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 256d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber pvmp3_mdct_18(out, history, start_win); 257d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 258d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber break; 259d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 260d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber case STOP: 261d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 262d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber pvmp3_mdct_18(out, history, stop_win); 263d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 264d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber break; 265d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 266d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber case SHORT: 267d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 268d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber int32 *tmp_prev_ovr = &Scratch_mem[FILTERBANK_BANDS]; 269d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber int32 i; 270d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 271d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber for (i = 0; i < 6; i++) 272d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 273d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Scratch_mem[i ] = out[(i*3)]; 274d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Scratch_mem[6 +i] = out[(i*3) + 1]; 275d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Scratch_mem[12 +i] = out[(i*3) + 2]; 276d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 277d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 278d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber pvmp3_mdct_6(&Scratch_mem[ 0], &tmp_prev_ovr[ 0]); 279d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber pvmp3_mdct_6(&Scratch_mem[ 6], &tmp_prev_ovr[ 6]); 280d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber pvmp3_mdct_6(&Scratch_mem[12], &tmp_prev_ovr[12]); 281d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 282d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber for (i = 0; i < 6; i++) 283d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 284d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber int32 temp = history[i]; 285d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber /* next iteration overlap */ 286d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber history[i] = fxp_mul32_Q32(tmp_prev_ovr[ 6+i] << 1, short_win[6+i]); 287d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber history[i] += fxp_mul32_Q32(Scratch_mem[12+i] << 1, short_win[ i]); 288d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber out[i] = temp; 289d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 290d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 291d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber for (i = 0; i < 6; i++) 292d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 293d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber out[i+6] = fxp_mul32_Q32(Scratch_mem[i] << 1, short_win[i]); 294d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber out[i+6] += history[i+6]; 295d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber /* next iteration overlap */ 296d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber history[i+6] = fxp_mul32_Q32(tmp_prev_ovr[12+i] << 1, short_win[6+i]); 297d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 298d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 299d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber for (i = 0; i < 6; i++) 300d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 301d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber out[i+12] = fxp_mul32_Q32(tmp_prev_ovr[ i] << 1, short_win[6+i]); 302d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber out[i+12] += fxp_mul32_Q32(Scratch_mem[6+i] << 1, short_win[ i]); 303d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber out[i+12] += history[i+12]; 304d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber history[12+i] = 0; 305d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 306d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 307d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 308d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber break; 309d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 310d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 311d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber /* 312d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * Compensation for frequency inversion of polyphase filterbank 313d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * every odd time sample of every odd odd subband is mulitplied by -1 before 314d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * processing by the polyphase filter 315d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber */ 316d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 317d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber if (band & 1) 318d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 319d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber for (int32 slot = 1; slot < FILTERBANK_BANDS; slot += 6) 320d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 321d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber int32 temp1 = out[slot ]; 322d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber int32 temp2 = out[slot+2]; 323d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber int32 temp3 = out[slot+4]; 324d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber out[slot ] = -temp1; 325d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber out[slot+2] = -temp2; 326d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber out[slot+4] = -temp3; 327d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 328d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 329d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 330d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 331d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 332d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber for (band = bands2process; band < SUBBANDS_NUMBER; band++) 333d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 334d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber int32 * out = in + (band * FILTERBANK_BANDS); 335d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber int32 * history = overlap + (band * FILTERBANK_BANDS); 336d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber int32 slot; 337d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 338d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber if (band & 1) 339d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 340d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber for (slot = 0; slot < FILTERBANK_BANDS; slot += 6) 341d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 342d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber int32 temp1 = history[slot ]; 343d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber int32 temp2 = history[slot+1]; 344d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber int32 temp3 = history[slot+2]; 345d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber out[slot ] = temp1; 346d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber out[slot+1] = -temp2; 347d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber out[slot+2] = temp3; 348d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 349d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber temp1 = history[slot+3]; 350d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber temp2 = history[slot+4]; 351d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber temp3 = history[slot+5]; 352d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber out[slot+3] = -temp1; 353d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber out[slot+4] = temp2; 354d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber out[slot+5] = -temp3; 355d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 356d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 357d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber else 358d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 359d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber for (slot = 0; slot < FILTERBANK_BANDS; slot += 3) 360d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 361d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber int32 temp1 = history[slot ]; 362d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber int32 temp2 = history[slot+1]; 363d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber int32 temp3 = history[slot+2]; 364d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber out[slot ] = temp1; 365d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber out[slot+1] = temp2; 366d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber out[slot+2] = temp3; 367d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 368d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 369d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 370d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber pv_memset(history, 0, FILTERBANK_BANDS*sizeof(*overlap)); 371d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 372d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber} 373d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 374d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 375d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 376d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 377