1 /* ------------------------------------------------------------------
2  * Copyright (C) 1998-2009 PacketVideo
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
13  * express or implied.
14  * See the License for the specific language governing permissions
15  * and limitations under the License.
16  * -------------------------------------------------------------------
17  */
18 /****************************************************************************************
19 Portions of this file are derived from the following 3GPP standard:
20 
21     3GPP TS 26.173
22     ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
23     Available from http://www.3gpp.org
24 
25 (C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
26 Permission to distribute, modify and use this file under the standard license
27 terms listed above has been obtained from the copyright holder.
28 ****************************************************************************************/
29 /*
30 ------------------------------------------------------------------------------
31 
32 
33 
34  Pathname: ./cpp/include/pvamrwbdecoder_acelp.h
35 
36      Date: 01/04/2007
37 
38 ------------------------------------------------------------------------------
39  REVISION HISTORY
40 
41  Description:
42 ------------------------------------------------------------------------------
43  INCLUDE DESCRIPTION
44 
45 ------------------------------------------------------------------------------
46 */
47 
48 #ifndef PVAMRWBDECODER_ACELP_H
49 #define PVAMRWBDECODER_ACELP_H
50 
51 
52 /*----------------------------------------------------------------------------
53 ; INCLUDES
54 ----------------------------------------------------------------------------*/
55 
56 #include "pv_amr_wb_type_defs.h"
57 #include "pvamrwbdecoder_mem_funcs.h"
58 
59 #ifdef __cplusplus
60 extern "C"
61 {
62 #endif
63 
64     /*-----------------------------------------------------------------*
65      *                        LPC prototypes                           *
66      *-----------------------------------------------------------------*/
67 
68     void isf_extrapolation(int16 HfIsf[]);
69 
70     void Init_Lagconc(int16 lag_hist[]);
71     void lagconceal(
72         int16 gain_hist[],                   /* (i) : Gain history     */
73         int16 lag_hist[],                    /* (i) : Subframe size         */
74         int16 * T0,
75         int16 * old_T0,
76         int16 * seed,
77         int16 unusable_frame
78     );
79 
80     void agc2_amr_wb(
81         int16 * sig_in,                      /* input : postfilter input signal  */
82         int16 * sig_out,                     /* in/out: postfilter output signal */
83         int16 l_trm                          /* input : subframe size            */
84     );
85 
86     void low_pass_filt_7k_init(int16 mem[]);
87     void low_pass_filt_7k(
88         int16 signal[],                      /* input:  signal                  */
89         int16 lg,                            /* input:  length of input         */
90         int16 mem[],                         /* in/out: memory (size=30)        */
91         int16 x[]
92     );
93 
94     int16 median5(int16 x[]);
95 
96     void Isp_Az(
97         int16 isp[],                         /* (i) Q15 : Immittance spectral pairs            */
98         int16 a[],                           /* (o) Q12 : predictor coefficients (order = M)   */
99         int16 m,
100         int16 adaptive_scaling               /* (i) 0   : adaptive scaling disabled */
101         /*     1   : adaptive scaling enabled  */
102     );
103     void Isf_isp(
104         int16 isf[],                         /* (i) Q15 : isf[m] normalized (range: 0.0<=val<=0.5) */
105         int16 isp[],                         /* (o) Q15 : isp[m] (range: -1<=val<1)                */
106         int16 m                              /* (i)     : LPC order                                */
107     );
108     void interpolate_isp(
109         int16 isp_old[],                     /* input : isps from past frame              */
110         int16 isp_new[],                     /* input : isps from present frame           */
111         const int16 frac[],                  /* input : fraction for 3 first subfr (Q15)  */
112         int16 Az[]                           /* output: LP coefficients in 4 subframes    */
113     );
114     void weight_amrwb_lpc(
115         int16 a[],                           /* (i) Q12 : a[m+1]  LPC coefficients             */
116         int16 ap[],                          /* (o) Q12 : Spectral expanded LPC coefficients   */
117         int16 gamma,                         /* (i) Q15 : Spectral expansion factor.           */
118         int16 m                              /* (i)     : LPC order.                           */
119     );
120 
121 
122     /*-----------------------------------------------------------------*
123      *                        isf quantizers                           *
124      *-----------------------------------------------------------------*/
125 
126     void Disf_ns(
127         int16 * indice,                      /* input:  quantization indices                  */
128         int16 * isf_q                        /* input : ISF in the frequency domain (0..0.5)  */
129     );
130 
131     void Dpisf_2s_46b(
132         int16 * indice,                      /* input:  quantization indices                       */
133         int16 * isf_q,                       /* output: quantized ISF in frequency domain (0..0.5) */
134         int16 * past_isfq,                   /* i/0   : past ISF quantizer                    */
135         int16 * isfold,                      /* input : past quantized ISF                    */
136         int16 * isf_buf,                     /* input : isf buffer                                                        */
137         int16 bfi,                           /* input : Bad frame indicator                   */
138         int16 enc_dec
139     );
140     void Dpisf_2s_36b(
141         int16 * indice,                      /* input:  quantization indices                       */
142         int16 * isf_q,                       /* output: quantized ISF in frequency domain (0..0.5) */
143         int16 * past_isfq,                   /* i/0   : past ISF quantizer                    */
144         int16 * isfold,                      /* input : past quantized ISF                    */
145         int16 * isf_buf,                     /* input : isf buffer                                                        */
146         int16 bfi,                           /* input : Bad frame indicator                   */
147         int16 enc_dec
148     );
149 
150 
151     void Reorder_isf(
152         int16 * isf,                         /* (i/o) Q15: ISF in the frequency domain (0..0.5) */
153         int16 min_dist,                      /* (i) Q15  : minimum distance to keep             */
154         int16 n                              /* (i)      : number of ISF                        */
155     );
156 
157     /*-----------------------------------------------------------------*
158      *                       filter prototypes                         *
159      *-----------------------------------------------------------------*/
160 
161     void oversamp_12k8_to_16k_init(
162         int16 mem[]                          /* output: memory (2*NB_COEF_UP) set to zeros  */
163     );
164     void oversamp_12k8_to_16k(
165         int16 sig12k8[],                     /* input:  signal to oversampling  */
166         int16 lg,                            /* input:  length of input         */
167         int16 sig16k[],                      /* output: oversampled signal      */
168         int16 mem[],                         /* in/out: memory (2*NB_COEF_UP)   */
169         int16 signal[]
170     );
171 
172     void highpass_50Hz_at_12k8_init(int16 mem[]);
173     void highpass_50Hz_at_12k8(
174         int16 signal[],                      /* input/output signal */
175         int16 lg,                            /* lenght of signal    */
176         int16 mem[]                          /* filter memory [6]   */
177     );
178     void highpass_400Hz_at_12k8_init(int16 mem[]);
179     void highpass_400Hz_at_12k8(
180         int16 signal[],                      /* input/output signal */
181         int16 lg,                            /* lenght of signal    */
182         int16 mem[]                          /* filter memory [6]   */
183     );
184 
185     void band_pass_6k_7k_init(int16 mem[]);
186     void band_pass_6k_7k(
187         int16 signal[],                      /* input:  signal                  */
188         int16 lg,                            /* input:  length of input         */
189         int16 mem[],                         /* in/out: memory (size=30)        */
190         int16 x[]
191     );
192 
193 
194     void preemph_amrwb_dec(
195         int16 x[],                           /* (i/o)   : input signal overwritten by the output */
196         int16 mu,                            /* (i) Q15 : preemphasis coefficient                */
197         int16 lg                             /* (i)     : lenght of filtering                    */
198     );
199 
200     void deemphasis_32(
201         int16 x_hi[],                        /* (i)     : input signal (bit31..16) */
202         int16 x_lo[],                        /* (i)     : input signal (bit15..4)  */
203         int16 y[],                           /* (o)     : output signal (x16)      */
204         int16 mu,                            /* (i) Q15 : deemphasis factor        */
205         int16 L,                             /* (i)     : vector size              */
206         int16 * mem                          /* (i/o)   : memory (y[-1])           */
207     );
208 
209 
210     void wb_syn_filt(
211         int16 a[],                           /* (i) Q12 : a[m+1] prediction coefficients           */
212         int16 m,                             /* (i)     : order of LP filter                       */
213         int16 x[],                           /* (i)     : input signal                             */
214         int16 y[],                           /* (o)     : output signal                            */
215         int16 lg,                            /* (i)     : size of filtering                        */
216         int16 mem[],                         /* (i/o)   : memory associated with this filtering.   */
217         int16 update,                        /* (i)     : 0=no update, 1=update of memory.         */
218         int16 y_buf[]
219     );
220     void Syn_filt_32(
221         int16 a[],                           /* (i) Q12 : a[m+1] prediction coefficients */
222         int16 m,                             /* (i)     : order of LP filter             */
223         int16 exc[],                         /* (i) Qnew: excitation (exc[i] >> Qnew)    */
224         int16 Qnew,                          /* (i)     : exc scaling = 0(min) to 8(max) */
225         int16 sig_hi[],                      /* (o) /16 : synthesis high                 */
226         int16 sig_lo[],                      /* (o) /16 : synthesis low                  */
227         int16 lg                             /* (i)     : size of filtering              */
228     );
229 
230     /*-----------------------------------------------------------------*
231      *                       pitch prototypes                          *
232      *-----------------------------------------------------------------*/
233 
234 
235     void Pred_lt4(
236         int16 exc[],                         /* in/out: excitation buffer */
237         int16 T0,                            /* input : integer pitch lag */
238         int16 frac,                          /* input : fraction of lag   */
239         int16 L_subfr                        /* input : subframe size     */
240     );
241 
242     /*-----------------------------------------------------------------*
243      *                       gain prototypes                           *
244      *-----------------------------------------------------------------*/
245 
246 
247     void dec_gain2_amr_wb_init(
248         int16 * mem                          /* output  : memory (4 words)      */
249     );
250     void dec_gain2_amr_wb(
251         int16 index,                         /* (i)     :index of quantization.       */
252         int16 nbits,                         /* (i)     : number of bits (6 or 7)     */
253         int16 code[],                        /* (i) Q9  :Innovative vector.           */
254         int16 L_subfr,                       /* (i)     :Subframe lenght.             */
255         int16 * gain_pit,                    /* (o) Q14 :Pitch gain.                  */
256         int32 * gain_cod,                    /* (o) Q16 :Code gain.                   */
257         int16 bfi,                           /* (i)     :bad frame indicator          */
258         int16 prev_bfi,                      /* (i) : Previous BF indicator      */
259         int16 state,                         /* (i) : State of BFH               */
260         int16 unusable_frame,                /* (i) : UF indicator            */
261         int16 vad_hist,                      /* (i)         :number of non-speech frames  */
262         int16 * mem                          /* (i/o)   : memory (4 words)      */
263     );
264 
265     /*-----------------------------------------------------------------*
266      *                       acelp prototypes                          *
267      *-----------------------------------------------------------------*/
268 
269     void dec_acelp_2p_in_64(
270         int16 index,                         /* (i) :    12 bits index                                  */
271         int16 code[]                         /* (o) :Q9  algebraic (fixed) codebook excitation          */
272     );
273 
274     void dec_acelp_4p_in_64(
275         int16 index[],                       /* (i) : index (20): 5+5+5+5 = 20 bits.                 */
276         /* (i) : index (36): 9+9+9+9 = 36 bits.                 */
277         /* (i) : index (44): 13+9+13+9 = 44 bits.               */
278         /* (i) : index (52): 13+13+13+13 = 52 bits.             */
279         /* (i) : index (64): 2+2+2+2+14+14+14+14 = 64 bits.     */
280         /* (i) : index (72): 10+2+10+2+10+14+10+14 = 72 bits.   */
281         /* (i) : index (88): 11+11+11+11+11+11+11+11 = 88 bits. */
282         int16 nbbits,                        /* (i) : 20, 36, 44, 52, 64, 72 or 88 bits              */
283         int16 code[]                         /* (o) Q9: algebraic (fixed) codebook excitation        */
284     );
285     void Pit_shrp(
286         int16 * x,                           /* in/out: impulse response (or algebraic code) */
287         int16 pit_lag,                       /* input : pitch lag                            */
288         int16 sharp,                         /* input : pitch sharpening factor (Q15)        */
289         int16 L_subfr                        /* input : subframe size                        */
290     );
291 
292 
293     /*-----------------------------------------------------------------*
294      *                        others prototypes                        *
295      *-----------------------------------------------------------------*/
296 
297     int16 voice_factor(                       /* (o) Q15 : factor (-1=unvoiced to 1=voiced) */
298         int16 exc[],                         /* (i) Q_exc: pitch excitation                */
299         int16 Q_exc,                         /* (i)     : exc format                       */
300         int16 gain_pit,                      /* (i) Q14 : gain of pitch                    */
301         int16 code[],                        /* (i) Q9  : Fixed codebook excitation        */
302         int16 gain_code,                     /* (i) Q0  : gain of code                     */
303         int16 L_subfr                        /* (i)     : subframe length                  */
304     );
305 
306     void scale_signal(
307         int16 x[],                           /* (i/o) : signal to scale               */
308         int16 lg,                            /* (i)   : size of x[]                   */
309         int16 exp                            /* (i)   : exponent: x = round(x << exp) */
310     );
311 
312     int16 noise_gen_amrwb(int16 * seed);
313 
314 
315     void phase_dispersion(
316         int16 gain_code,                     /* (i) Q0  : gain of code             */
317         int16 gain_pit,                      /* (i) Q14 : gain of pitch            */
318         int16 code[],                        /* (i/o)   : code vector              */
319         int16 mode,                          /* (i)     : level, 0=hi, 1=lo, 2=off */
320         int16 disp_mem[],                    /* (i/o)   :  memory (size = 8) */
321         int16 ScratchMem[]
322     );
323 
324 #ifdef __cplusplus
325 }
326 #endif
327 
328 #endif  /* ACELP_H */
329 
330