FFmpeg
Macros | Functions | Variables
lsp.c File Reference
#include <math.h>
#include "config.h"
#include "libavutil/macros.h"
#include "mathops.h"
#include "lsp.h"
#include "libavutil/avassert.h"

Go to the source code of this file.

Macros

#define FRAC_BITS   14
 

Functions

void ff_acelp_reorder_lsf (int16_t *lsfq, int lsfq_min_distance, int lsfq_min, int lsfq_max, int lp_order)
 (I.F) means fixed-point value with F fractional and I integer bits More...
 
void ff_set_min_dist_lsf (float *lsf, double min_spacing, int size)
 Adjust the quantized LSFs so they are increasing and not too close. More...
 
static int16_t ff_cos (uint16_t arg)
 
void ff_acelp_lsf2lsp (int16_t *lsp, const int16_t *lsf, int lp_order)
 Convert LSF to LSP. More...
 
void ff_acelp_lsf2lspd (double *lsp, const float *lsf, int lp_order)
 Floating point version of ff_acelp_lsf2lsp() More...
 
static void lsp2poly (int *f, const int16_t *lsp, int lp_half_order)
 decodes polynomial coefficients from LSP More...
 
static void lsp2polyf (const double *lsp, double *f, int lp_half_order)
 Compute the Pa / (1 + z(-1)) or Qa / (1 - z(-1)) coefficients needed for LSP to LPC conversion. More...
 
void ff_acelp_lsp2lpc (int16_t *lp, const int16_t *lsp, int lp_half_order)
 LSP to LP conversion (3.2.6 of G.729) More...
 
void ff_amrwb_lsp2lpc (const double *lsp, float *lp, int lp_order)
 LSP to LP conversion (5.2.4 of AMR-WB) More...
 
void ff_acelp_lp_decode (int16_t *lp_1st, int16_t *lp_2nd, const int16_t *lsp_2nd, const int16_t *lsp_prev, int lp_order)
 Interpolate LSP for the first subframe and convert LSP -> LP for both subframes (3.2.5 and 3.2.6 of G.729) More...
 
void ff_acelp_lspd2lpc (const double *lsp, float *lpc, int lp_half_order)
 Reconstruct LPC coefficients from the line spectral pair frequencies. More...
 
void ff_sort_nearly_sorted_floats (float *vals, int len)
 Sort values in ascending order. More...
 

Variables

static const int16_t tab_cos [65]
 

Macro Definition Documentation

◆ FRAC_BITS

#define FRAC_BITS   14

Definition at line 28 of file lsp.c.

Function Documentation

◆ ff_acelp_reorder_lsf()

void ff_acelp_reorder_lsf ( int16_t *  lsfq,
int  lsfq_min_distance,
int  lsfq_min,
int  lsfq_max,
int  lp_order 
)

(I.F) means fixed-point value with F fractional and I integer bits

ensure a minimum distance between LSFs

Parameters
[in,out]lsfqLSF to check and adjust
lsfq_min_distanceminimum distance between LSFs
lsfq_minminimum allowed LSF value
lsfq_maxmaximum allowed LSF value
lp_orderLP filter order

Definition at line 37 of file lsp.c.

Referenced by lsf_decode().

◆ ff_set_min_dist_lsf()

void ff_set_min_dist_lsf ( float lsf,
double  min_spacing,
int  size 
)

Adjust the quantized LSFs so they are increasing and not too close.

This step is not mentioned in the AMR spec but is in the reference C decoder. Omitting this step creates audible distortion on the sinusoidal sweep test vectors in 3GPP TS 26.074.

Parameters
[in,out]lsfLSFs in Hertz
min_spacingminimum distance between two consecutive lsf values
sizesize of the lsf vector

Definition at line 55 of file lsp.c.

Referenced by amrwb_decode_frame(), ff_sipr_decode_frame_16k(), lsf2lsp_3(), lsf2lsp_for_mode12k2(), and lsf_decode_fp().

◆ ff_cos()

static int16_t ff_cos ( uint16_t  arg)
static

Definition at line 77 of file lsp.c.

Referenced by ff_acelp_lsf2lsp().

◆ ff_acelp_lsf2lsp()

void ff_acelp_lsf2lsp ( int16_t *  lsp,
const int16_t *  lsf,
int  lp_order 
)

Convert LSF to LSP.

Parameters
[out]lspLSP coefficients (-0x8000 <= (0.15) < 0x8000)
lsfnormalized LSF coefficients (0 <= (2.13) < 0x2000 * PI)
lp_orderLP filter order
Remarks
It is safe to pass the same array into the lsf and lsp parameters.

Definition at line 87 of file lsp.c.

Referenced by decode_frame().

◆ ff_acelp_lsf2lspd()

void ff_acelp_lsf2lspd ( double lsp,
const float lsf,
int  lp_order 
)

Floating point version of ff_acelp_lsf2lsp()

Definition at line 97 of file lsp.c.

