FFmpeg
acelp_vectors.h
Go to the documentation of this file.
1 /*
2  * adaptive and fixed codebook vector operations for ACELP-based codecs
3  *
4  * Copyright (c) 2008 Vladimir Voroshilov
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 
23 #ifndef AVCODEC_ACELP_VECTORS_H
24 #define AVCODEC_ACELP_VECTORS_H
25 
26 #include <stdint.h>
27 
28 typedef struct ACELPVContext {
29  /**
30  * float implementation of weighted sum of two vectors.
31  * @param[out] out result of addition
32  * @param in_a first vector
33  * @param in_b second vector
34  * @param weight_coeff_a first vector weight coefficient
35  * @param weight_coeff_a second vector weight coefficient
36  * @param length vectors length (should be a multiple of two)
37  *
38  * @note It is safe to pass the same buffer for out and in_a or in_b.
39  */
40  void (*weighted_vector_sumf)(float *out, const float *in_a, const float *in_b,
41  float weight_coeff_a, float weight_coeff_b,
42  int length);
43 
45 
46 /**
47  * Initialize ACELPVContext.
48  */
51 
52 /** Sparse representation for the algebraic codebook (fixed) vector */
53 typedef struct AMRFixed {
54  int n;
55  int x[10];
56  float y[10];
58  int pitch_lag;
59  float pitch_fac;
60 } AMRFixed;
61 
62 /**
63  * Track|Pulse| Positions
64  * -------------------------------------------------------------------------
65  * 1 | 0 | 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75
66  * -------------------------------------------------------------------------
67  * 2 | 1 | 1, 6, 11, 16, 21, 26, 31, 36, 41, 46, 51, 56, 61, 66, 71, 76
68  * -------------------------------------------------------------------------
69  * 3 | 2 | 2, 7, 12, 17, 22, 27, 32, 37, 42, 47, 52, 57, 62, 67, 72, 77
70  * -------------------------------------------------------------------------
71  *
72  * Table contains only first the pulse indexes.
73  *
74  * Used in G.729 @@8k, G.729 @@4.4k, AMR @@7.95k, AMR @@7.40k
75  */
76 extern const uint8_t ff_fc_4pulses_8bits_tracks_13[16];
77 
78 /**
79  * Track|Pulse| Positions
80  * -------------------------------------------------------------------------
81  * 4 | 3 | 3, 8, 13, 18, 23, 28, 33, 38, 43, 48, 53, 58, 63, 68, 73, 78
82  * | | 4, 9, 14, 19, 24, 29, 34, 39, 44, 49, 54, 59, 64, 69, 74, 79
83  * -------------------------------------------------------------------------
84  *
85  * @remark Track in the table should be read top-to-bottom, left-to-right.
86  *
87  * Used in G.729 @@8k, G.729 @@4.4k, AMR @@7.95k, AMR @@7.40k
88  */
89 extern const uint8_t ff_fc_4pulses_8bits_track_4[32];
90 
91 /**
92  * Track|Pulse| Positions
93  * -----------------------------------------
94  * 1 | 0 | 1, 6, 11, 16, 21, 26, 31, 36
95  * | | 3, 8, 13, 18, 23, 28, 33, 38
96  * -----------------------------------------
97  *
98  * @remark Track in the table should be read top-to-bottom, left-to-right.
99  *
100  * @note (EE) Reference G.729D code also uses gray decoding for each
101  * pulse index before looking up the value in the table.
102  *
103  * Used in G.729 @@6.4k (with gray coding), AMR @@5.9k (without gray coding)
104  */
105 extern const uint8_t ff_fc_2pulses_9bits_track1_gray[16];
106 
107 /**
108  * Track|Pulse| Positions
109  * -----------------------------------------
110  * 2 | 1 | 0, 7, 14, 20, 27, 34, 1, 21
111  * | | 2, 9, 15, 22, 29, 35, 6, 26
112  * | | 4,10, 17, 24, 30, 37, 11, 31
113  * | | 5,12, 19, 25, 32, 39, 16, 36
114  * -----------------------------------------
115  *
116  * @remark Track in the table should be read top-to-bottom, left-to-right.
117  *
118  * @note (EE.1) This table (from the reference code) does not comply with
119  * the specification.
120  * The specification contains the following table:
121  *
122  * Track|Pulse| Positions
123  * -----------------------------------------
124  * 2 | 1 | 0, 5, 10, 15, 20, 25, 30, 35
125  * | | 1, 6, 11, 16, 21, 26, 31, 36
126  * | | 2, 7, 12, 17, 22, 27, 32, 37
127  * | | 4, 9, 14, 19, 24, 29, 34, 39
128  *
129  * -----------------------------------------
130  *
131  * @note (EE.2) Reference G.729D code also uses gray decoding for each
132  * pulse index before looking up the value in the table.
133  *
134  * Used in G.729 @@6.4k (with gray coding)
135  */
136 extern const uint8_t ff_fc_2pulses_9bits_track2_gray[32];
137 
138 /**
139  * b60 hamming windowed sinc function coefficients
140  */
141 extern const float ff_b60_sinc[61];
142 
143 /**
144  * Table of pow(0.7,n)
145  */
146 extern const float ff_pow_0_7[10];
147 
148 /**
149  * Table of pow(0.75,n)
150  */
151 extern const float ff_pow_0_75[10];
152 
153 /**
154  * Table of pow(0.55,n)
155  */
156 extern const float ff_pow_0_55[10];
157 
158 /**
159  * Decode fixed-codebook vector (3.8 and D.5.8 of G.729, 5.7.1 of AMR).
160  * @param[out] fc_v decoded fixed codebook vector (2.13)
161  * @param tab1 table used for first pulse_count pulses
162  * @param tab2 table used for last pulse
163  * @param pulse_indexes fixed codebook indexes
164  * @param pulse_signs signs of the excitation pulses (0 bit value
165  * means negative sign)
166  * @param bits number of bits per one pulse index
167  * @param pulse_count number of pulses decoded using first table
168  * @param bits length of one pulse index in bits
169  *
170  * Used in G.729 @@8k, G.729 @@4.4k, G.729 @@6.4k, AMR @@7.95k, AMR @@7.40k
171  */
172 void ff_acelp_fc_pulse_per_track(int16_t* fc_v,
173  const uint8_t *tab1,
174  const uint8_t *tab2,
175  int pulse_indexes,
176  int pulse_signs,
177  int pulse_count,
178  int bits);
179 
180 /**
181  * Decode the algebraic codebook index to pulse positions and signs and
182  * construct the algebraic codebook vector for MODE_12k2.
183  *
184  * @note: The positions and signs are explicitly coded in MODE_12k2.
185  *
186  * @param fixed_index positions of the ten pulses
187  * @param fixed_sparse pointer to the algebraic codebook vector
188  * @param gray_decode gray decoding table
189  * @param half_pulse_count number of couples of pulses
190  * @param bits length of one pulse index in bits
191  */
192 void ff_decode_10_pulses_35bits(const int16_t *fixed_index,
193  AMRFixed *fixed_sparse,
194  const uint8_t *gray_decode,
195  int half_pulse_count, int bits);
196 
197 
198 /**
199  * weighted sum of two vectors with rounding.
200  * @param[out] out result of addition
201  * @param in_a first vector
202  * @param in_b second vector
203  * @param weight_coeff_a first vector weight coefficient
204  * @param weight_coeff_a second vector weight coefficient
205  * @param rounder this value will be added to the sum of the two vectors
206  * @param shift result will be shifted to right by this value
207  * @param length vectors length
208  *
209  * @note It is safe to pass the same buffer for out and in_a or in_b.
210  *
211  * out[i] = (in_a[i]*weight_a + in_b[i]*weight_b + rounder) >> shift
212  */
213 void ff_acelp_weighted_vector_sum(int16_t* out,
214  const int16_t *in_a,
215  const int16_t *in_b,
216  int16_t weight_coeff_a,
217  int16_t weight_coeff_b,
218  int16_t rounder,
219  int shift,
220  int length);
221 
222 /**
223  * float implementation of weighted sum of two vectors.
224  * @param[out] out result of addition
225  * @param in_a first vector
226  * @param in_b second vector
227  * @param weight_coeff_a first vector weight coefficient
228  * @param weight_coeff_a second vector weight coefficient
229  * @param length vectors length
230  *
231  * @note It is safe to pass the same buffer for out and in_a or in_b.
232  */
233 void ff_weighted_vector_sumf(float *out, const float *in_a, const float *in_b,
234  float weight_coeff_a, float weight_coeff_b,
235  int length);
236 
237 /**
238  * Adaptive gain control (as used in AMR postfiltering)
239  *
240  * @param out output buffer for filtered speech data
241  * @param in the input speech buffer (may be the same as out)
242  * @param speech_energ input energy
243  * @param size the input buffer size
244  * @param alpha exponential filter factor
245  * @param gain_mem a pointer to the filter memory (single float of size)
246  */
247 void ff_adaptive_gain_control(float *out, const float *in, float speech_energ,
248  int size, float alpha, float *gain_mem);
249 
250 /**
251  * Set the sum of squares of a signal by scaling
252  *
253  * @param out output samples
254  * @param in input samples
255  * @param sum_of_squares new sum of squares
256  * @param n number of samples
257  *
258  * @note If the input is zero (or its energy underflows), the output is zero.
259  * This is the behavior of AGC in the AMR reference decoder. The QCELP
260  * reference decoder seems to have undefined behavior.
261  *
262  * TIA/EIA/IS-733 2.4.8.3-2/3/4/5, 2.4.8.6
263  * 3GPP TS 26.090 6.1 (6)
264  */
265 void ff_scale_vector_to_given_sum_of_squares(float *out, const float *in,
266  float sum_of_squares, const int n);
267 
268 /**
269  * Add fixed vector to an array from a sparse representation
270  *
271  * @param out fixed vector with pitch sharpening
272  * @param in sparse fixed vector
273  * @param scale number to multiply the fixed vector by
274  * @param size the output vector size
275  */
276 void ff_set_fixed_vector(float *out, const AMRFixed *in, float scale, int size);
277 
278 /**
279  * Clear array values set by set_fixed_vector
280  *
281  * @param out fixed vector to be cleared
282  * @param in sparse fixed vector
283  * @param size the output vector size
284  */
285 void ff_clear_fixed_vector(float *out, const AMRFixed *in, int size);
286 
287 #endif /* AVCODEC_ACELP_VECTORS_H */
AMRFixed::x
int x[10]
Definition: acelp_vectors.h:55
gray_decode
static const uint8_t gray_decode[8]
3-bit Gray code to binary lookup table
Definition: amrnbdata.h:1433
out
FILE * out
Definition: movenc.c:54
ff_clear_fixed_vector
void ff_clear_fixed_vector(float *out, const AMRFixed *in, int size)
Clear array values set by set_fixed_vector.
Definition: acelp_vectors.c:243
ff_adaptive_gain_control
void ff_adaptive_gain_control(float *out, const float *in, float speech_energ, int size, float alpha, float *gain_mem)
Adaptive gain control (as used in AMR postfiltering)
Definition: acelp_vectors.c:192
ff_pow_0_55
const float ff_pow_0_55[10]
Table of pow(0.55,n)
Definition: acelp_vectors.c:98
ff_pow_0_75
const float ff_pow_0_75[10]
Table of pow(0.75,n)
Definition: acelp_vectors.c:93
ff_scale_vector_to_given_sum_of_squares
void ff_scale_vector_to_given_sum_of_squares(float *out, const float *in, float sum_of_squares, const int n)
Set the sum of squares of a signal by scaling.
Definition: acelp_vectors.c:213
AMRFixed::pitch_fac
float pitch_fac
Definition: acelp_vectors.h:59
tab2
const int16_t * tab2
Definition: mace.c:144
scale
static av_always_inline float scale(float x, float s)
Definition: vf_v360.c:1388
tab1
const int16_t * tab1
Definition: mace.c:144
ff_fc_2pulses_9bits_track2_gray
const uint8_t ff_fc_2pulses_9bits_track2_gray[32]
Definition: acelp_vectors.c:43
ff_acelp_weighted_vector_sum
void ff_acelp_weighted_vector_sum(int16_t *out, const int16_t *in_a, const int16_t *in_b, int16_t weight_coeff_a, int16_t weight_coeff_b, int16_t rounder, int shift, int length)
weighted sum of two vectors with rounding.
Definition: acelp_vectors.c:162
AMRFixed
Sparse representation for the algebraic codebook (fixed) vector.
Definition: acelp_vectors.h:53
bits
uint8_t bits
Definition: vp3data.h:141
AMRFixed::y
float y[10]
Definition: acelp_vectors.h:56
AMRFixed::no_repeat_mask
int no_repeat_mask
Definition: acelp_vectors.h:57
ff_acelp_vectors_init
void ff_acelp_vectors_init(ACELPVContext *c)
Initialize ACELPVContext.
Definition: acelp_vectors.c:258
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
ACELPVContext
Definition: acelp_vectors.h:28
size
int size
Definition: twinvq_data.h:10344
ff_b60_sinc
const float ff_b60_sinc[61]
b60 hamming windowed sinc function coefficients
Definition: acelp_vectors.c:103
ff_pow_0_7
const float ff_pow_0_7[10]
Table of pow(0.7,n)
Definition: acelp_vectors.c:88
ff_fc_2pulses_9bits_track1_gray
const uint8_t ff_fc_2pulses_9bits_track1_gray[16]
Definition: acelp_vectors.c:31
AMRFixed::n
int n
Definition: acelp_vectors.h:54
ff_fc_4pulses_8bits_tracks_13
const uint8_t ff_fc_4pulses_8bits_tracks_13[16]
Definition: acelp_vectors.c:63
ff_weighted_vector_sumf
void ff_weighted_vector_sumf(float *out, const float *in_a, const float *in_b, float weight_coeff_a, float weight_coeff_b, int length)
float implementation of weighted sum of two vectors.
Definition: acelp_vectors.c:182
shift
static int shift(int a, int b)
Definition: sonic.c:83
ff_fc_4pulses_8bits_track_4
const uint8_t ff_fc_4pulses_8bits_track_4[32]
Definition: acelp_vectors.c:68
alpha
static const int16_t alpha[]
Definition: ilbcdata.h:55
AMRFixed::pitch_lag
int pitch_lag
Definition: acelp_vectors.h:58
ACELPVContext::weighted_vector_sumf
void(* weighted_vector_sumf)(float *out, const float *in_a, const float *in_b, float weight_coeff_a, float weight_coeff_b, int length)
float implementation of weighted sum of two vectors.
Definition: acelp_vectors.h:40
ff_acelp_fc_pulse_per_track
void ff_acelp_fc_pulse_per_track(int16_t *fc_v, const uint8_t *tab1, const uint8_t *tab2, int pulse_indexes, int pulse_signs, int pulse_count, int bits)
Decode fixed-codebook vector (3.8 and D.5.8 of G.729, 5.7.1 of AMR).
Definition: acelp_vectors.c:117
ff_decode_10_pulses_35bits
void ff_decode_10_pulses_35bits(const int16_t *fixed_index, AMRFixed *fixed_sparse, const uint8_t *gray_decode, int half_pulse_count, int bits)
Decode the algebraic codebook index to pulse positions and signs and construct the algebraic codebook...
Definition: acelp_vectors.c:141
ff_set_fixed_vector
void ff_set_fixed_vector(float *out, const AMRFixed *in, float scale, int size)
Add fixed vector to an array from a sparse representation.
Definition: acelp_vectors.c:224
ff_acelp_vectors_init_mips
void ff_acelp_vectors_init_mips(ACELPVContext *c)
Definition: acelp_vectors_mips.c:99