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 /*********************************************************************** 18 * File: preemph.c * 19 * * 20 * Description: Preemphasis: filtering through 1 - g z^-1 * 21 * Preemph2 --> signal is multiplied by 2 * 22 * * 23 ************************************************************************/ 24 25 #include "typedef.h" 26 #include "basic_op.h" 27 28 void Preemph( 29 Word16 x[], /* (i/o) : input signal overwritten by the output */ 30 Word16 mu, /* (i) Q15 : preemphasis coefficient */ 31 Word16 lg, /* (i) : lenght of filtering */ 32 Word16 * mem /* (i/o) : memory (x[-1]) */ 33 ) 34 { 35 Word16 temp; 36 Word32 i, L_tmp; 37 38 temp = x[lg - 1]; 39 40 for (i = lg - 1; i > 0; i--) 41 { 42 L_tmp = L_deposit_h(x[i]); 43 L_tmp -= (x[i - 1] * mu)<<1; 44 x[i] = (L_tmp + 0x8000)>>16; 45 } 46 47 L_tmp = L_deposit_h(x[0]); 48 L_tmp -= ((*mem) * mu)<<1; 49 x[0] = (L_tmp + 0x8000)>>16; 50 51 *mem = temp; 52 53 return; 54 } 55 56 57 void Preemph2( 58 Word16 x[], /* (i/o) : input signal overwritten by the output */ 59 Word16 mu, /* (i) Q15 : preemphasis coefficient */ 60 Word16 lg, /* (i) : lenght of filtering */ 61 Word16 * mem /* (i/o) : memory (x[-1]) */ 62 ) 63 { 64 Word16 temp; 65 Word32 i, L_tmp; 66 67 temp = x[lg - 1]; 68 69 for (i = (Word16) (lg - 1); i > 0; i--) 70 { 71 L_tmp = L_deposit_h(x[i]); 72 L_tmp -= (x[i - 1] * mu)<<1; // only called with mu == 22282, so this won't overflow 73 if (L_tmp > INT32_MAX / 2) { 74 L_tmp = INT32_MAX / 2; 75 } 76 L_tmp = (L_tmp << 1); 77 if (L_tmp > INT32_MAX - 0x8000) { 78 L_tmp = INT32_MAX - 0x8000; 79 } 80 x[i] = (L_tmp + 0x8000)>>16; 81 } 82 83 L_tmp = L_deposit_h(x[0]); 84 L_tmp -= ((*mem) * mu)<<1; 85 if (L_tmp > INT32_MAX / 2) { 86 L_tmp = INT32_MAX / 2; 87 } 88 L_tmp = (L_tmp << 1); 89 if (L_tmp > INT32_MAX - 0x8000) { 90 L_tmp = INT32_MAX - 0x8000; 91 } 92 x[0] = (L_tmp + 0x8000)>>16; 93 94 *mem = temp; 95 96 return; 97 } 98 99 100 101