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