Referenced by amrwb_decode_frame(), decode_predictor_coeffs(), hb_synthesis(), lsf2lsp_3(), and lsf2lsp_for_mode12k2().

◆ lsp2poly()

static void lsp2poly ( int f,
const int16_t *  lsp,
int  lp_half_order 
)
static

decodes polynomial coefficients from LSP

Parameters
[out]fdecoded polynomial coefficients (-0x20000000 <= (3.22) <= 0x1fffffff)
lspLSP coefficients (-0x8000 <= (0.15) <= 0x7fff)

Definition at line 110 of file lsp.c.

Referenced by ff_acelp_lsp2lpc().

◆ lsp2polyf()

static void lsp2polyf ( const double lsp,
double f,
int  lp_half_order 
)
static

Compute the Pa / (1 + z(-1)) or Qa / (1 - z(-1)) coefficients needed for LSP to LPC conversion.

We only need to calculate the 6 first elements of the polynomial.

Parameters
lspline spectral pairs in cosine domain
[out]fpolynomial input/output as a vector

TIA/EIA/IS-733 2.4.3.3.5-1/2

Definition at line 138 of file lsp.c.

Referenced by ff_acelp_lspd2lpc(), and ff_amrwb_lsp2lpc().

◆ ff_acelp_lsp2lpc()

void ff_acelp_lsp2lpc ( int16_t *  lp,
const int16_t *  lsp,
int  lp_half_order 
)

LSP to LP conversion (3.2.6 of G.729)

Parameters
[out]lpdecoded LP coefficients (-0x8000 <= (3.12) < 0x8000)
lspLSP coefficients (-0x8000 <= (0.15) < 0x8000)
lp_half_orderLP filter order, divided by 2

Definition at line 153 of file lsp.c.

Referenced by ff_acelp_lp_decode().

◆ ff_amrwb_lsp2lpc()

void ff_amrwb_lsp2lpc ( const double lsp,
float lp,
int  lp_order 
)

LSP to LP conversion (5.2.4 of AMR-WB)

Definition at line 175 of file lsp.c.

Referenced by amrwb_decode_frame(), hb_synthesis(), and sipr_decode_lp().

◆ ff_acelp_lp_decode()

void ff_acelp_lp_decode ( int16_t *  lp_1st,
int16_t *  lp_2nd,
const int16_t *  lsp_2nd,
const int16_t *  lsp_prev,
int  lp_order 
)

Interpolate LSP for the first subframe and convert LSP -> LP for both subframes (3.2.5 and 3.2.6 of G.729)

Parameters
[out]lp_1stdecoded LP coefficients for first subframe (-0x8000 <= (3.12) < 0x8000)
[out]lp_2nddecoded LP coefficients for second subframe (-0x8000 <= (3.12) < 0x8000)
lsp_2ndLSP coefficients of the second subframe (-0x8000 <= (0.15) < 0x8000)
lsp_prevLSP coefficients from the second subframe of the previous frame (-0x8000 <= (0.15) < 0x8000)
lp_orderLP filter order

Definition at line 201 of file lsp.c.

Referenced by decode_frame().

◆ ff_acelp_lspd2lpc()

void ff_acelp_lspd2lpc ( const double lsp,
float lpc,
int  lp_half_order 
)

Reconstruct LPC coefficients from the line spectral pair frequencies.

Parameters
lspline spectral pairs in cosine domain
lpclinear predictive coding coefficients
lp_half_orderhalf the number of the amount of LPCs to be reconstructed, need to be smaller or equal to MAX_LP_HALF_ORDER
Note
buffers should have a minimum size of 2*lp_half_order elements.

TIA/EIA/IS-733 2.4.3.3.5

Definition at line 220 of file lsp.c.

Referenced by acelp_lp_decodef(), amrnb_decode_frame(), lspf2lpc(), synth_block(), and synth_frame().

◆ ff_sort_nearly_sorted_floats()

void ff_sort_nearly_sorted_floats ( float vals,
int  len 
)

Sort values in ascending order.

Note
O(n) if data already sorted, O(n^2) - otherwise

Definition at line 239 of file lsp.c.

Referenced by decode_lsp(), and lsf_decode_fp().

Variable Documentation

◆ tab_cos

const int16_t tab_cos[65]
static
Initial value:
=
{
32767, 32738, 32617, 32421, 32145, 31793, 31364, 30860,
30280, 29629, 28905, 28113, 27252, 26326, 25336, 24285,
23176, 22011, 20793, 19525, 18210, 16851, 15451, 14014,
12543, 11043, 9515, 7965, 6395, 4810, 3214, 1609,
1, -1607, -3211, -4808, -6393, -7962, -9513, -11040,
-12541, -14012, -15449, -16848, -18207, -19523, -20791, -22009,
-23174, -24283, -25334, -26324, -27250, -28111, -28904, -29627,
-30279, -30858, -31363, -31792, -32144, -32419, -32616, -32736, -32768,
}

Definition at line 65 of file lsp.c.

Referenced by ff_cos().