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