1219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard/* 2219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** Copyright 2003-2010, VisualOn, Inc. 3219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** 4219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** Licensed under the Apache License, Version 2.0 (the "License"); 5219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** you may not use this file except in compliance with the License. 6219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** You may obtain a copy of the License at 7219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** 8219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** http://www.apache.org/licenses/LICENSE-2.0 9219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** 10219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** Unless required by applicable law or agreed to in writing, software 11219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** distributed under the License is distributed on an "AS IS" BASIS, 12219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** See the License for the specific language governing permissions and 14219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** limitations under the License. 15219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard */ 16219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 17219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard/*********************************************************************** 18219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* File: preemph.c * 19219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* * 20219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* Description: Preemphasis: filtering through 1 - g z^-1 * 21219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* Preemph2 --> signal is multiplied by 2 * 22219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* * 23219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard************************************************************************/ 24219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 25219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard#include "typedef.h" 26219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard#include "basic_op.h" 27219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 28219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgardvoid Preemph( 29219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 x[], /* (i/o) : input signal overwritten by the output */ 30219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 mu, /* (i) Q15 : preemphasis coefficient */ 31219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 lg, /* (i) : lenght of filtering */ 32219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 * mem /* (i/o) : memory (x[-1]) */ 33219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ) 34219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard{ 35219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 temp; 36219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word32 i, L_tmp; 37219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 38219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard temp = x[lg - 1]; 39219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 40219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (i = lg - 1; i > 0; i--) 41219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 42219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard L_tmp = L_deposit_h(x[i]); 43219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard L_tmp -= (x[i - 1] * mu)<<1; 44219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard x[i] = (L_tmp + 0x8000)>>16; 45219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 46219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 47219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard L_tmp = L_deposit_h(x[0]); 48219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard L_tmp -= ((*mem) * mu)<<1; 49219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard x[0] = (L_tmp + 0x8000)>>16; 50219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 51219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard *mem = temp; 52219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 53219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard return; 54219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard} 55219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 56219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 57219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgardvoid Preemph2( 58219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 x[], /* (i/o) : input signal overwritten by the output */ 59219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 mu, /* (i) Q15 : preemphasis coefficient */ 60219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 lg, /* (i) : lenght of filtering */ 61219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 * mem /* (i/o) : memory (x[-1]) */ 62219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ) 63219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard{ 64219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 temp; 65219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word32 i, L_tmp; 66219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 67219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard temp = x[lg - 1]; 68219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 69219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (i = (Word16) (lg - 1); i > 0; i--) 70219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 71219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard L_tmp = L_deposit_h(x[i]); 72219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard L_tmp -= (x[i - 1] * mu)<<1; 73219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard L_tmp = (L_tmp << 1); 74219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard x[i] = (L_tmp + 0x8000)>>16; 75219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 76219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 77219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard L_tmp = L_deposit_h(x[0]); 78219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard L_tmp -= ((*mem) * mu)<<1; 79219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard L_tmp = (L_tmp << 1); 80219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard x[0] = (L_tmp + 0x8000)>>16; 81219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 82219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard *mem = temp; 83219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 84219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard return; 85219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard} 86219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 87219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 88219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 89