acelp_vectors.c File Reference
#include <inttypes.h>
#include "libavutil/common.h"
#include "libavutil/float_dsp.h"
#include "avcodec.h"
#include "acelp_vectors.h"
Include dependency graph for acelp_vectors.c:

Go to the source code of this file.

Functions

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). More...
 
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 vector for MODE_12k2. More...
 
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. More...
 
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. More...
 
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) More...
 
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. More...
 
void ff_set_fixed_vector (float *out, const AMRFixed *in, float scale, int size)
 Add fixed vector to an array from a sparse representation. More...
 
void ff_clear_fixed_vector (float *out, const AMRFixed *in, int size)
 Clear array values set by set_fixed_vector. More...
 
void ff_acelp_vectors_init (ACELPVContext *c)
 Initialize ACELPVContext. More...
 

Variables

const uint8_t ff_fc_2pulses_9bits_track1 [16]
 

Track|Pulse| Positions

1 | 0 | 1, 6, 11, 16, 21, 26, 31, 36

| | 3, 8, 13, 18, 23, 28, 33, 38

More...
 
const uint8_t ff_fc_2pulses_9bits_track1_gray [16]
 
const uint8_t ff_fc_2pulses_9bits_track2_gray [32]
 

Track|Pulse| Positions

2 | 1 | 0, 7, 14, 20, 27, 34, 1, 21 | | 2, 9, 15, 22, 29, 35, 6, 26 | | 4,10, 17, 24, 30, 37, 11, 31

| | 5,12, 19, 25, 32, 39, 16, 36

More...
 
const uint8_t ff_fc_4pulses_8bits_tracks_13 [16]
 

Track|Pulse| Positions

1 | 0 | 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75

2 | 1 | 1, 6, 11, 16, 21, 26, 31, 36, 41, 46, 51, 56, 61, 66, 71, 76

3 | 2 | 2, 7, 12, 17, 22, 27, 32, 37, 42, 47, 52, 57, 62, 67, 72, 77

More...
 
const uint8_t ff_fc_4pulses_8bits_track_4 [32]
 

Track|Pulse| Positions

4 | 3 | 3, 8, 13, 18, 23, 28, 33, 38, 43, 48, 53, 58, 63, 68, 73, 78

| | 4, 9, 14, 19, 24, 29, 34, 39, 44, 49, 54, 59, 64, 69, 74, 79

More...
 
const float ff_pow_0_7 [10]
 Table of pow(0.7,n) More...
 
const float ff_pow_0_75 [10]
 Table of pow(0.75,n) More...
 
const float ff_pow_0_55 [10]
 Table of pow(0.55,n) More...
 
const float ff_b60_sinc [61]
 b60 hamming windowed sinc function coefficients More...
 

Function Documentation

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).

Parameters
[out]fc_vdecoded fixed codebook vector (2.13)
tab1table used for first pulse_count pulses
tab2table used for last pulse
pulse_indexesfixed codebook indexes
pulse_signssigns of the excitation pulses (0 bit value means negative sign)
bitsnumber of bits per one pulse index
pulse_countnumber of pulses decoded using first table
bitslength of one pulse index in bits

Used in G.729 @8k, G.729 @4.4k, G.729 @6.4k, AMR @7.95k, AMR @7.40k

Definition at line 127 of file acelp_vectors.c.

Referenced by decode_frame().

void ff_acelp_vectors_init ( ACELPVContext c)

Initialize ACELPVContext.

Definition at line 266 of file acelp_vectors.c.

Referenced by amrnb_decode_init(), and amrwb_decode_init().

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.

Parameters
[out]outresult of addition
in_afirst vector
in_bsecond vector
weight_coeff_afirst vector weight coefficient
weight_coeff_asecond vector weight coefficient
rounderthis value will be added to the sum of the two vectors
shiftresult will be shifted to right by this value
lengthvectors length
Note
It is safe to pass the same buffer for out and in_a or in_b.

out[i] = (in_a[i]*weight_a + in_b[i]*weight_b + rounder) >> shift

Definition at line 172 of file acelp_vectors.c.

Referenced by decode_frame(), g723_1_decode_frame(), long_term_filter(), and lsp_interpolate().

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)

Parameters
outoutput buffer for filtered speech data
inthe input speech buffer (may be the same as out)
speech_energinput energy
sizethe input buffer size
alphaexponential filter factor
gain_mema pointer to the filter memory (single float of size)

