1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * gain code, gain pitch and pitch delay decoding 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * Copyright (c) 2008 Vladimir Voroshilov 5cabdff1aSopenharmony_ci * 6cabdff1aSopenharmony_ci * This file is part of FFmpeg. 7cabdff1aSopenharmony_ci * 8cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 9cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 10cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 11cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 12cabdff1aSopenharmony_ci * 13cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 14cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 15cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16cabdff1aSopenharmony_ci * Lesser General Public License for more details. 17cabdff1aSopenharmony_ci * 18cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 19cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 20cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 21cabdff1aSopenharmony_ci */ 22cabdff1aSopenharmony_ci 23cabdff1aSopenharmony_ci#ifndef AVCODEC_ACELP_PITCH_DELAY_H 24cabdff1aSopenharmony_ci#define AVCODEC_ACELP_PITCH_DELAY_H 25cabdff1aSopenharmony_ci 26cabdff1aSopenharmony_ci#include <stdint.h> 27cabdff1aSopenharmony_ci 28cabdff1aSopenharmony_ci#include "audiodsp.h" 29cabdff1aSopenharmony_ci 30cabdff1aSopenharmony_ci#define PITCH_DELAY_MIN 20 31cabdff1aSopenharmony_ci#define PITCH_DELAY_MAX 143 32cabdff1aSopenharmony_ci 33cabdff1aSopenharmony_ci/** 34cabdff1aSopenharmony_ci * @brief Decode pitch delay of the first subframe encoded by 8 bits with 1/3 35cabdff1aSopenharmony_ci * resolution. 36cabdff1aSopenharmony_ci * @param ac_index adaptive codebook index (8 bits) 37cabdff1aSopenharmony_ci * 38cabdff1aSopenharmony_ci * @return pitch delay in 1/3 units 39cabdff1aSopenharmony_ci * 40cabdff1aSopenharmony_ci * Pitch delay is coded: 41cabdff1aSopenharmony_ci * with 1/3 resolution, 19 < pitch_delay < 85 42cabdff1aSopenharmony_ci * integers only, 85 <= pitch_delay <= 143 43cabdff1aSopenharmony_ci */ 44cabdff1aSopenharmony_cistatic inline int ff_acelp_decode_8bit_to_1st_delay3(int ac_index) 45cabdff1aSopenharmony_ci{ 46cabdff1aSopenharmony_ci ac_index += 58; 47cabdff1aSopenharmony_ci if (ac_index > 254) 48cabdff1aSopenharmony_ci ac_index = 3 * ac_index - 510; 49cabdff1aSopenharmony_ci return ac_index; 50cabdff1aSopenharmony_ci} 51cabdff1aSopenharmony_ci 52cabdff1aSopenharmony_ci/** 53cabdff1aSopenharmony_ci * @brief Decode pitch delay of the second subframe encoded by 5 or 6 bits 54cabdff1aSopenharmony_ci * with 1/3 precision. 55cabdff1aSopenharmony_ci * @param ac_index adaptive codebook index (5 or 6 bits) 56cabdff1aSopenharmony_ci * @param pitch_delay_min lower bound (integer) of pitch delay interval 57cabdff1aSopenharmony_ci * for second subframe 58cabdff1aSopenharmony_ci * 59cabdff1aSopenharmony_ci * @return pitch delay in 1/3 units 60cabdff1aSopenharmony_ci * 61cabdff1aSopenharmony_ci * Pitch delay is coded: 62cabdff1aSopenharmony_ci * with 1/3 resolution, -6 < pitch_delay - int(prev_pitch_delay) < 5 63cabdff1aSopenharmony_ci * 64cabdff1aSopenharmony_ci * @remark The routine is used in G.729 @@8k, AMR @@10.2k, AMR @@7.95k, 65cabdff1aSopenharmony_ci * AMR @@7.4k for the second subframe. 66cabdff1aSopenharmony_ci */ 67cabdff1aSopenharmony_cistatic inline int ff_acelp_decode_5_6_bit_to_2nd_delay3(int ac_index, 68cabdff1aSopenharmony_ci int pitch_delay_min) 69cabdff1aSopenharmony_ci{ 70cabdff1aSopenharmony_ci return 3 * pitch_delay_min + ac_index - 2; 71cabdff1aSopenharmony_ci} 72cabdff1aSopenharmony_ci 73cabdff1aSopenharmony_ci/** 74cabdff1aSopenharmony_ci * @brief Decode pitch delay with 1/3 precision. 75cabdff1aSopenharmony_ci * @param ac_index adaptive codebook index (4 bits) 76cabdff1aSopenharmony_ci * @param pitch_delay_min lower bound (integer) of pitch delay interval for 77cabdff1aSopenharmony_ci * second subframe 78cabdff1aSopenharmony_ci * 79cabdff1aSopenharmony_ci * @return pitch delay in 1/3 units 80cabdff1aSopenharmony_ci * 81cabdff1aSopenharmony_ci * Pitch delay is coded: 82cabdff1aSopenharmony_ci * integers only, -6 < pitch_delay - int(prev_pitch_delay) <= -2 83cabdff1aSopenharmony_ci * with 1/3 resolution, -2 < pitch_delay - int(prev_pitch_delay) < 1 84cabdff1aSopenharmony_ci * integers only, 1 <= pitch_delay - int(prev_pitch_delay) < 5 85cabdff1aSopenharmony_ci * 86cabdff1aSopenharmony_ci * @remark The routine is used in G.729 @@6.4k, AMR @@6.7k, AMR @@5.9k, 87cabdff1aSopenharmony_ci * AMR @@5.15k, AMR @@4.75k for the second subframe. 88cabdff1aSopenharmony_ci */ 89cabdff1aSopenharmony_cistatic inline int ff_acelp_decode_4bit_to_2nd_delay3(int ac_index, 90cabdff1aSopenharmony_ci int pitch_delay_min) 91cabdff1aSopenharmony_ci{ 92cabdff1aSopenharmony_ci if (ac_index < 4) 93cabdff1aSopenharmony_ci return 3 * (ac_index + pitch_delay_min); 94cabdff1aSopenharmony_ci else if (ac_index < 12) 95cabdff1aSopenharmony_ci return 3 * pitch_delay_min + ac_index + 6; 96cabdff1aSopenharmony_ci else 97cabdff1aSopenharmony_ci return 3 * (ac_index + pitch_delay_min) - 18; 98cabdff1aSopenharmony_ci} 99cabdff1aSopenharmony_ci 100cabdff1aSopenharmony_ci/** 101cabdff1aSopenharmony_ci * @brief Decode pitch delay of the first subframe encoded by 9 bits 102cabdff1aSopenharmony_ci * with 1/6 precision. 103cabdff1aSopenharmony_ci * @param ac_index adaptive codebook index (9 bits) 104cabdff1aSopenharmony_ci * 105cabdff1aSopenharmony_ci * @return pitch delay in 1/6 units 106cabdff1aSopenharmony_ci * 107cabdff1aSopenharmony_ci * Pitch delay is coded: 108cabdff1aSopenharmony_ci * with 1/6 resolution, 17 < pitch_delay < 95 109cabdff1aSopenharmony_ci * integers only, 95 <= pitch_delay <= 143 110cabdff1aSopenharmony_ci * 111cabdff1aSopenharmony_ci * @remark The routine is used in AMR @@12.2k for the first and third subframes. 112cabdff1aSopenharmony_ci */ 113cabdff1aSopenharmony_cistatic inline int ff_acelp_decode_9bit_to_1st_delay6(int ac_index) 114cabdff1aSopenharmony_ci{ 115cabdff1aSopenharmony_ci if (ac_index < 463) 116cabdff1aSopenharmony_ci return ac_index + 105; 117cabdff1aSopenharmony_ci else 118cabdff1aSopenharmony_ci return 6 * (ac_index - 368); 119cabdff1aSopenharmony_ci} 120cabdff1aSopenharmony_ci 121cabdff1aSopenharmony_ci/** 122cabdff1aSopenharmony_ci * @brief Decode pitch delay of the second subframe encoded by 6 bits 123cabdff1aSopenharmony_ci * with 1/6 precision. 124cabdff1aSopenharmony_ci * @param ac_index adaptive codebook index (6 bits) 125cabdff1aSopenharmony_ci * @param pitch_delay_min lower bound (integer) of pitch delay interval for 126cabdff1aSopenharmony_ci * second subframe 127cabdff1aSopenharmony_ci * 128cabdff1aSopenharmony_ci * @return pitch delay in 1/6 units 129cabdff1aSopenharmony_ci * 130cabdff1aSopenharmony_ci * Pitch delay is coded: 131cabdff1aSopenharmony_ci * with 1/6 resolution, -6 < pitch_delay - int(prev_pitch_delay) < 5 132cabdff1aSopenharmony_ci * 133cabdff1aSopenharmony_ci * @remark The routine is used in AMR @@12.2k for the second and fourth subframes. 134cabdff1aSopenharmony_ci */ 135cabdff1aSopenharmony_cistatic inline int ff_acelp_decode_6bit_to_2nd_delay6(int ac_index, 136cabdff1aSopenharmony_ci int pitch_delay_min) 137cabdff1aSopenharmony_ci{ 138cabdff1aSopenharmony_ci return 6 * pitch_delay_min + ac_index - 3; 139cabdff1aSopenharmony_ci} 140cabdff1aSopenharmony_ci 141cabdff1aSopenharmony_ci/** 142cabdff1aSopenharmony_ci * @brief Update past quantized energies 143cabdff1aSopenharmony_ci * @param[in,out] quant_energy past quantized energies (5.10) 144cabdff1aSopenharmony_ci * @param gain_corr_factor gain correction factor 145cabdff1aSopenharmony_ci * @param log2_ma_pred_order log2() of MA prediction order 146cabdff1aSopenharmony_ci * @param erasure frame erasure flag 147cabdff1aSopenharmony_ci * 148cabdff1aSopenharmony_ci * If frame erasure flag is not equal to zero, memory is updated with 149cabdff1aSopenharmony_ci * averaged energy, attenuated by 4dB: 150cabdff1aSopenharmony_ci * max(avg(quant_energy[i])-4, -14), i=0,ma_pred_order 151cabdff1aSopenharmony_ci * 152cabdff1aSopenharmony_ci * In normal mode memory is updated with 153cabdff1aSopenharmony_ci * Er - Ep = 20 * log10(gain_corr_factor) 154cabdff1aSopenharmony_ci * 155cabdff1aSopenharmony_ci * @remark The routine is used in G.729 and AMR (all modes). 156cabdff1aSopenharmony_ci */ 157cabdff1aSopenharmony_civoid ff_acelp_update_past_gain( 158cabdff1aSopenharmony_ci int16_t* quant_energy, 159cabdff1aSopenharmony_ci int gain_corr_factor, 160cabdff1aSopenharmony_ci int log2_ma_pred_order, 161cabdff1aSopenharmony_ci int erasure); 162cabdff1aSopenharmony_ci 163cabdff1aSopenharmony_ci/** 164cabdff1aSopenharmony_ci * @brief Decode the adaptive codebook gain and add 165cabdff1aSopenharmony_ci * correction (4.1.5 and 3.9.1 of G.729). 166cabdff1aSopenharmony_ci * @param adsp initialized audio DSP context 167cabdff1aSopenharmony_ci * @param gain_corr_factor gain correction factor (2.13) 168cabdff1aSopenharmony_ci * @param fc_v fixed-codebook vector (2.13) 169cabdff1aSopenharmony_ci * @param mr_energy mean innovation energy and fixed-point correction (7.13) 170cabdff1aSopenharmony_ci * @param[in,out] quant_energy past quantized energies (5.10) 171cabdff1aSopenharmony_ci * @param subframe_size length of subframe 172cabdff1aSopenharmony_ci * 173cabdff1aSopenharmony_ci * @return quantized fixed-codebook gain (14.1) 174cabdff1aSopenharmony_ci * 175cabdff1aSopenharmony_ci * The routine implements equations 69, 66 and 71 of the G.729 specification (3.9.1) 176cabdff1aSopenharmony_ci * 177cabdff1aSopenharmony_ci * Em - mean innovation energy (dB, constant, depends on decoding algorithm) 178cabdff1aSopenharmony_ci * Ep - mean-removed predicted energy (dB) 179cabdff1aSopenharmony_ci * Er - mean-removed innovation energy (dB) 180cabdff1aSopenharmony_ci * Ei - mean energy of the fixed-codebook contribution (dB) 181cabdff1aSopenharmony_ci * N - subframe_size 182cabdff1aSopenharmony_ci * M - MA (Moving Average) prediction order 183cabdff1aSopenharmony_ci * gc - fixed-codebook gain 184cabdff1aSopenharmony_ci * gc_p - predicted fixed-codebook gain 185cabdff1aSopenharmony_ci * 186cabdff1aSopenharmony_ci * Fixed codebook gain is computed using predicted gain gc_p and 187cabdff1aSopenharmony_ci * correction factor gain_corr_factor as shown below: 188cabdff1aSopenharmony_ci * 189cabdff1aSopenharmony_ci * gc = gc_p * gain_corr_factor 190cabdff1aSopenharmony_ci * 191cabdff1aSopenharmony_ci * The predicted fixed codebook gain gc_p is found by predicting 192cabdff1aSopenharmony_ci * the energy of the fixed-codebook contribution from the energy 193cabdff1aSopenharmony_ci * of previous fixed-codebook contributions. 194cabdff1aSopenharmony_ci * 195cabdff1aSopenharmony_ci * mean = 1/N * sum(i,0,N){ fc_v[i] * fc_v[i] } 196cabdff1aSopenharmony_ci * 197cabdff1aSopenharmony_ci * Ei = 10log(mean) 198cabdff1aSopenharmony_ci * 199cabdff1aSopenharmony_ci * Er = 10log(1/N * gc^2 * mean) - Em = 20log(gc) + Ei - Em 200cabdff1aSopenharmony_ci * 201cabdff1aSopenharmony_ci * Replacing Er with Ep and gc with gc_p we will receive: 202cabdff1aSopenharmony_ci * 203cabdff1aSopenharmony_ci * Ep = 10log(1/N * gc_p^2 * mean) - Em = 20log(gc_p) + Ei - Em 204cabdff1aSopenharmony_ci * 205cabdff1aSopenharmony_ci * and from above: 206cabdff1aSopenharmony_ci * 207cabdff1aSopenharmony_ci * gc_p = 10^((Ep - Ei + Em) / 20) 208cabdff1aSopenharmony_ci * 209cabdff1aSopenharmony_ci * Ep is predicted using past energies and prediction coefficients: 210cabdff1aSopenharmony_ci * 211cabdff1aSopenharmony_ci * Ep = sum(i,0,M){ ma_prediction_coeff[i] * quant_energy[i] } 212cabdff1aSopenharmony_ci * 213cabdff1aSopenharmony_ci * gc_p in fixed-point arithmetic is calculated as following: 214cabdff1aSopenharmony_ci * 215cabdff1aSopenharmony_ci * mean = 1/N * sum(i,0,N){ (fc_v[i] / 2^13) * (fc_v[i] / 2^13) } = 216cabdff1aSopenharmony_ci * = 1/N * sum(i,0,N) { fc_v[i] * fc_v[i] } / 2^26 217cabdff1aSopenharmony_ci * 218cabdff1aSopenharmony_ci * Ei = 10log(mean) = -10log(N) - 10log(2^26) + 219cabdff1aSopenharmony_ci * + 10log(sum(i,0,N) { fc_v[i] * fc_v[i] }) 220cabdff1aSopenharmony_ci * 221cabdff1aSopenharmony_ci * Ep - Ei + Em = Ep + Em + 10log(N) + 10log(2^26) - 222cabdff1aSopenharmony_ci * - 10log(sum(i,0,N) { fc_v[i] * fc_v[i] }) = 223cabdff1aSopenharmony_ci * = Ep + mr_energy - 10log(sum(i,0,N) { fc_v[i] * fc_v[i] }) 224cabdff1aSopenharmony_ci * 225cabdff1aSopenharmony_ci * gc_p = 10 ^ ((Ep - Ei + Em) / 20) = 226cabdff1aSopenharmony_ci * = 2 ^ (3.3219 * (Ep - Ei + Em) / 20) = 2 ^ (0.166 * (Ep - Ei + Em)) 227cabdff1aSopenharmony_ci * 228cabdff1aSopenharmony_ci * where 229cabdff1aSopenharmony_ci * 230cabdff1aSopenharmony_ci * mr_energy = Em + 10log(N) + 10log(2^26) 231cabdff1aSopenharmony_ci * 232cabdff1aSopenharmony_ci * @remark The routine is used in G.729 and AMR (all modes). 233cabdff1aSopenharmony_ci */ 234cabdff1aSopenharmony_ciint16_t ff_acelp_decode_gain_code( 235cabdff1aSopenharmony_ci AudioDSPContext *adsp, 236cabdff1aSopenharmony_ci int gain_corr_factor, 237cabdff1aSopenharmony_ci const int16_t* fc_v, 238cabdff1aSopenharmony_ci int mr_energy, 239cabdff1aSopenharmony_ci const int16_t* quant_energy, 240cabdff1aSopenharmony_ci const int16_t* ma_prediction_coeff, 241cabdff1aSopenharmony_ci int subframe_size, 242cabdff1aSopenharmony_ci int max_pred_order); 243cabdff1aSopenharmony_ci 244cabdff1aSopenharmony_ci/** 245cabdff1aSopenharmony_ci * Calculate fixed gain (part of section 6.1.3 of AMR spec) 246cabdff1aSopenharmony_ci * 247cabdff1aSopenharmony_ci * @param fixed_gain_factor gain correction factor 248cabdff1aSopenharmony_ci * @param fixed_mean_energy mean decoded algebraic codebook vector energy 249cabdff1aSopenharmony_ci * @param prediction_error vector of the quantified predictor errors of 250cabdff1aSopenharmony_ci * the four previous subframes. It is updated by this function. 251cabdff1aSopenharmony_ci * @param energy_mean desired mean innovation energy 252cabdff1aSopenharmony_ci * @param pred_table table of four moving average coefficients 253cabdff1aSopenharmony_ci */ 254cabdff1aSopenharmony_cifloat ff_amr_set_fixed_gain(float fixed_gain_factor, float fixed_mean_energy, 255cabdff1aSopenharmony_ci float *prediction_error, float energy_mean, 256cabdff1aSopenharmony_ci const float *pred_table); 257cabdff1aSopenharmony_ci 258cabdff1aSopenharmony_ci 259cabdff1aSopenharmony_ci/** 260cabdff1aSopenharmony_ci * Decode the adaptive codebook index to the integer and fractional parts 261cabdff1aSopenharmony_ci * of the pitch lag for one subframe at 1/3 fractional precision. 262cabdff1aSopenharmony_ci * 263cabdff1aSopenharmony_ci * The choice of pitch lag is described in 3GPP TS 26.090 section 5.6.1. 264cabdff1aSopenharmony_ci * 265cabdff1aSopenharmony_ci * @param lag_int integer part of pitch lag of the current subframe 266cabdff1aSopenharmony_ci * @param lag_frac fractional part of pitch lag of the current subframe 267cabdff1aSopenharmony_ci * @param pitch_index parsed adaptive codebook (pitch) index 268cabdff1aSopenharmony_ci * @param prev_lag_int integer part of pitch lag for the previous subframe 269cabdff1aSopenharmony_ci * @param subframe current subframe number 270cabdff1aSopenharmony_ci * @param third_as_first treat the third frame the same way as the first 271cabdff1aSopenharmony_ci */ 272cabdff1aSopenharmony_civoid ff_decode_pitch_lag(int *lag_int, int *lag_frac, int pitch_index, 273cabdff1aSopenharmony_ci const int prev_lag_int, const int subframe, 274cabdff1aSopenharmony_ci int third_as_first, int resolution); 275cabdff1aSopenharmony_ci 276cabdff1aSopenharmony_ci#endif /* AVCODEC_ACELP_PITCH_DELAY_H */ 277