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