Definition at line 202 of file acelp_vectors.c.

Referenced by decode_frame(), and postfilter().

void ff_clear_fixed_vector ( float *  out,
const AMRFixed in,
int  size 
)

Clear array values set by set_fixed_vector.

Parameters
outfixed vector to be cleared
insparse fixed vector
sizethe output vector size

Definition at line 251 of file acelp_vectors.c.

Referenced by amrnb_decode_frame().

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 vector for MODE_12k2.

Note
: The positions and signs are explicitly coded in MODE_12k2.
Parameters
fixed_indexpositions of the ten pulses
fixed_sparsepointer to the algebraic codebook vector
gray_decodegray decoding table
half_pulse_countnumber of couples of pulses
bitslength of one pulse index in bits

Definition at line 151 of file acelp_vectors.c.

Referenced by decode_fixed_sparse(), and ff_sipr_decode_frame_16k().

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.

Parameters
outoutput samples
ininput samples
sum_of_squaresnew sum of squares
nnumber of samples
Note
If the input is zero (or its energy underflows), the output is zero. This is the behavior of AGC in the AMR reference decoder. The QCELP reference decoder seems to have undefined behavior.

TIA/EIA/IS-733 2.4.8.3-2/3/4/5, 2.4.8.6 3GPP TS 26.090 6.1 (6)

Definition at line 223 of file acelp_vectors.c.

Referenced by apply_gain_ctrl(), scaled_hb_excitation(), and synthesis().

void ff_set_fixed_vector ( float *  out,
const AMRFixed in,
float  scale,
int  size 
)

Add fixed vector to an array from a sparse representation.

Parameters
outfixed vector with pitch sharpening
insparse fixed vector
scalenumber to multiply the fixed vector by
sizethe output vector size

Definition at line 234 of file acelp_vectors.c.

Referenced by amrnb_decode_frame(), ff_sipr_decode_frame_16k(), and synth_block_fcb_acb().

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.

Parameters
[out]outresult of addition
in_afirst vector
in_bsecond vector
weight_coeff_afirst vector weight coefficient
weight_coeff_asecond vector weight coefficient
lengthvectors length
Note
It is safe to pass the same buffer for out and in_a or in_b.

Definition at line 192 of file acelp_vectors.c.

Referenced by decode_frame(), decode_lspf(), ff_acelp_vectors_init(), ff_sipr_decode_frame_16k(), interpolate_lpc(), interpolate_lsp(), and synth_block_fcb_acb().

Variable Documentation

const float ff_b60_sinc[61]
Initial value:
= {
0.898529 , 0.865051 , 0.769257 , 0.624054 , 0.448639 , 0.265289 ,
0.0959167 , -0.0412598 , -0.134338 , -0.178986 , -0.178528 , -0.142609 ,
-0.0849304 , -0.0205078 , 0.0369568 , 0.0773926 , 0.0955200 , 0.0912781 ,
0.0689392 , 0.0357056 , 0. , -0.0305481 , -0.0504150 , -0.0570068 ,
-0.0508423 , -0.0350037 , -0.0141602 , 0.00665283, 0.0230713 , 0.0323486 ,
0.0335388 , 0.0275879 , 0.0167847 , 0.00411987, -0.00747681, -0.0156860 ,
-0.0193481 , -0.0183716 , -0.0137634 , -0.00704956, 0. , 0.00582886 ,
0.00939941, 0.0103760 , 0.00903320, 0.00604248, 0.00238037, -0.00109863 ,
-0.00366211, -0.00497437, -0.00503540, -0.00402832, -0.00241089, -0.000579834,
0.00103760, 0.00222778, 0.00277710, 0.00271606, 0.00213623, 0.00115967 ,
0.
}

b60 hamming windowed sinc function coefficients

Definition at line 113 of file acelp_vectors.c.

Referenced by decode_frame(), and decode_pitch_vector().

const uint8_t ff_fc_2pulses_9bits_track1[16]
Initial value:
=
{
1, 3,
6, 8,
11, 13,
16, 18,
21, 23,
26, 28,
31, 33,
36, 38
}

Track|Pulse| Positions

1 | 0 | 1, 6, 11, 16, 21, 26, 31, 36

| | 3, 8, 13, 18, 23, 28, 33, 38

Remarks
Track in the table should be read top-to-bottom, left-to-right.
Note
(EE) Reference G.729D code also uses gray decoding for each pulse index before looking up the value in the table.

Used in G.729 @6.4k (with gray coding), AMR @5.9k (without gray coding)

Definition at line 30 of file acelp_vectors.c.

const uint8_t ff_fc_2pulses_9bits_track1_gray[16]
Initial value:
=
{
1, 3,
8, 6,
18, 16,
11, 13,
38, 36,
31, 33,
21, 23,
28, 26,
}

Definition at line 41 of file acelp_vectors.c.

Referenced by decode_frame().

const uint8_t ff_fc_2pulses_9bits_track2_gray[32]
Initial value:
=
{
0, 2,
5, 4,
12, 10,
7, 9,
25, 24,
20, 22,
14, 15,
19, 17,
36, 31,
21, 26,
1, 6,
16, 11,
27, 29,
32, 30,
39, 37,
34, 35,
}

Track|Pulse| Positions

2 | 1 | 0, 7, 14, 20, 27, 34, 1, 21 | | 2, 9, 15, 22, 29, 35, 6, 26 | | 4,10, 17, 24, 30, 37, 11, 31

| | 5,12, 19, 25, 32, 39, 16, 36

Remarks
Track in the table should be read top-to-bottom, left-to-right.
Note
(EE.1) This table (from the reference code) does not comply with the specification. The specification contains the following table:

Track|Pulse| Positions

2 | 1 | 0, 5, 10, 15, 20, 25, 30, 35 | | 1, 6, 11, 16, 21, 26, 31, 36 | | 2, 7, 12, 17, 22, 27, 32, 37 | | 4, 9, 14, 19, 24, 29, 34, 39


Note
(EE.2) Reference G.729D code also uses gray decoding for each pulse index before looking up the value in the table.

Used in G.729 @6.4k (with gray coding)

Definition at line 53 of file acelp_vectors.c.

Referenced by decode_frame().

const uint8_t ff_fc_4pulses_8bits_track_4[32]
Initial value:
=
{
3, 4,
8, 9,
13, 14,
18, 19,
23, 24,
28, 29,
33, 34,
38, 39,
43, 44,
48, 49,
53, 54,
58, 59,
63, 64,
68, 69,
73, 74,
78, 79,
}

Track|Pulse| Positions

4 | 3 | 3, 8, 13, 18, 23, 28, 33, 38, 43, 48, 53, 58, 63, 68, 73, 78

| | 4, 9, 14, 19, 24, 29, 34, 39, 44, 49, 54, 59, 64, 69, 74, 79

Remarks
Track in the table should be read top-to-bottom, left-to-right.

Used in G.729 @8k, G.729 @4.4k, AMR @7.95k, AMR @7.40k

Definition at line 78 of file acelp_vectors.c.

Referenced by decode_frame().

const uint8_t ff_fc_4pulses_8bits_tracks_13[16]
Initial value:
=
{
0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75,
}

Track|Pulse| Positions

1 | 0 | 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75

2 | 1 | 1, 6, 11, 16, 21, 26, 31, 36, 41, 46, 51, 56, 61, 66, 71, 76

3 | 2 | 2, 7, 12, 17, 22, 27, 32, 37, 42, 47, 52, 57, 62, 67, 72, 77

Table contains only first the pulse indexes.

Used in G.729 @8k, G.729 @4.4k, AMR @7.95k, AMR @7.40k

Definition at line 73 of file acelp_vectors.c.

Referenced by decode_frame(), and ff_sipr_decode_frame_16k().

const float ff_pow_0_55[10]
Initial value:
= {
0.550000, 0.302500, 0.166375, 0.091506, 0.050328,
0.027681, 0.015224, 0.008373, 0.004605, 0.002533
}

Table of pow(0.55,n)

Definition at line 108 of file acelp_vectors.c.

Referenced by eval_ir(), and postfilter().

const float ff_pow_0_7[10]
Initial value:
= {
0.700000, 0.490000, 0.343000, 0.240100, 0.168070,
0.117649, 0.082354, 0.057648, 0.040354, 0.028248
}

Table of pow(0.7,n)

Definition at line 98 of file acelp_vectors.c.

Referenced by eval_ir(), and postfilter().

const float ff_pow_0_75[10]
Initial value:
= {
0.750000, 0.562500, 0.421875, 0.316406, 0.237305,
0.177979, 0.133484, 0.100113, 0.075085, 0.056314
}

Table of pow(0.75,n)

Definition at line 103 of file acelp_vectors.c.

Referenced by postfilter(), and postfilter_5k0().