line_pe.c revision f3664ae9369a861ffbc2354e8e93e48983802062
1b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/* 2b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ** Copyright 2003-2010, VisualOn, Inc. 3b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ** 4b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ** Licensed under the Apache License, Version 2.0 (the "License"); 5b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ** you may not use this file except in compliance with the License. 6b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ** You may obtain a copy of the License at 7b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ** 8b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ** http://www.apache.org/licenses/LICENSE-2.0 9b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ** 10b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ** Unless required by applicable law or agreed to in writing, software 11b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ** distributed under the License is distributed on an "AS IS" BASIS, 12b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ** See the License for the specific language governing permissions and 14b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ** limitations under the License. 15b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber */ 16b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/******************************************************************************* 17b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber File: line_pe.c 18b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 19b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Content: Perceptual entropie module functions 20b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 21b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber*******************************************************************************/ 22b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 23b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "basic_op.h" 24b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "oper_32b.h" 25b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "typedef.h" 26b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "line_pe.h" 27b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 28b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 29b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huberstatic const Word16 C1_I = 12; /* log(8.0)/log(2) *4 */ 30b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huberstatic const Word32 C2_I = 10830; /* log(2.5)/log(2) * 1024 * 4 * 2 */ 31b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huberstatic const Word16 C3_I = 573; /* (1-C2/C1) *1024 */ 32b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 33b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 34b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/***************************************************************************** 35b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber* 36b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber* function name: prepareSfbPe 37b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber* description: constants that do not change during successive pe calculations 38b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber* 39b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber**********************************************************************************/ 40b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Hubervoid prepareSfbPe(PE_DATA *peData, 41b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], 42b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 logSfbEnergy[MAX_CHANNELS][MAX_GROUPED_SFB], 43b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 sfbNRelevantLines[MAX_CHANNELS][MAX_GROUPED_SFB], 44b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber const Word16 nChannels, 45b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber const Word16 peOffset) 46b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{ 47b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word32 sfbGrp, sfb; 48b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word32 ch; 49b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 50b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber for(ch=0; ch<nChannels; ch++) { 51b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch]; 52b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber PE_CHANNEL_DATA *peChanData=&peData->peChannelData[ch]; 53b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber for(sfbGrp=0;sfbGrp<psyOutChan->sfbCnt; sfbGrp+=psyOutChan->sfbPerGroup){ 54b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) { 55b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber peChanData->sfbNLines4[sfbGrp+sfb] = sfbNRelevantLines[ch][sfbGrp+sfb]; 56b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber sfbNRelevantLines[ch][sfbGrp+sfb] = sfbNRelevantLines[ch][sfbGrp+sfb] >> 2; 57b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber peChanData->sfbLdEnergy[sfbGrp+sfb] = logSfbEnergy[ch][sfbGrp+sfb]; 58b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 59b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 60b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 61b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber peData->offset = peOffset; 62b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber} 63b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 64b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 65b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/***************************************************************************** 66b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber* 67b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber* function name: calcSfbPe 68b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber* description: constPart is sfbPe without the threshold part n*ld(thr) or n*C3*ld(thr) 69b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber* 70b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber**********************************************************************************/ 71b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Hubervoid calcSfbPe(PE_DATA *peData, 72b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], 73b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber const Word16 nChannels) 74b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{ 75b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word32 ch; 76b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word32 sfbGrp, sfb; 77b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word32 nLines4; 78b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word32 ldThr, ldRatio; 79b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word32 pe, constPart, nActiveLines; 80b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 81b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber peData->pe = peData->offset; 82b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber peData->constPart = 0; 83b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber peData->nActiveLines = 0; 84b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber for(ch=0; ch<nChannels; ch++) { 85b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch]; 86b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber PE_CHANNEL_DATA *peChanData = &peData->peChannelData[ch]; 87b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber const Word32 *sfbEnergy = psyOutChan->sfbEnergy; 88b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber const Word32 *sfbThreshold = psyOutChan->sfbThreshold; 89b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 90b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber pe = 0; 91b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber constPart = 0; 92b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber nActiveLines = 0; 93b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 94b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber for(sfbGrp=0; sfbGrp<psyOutChan->sfbCnt; sfbGrp+=psyOutChan->sfbPerGroup) { 95b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) { 96b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word32 nrg = sfbEnergy[sfbGrp+sfb]; 97b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word32 thres = sfbThreshold[sfbGrp+sfb]; 98b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word32 sfbLDEn = peChanData->sfbLdEnergy[sfbGrp+sfb]; 99b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 100b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (nrg > thres) { 101b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ldThr = iLog4(thres); 102b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 103b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ldRatio = sfbLDEn - ldThr; 104b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 105b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber nLines4 = peChanData->sfbNLines4[sfbGrp+sfb]; 106b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 107b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* sfbPe = nl*log2(en/thr)*/ 108b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (ldRatio >= C1_I) { 109b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber peChanData->sfbPe[sfbGrp+sfb] = (nLines4*ldRatio + 8) >> 4; 110b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber peChanData->sfbConstPart[sfbGrp+sfb] = ((nLines4*sfbLDEn)) >> 4; 111b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 112b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber else { 113b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* sfbPe = nl*(c2 + c3*log2(en/thr))*/ 114b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber peChanData->sfbPe[sfbGrp+sfb] = extract_l((L_mpy_wx( 115b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber (C2_I + C3_I * ldRatio * 2) << 4, nLines4) + 4) >> 3); 116b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber peChanData->sfbConstPart[sfbGrp+sfb] = extract_l(( L_mpy_wx( 117b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber (C2_I + C3_I * sfbLDEn * 2) << 4, nLines4) + 4) >> 3); 118b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber nLines4 = (nLines4 * C3_I + (1024<<1)) >> 10; 119b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 120b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber peChanData->sfbNActiveLines[sfbGrp+sfb] = nLines4 >> 2; 121b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 122b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber else { 123b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber peChanData->sfbPe[sfbGrp+sfb] = 0; 124b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber peChanData->sfbConstPart[sfbGrp+sfb] = 0; 125b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber peChanData->sfbNActiveLines[sfbGrp+sfb] = 0; 126b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 127b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber pe = pe + peChanData->sfbPe[sfbGrp+sfb]; 128b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber constPart = constPart + peChanData->sfbConstPart[sfbGrp+sfb]; 129b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber nActiveLines = nActiveLines + peChanData->sfbNActiveLines[sfbGrp+sfb]; 130b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 131b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 132b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 133b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber peChanData->pe = saturate(pe); 134b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber peChanData->constPart = saturate(constPart); 135b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber peChanData->nActiveLines = saturate(nActiveLines); 136b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 137b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 138b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber pe += peData->pe; 139b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber peData->pe = saturate(pe); 140b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber constPart += peData->constPart; 141b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber peData->constPart = saturate(constPart); 142b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber nActiveLines += peData->nActiveLines; 143b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber peData->nActiveLines = saturate(nActiveLines); 144b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 145b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber} 146b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber