19969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang/* 29969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ** Copyright 2003-2010, VisualOn, Inc. 39969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ** 49969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ** Licensed under the Apache License, Version 2.0 (the "License"); 59969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ** you may not use this file except in compliance with the License. 69969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ** You may obtain a copy of the License at 79969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ** 89969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ** http://www.apache.org/licenses/LICENSE-2.0 99969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ** 109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ** Unless required by applicable law or agreed to in writing, software 119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ** distributed under the License is distributed on an "AS IS" BASIS, 129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ** See the License for the specific language governing permissions and 149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ** limitations under the License. 159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang */ 169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang/*********************************************************************** 189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang* File: preemph.c * 199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang* * 209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang* Description: Preemphasis: filtering through 1 - g z^-1 * 219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang* Preemph2 --> signal is multiplied by 2 * 229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang* * 239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang************************************************************************/ 24c4689fae1bdb8d1c94eb28af1b2a1f30d2b1a3daJames Dong 2590b6191067990a7a3ee947d7ce08c64f780f0de7Mathias Agopian#include "typedef.h" 269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include "basic_op.h" 279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changvoid Preemph( 2908b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang Word16 x[], /* (i/o) : input signal overwritten by the output */ 3008b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang Word16 mu, /* (i) Q15 : preemphasis coefficient */ 319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Word16 lg, /* (i) : lenght of filtering */ 3208b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang Word16 * mem /* (i/o) : memory (x[-1]) */ 339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ) 3408b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang{ 3508b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang Word16 temp; 3608b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang Word32 i, L_tmp; 3708b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang 389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang temp = x[lg - 1]; 3908b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang 409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for (i = lg - 1; i > 0; i--) 419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang L_tmp = L_deposit_h(x[i]); 439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang L_tmp -= (x[i - 1] * mu)<<1; 4408b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang x[i] = (L_tmp + 0x8000)>>16; 4508b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang } 4608b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang 4708b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang L_tmp = L_deposit_h(x[0]); 4808b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang L_tmp -= ((*mem) * mu)<<1; 4908b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang x[0] = (L_tmp + 0x8000)>>16; 5008b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang 5108b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang *mem = temp; 52aef59c544429aae73429a1325d43e830600e3b67Chih-Chung Chang 5308b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang return; 54aef59c544429aae73429a1325d43e830600e3b67Chih-Chung Chang} 5508b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang 5608b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang 57aef59c544429aae73429a1325d43e830600e3b67Chih-Chung Changvoid Preemph2( 58aef59c544429aae73429a1325d43e830600e3b67Chih-Chung Chang Word16 x[], /* (i/o) : input signal overwritten by the output */ 5908b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang Word16 mu, /* (i) Q15 : preemphasis coefficient */ 6008b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang Word16 lg, /* (i) : lenght of filtering */ 61aef59c544429aae73429a1325d43e830600e3b67Chih-Chung Chang Word16 * mem /* (i/o) : memory (x[-1]) */ 6208b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang ) 6308b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang{ 6408b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang Word16 temp; 65aef59c544429aae73429a1325d43e830600e3b67Chih-Chung Chang Word32 i, L_tmp; 6608b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang 6708b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang temp = x[lg - 1]; 6808b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang 69aef59c544429aae73429a1325d43e830600e3b67Chih-Chung Chang for (i = (Word16) (lg - 1); i > 0; i--) 70aef59c544429aae73429a1325d43e830600e3b67Chih-Chung Chang { 71aef59c544429aae73429a1325d43e830600e3b67Chih-Chung Chang L_tmp = L_deposit_h(x[i]); 72aef59c544429aae73429a1325d43e830600e3b67Chih-Chung Chang L_tmp -= (x[i - 1] * mu)<<1; 7308b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang L_tmp = (L_tmp << 1); 7408b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang x[i] = (L_tmp + 0x8000)>>16; 7508b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang } 7608b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang 779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang L_tmp = L_deposit_h(x[0]); 789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang L_tmp -= ((*mem) * mu)<<1; 799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang L_tmp = (L_tmp << 1); 8008b82bddf54757ad6bd243181f1b68a79bb70e6dChih-Chung Chang x[0] = (L_tmp + 0x8000)>>16; 819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *mem = temp; 839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return; 859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang