transform.c revision 956c553ab0ce72f8074ad0fda2ffd66a0305700c
1956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/* 2956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ** Copyright 2003-2010, VisualOn, Inc. 3956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ** 4956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ** Licensed under the Apache License, Version 2.0 (the "License"); 5956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ** you may not use this file except in compliance with the License. 6956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ** You may obtain a copy of the License at 7956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ** 8956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ** http://www.apache.org/licenses/LICENSE-2.0 9956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ** 10956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ** Unless required by applicable law or agreed to in writing, software 11956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ** distributed under the License is distributed on an "AS IS" BASIS, 12956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ** See the License for the specific language governing permissions and 14956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ** limitations under the License. 15956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong */ 16956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/******************************************************************************* 17956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong File: transform.c 18956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 19956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Content: MDCT Transform functionss 20956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 21956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*******************************************************************************/ 22956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 23956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#include "basic_op.h" 24956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#include "psy_const.h" 25956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#include "transform.h" 26956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#include "aac_rom.h" 27956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 28956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 29956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#define LS_TRANS ((FRAME_LEN_LONG-FRAME_LEN_SHORT)/2) /* 448 */ 30956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#define SQRT1_2 0x5a82799a /* sqrt(1/2) in Q31 */ 31956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#define swap2(p0,p1) \ 32956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong t = p0; t1 = *(&(p0)+1); \ 33956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong p0 = p1; *(&(p0)+1) = *(&(p1)+1); \ 34956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong p1 = t; *(&(p1)+1) = t1 35956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 36956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/********************************************************************************* 37956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* 38956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: Shuffle 39956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description: Shuffle points prepared function for fft 40956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* 41956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong**********************************************************************************/ 42956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongstatic void Shuffle(int *buf, int num, const unsigned char* bitTab) 43956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{ 44956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong int *part0, *part1; 45956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong int i, j; 46956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong int t, t1; 47956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 48956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong part0 = buf; 49956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong part1 = buf + num; 50956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 51956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong while ((i = *bitTab++) != 0) { 52956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong j = *bitTab++; 53956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 54956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong swap2(part0[4*i+0], part0[4*j+0]); 55956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong swap2(part0[4*i+2], part1[4*j+0]); 56956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong swap2(part1[4*i+0], part0[4*j+2]); 57956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong swap2(part1[4*i+2], part1[4*j+2]); 58956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 59956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 60956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong do { 61956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong swap2(part0[4*i+2], part1[4*i+0]); 62956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } while ((i = *bitTab++) != 0); 63956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong} 64956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 65956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if !defined(ARMV5E) && !defined(ARMV7Neon) 66956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 67956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/***************************************************************************** 68956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* 69956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: Radix4First 70956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description: Radix 4 point prepared function for fft 71956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* 72956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong**********************************************************************************/ 73956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongstatic void Radix4First(int *buf, int num) 74956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{ 75956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong int r0, r1, r2, r3; 76956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong int r4, r5, r6, r7; 77956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 78956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong for (; num != 0; num--) 79956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong { 80956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong r0 = buf[0] + buf[2]; 81956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong r1 = buf[1] + buf[3]; 82956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong r2 = buf[0] - buf[2]; 83956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong r3 = buf[1] - buf[3]; 84956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong r4 = buf[4] + buf[6]; 85956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong r5 = buf[5] + buf[7]; 86956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong r6 = buf[4] - buf[6]; 87956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong r7 = buf[5] - buf[7]; 88956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 89956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong buf[0] = r0 + r4; 90956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong buf[1] = r1 + r5; 91956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong buf[4] = r0 - r4; 92956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong buf[5] = r1 - r5; 93956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong buf[2] = r2 + r7; 94956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong buf[3] = r3 - r6; 95956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong buf[6] = r2 - r7; 96956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong buf[7] = r3 + r6; 97956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 98956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong buf += 8; 99956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 100956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong} 101956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 102956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/***************************************************************************** 103956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* 104956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: Radix8First 105956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description: Radix 8 point prepared function for fft 106956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* 107956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong**********************************************************************************/ 108956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongstatic void Radix8First(int *buf, int num) 109956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{ 110956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong int r0, r1, r2, r3; 111956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong int i0, i1, i2, i3; 112956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong int r4, r5, r6, r7; 113956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong int i4, i5, i6, i7; 114956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong int t0, t1, t2, t3; 115956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 116956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong for ( ; num != 0; num--) 117956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong { 118956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong r0 = buf[0] + buf[2]; 119956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong i0 = buf[1] + buf[3]; 120956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong r1 = buf[0] - buf[2]; 121956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong i1 = buf[1] - buf[3]; 122956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong r2 = buf[4] + buf[6]; 123956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong i2 = buf[5] + buf[7]; 124956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong r3 = buf[4] - buf[6]; 125956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong i3 = buf[5] - buf[7]; 126956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 127956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong r4 = (r0 + r2) >> 1; 128956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong i4 = (i0 + i2) >> 1; 129956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong r5 = (r0 - r2) >> 1; 130956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong i5 = (i0 - i2) >> 1; 131956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong r6 = (r1 - i3) >> 1; 132956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong i6 = (i1 + r3) >> 1; 133956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong r7 = (r1 + i3) >> 1; 134956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong i7 = (i1 - r3) >> 1; 135956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 136956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong r0 = buf[ 8] + buf[10]; 137956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong i0 = buf[ 9] + buf[11]; 138956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong r1 = buf[ 8] - buf[10]; 139956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong i1 = buf[ 9] - buf[11]; 140956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong r2 = buf[12] + buf[14]; 141956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong i2 = buf[13] + buf[15]; 142956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong r3 = buf[12] - buf[14]; 143956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong i3 = buf[13] - buf[15]; 144956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 145956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong t0 = (r0 + r2) >> 1; 146956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong t1 = (i0 + i2) >> 1; 147956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong t2 = (r0 - r2) >> 1; 148956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong t3 = (i0 - i2) >> 1; 149956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 150956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong buf[ 0] = r4 + t0; 151956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong buf[ 1] = i4 + t1; 152956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong buf[ 8] = r4 - t0; 153956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong buf[ 9] = i4 - t1; 154956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong buf[ 4] = r5 + t3; 155956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong buf[ 5] = i5 - t2; 156956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong buf[12] = r5 - t3; 157956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong buf[13] = i5 + t2; 158956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 159956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong r0 = r1 - i3; 160956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong i0 = i1 + r3; 161956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong r2 = r1 + i3; 162956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong i2 = i1 - r3; 163956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 164956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong t0 = MULHIGH(SQRT1_2, r0 - i0); 165956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong t1 = MULHIGH(SQRT1_2, r0 + i0); 166956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong t2 = MULHIGH(SQRT1_2, r2 - i2); 167956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong t3 = MULHIGH(SQRT1_2, r2 + i2); 168956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 169956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong buf[ 6] = r6 - t0; 170956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong buf[ 7] = i6 - t1; 171956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong buf[14] = r6 + t0; 172956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong buf[15] = i6 + t1; 173956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong buf[ 2] = r7 + t3; 174956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong buf[ 3] = i7 - t2; 175956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong buf[10] = r7 - t3; 176956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong buf[11] = i7 + t2; 177956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 178956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong buf += 16; 179956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 180956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong} 181956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 182956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/***************************************************************************** 183956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* 184956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: Radix4FFT 185956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description: Radix 4 point fft core function 186956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* 187956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong**********************************************************************************/ 188956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongstatic void Radix4FFT(int *buf, int num, int bgn, int *twidTab) 189956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{ 190956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong int r0, r1, r2, r3; 191956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong int r4, r5, r6, r7; 192956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong int t0, t1; 193956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong int sinx, cosx; 194956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong int i, j, step; 195956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong int *xptr, *csptr; 196956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 197956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong for (num >>= 2; num != 0; num >>= 2) 198956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong { 199956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong step = 2*bgn; 200956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong xptr = buf; 201956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 202956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong for (i = num; i != 0; i--) 203956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong { 204956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong csptr = twidTab; 205956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 206956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong for (j = bgn; j != 0; j--) 207956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong { 208956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong r0 = xptr[0]; 209956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong r1 = xptr[1]; 210956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong xptr += step; 211956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 212956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong t0 = xptr[0]; 213956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong t1 = xptr[1]; 214956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong cosx = csptr[0]; 215956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong sinx = csptr[1]; 216956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong r2 = MULHIGH(cosx, t0) + MULHIGH(sinx, t1); /* cos*br + sin*bi */ 217956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong r3 = MULHIGH(cosx, t1) - MULHIGH(sinx, t0); /* cos*bi - sin*br */ 218956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong xptr += step; 219956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 220956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong t0 = r0 >> 2; 221956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong t1 = r1 >> 2; 222956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong r0 = t0 - r2; 223956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong r1 = t1 - r3; 224956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong r2 = t0 + r2; 225956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong r3 = t1 + r3; 226956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 227956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong t0 = xptr[0]; 228956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong t1 = xptr[1]; 229956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong cosx = csptr[2]; 230956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong sinx = csptr[3]; 231956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong r4 = MULHIGH(cosx, t0) + MULHIGH(sinx, t1); /* cos*cr + sin*ci */ 232956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong r5 = MULHIGH(cosx, t1) - MULHIGH(sinx, t0); /* cos*ci - sin*cr */ 233956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong xptr += step; 234956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 235956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong t0 = xptr[0]; 236956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong t1 = xptr[1]; 237956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong cosx = csptr[4]; 238956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong sinx = csptr[5]; 239956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong r6 = MULHIGH(cosx, t0) + MULHIGH(sinx, t1); /* cos*cr + sin*ci */ 240956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong r7 = MULHIGH(cosx, t1) - MULHIGH(sinx, t0); /* cos*ci - sin*cr */ 241956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong csptr += 6; 242956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 243956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong t0 = r4; 244956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong t1 = r5; 245956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong r4 = t0 + r6; 246956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong r5 = r7 - t1; 247956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong r6 = t0 - r6; 248956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong r7 = r7 + t1; 249956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 250956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong xptr[0] = r0 + r5; 251956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong xptr[1] = r1 + r6; 252956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong xptr -= step; 253956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 254956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong xptr[0] = r2 - r4; 255956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong xptr[1] = r3 - r7; 256956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong xptr -= step; 257956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 258956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong xptr[0] = r0 - r5; 259956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong xptr[1] = r1 - r6; 260956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong xptr -= step; 261956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 262956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong xptr[0] = r2 + r4; 263956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong xptr[1] = r3 + r7; 264956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong xptr += 2; 265956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 266956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong xptr += 3*step; 267956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 268956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong twidTab += 3*step; 269956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong bgn <<= 2; 270956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 271956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong} 272956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 273956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/********************************************************************************* 274956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* 275956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: PreMDCT 276956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description: prepare MDCT process for next FFT compute 277956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* 278956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong**********************************************************************************/ 279956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongstatic void PreMDCT(int *buf0, int num, const int *csptr) 280956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{ 281956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong int i; 282956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong int tr1, ti1, tr2, ti2; 283956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong int cosa, sina, cosb, sinb; 284956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong int *buf1; 285956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 286956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong buf1 = buf0 + num - 1; 287956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 288956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong for(i = num >> 2; i != 0; i--) 289956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong { 290956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong cosa = *csptr++; 291956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong sina = *csptr++; 292956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong cosb = *csptr++; 293956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong sinb = *csptr++; 294956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 295956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong tr1 = *(buf0 + 0); 296956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ti2 = *(buf0 + 1); 297956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong tr2 = *(buf1 - 1); 298956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ti1 = *(buf1 + 0); 299956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 300956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong *buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1); 301956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong *buf0++ = MULHIGH(cosa, ti1) - MULHIGH(sina, tr1); 302956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 303956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong *buf1-- = MULHIGH(cosb, ti2) - MULHIGH(sinb, tr2); 304956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong *buf1-- = MULHIGH(cosb, tr2) + MULHIGH(sinb, ti2); 305956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 306956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong} 307956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 308956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/********************************************************************************* 309956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* 310956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: PostMDCT 311956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description: post MDCT process after next FFT for MDCT 312956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* 313956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong**********************************************************************************/ 314956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongstatic void PostMDCT(int *buf0, int num, const int *csptr) 315956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{ 316956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong int i; 317956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong int tr1, ti1, tr2, ti2; 318956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong int cosa, sina, cosb, sinb; 319956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong int *buf1; 320956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 321956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong buf1 = buf0 + num - 1; 322956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 323956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong for(i = num >> 2; i != 0; i--) 324956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong { 325956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong cosa = *csptr++; 326956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong sina = *csptr++; 327956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong cosb = *csptr++; 328956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong sinb = *csptr++; 329956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 330956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong tr1 = *(buf0 + 0); 331956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ti1 = *(buf0 + 1); 332956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ti2 = *(buf1 + 0); 333956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong tr2 = *(buf1 - 1); 334956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 335956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong *buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1); 336956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong *buf1-- = MULHIGH(sina, tr1) - MULHIGH(cosa, ti1); 337956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 338956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong *buf0++ = MULHIGH(sinb, tr2) - MULHIGH(cosb, ti2); 339956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong *buf1-- = MULHIGH(cosb, tr2) + MULHIGH(sinb, ti2); 340956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 341956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong} 342956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif 343956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 344956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 345956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/********************************************************************************** 346956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* 347956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: Mdct_Long 348956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description: the long block mdct, include long_start block, end_long block 349956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* 350956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong**********************************************************************************/ 351956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongvoid Mdct_Long(int *buf) 352956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{ 353956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong PreMDCT(buf, 1024, cossintab + 128); 354956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 355956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Shuffle(buf, 512, bitrevTab + 17); 356956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Radix8First(buf, 512 >> 3); 357956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Radix4FFT(buf, 512 >> 3, 8, (int *)twidTab512); 358956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 359956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong PostMDCT(buf, 1024, cossintab + 128); 360956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong} 361956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 362956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 363956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/********************************************************************************** 364956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* 365956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: Mdct_Short 366956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description: the short block mdct 367956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* 368956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong**********************************************************************************/ 369956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongvoid Mdct_Short(int *buf) 370956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{ 371956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong PreMDCT(buf, 128, cossintab); 372956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 373956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Shuffle(buf, 64, bitrevTab); 374956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Radix4First(buf, 64 >> 2); 375956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Radix4FFT(buf, 64 >> 2, 4, (int *)twidTab64); 376956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 377956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong PostMDCT(buf, 128, cossintab); 378956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong} 379956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 380956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 381956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/***************************************************************************** 382956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* 383956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: shiftMdctDelayBuffer 384956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description: the mdct delay buffer has a size of 1600, 385956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* so the calculation of LONG,STOP must be spilt in two 386956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* passes with 1024 samples and a mid shift, 387956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* the SHORT transforms can be completed in the delay buffer, 388956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* and afterwards a shift 389956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* 390956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong**********************************************************************************/ 391956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongstatic void shiftMdctDelayBuffer(Word16 *mdctDelayBuffer, /*! start of mdct delay buffer */ 392956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word16 *timeSignal, /*! pointer to new time signal samples, interleaved */ 393956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word16 chIncrement /*! number of channels */ 394956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ) 395956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{ 396956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word32 i; 397956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word16 *srBuf = mdctDelayBuffer; 398956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word16 *dsBuf = mdctDelayBuffer+FRAME_LEN_LONG; 399956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 400956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong for(i = 0; i < BLOCK_SWITCHING_OFFSET-FRAME_LEN_LONG; i+= 8) 401956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong { 402956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong *srBuf++ = *dsBuf++; *srBuf++ = *dsBuf++; 403956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong *srBuf++ = *dsBuf++; *srBuf++ = *dsBuf++; 404956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong *srBuf++ = *dsBuf++; *srBuf++ = *dsBuf++; 405956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong *srBuf++ = *dsBuf++; *srBuf++ = *dsBuf++; 406956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 407956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 408956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong srBuf = mdctDelayBuffer + BLOCK_SWITCHING_OFFSET-FRAME_LEN_LONG; 409956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong dsBuf = timeSignal; 410956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 411956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong for(i=0; i<FRAME_LEN_LONG; i+=8) 412956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong { 413956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong *srBuf++ = *dsBuf; dsBuf += chIncrement; 414956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong *srBuf++ = *dsBuf; dsBuf += chIncrement; 415956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong *srBuf++ = *dsBuf; dsBuf += chIncrement; 416956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong *srBuf++ = *dsBuf; dsBuf += chIncrement; 417956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong *srBuf++ = *dsBuf; dsBuf += chIncrement; 418956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong *srBuf++ = *dsBuf; dsBuf += chIncrement; 419956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong *srBuf++ = *dsBuf; dsBuf += chIncrement; 420956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong *srBuf++ = *dsBuf; dsBuf += chIncrement; 421956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 422956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong} 423956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 424956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 425956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/***************************************************************************** 426956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* 427956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: getScalefactorOfShortVectorStride 428956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description: Calculate max possible scale factor for input vector of shorts 429956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* returns: Maximum scale factor 430956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* 431956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong**********************************************************************************/ 432956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongstatic Word16 getScalefactorOfShortVectorStride(const Word16 *vector, /*!< Pointer to input vector */ 433956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word16 len, /*!< Length of input vector */ 434956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word16 stride) /*!< Stride of input vector */ 435956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{ 436956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word16 maxVal = 0; 437956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word16 absVal; 438956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word16 i; 439956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 440956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong for(i=0; i<len; i++){ 441956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong absVal = abs_s(vector[i*stride]); 442956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong maxVal |= absVal; 443956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 444956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 445956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong return( maxVal ? norm_s(maxVal) : 15); 446956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong} 447956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 448956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 449956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/***************************************************************************** 450956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* 451956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: Transform_Real 452956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description: Calculate transform filter for input vector of shorts 453956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* returns: TRUE if success 454956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* 455956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong**********************************************************************************/ 456956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongvoid Transform_Real(Word16 *mdctDelayBuffer, 457956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word16 *timeSignal, 458956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word16 chIncrement, 459956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word32 *realOut, 460956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word16 *mdctScale, 461956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word16 blockType 462956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ) 463956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{ 464956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word32 i,w; 465956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word32 timeSignalSample; 466956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word32 ws1,ws2; 467956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word16 *dctIn0, *dctIn1; 468956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word32 *outData0, *outData1; 469956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word32 *winPtr; 470956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 471956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word32 delayBufferSf,timeSignalSf,minSf; 472956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word32 headRoom=0; 473956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 474956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong switch(blockType){ 475956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 476956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 477956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong case LONG_WINDOW: 478956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong /* 479956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong we access BLOCK_SWITCHING_OFFSET (1600 ) delay buffer samples + 448 new timeSignal samples 480956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong and get the biggest scale factor for next calculate more precise 481956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong */ 482956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong delayBufferSf = getScalefactorOfShortVectorStride(mdctDelayBuffer,BLOCK_SWITCHING_OFFSET,1); 483956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong timeSignalSf = getScalefactorOfShortVectorStride(timeSignal,2*FRAME_LEN_LONG-BLOCK_SWITCHING_OFFSET,chIncrement); 484956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong minSf = min(delayBufferSf,timeSignalSf); 485956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong minSf = min(minSf,14); 486956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 487956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong dctIn0 = mdctDelayBuffer; 488956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1; 489956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong outData0 = realOut + FRAME_LEN_LONG/2; 490956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 491956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong /* add windows and pre add for mdct to last buffer*/ 492956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong winPtr = (int *)LongWindowKBD; 493956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong for(i=0;i<FRAME_LEN_LONG/2;i++){ 494956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong timeSignalSample = (*dctIn0++) << minSf; 495956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ws1 = timeSignalSample * (*winPtr >> 16); 496956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong timeSignalSample = (*dctIn1--) << minSf; 497956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ws2 = timeSignalSample * (*winPtr & 0xffff); 498956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong winPtr ++; 499956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong /* shift 2 to avoid overflow next */ 500956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong *outData0++ = (ws1 >> 2) - (ws2 >> 2); 501956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 502956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 503956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement); 504956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 505956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong /* add windows and pre add for mdct to new buffer*/ 506956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong dctIn0 = mdctDelayBuffer; 507956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1; 508956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong outData0 = realOut + FRAME_LEN_LONG/2 - 1; 509956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong winPtr = (int *)LongWindowKBD; 510956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong for(i=0;i<FRAME_LEN_LONG/2;i++){ 511956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong timeSignalSample = (*dctIn0++) << minSf; 512956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ws1 = timeSignalSample * (*winPtr & 0xffff); 513956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong timeSignalSample = (*dctIn1--) << minSf; 514956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ws2 = timeSignalSample * (*winPtr >> 16); 515956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong winPtr++; 516956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong /* shift 2 to avoid overflow next */ 517956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong *outData0-- = -((ws1 >> 2) + (ws2 >> 2)); 518956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 519956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 520956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Mdct_Long(realOut); 521956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong /* update scale factor */ 522956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong minSf = 14 - minSf; 523956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong *mdctScale=minSf; 524956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong break; 525956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 526956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong case START_WINDOW: 527956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong /* 528956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong we access BLOCK_SWITCHING_OFFSET (1600 ) delay buffer samples + no timeSignal samples 529956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong and get the biggest scale factor for next calculate more precise 530956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong */ 531956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong minSf = getScalefactorOfShortVectorStride(mdctDelayBuffer,BLOCK_SWITCHING_OFFSET,1); 532956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong minSf = min(minSf,14); 533956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 534956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong dctIn0 = mdctDelayBuffer; 535956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1; 536956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong outData0 = realOut + FRAME_LEN_LONG/2; 537956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong winPtr = (int *)LongWindowKBD; 538956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 539956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong /* add windows and pre add for mdct to last buffer*/ 540956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong for(i=0;i<FRAME_LEN_LONG/2;i++){ 541956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong timeSignalSample = (*dctIn0++) << minSf; 542956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ws1 = timeSignalSample * (*winPtr >> 16); 543956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong timeSignalSample = (*dctIn1--) << minSf; 544956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ws2 = timeSignalSample * (*winPtr & 0xffff); 545956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong winPtr ++; 546956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong *outData0++ = (ws1 >> 2) - (ws2 >> 2); /* shift 2 to avoid overflow next */ 547956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 548956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 549956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement); 550956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 551956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong outData0 = realOut + FRAME_LEN_LONG/2 - 1; 552956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong for(i=0;i<LS_TRANS;i++){ 553956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong *outData0-- = -mdctDelayBuffer[i] << (15 - 2 + minSf); 554956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 555956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 556956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong /* add windows and pre add for mdct to new buffer*/ 557956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong dctIn0 = mdctDelayBuffer + LS_TRANS; 558956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1 - LS_TRANS; 559956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong outData0 = realOut + FRAME_LEN_LONG/2 - 1 -LS_TRANS; 560956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong winPtr = (int *)ShortWindowSine; 561956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong for(i=0;i<FRAME_LEN_SHORT/2;i++){ 562956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong timeSignalSample= (*dctIn0++) << minSf; 563956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ws1 = timeSignalSample * (*winPtr & 0xffff); 564956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong timeSignalSample= (*dctIn1--) << minSf; 565956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ws2 = timeSignalSample * (*winPtr >> 16); 566956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong winPtr++; 567956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong *outData0-- = -((ws1 >> 2) + (ws2 >> 2)); /* shift 2 to avoid overflow next */ 568956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 569956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 570956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Mdct_Long(realOut); 571956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong /* update scale factor */ 572956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong minSf = 14 - minSf; 573956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong *mdctScale= minSf; 574956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong break; 575956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 576956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong case STOP_WINDOW: 577956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong /* 578956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong we access BLOCK_SWITCHING_OFFSET-LS_TRANS (1600-448 ) delay buffer samples + 448 new timeSignal samples 579956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong and get the biggest scale factor for next calculate more precise 580956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong */ 581956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong delayBufferSf = getScalefactorOfShortVectorStride(mdctDelayBuffer+LS_TRANS,BLOCK_SWITCHING_OFFSET-LS_TRANS,1); 582956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong timeSignalSf = getScalefactorOfShortVectorStride(timeSignal,2*FRAME_LEN_LONG-BLOCK_SWITCHING_OFFSET,chIncrement); 583956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong minSf = min(delayBufferSf,timeSignalSf); 584956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong minSf = min(minSf,13); 585956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 586956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong outData0 = realOut + FRAME_LEN_LONG/2; 587956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1; 588956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong for(i=0;i<LS_TRANS;i++){ 589956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong *outData0++ = -(*dctIn1--) << (15 - 2 + minSf); 590956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 591956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 592956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong /* add windows and pre add for mdct to last buffer*/ 593956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong dctIn0 = mdctDelayBuffer + LS_TRANS; 594956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1 - LS_TRANS; 595956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong outData0 = realOut + FRAME_LEN_LONG/2 + LS_TRANS; 596956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong winPtr = (int *)ShortWindowSine; 597956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong for(i=0;i<FRAME_LEN_SHORT/2;i++){ 598956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong timeSignalSample = (*dctIn0++) << minSf; 599956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ws1 = timeSignalSample * (*winPtr >> 16); 600956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong timeSignalSample= (*dctIn1--) << minSf; 601956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ws2 = timeSignalSample * (*winPtr & 0xffff); 602956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong winPtr++; 603956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong *outData0++ = (ws1 >> 2) - (ws2 >> 2); /* shift 2 to avoid overflow next */ 604956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 605956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 606956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement); 607956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 608956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong /* add windows and pre add for mdct to new buffer*/ 609956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong dctIn0 = mdctDelayBuffer; 610956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1; 611956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong outData0 = realOut + FRAME_LEN_LONG/2 - 1; 612956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong winPtr = (int *)LongWindowKBD; 613956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong for(i=0;i<FRAME_LEN_LONG/2;i++){ 614956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong timeSignalSample= (*dctIn0++) << minSf; 615956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ws1 = timeSignalSample *(*winPtr & 0xffff); 616956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong timeSignalSample= (*dctIn1--) << minSf; 617956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ws2 = timeSignalSample * (*winPtr >> 16); 618956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong *outData0-- = -((ws1 >> 2) + (ws2 >> 2)); /* shift 2 to avoid overflow next */ 619956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong winPtr++; 620956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 621956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 622956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Mdct_Long(realOut); 623956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong minSf = 14 - minSf; 624956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong *mdctScale= minSf; /* update scale factor */ 625956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong break; 626956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 627956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong case SHORT_WINDOW: 628956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong /* 629956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong we access BLOCK_SWITCHING_OFFSET (1600 ) delay buffer samples + no new timeSignal samples 630956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong and get the biggest scale factor for next calculate more precise 631956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong */ 632956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong minSf = getScalefactorOfShortVectorStride(mdctDelayBuffer+TRANSFORM_OFFSET_SHORT,9*FRAME_LEN_SHORT,1); 633956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong minSf = min(minSf,10); 634956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 635956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 636956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong for(w=0;w<TRANS_FAC;w++){ 637956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong dctIn0 = mdctDelayBuffer+w*FRAME_LEN_SHORT+TRANSFORM_OFFSET_SHORT; 638956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong dctIn1 = mdctDelayBuffer+w*FRAME_LEN_SHORT+TRANSFORM_OFFSET_SHORT + FRAME_LEN_SHORT-1; 639956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong outData0 = realOut + FRAME_LEN_SHORT/2; 640956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong outData1 = realOut + FRAME_LEN_SHORT/2 - 1; 641956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 642956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong winPtr = (int *)ShortWindowSine; 643956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong for(i=0;i<FRAME_LEN_SHORT/2;i++){ 644956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong timeSignalSample= *dctIn0 << minSf; 645956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ws1 = timeSignalSample * (*winPtr >> 16); 646956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong timeSignalSample= *dctIn1 << minSf; 647956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ws2 = timeSignalSample * (*winPtr & 0xffff); 648956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong *outData0++ = (ws1 >> 2) - (ws2 >> 2); /* shift 2 to avoid overflow next */ 649956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 650956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong timeSignalSample= *(dctIn0 + FRAME_LEN_SHORT) << minSf; 651956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ws1 = timeSignalSample * (*winPtr & 0xffff); 652956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong timeSignalSample= *(dctIn1 + FRAME_LEN_SHORT) << minSf; 653956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ws2 = timeSignalSample * (*winPtr >> 16); 654956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong *outData1-- = -((ws1 >> 2) + (ws2 >> 2)); /* shift 2 to avoid overflow next */ 655956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 656956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong winPtr++; 657956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong dctIn0++; 658956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong dctIn1--; 659956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 660956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 661956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Mdct_Short(realOut); 662956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong realOut += FRAME_LEN_SHORT; 663956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 664956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 665956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong minSf = 11 - minSf; 666956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong *mdctScale = minSf; /* update scale factor */ 667956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 668956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement); 669956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong break; 670956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 671956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong} 672956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 673