1e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*
2e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Copyright 2003-2010, VisualOn, Inc.
3e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **
4e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Licensed under the Apache License, Version 2.0 (the "License");
5e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** you may not use this file except in compliance with the License.
6e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** You may obtain a copy of the License at
7e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **
8e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **     http://www.apache.org/licenses/LICENSE-2.0
9e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **
10e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Unless required by applicable law or agreed to in writing, software
11e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** distributed under the License is distributed on an "AS IS" BASIS,
12e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** See the License for the specific language governing permissions and
14e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** limitations under the License.
15e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard */
16e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*******************************************************************************
17e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	File:		psy_configuration.c
18e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
19e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Content:	Psychoaccoustic configuration functions
20e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
21956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*******************************************************************************/
22956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
23e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "basic_op.h"
24956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#include "oper_32b.h"
25956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#include "psy_configuration.h"
26956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#include "adj_thr.h"
27956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#include "aac_rom.h"
28956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
29956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
30956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
31956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#define BARC_SCALE	100 /* integer barc values are scaled with 100 */
32e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define LOG2_1000	301 /* log2*1000 */
33e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define PI2_1000	1571 /* pi/2*1000*/
34e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define ATAN_COEF1	3560 /* 1000/0.280872f*/
35e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define ATAN_COEF2	281 /* 1000*0.280872f*/
36956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
37956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
38956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongtypedef struct{
39956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  Word32 sampleRate;
40956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  const UWord8 *paramLong;
41956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  const UWord8 *paramShort;
42956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}SFB_INFO_TAB;
43956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
44956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongstatic const Word16 ABS_LEV = 20;
45956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongstatic const Word16 BARC_THR_QUIET[] = {15, 10,  7,  2,  0,  0,  0,  0,  0,  0,
46956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                                         0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
47956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                                         3,  5, 10, 20, 30};
48956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
49956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
50956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
51956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongstatic const Word16 max_bark = 24; /* maximum bark-value */
52956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongstatic const Word16 maskLow  = 30; /* in 1dB/bark */
53956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongstatic const Word16 maskHigh = 15; /* in 1*dB/bark */
54956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongstatic const Word16 c_ratio  = 0x0029; /* pow(10.0f, -(29.0f/10.0f)) */
55956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
56956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongstatic const Word16 maskLowSprEnLong = 30;       /* in 1dB/bark */
57956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongstatic const Word16 maskHighSprEnLong = 20;      /* in 1dB/bark */
58956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongstatic const Word16 maskHighSprEnLongLowBr = 15; /* in 1dB/bark */
59956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongstatic const Word16 maskLowSprEnShort = 20;      /* in 1dB/bark */
60e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic const Word16 maskHighSprEnShort = 15;     /* in 1dB/bark */
61e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic const Word16 c_minRemainingThresholdFactor = 0x0148;    /* 0.01 *(1 << 15)*/
62e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic const Word32 c_maxsnr = 0x66666666;		 /* upper limit is -1 dB */
63e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic const Word32 c_minsnr = 0x00624dd3;		 /* lower limit is -25 dB */
64e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
65e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic const Word32 c_maxClipEnergyLong = 0x77359400;  /* 2.0e9f*/
66e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic const Word32 c_maxClipEnergyShort = 0x01dcd650; /* 2.0e9f/(AACENC_TRANS_FAC*AACENC_TRANS_FAC)*/
67e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
68e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
69e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord32 GetSRIndex(Word32 sampleRate)
70e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
71e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if (92017 <= sampleRate) return 0;
72e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if (75132 <= sampleRate) return 1;
73e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if (55426 <= sampleRate) return 2;
74e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if (46009 <= sampleRate) return 3;
75e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if (37566 <= sampleRate) return 4;
76e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if (27713 <= sampleRate) return 5;
77e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if (23004 <= sampleRate) return 6;
78e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if (18783 <= sampleRate) return 7;
79e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if (13856 <= sampleRate) return 8;
80e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if (11502 <= sampleRate) return 9;
81e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if (9391 <= sampleRate) return 10;
82e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
83e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return 11;
84956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
85956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
86956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
87956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/*********************************************************************************
88956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
89956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: atan_1000
90956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description:  calculates 1000*atan(x/1000)
91b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard*               based on atan approx for x > 0
92e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*				atan(x) = x/((float)1.0f+(float)0.280872f*x*x)  if x < 1
93e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*						= pi/2 - x/((float)0.280872f +x*x)	    if x >= 1
94956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* return:       1000*atan(x/1000)
95956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
96956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong**********************************************************************************/
97b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgardstatic Word16 atan_1000(Word32 val)
98956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
99956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  Word32 y;
100956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
101b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
102956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  if(L_sub(val, 1000) < 0) {
103956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    y = extract_l(((1000 * val) / (1000 + ((val * val) / ATAN_COEF1))));
104956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  }
105956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  else {
106956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    y = PI2_1000 - ((1000 * val) / (ATAN_COEF2 + ((val * val) / 1000)));
107956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  }
108956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
109956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  return extract_l(y);
110956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
111956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
112956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
113956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/*****************************************************************************
114956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
115956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: BarcLineValue
116956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description:  Calculates barc value for one frequency line
117956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* returns:      barc value of line * BARC_SCALE
118956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* input:        number of lines in transform, index of line to check, Fs
119956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* output:
120956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
121956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*****************************************************************************/
122956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongstatic Word16 BarcLineValue(Word16 noOfLines, Word16 fftLine, Word32 samplingFreq)
123956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
124956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  Word32 center_freq, temp, bvalFFTLine;
125956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
126956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  /* center frequency of fft line */
127956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  center_freq = (fftLine * samplingFreq) / (noOfLines << 1);
128956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  temp =  atan_1000((center_freq << 2) / (3*10));
129b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  bvalFFTLine =
130956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    (26600 * atan_1000((center_freq*76) / 100) + 7*temp*temp) / (2*1000*1000 / BARC_SCALE);
131b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
132956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  return saturate(bvalFFTLine);
133956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
134956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
135956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/*****************************************************************************
136956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
137956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: initThrQuiet
138956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description:  init thredhold in quiet
139956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
140956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*****************************************************************************/
141956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongstatic void initThrQuiet(Word16  numPb,
1429fc4dfb69df0b5a13b7a1904272eb1dcf8113d0cMartin Storsjo                         const Word16 *pbOffset,
143956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                         Word16 *pbBarcVal,
144956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                         Word32 *pbThresholdQuiet) {
145956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  Word16 i;
146956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  Word16 barcThrQuiet;
147956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
148956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  for(i=0; i<numPb; i++) {
149956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    Word16 bv1, bv2;
150956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
151b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
152956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    if (i>0)
153956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      bv1 = (pbBarcVal[i] + pbBarcVal[i-1]) >> 1;
154956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    else
155956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      bv1 = pbBarcVal[i] >> 1;
156956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
157b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
158956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    if (i < (numPb - 1))
159956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      bv2 = (pbBarcVal[i] + pbBarcVal[i+1]) >> 1;
160956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    else {
161b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard      bv2 = pbBarcVal[i];
162956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    }
163956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
164956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    bv1 = min((bv1 / BARC_SCALE), max_bark);
165956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    bv2 = min((bv2 / BARC_SCALE), max_bark);
166956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
167956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    barcThrQuiet = min(BARC_THR_QUIET[bv1], BARC_THR_QUIET[bv2]);
168956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
169b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
170956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    /*
171b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard      we calculate
172956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      pow(10.0f,(float)(barcThrQuiet - ABS_LEV)*0.1)*(float)ABS_LOW*(pbOffset[i+1] - pbOffset[i]);
173956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    */
174956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
175956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    pbThresholdQuiet[i] = pow2_xy((((barcThrQuiet - ABS_LEV) * 100) +
176956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                          LOG2_1000*(14+2*LOG_NORM_PCM)), LOG2_1000) * (pbOffset[i+1] - pbOffset[i]);
177956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  }
178956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
179956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
180956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
181956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/*****************************************************************************
182956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
183956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: initSpreading
184956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description:  init energy spreading parameter
185956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
186956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*****************************************************************************/
187956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongstatic void initSpreading(Word16  numPb,
188956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                          Word16 *pbBarcValue,
189956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                          Word16 *pbMaskLoFactor,
190956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                          Word16 *pbMaskHiFactor,
191956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                          Word16 *pbMaskLoFactorSprEn,
192956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                          Word16 *pbMaskHiFactorSprEn,
193956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                          const Word32 bitrate,
194956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                          const Word16 blockType)
195956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
196956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  Word16 i;
197956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  Word16 maskLowSprEn, maskHighSprEn;
198956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
199b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
200956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  if (sub(blockType, SHORT_WINDOW) != 0) {
201b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard    maskLowSprEn = maskLowSprEnLong;
202b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
203956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    if (bitrate > 22000)
204956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      maskHighSprEn = maskHighSprEnLong;
205956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    else
206956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      maskHighSprEn = maskHighSprEnLongLowBr;
207956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  }
208956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  else {
209b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard    maskLowSprEn = maskLowSprEnShort;
210b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard    maskHighSprEn = maskHighSprEnShort;
211956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  }
212956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
213956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  for(i=0; i<numPb; i++) {
214b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
215956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    if (i > 0) {
216956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      Word32 dbVal;
217956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      Word16 dbark = pbBarcValue[i] - pbBarcValue[i-1];
218956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
219956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      /*
220b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard        we calulate pow(10.0f, -0.1*dbVal/BARC_SCALE)
221956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      */
222956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      dbVal = (maskHigh * dbark);
223956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      pbMaskHiFactor[i] = round16(pow2_xy(L_negate(dbVal), (Word32)LOG2_1000));             /* 0.301 log10(2) */
224b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
225956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      dbVal = (maskLow * dbark);
226b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard      pbMaskLoFactor[i-1] = round16(pow2_xy(L_negate(dbVal),(Word32)LOG2_1000));
227b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
228b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
229956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      dbVal = (maskHighSprEn * dbark);
230b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard      pbMaskHiFactorSprEn[i] =  round16(pow2_xy(L_negate(dbVal),(Word32)LOG2_1000));
231956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      dbVal = (maskLowSprEn * dbark);
232956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      pbMaskLoFactorSprEn[i-1] = round16(pow2_xy(L_negate(dbVal),(Word32)LOG2_1000));
233956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    }
234956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    else {
235b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard      pbMaskHiFactor[i] = 0;
236b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard      pbMaskLoFactor[numPb-1] = 0;
237956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
238b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard      pbMaskHiFactorSprEn[i] = 0;
239b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard      pbMaskLoFactorSprEn[numPb-1] = 0;
240956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    }
241956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  }
242956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
243956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
244956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
245956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
246956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/*****************************************************************************
247956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
248956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: initBarcValues
249956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description:  init bark value
250956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
251956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*****************************************************************************/
252956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongstatic void initBarcValues(Word16  numPb,
2539fc4dfb69df0b5a13b7a1904272eb1dcf8113d0cMartin Storsjo                           const Word16 *pbOffset,
254956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                           Word16  numLines,
255956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                           Word32  samplingFrequency,
256956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                           Word16 *pbBval)
257956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
258956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  Word16 i;
259956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  Word16 pbBval0, pbBval1;
260956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
261b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  pbBval0 = 0;
262956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
263956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  for(i=0; i<numPb; i++){
264956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    pbBval1 = BarcLineValue(numLines, pbOffset[i+1], samplingFrequency);
265956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    pbBval[i] = (pbBval0 + pbBval1) >> 1;
266b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard    pbBval0 = pbBval1;
267956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  }
268956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
269956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
270956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
271956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/*****************************************************************************
272956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
273956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: initMinSnr
274956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description:  calculate min snr parameter
275e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*				minSnr(n) = 1/(2^sfbPemin(n)/w(n) - 1.5)
276956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
277956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*****************************************************************************/
278956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongstatic void initMinSnr(const Word32  bitrate,
279956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                       const Word32  samplerate,
280956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                       const Word16  numLines,
281956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                       const Word16 *sfbOffset,
282956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                       const Word16 *pbBarcVal,
283956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                       const Word16  sfbActive,
284956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                       Word16       *sfbMinSnr)
285956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
286956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  Word16 sfb;
287956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  Word16 barcWidth;
288956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  Word16 pePerWindow;
289956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  Word32 pePart;
290956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  Word32 snr;
291956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  Word16 pbVal0, pbVal1, shift;
292956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
293956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  /* relative number of active barks */
294956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
295956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
296956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  pePerWindow = bits2pe(extract_l((bitrate * numLines) / samplerate));
297956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
298b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  pbVal0 = 0;
299956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
300956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  for (sfb=0; sfb<sfbActive; sfb++) {
301956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
302956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    pbVal1 = (pbBarcVal[sfb] << 1) - pbVal0;
303956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    barcWidth = pbVal1 - pbVal0;
304b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard    pbVal0 = pbVal1;
305956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
306e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    /* allow at least 2.4% of pe for each active barc */
307956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	pePart = ((pePerWindow * 24) * (max_bark * barcWidth)) /
308956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        (pbBarcVal[sfbActive-1] * (sfbOffset[sfb+1] - sfbOffset[sfb]));
309b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
310b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
311b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard    pePart = min(pePart, 8400);
312956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    pePart = max(pePart, 1400);
313956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
314e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    /* minSnr(n) = 1/(2^sfbPemin(n)/w(n) - 1.5)*/
315956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	/* we add an offset of 2^16 to the pow functions */
316e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* 0xc000 = 1.5*(1 << 15)*/
317b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
318956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    snr = pow2_xy((pePart - 16*1000),1000) - 0x0000c000;
319b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
320e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if(snr > 0x00008000)
321e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
322e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		shift = norm_l(snr);
323b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		snr = Div_32(0x00008000 << shift, snr << shift);
324956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	}
325956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	else
326956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	{
327956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		snr = 0x7fffffff;
328956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	}
329b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
330956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    /* upper limit is -1 dB */
331956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    snr = min(snr, c_maxsnr);
332956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    /* lower limit is -25 dB */
333956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    snr = max(snr, c_minsnr);
334956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    sfbMinSnr[sfb] = round16(snr);
335956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  }
336956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
337956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
338956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
339956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/*****************************************************************************
340956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
341956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: InitPsyConfigurationLong
342956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description:  init long block psychoacoustic configuration
343956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
344956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*****************************************************************************/
345956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongWord16 InitPsyConfigurationLong(Word32 bitrate,
346956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                                Word32 samplerate,
347956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                                Word16 bandwidth,
348956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                                PSY_CONFIGURATION_LONG *psyConf)
349956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
350e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard  Word32 samplerateindex;
351e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard  Word16 sfbBarcVal[MAX_SFB_LONG];
352956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  Word16 sfb;
353956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
354956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  /*
355956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    init sfb table
356e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard  */
357b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  samplerateindex = GetSRIndex(samplerate);
358e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard  psyConf->sfbCnt = sfBandTotalLong[samplerateindex];
359e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard  psyConf->sfbOffset = sfBandTabLong + sfBandTabLongOffset[samplerateindex];
360956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  psyConf->sampRateIdx = samplerateindex;
361956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
362956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  /*
363956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    calculate barc values for each pb
364956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  */
365956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  initBarcValues(psyConf->sfbCnt,
366956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                 psyConf->sfbOffset,
367956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                 psyConf->sfbOffset[psyConf->sfbCnt],
368956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                 samplerate,
369956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                 sfbBarcVal);
370956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
371956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  /*
372956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    init thresholds in quiet
373956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  */
374956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  initThrQuiet(psyConf->sfbCnt,
375956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong               psyConf->sfbOffset,
376956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong               sfbBarcVal,
377956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong               psyConf->sfbThresholdQuiet);
378956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
379956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  /*
380956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    calculate spreading function
381956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  */
382956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  initSpreading(psyConf->sfbCnt,
383956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                sfbBarcVal,
384956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                psyConf->sfbMaskLowFactor,
385956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                psyConf->sfbMaskHighFactor,
386956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                psyConf->sfbMaskLowFactorSprEn,
387956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                psyConf->sfbMaskHighFactorSprEn,
388956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                bitrate,
389956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                LONG_WINDOW);
390956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
391956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  /*
392956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    init ratio
393956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  */
394b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  psyConf->ratio = c_ratio;
395956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
396b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  psyConf->maxAllowedIncreaseFactor = 2;
397b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  psyConf->minRemainingThresholdFactor = c_minRemainingThresholdFactor;    /* 0.01 *(1 << 15)*/
398956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
399b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  psyConf->clipEnergy = c_maxClipEnergyLong;
400956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  psyConf->lowpassLine = extract_l((bandwidth<<1) * FRAME_LEN_LONG / samplerate);
401956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
402956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  for (sfb = 0; sfb < psyConf->sfbCnt; sfb++) {
403956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    if (sub(psyConf->sfbOffset[sfb], psyConf->lowpassLine) >= 0)
404956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      break;
405956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  }
406b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  psyConf->sfbActive = sfb;
407956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
408956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  /*
409956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    calculate minSnr
410956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  */
411956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  initMinSnr(bitrate,
412956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong             samplerate,
413956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong             psyConf->sfbOffset[psyConf->sfbCnt],
414956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong             psyConf->sfbOffset,
415956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong             sfbBarcVal,
416956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong             psyConf->sfbActive,
417956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong             psyConf->sfbMinSnr);
418956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
419956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
420956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  return(0);
421956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
422956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
423956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/*****************************************************************************
424956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
425956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: InitPsyConfigurationShort
426956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description:  init short block psychoacoustic configuration
427956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
428956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*****************************************************************************/
429956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongWord16 InitPsyConfigurationShort(Word32 bitrate,
430956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                                 Word32 samplerate,
431956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                                 Word16 bandwidth,
432b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard                                 PSY_CONFIGURATION_SHORT *psyConf)
433956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
434956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  Word32 samplerateindex;
435956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  Word16 sfbBarcVal[MAX_SFB_SHORT];
436956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  Word16 sfb;
437956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  /*
438956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    init sfb table
439956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  */
440b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  samplerateindex = GetSRIndex(samplerate);
441e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard  psyConf->sfbCnt = sfBandTotalShort[samplerateindex];
442956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  psyConf->sfbOffset = sfBandTabShort + sfBandTabShortOffset[samplerateindex];
443956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  psyConf->sampRateIdx = samplerateindex;
444956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  /*
445956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    calculate barc values for each pb
446956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  */
447956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  initBarcValues(psyConf->sfbCnt,
448956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                 psyConf->sfbOffset,
449956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                 psyConf->sfbOffset[psyConf->sfbCnt],
450956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                 samplerate,
451956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                 sfbBarcVal);
452956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
453956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  /*
454956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    init thresholds in quiet
455956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  */
456956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  initThrQuiet(psyConf->sfbCnt,
457956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong               psyConf->sfbOffset,
458956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong               sfbBarcVal,
459956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong               psyConf->sfbThresholdQuiet);
460956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
461956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  /*
462956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    calculate spreading function
463956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  */
464956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  initSpreading(psyConf->sfbCnt,
465956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                sfbBarcVal,
466956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                psyConf->sfbMaskLowFactor,
467956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                psyConf->sfbMaskHighFactor,
468956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                psyConf->sfbMaskLowFactorSprEn,
469956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                psyConf->sfbMaskHighFactorSprEn,
470956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                bitrate,
471956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                SHORT_WINDOW);
472956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
473956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  /*
474956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    init ratio
475956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  */
476b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  psyConf->ratio = c_ratio;
477956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
478b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  psyConf->maxAllowedIncreaseFactor = 2;
479b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  psyConf->minRemainingThresholdFactor = c_minRemainingThresholdFactor;
480956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
481b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  psyConf->clipEnergy = c_maxClipEnergyShort;
482956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
483956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  psyConf->lowpassLine = extract_l(((bandwidth << 1) * FRAME_LEN_SHORT) / samplerate);
484b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
485956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  for (sfb = 0; sfb < psyConf->sfbCnt; sfb++) {
486b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
487956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    if (psyConf->sfbOffset[sfb] >= psyConf->lowpassLine)
488956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      break;
489956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  }
490b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  psyConf->sfbActive = sfb;
491956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
492956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  /*
493956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    calculate minSnr
494956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  */
495956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  initMinSnr(bitrate,
496956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong             samplerate,
497956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong             psyConf->sfbOffset[psyConf->sfbCnt],
498956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong             psyConf->sfbOffset,
499956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong             sfbBarcVal,
500956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong             psyConf->sfbActive,
501956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong             psyConf->sfbMinSnr);
502956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
503956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  return(0);
504956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
505956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
506