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/****************************************************************************************
19Portions 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)
26Permission to distribute, modify and use this file under the standard license
27terms 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
60extern "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