FFmpeg
|
AMR narrowband decoder. More...
#include <string.h>
#include <math.h>
#include "libavutil/channel_layout.h"
#include "libavutil/float_dsp.h"
#include "avcodec.h"
#include "libavutil/common.h"
#include "libavutil/avassert.h"
#include "celp_math.h"
#include "celp_filters.h"
#include "acelp_filters.h"
#include "acelp_vectors.h"
#include "acelp_pitch_delay.h"
#include "lsp.h"
#include "amr.h"
#include "internal.h"
#include "amrnbdata.h"
Go to the source code of this file.
Data Structures | |
struct | AMRContext |
Macros | |
#define | AMR_BLOCK_SIZE 160 |
samples per frame More... | |
#define | AMR_SAMPLE_BOUND 32768.0 |
threshold for synthesis overflow More... | |
#define | AMR_SAMPLE_SCALE (2.0 / 32768.0) |
Scale from constructed speech to [-1,1]. More... | |
#define | PRED_FAC_MODE_12k2 0.65 |
Prediction factor for 12.2kbit/s mode. More... | |
#define | LSF_R_FAC (8000.0 / 32768.0) |
LSF residual tables to Hertz. More... | |
#define | MIN_LSF_SPACING (50.0488 / 8000.0) |
Ensures stability of LPC filter. More... | |
#define | PITCH_LAG_MIN_MODE_12k2 18 |
Lower bound on decoded lag search in 12.2kbit/s mode. More... | |
#define | MIN_ENERGY -14.0 |
Initial energy in dB. More... | |
#define | SHARP_MAX 0.79449462890625 |
Maximum sharpening factor. More... | |
#define | AMR_TILT_RESPONSE 22 |
Number of impulse response coefficients used for tilt factor. More... | |
#define | AMR_TILT_GAMMA_T 0.8 |
Tilt factor = 1st reflection coefficient * gamma_t. More... | |
#define | AMR_AGC_ALPHA 0.9 |
Adaptive gain control factor used in post-filter. More... | |
Typedefs | |
typedef struct AMRContext | AMRContext |
Functions | |
static void | weighted_vector_sumd (double *out, const double *in_a, const double *in_b, double weight_coeff_a, double weight_coeff_b, int length) |
Double version of ff_weighted_vector_sumf() More... | |
static av_cold int | amrnb_decode_init (AVCodecContext *avctx) |
static enum Mode | unpack_bitstream (AMRContext *p, const uint8_t *buf, int buf_size) |
Unpack an RFC4867 speech frame into the AMR frame mode and parameters. More... | |
static int | amrnb_decode_frame (AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt) |
AMR pitch LPC coefficient decoding functions | |
static void | interpolate_lsf (ACELPVContext *ctx, float lsf_q[4][LP_FILTER_ORDER], float *lsf_new) |
Interpolate the LSF vector (used for fixed gain smoothing). More... | |
static void | lsf2lsp_for_mode12k2 (AMRContext *p, double lsp[LP_FILTER_ORDER], const float lsf_no_r[LP_FILTER_ORDER], const int16_t *lsf_quantizer[5], const int quantizer_offset, const int sign, const int update) |
Decode a set of 5 split-matrix quantized lsf indexes into an lsp vector. More... | |
static void | lsf2lsp_5 (AMRContext *p) |
Decode a set of 5 split-matrix quantized lsf indexes into 2 lsp vectors. More... | |
static void | lsf2lsp_3 (AMRContext *p) |
Decode a set of 3 split-matrix quantized lsf indexes into an lsp vector. More... | |
AMR pitch vector decoding functions | |
static void | decode_pitch_lag_1_6 (int *lag_int, int *lag_frac, int pitch_index, const int prev_lag_int, const int subframe) |
Like ff_decode_pitch_lag(), but with 1/6 resolution. More... | |
static void | decode_pitch_vector (AMRContext *p, const AMRNBSubframe *amr_subframe, const int subframe) |
AMR algebraic code book (fixed) vector decoding functions | |
static void | decode_10bit_pulse (int code, int pulse_position[8], int i1, int i2, int i3) |
Decode a 10-bit algebraic codebook index from a 10.2 kbit/s frame. More... | |
static void | decode_8_pulses_31bits (const int16_t *fixed_index, AMRFixed *fixed_sparse) |
Decode the algebraic codebook index to pulse positions and signs and construct the algebraic codebook vector for MODE_10k2. More... | |
static void | decode_fixed_sparse (AMRFixed *fixed_sparse, const uint16_t *pulses, const enum Mode mode, const int subframe) |
Decode the algebraic codebook index to pulse positions and signs, then construct the algebraic codebook vector. More... | |
static void | pitch_sharpening (AMRContext *p, int subframe, enum Mode mode, AMRFixed *fixed_sparse) |
Apply pitch lag to obtain the sharpened fixed vector (section 6.1.2) More... | |
AMR gain decoding functions | |
static float | fixed_gain_smooth (AMRContext *p, const float *lsf, const float *lsf_avg, const enum Mode mode) |
fixed gain smoothing Note that where the spec specifies the "spectrum in the q domain" in section 6.1.4, in fact frequencies should be used. More... | |
static void | decode_gains (AMRContext *p, const AMRNBSubframe *amr_subframe, const enum Mode mode, const int subframe, float *fixed_gain_factor) |
Decode pitch gain and fixed gain factor (part of section 6.1.3). More... | |
AMR preprocessing functions | |
static void | apply_ir_filter (float *out, const AMRFixed *in, const float *filter) |
Circularly convolve a sparse fixed vector with a phase dispersion impulse response filter (D.6.2 of G.729 and 6.1.5 of AMR). More... | |
static const float * | anti_sparseness (AMRContext *p, AMRFixed *fixed_sparse, const float *fixed_vector, float fixed_gain, float *out) |
Reduce fixed vector sparseness by smoothing with one of three IR filters. More... | |
AMR synthesis functions | |
static int | synthesis (AMRContext *p, float *lpc, float fixed_gain, const float *fixed_vector, float *samples, uint8_t overflow) |
Conduct 10th order linear predictive coding synthesis. More... | |
AMR update functions | |
static void | update_state (AMRContext *p) |
Update buffers and history at the end of decoding a subframe. More... | |
AMR Postprocessing functions | |
static float | tilt_factor (AMRContext *p, float *lpc_n, float *lpc_d) |
Get the tilt factor of a formant filter from its transfer function. More... | |
static void | postfilter (AMRContext *p, float *lpc, float *buf_out) |
Perform adaptive post-filtering to enhance the quality of the speech. More... | |
Variables | |
AVCodec | ff_amrnb_decoder |
Detailed Description
AMR narrowband decoder.
This decoder uses floats for simplicity and so is not bit-exact. One difference is that differences in phase can accumulate. The test sequences in 3GPP TS 26.074 can still be useful.
- Comparing this file's output to the output of the ref decoder gives a PSNR of 30 to 80. Plotting the output samples shows a difference in phase in some areas.
- Comparing both decoders against their input, this decoder gives a similar PSNR. If the test sequence homing frames are removed (this decoder does not detect them), the PSNR is at least as good as the reference on 140 out of 169 tests.
Definition in file amrnbdec.c.
Macro Definition Documentation
#define AMR_AGC_ALPHA 0.9 |
Adaptive gain control factor used in post-filter.
Definition at line 98 of file amrnbdec.c.
Referenced by postfilter().
#define AMR_BLOCK_SIZE 160 |
#define AMR_SAMPLE_BOUND 32768.0 |
threshold for synthesis overflow
Definition at line 63 of file amrnbdec.c.
Referenced by synthesis().
#define AMR_SAMPLE_SCALE (2.0 / 32768.0) |
Scale from constructed speech to [-1,1].
AMR is designed to produce 16-bit PCM samples (3GPP TS 26.090 4.2) but upscales by two (section 6.2.2).
Fundamentally, this scale is determined by energy_mean through the fixed vector contribution to the excitation vector.
Definition at line 74 of file amrnbdec.c.
Referenced by amrnb_decode_frame().
#define AMR_TILT_GAMMA_T 0.8 |
Tilt factor = 1st reflection coefficient * gamma_t.
Definition at line 96 of file amrnbdec.c.
Referenced by tilt_factor().
#define AMR_TILT_RESPONSE 22 |
Number of impulse response coefficients used for tilt factor.
Definition at line 94 of file amrnbdec.c.
Referenced by tilt_factor().
#define LSF_R_FAC (8000.0 / 32768.0) |
LSF residual tables to Hertz.
Definition at line 79 of file amrnbdec.c.
Referenced by lsf2lsp_3(), lsf2lsp_5(), and lsf2lsp_for_mode12k2().
#define MIN_ENERGY -14.0 |
Initial energy in dB.
Also used for bad frames (unimplemented).
Definition at line 84 of file amrnbdec.c.
Referenced by amrnb_decode_init(), and amrwb_decode_init().
#define MIN_LSF_SPACING (50.0488 / 8000.0) |
Ensures stability of LPC filter.
Definition at line 80 of file amrnbdec.c.
Referenced by lsf2lsp_3(), and lsf2lsp_for_mode12k2().
#define PITCH_LAG_MIN_MODE_12k2 18 |
Lower bound on decoded lag search in 12.2kbit/s mode.
Definition at line 81 of file amrnbdec.c.
Referenced by decode_pitch_lag_1_6().
#define PRED_FAC_MODE_12k2 0.65 |
Prediction factor for 12.2kbit/s mode.
Definition at line 77 of file amrnbdec.c.
Referenced by lsf2lsp_5().
#define SHARP_MAX 0.79449462890625 |
Maximum sharpening factor.
The specification says 0.8, which should be 13107, but the reference C code uses 13017 instead. (Amusingly the same applies to SHARP_MAX in g729dec.c.)
Definition at line 91 of file amrnbdec.c.
Referenced by pitch_sharpening(), and synthesis().
Typedef Documentation
typedef struct AMRContext AMRContext |
Function Documentation
|
static |
Definition at line 948 of file amrnbdec.c.
|
static |
Definition at line 160 of file amrnbdec.c.
|
static |
Reduce fixed vector sparseness by smoothing with one of three IR filters.
Also know as "adaptive phase dispersion".
This implements 3GPP TS 26.090 section 6.1(5).
- Parameters
-
p the context fixed_sparse algebraic codebook vector fixed_vector unfiltered fixed vector fixed_gain smoothed gain out space for modified vector if necessary
Definition at line 719 of file amrnbdec.c.
Referenced by amrnb_decode_frame().
Circularly convolve a sparse fixed vector with a phase dispersion impulse response filter (D.6.2 of G.729 and 6.1.5 of AMR).
- Parameters
-
out vector with filter applied in source vector filter phase filter coefficients
out[n] = sum(i,0,len-1){ in[i] * filter[(len + n - i)len] }
< filters at pitch lag*1 and *2
Definition at line 672 of file amrnbdec.c.
Referenced by anti_sparseness().
|
static |
Decode a 10-bit algebraic codebook index from a 10.2 kbit/s frame.
Definition at line 435 of file amrnbdec.c.
Referenced by decode_8_pulses_31bits().
Decode the algebraic codebook index to pulse positions and signs and construct the algebraic codebook vector for MODE_10k2.
- Parameters
-
fixed_index positions of the eight pulses fixed_sparse pointer to the algebraic codebook vector
Definition at line 453 of file amrnbdec.c.
Referenced by decode_fixed_sparse().
|
static |
Decode the algebraic codebook index to pulse positions and signs, then construct the algebraic codebook vector.
nb of pulses | bits encoding pulses For MODE_4k75 or MODE_5k15, 2 | 1-3, 4-6, 7 MODE_5k9, 2 | 1, 2-4, 5-6, 7-9 MODE_6k7, 3 | 1-3, 4, 5-7, 8, 9-11 MODE_7k4 or MODE_7k95, 4 | 1-3, 4-6, 7-9, 10, 11-13
- Parameters
-
fixed_sparse pointer to the algebraic codebook vector pulses algebraic codebook indexes mode mode of the current frame subframe current subframe number
Definition at line 499 of file amrnbdec.c.
Referenced by amrnb_decode_frame().
|
static |
Decode pitch gain and fixed gain factor (part of section 6.1.3).
- Parameters
-
p the context amr_subframe unpacked amr subframe mode mode of the current frame subframe current subframe number fixed_gain_factor decoded gain correction factor
Definition at line 630 of file amrnbdec.c.
Referenced by amrnb_decode_frame().
|
static |
Like ff_decode_pitch_lag(), but with 1/6 resolution.
Definition at line 372 of file amrnbdec.c.
Referenced by decode_pitch_vector().
|
static |
Definition at line 391 of file amrnbdec.c.
Referenced by amrnb_decode_frame().
|
static |
fixed gain smoothing Note that where the spec specifies the "spectrum in the q domain" in section 6.1.4, in fact frequencies should be used.
- Parameters
-
p the context lsf LSFs for the current subframe, in the range [0,1] lsf_avg averaged LSFs mode mode of the current frame
- Returns
- fixed gain smoothed
Definition at line 588 of file amrnbdec.c.
Referenced by amrnb_decode_frame().
|
static |
Interpolate the LSF vector (used for fixed gain smoothing).
The interpolation is done over all four subframes even in MODE_12k2.
- Parameters
-
[in] ctx The Context [in,out] lsf_q LSFs in [0,1] for each subframe [in] lsf_new New LSFs in [0,1] for subframe 4
Definition at line 239 of file amrnbdec.c.
Referenced by lsf2lsp_3(), and lsf2lsp_for_mode12k2().
|
static |
Decode a set of 3 split-matrix quantized lsf indexes into an lsp vector.
- Parameters
-
p pointer to the AMRContext
Definition at line 327 of file amrnbdec.c.
Referenced by amrnb_decode_frame().
|
static |
Decode a set of 5 split-matrix quantized lsf indexes into 2 lsp vectors.
- Parameters
-
p pointer to the AMRContext
Definition at line 298 of file amrnbdec.c.
Referenced by amrnb_decode_frame().
|
static |
Decode a set of 5 split-matrix quantized lsf indexes into an lsp vector.
- Parameters
-
p the context lsp output LSP vector lsf_no_r LSF vector without the residual vector added lsf_quantizer pointers to LSF dictionary tables quantizer_offset offset in tables sign for the 3 dictionary table update store data for computing the next frame's LSFs
Definition at line 260 of file amrnbdec.c.
Referenced by lsf2lsp_5().
|
static |
Apply pitch lag to obtain the sharpened fixed vector (section 6.1.2)
- Parameters
-
p the context subframe unpacked amr subframe mode mode of the current frame fixed_sparse sparse respresentation of the fixed vector
Definition at line 552 of file amrnbdec.c.
Referenced by amrnb_decode_frame().
|
static |
Perform adaptive post-filtering to enhance the quality of the speech.
See section 6.2.1.
- Parameters
-
p pointer to the AMRContext lpc interpolated LP coefficients for this subframe buf_out output of the filter
Definition at line 904 of file amrnbdec.c.
Referenced by amrnb_decode_frame().
|
static |
Conduct 10th order linear predictive coding synthesis.
- Parameters
-
p pointer to the AMRContext lpc pointer to the LPC coefficients fixed_gain fixed codebook gain for synthesis fixed_vector algebraic codebook vector samples pointer to the output speech samples overflow 16-bit overflow flag
Definition at line 790 of file amrnbdec.c.
Referenced by amrnb_decode_frame().
|
static |
Get the tilt factor of a formant filter from its transfer function.
- Parameters
-
p The Context lpc_n LP_FILTER_ORDER coefficients of the numerator lpc_d LP_FILTER_ORDER coefficients of the denominator
Definition at line 874 of file amrnbdec.c.
Referenced by postfilter().
|
static |
Unpack an RFC4867 speech frame into the AMR frame mode and parameters.
The order of speech bits is specified by 3GPP TS 26.101.
- Parameters
-
p the context buf pointer to the input buffer buf_size size of the input buffer
- Returns
- the frame mode
Definition at line 207 of file amrnbdec.c.
Referenced by amrnb_decode_frame().
|
static |
Update buffers and history at the end of decoding a subframe.
- Parameters
-
p pointer to the AMRContext
Definition at line 847 of file amrnbdec.c.
Referenced by amrnb_decode_frame().
|
static |
Double version of ff_weighted_vector_sumf()
Definition at line 149 of file amrnbdec.c.
Referenced by lsf2lsp_5().
Variable Documentation
AVCodec ff_amrnb_decoder |
Definition at line 1083 of file amrnbdec.c.
Generated on Mon Nov 18 2024 06:52:04 for FFmpeg by 1.8.11