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 
Preemph(Word16 x[],Word16 mu,Word16 lg,Word16 * mem)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 
Preemph2(Word16 x[],Word16 mu,Word16 lg,Word16 * mem)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