pre_echo_control.c revision f3664ae9369a861ffbc2354e8e93e48983802062
1/* 2 ** Copyright 2003-2010, VisualOn, Inc. 3 ** 4 ** Licensed under the Apache License, Version 2.0 (the "License"); 5 ** you may not use this file except in compliance with the License. 6 ** You may obtain a copy of the License at 7 ** 8 ** http://www.apache.org/licenses/LICENSE-2.0 9 ** 10 ** Unless required by applicable law or agreed to in writing, software 11 ** distributed under the License is distributed on an "AS IS" BASIS, 12 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 ** See the License for the specific language governing permissions and 14 ** limitations under the License. 15 */ 16/******************************************************************************* 17 File: pre_echo_control.c 18 19 Content: Pre echo control functions 20 21*******************************************************************************/ 22 23#include "basic_op.h" 24#include "oper_32b.h" 25 26#include "oper_32b.h" 27#include "pre_echo_control.h" 28 29 30/***************************************************************************** 31* 32* function name:InitPreEchoControl 33* description: init pre echo control parameter 34* 35*****************************************************************************/ 36void InitPreEchoControl(Word32 *pbThresholdNm1, 37 Word16 numPb, 38 Word32 *pbThresholdQuiet) 39{ 40 Word16 pb; 41 42 for(pb=0; pb<numPb; pb++) { 43 pbThresholdNm1[pb] = pbThresholdQuiet[pb]; 44 } 45} 46 47/***************************************************************************** 48* 49* function name:PreEchoControl 50* description: update shreshold to avoid pre echo 51* thr(n) = max(rpmin*thrq(n), min(thrq(n), rpelev*thrq1(n))) 52* 53* 54*****************************************************************************/ 55void PreEchoControl(Word32 *pbThresholdNm1, 56 Word16 numPb, 57 Word32 maxAllowedIncreaseFactor, 58 Word16 minRemainingThresholdFactor, 59 Word32 *pbThreshold, 60 Word16 mdctScale, 61 Word16 mdctScalenm1) 62{ 63 Word32 i; 64 Word32 tmpThreshold1, tmpThreshold2; 65 Word32 scaling; 66 67 /* maxAllowedIncreaseFactor is hard coded to 2 */ 68 (void)maxAllowedIncreaseFactor; 69 70 scaling = ((mdctScale - mdctScalenm1) << 1); 71 72 if ( scaling > 0 ) { 73 for(i = 0; i < numPb; i++) { 74 tmpThreshold1 = pbThresholdNm1[i] >> (scaling-1); 75 tmpThreshold2 = L_mpy_ls(pbThreshold[i], minRemainingThresholdFactor); 76 77 /* copy thresholds to internal memory */ 78 pbThresholdNm1[i] = pbThreshold[i]; 79 80 81 if(pbThreshold[i] > tmpThreshold1) { 82 pbThreshold[i] = tmpThreshold1; 83 } 84 85 if(tmpThreshold2 > pbThreshold[i]) { 86 pbThreshold[i] = tmpThreshold2; 87 } 88 89 } 90 } 91 else { 92 scaling = -scaling; 93 for(i = 0; i < numPb; i++) { 94 95 tmpThreshold1 = pbThresholdNm1[i] << 1; 96 tmpThreshold2 = L_mpy_ls(pbThreshold[i], minRemainingThresholdFactor); 97 98 /* copy thresholds to internal memory */ 99 pbThresholdNm1[i] = pbThreshold[i]; 100 101 102 if(((pbThreshold[i] >> scaling) > tmpThreshold1)) { 103 pbThreshold[i] = tmpThreshold1 << scaling; 104 } 105 106 if(tmpThreshold2 > pbThreshold[i]) { 107 pbThreshold[i] = tmpThreshold2; 108 } 109 110 } 111 } 112} 113 114