OSDN Git Service

original
[gb-231r1-is01/Gingerbread_2.3.3_r1_IS01.git] / frameworks / base / media / libstagefright / codecs / amrwbenc / src / deemph.c
1 /*\r
2  ** Copyright 2003-2010, VisualOn, Inc.\r
3  **\r
4  ** Licensed under the Apache License, Version 2.0 (the "License");\r
5  ** you may not use this file except in compliance with the License.\r
6  ** You may obtain a copy of the License at\r
7  **\r
8  **     http://www.apache.org/licenses/LICENSE-2.0\r
9  **\r
10  ** Unless required by applicable law or agreed to in writing, software\r
11  ** distributed under the License is distributed on an "AS IS" BASIS,\r
12  ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  ** See the License for the specific language governing permissions and\r
14  ** limitations under the License.\r
15  */\r
16 \r
17 /***********************************************************************\r
18 *       File: deemph.c                                                 *\r
19 *                                                                      *\r
20 *          Description:filtering through 1/(1-mu z^ -1)                    *\r
21 *                      Deemph2 --> signal is divided by 2                  *\r
22 *                                  Deemph_32 --> for 32 bits signal.                   *\r
23 *                                                                      *\r
24 ************************************************************************/\r
25 \r
26 #include "typedef.h"\r
27 #include "basic_op.h"\r
28 #include "math_op.h"\r
29 \r
30 void Deemph(\r
31                 Word16 x[],                           /* (i/o)   : input signal overwritten by the output */\r
32                 Word16 mu,                            /* (i) Q15 : deemphasis factor                      */\r
33                 Word16 L,                             /* (i)     : vector size                            */\r
34                 Word16 * mem                          /* (i/o)   : memory (y[-1])                         */\r
35            )\r
36 {\r
37         Word32 i;\r
38         Word32 L_tmp;\r
39 \r
40         L_tmp = L_deposit_h(x[0]);\r
41         L_tmp = L_mac(L_tmp, *mem, mu);\r
42         x[0] = vo_round(L_tmp);                   \r
43 \r
44         for (i = 1; i < L; i++)\r
45         {\r
46                 L_tmp = L_deposit_h(x[i]);\r
47                 L_tmp = L_mac(L_tmp, x[i - 1], mu);\r
48                 x[i] = voround(L_tmp);               \r
49         }\r
50 \r
51         *mem = x[L - 1];                       \r
52 \r
53         return;\r
54 }\r
55 \r
56 \r
57 void Deemph2(\r
58                 Word16 x[],                           /* (i/o)   : input signal overwritten by the output */\r
59                 Word16 mu,                            /* (i) Q15 : deemphasis factor                      */\r
60                 Word16 L,                             /* (i)     : vector size                            */\r
61                 Word16 * mem                          /* (i/o)   : memory (y[-1])                         */\r
62             )\r
63 {\r
64         Word32 i;\r
65         Word32 L_tmp;\r
66         L_tmp = x[0] << 15;\r
67         L_tmp += ((*mem) * mu)<<1;\r
68         x[0] = (L_tmp + 0x8000)>>16;                   \r
69         for (i = 1; i < L; i++)\r
70         {\r
71                 L_tmp = x[i] << 15;\r
72                 L_tmp += (x[i - 1] * mu)<<1;\r
73                 x[i] = (L_tmp + 0x8000)>>16;               \r
74         }\r
75         *mem = x[L - 1];                       \r
76         return;\r
77 }\r
78 \r
79 \r
80 void Deemph_32(\r
81                 Word16 x_hi[],                        /* (i)     : input signal (bit31..16) */\r
82                 Word16 x_lo[],                        /* (i)     : input signal (bit15..4)  */\r
83                 Word16 y[],                           /* (o)     : output signal (x16)      */\r
84                 Word16 mu,                            /* (i) Q15 : deemphasis factor        */\r
85                 Word16 L,                             /* (i)     : vector size              */\r
86                 Word16 * mem                          /* (i/o)   : memory (y[-1])           */\r
87               )\r
88 {\r
89         Word16 fac;\r
90         Word32 i, L_tmp;\r
91 \r
92         fac = mu >> 1;                                /* Q15 --> Q14 */\r
93 \r
94         L_tmp = L_deposit_h(x_hi[0]);\r
95         L_tmp += (x_lo[0] * 8)<<1;\r
96         L_tmp = (L_tmp << 3);\r
97         L_tmp += ((*mem) * fac)<<1;\r
98         L_tmp = (L_tmp << 1);               \r
99         y[0] = (L_tmp + 0x8000)>>16;                  \r
100 \r
101         for (i = 1; i < L; i++)\r
102         {\r
103                 L_tmp = L_deposit_h(x_hi[i]);\r
104                 L_tmp += (x_lo[i] * 8)<<1;\r
105                 L_tmp = (L_tmp << 3);\r
106                 L_tmp += (y[i - 1] * fac)<<1;\r
107                 L_tmp = (L_tmp << 1);           \r
108                 y[i] = (L_tmp + 0x8000)>>16;               \r
109         }\r
110 \r
111         *mem = y[L - 1];                       \r
112 \r
113         return;\r
114 }\r
115 \r
116 \r
117 \r