⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qgain475.c

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.10平台上编译为嵌入式图形界面操作系统。
💻 C
📖 第 1 页 / 共 2 页
字号:
/***********************************************************************************      GSM AMR-NB speech codec   R98   Version 7.6.0   December 12, 2001*                                R99   Version 3.3.0                *                                REL-4 Version 4.1.0                ***********************************************************************************      File             : qg475.c*      Purpose          : Quantization of pitch and codebook gains for MR475.**********************************************************************************//**********************************************************************************                         MODULE INCLUDE FILE AND VERSION ID*********************************************************************************/#include "qgain475.h"const char qgain475_id[] = "@(#)$Id $" qgain475_h;/**********************************************************************************                         INCLUDE FILES*********************************************************************************/#include <stdio.h>#include <stdlib.h>#include "typedef.h"#include "basic_op.h"#include "mac_32.h"#include "mode.h"#include "count.h"#include "cnst.h"#include "pow2.h"#include "log2.h"/**********************************************************************************                         LOCAL VARIABLES AND TABLES*********************************************************************************//* minimum allowed gain code prediction error: 102.887/4096 = 0.0251189 */#define MIN_QUA_ENER         ( -5443) /* Q10 <->    log2 (0.0251189) */#define MIN_QUA_ENER_MR122   (-32768) /* Q10 <-> 20*log10(0.0251189) *//* minimum allowed gain code prediction error: 32000/4096 = 7.8125 */#define MAX_QUA_ENER         (  3037) /* Q10 <->    log2 (7.8125)    */#define MAX_QUA_ENER_MR122   ( 18284) /* Q10 <-> 20*log10(7.8125)    */#include "qgain475.tab"/**********************************************************************************                         PRIVATE PROGRAM CODE*********************************************************************************/static void MR475_quant_store_results(    gc_predState *pred_st, /* i/o: gain predictor state struct               */    const Word16 *p,       /* i  : pointer to selected quantizer table entry */    Word16 gcode0,         /* i  : predicted CB gain,     Q(14 - exp_gcode0) */    Word16 exp_gcode0,     /* i  : exponent of predicted CB gain,        Q0  */    Word16 *gain_pit,      /* o  : Pitch gain,                           Q14 */    Word16 *gain_cod       /* o  : Code gain,                            Q1  */){    Word16 g_code, exp, frac, tmp;    Word32 L_tmp;    Word16 qua_ener_MR122; /* o  : quantized energy error, MR122 version Q10 */    Word16 qua_ener;       /* o  : quantized energy error,               Q10 */    /* Read the quantized gains */    *gain_pit = *p++;                move16 ();    g_code = *p++;                   move16 ();    /*------------------------------------------------------------------*     *  calculate final fixed codebook gain:                            *     *  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                            *     *                                                                  *     *   gc = gc0 * g                                                   *     *------------------------------------------------------------------*/    L_tmp = L_mult(g_code, gcode0);    L_tmp = L_shr(L_tmp, sub(10, exp_gcode0));    *gain_cod = extract_h(L_tmp);    /*------------------------------------------------------------------*     *  calculate predictor update values and update gain predictor:    *     *  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~    *     *                                                                  *     *   qua_ener       = log2(g)                                       *     *   qua_ener_MR122 = 20*log10(g)                                   *     *------------------------------------------------------------------*/    Log2 (L_deposit_l (g_code), &exp, &frac); /* Log2(x Q12) = log2(x) + 12 */    exp = sub(exp, 12);    tmp = shr_r (frac, 5);    qua_ener_MR122 = add (tmp, shl (exp, 10));    L_tmp = Mpy_32_16(exp, frac, 24660); /* 24660 Q12 ~= 6.0206 = 20*log10(2) */    qua_ener = round (L_shl (L_tmp, 13)); /* Q12 * Q0 = Q13 -> Q10 */    gc_pred_update(pred_st, qua_ener_MR122, qua_ener);}/**********************************************************************************                         PUBLIC PROGRAM CODE*********************************************************************************//************************************************************************* * * FUNCTION:  MR475_update_unq_pred() * * PURPOSE:   use optimum codebook gain and update "unquantized" *            gain predictor with the (bounded) prediction error * *************************************************************************/voidMR475_update_unq_pred(    gc_predState *pred_st, /* i/o: gain predictor state struct            */    Word16 exp_gcode0,     /* i  : predicted CB gain (exponent MSW),  Q0  */    Word16 frac_gcode0,    /* i  : predicted CB gain (exponent LSW),  Q15 */    Word16 cod_gain_exp,   /* i  : optimum codebook gain (exponent),  Q0  */    Word16 cod_gain_frac   /* i  : optimum codebook gain (fraction),  Q15 */){    Word16 tmp, exp, frac;    Word16 qua_ener, qua_ener_MR122;    Word32 L_tmp;    /* calculate prediction error factor (given optimum CB gain gcu):     *     *   predErrFact = gcu / gcode0     *   (limit to MIN_PRED_ERR_FACT <= predErrFact <= MAX_PRED_ERR_FACT     *    -> limit qua_ener*)     *     * calculate prediction error (log):     *     *   qua_ener_MR122 = log2(predErrFact)     *   qua_ener       = 20*log10(predErrFact)     *     */    if (test(), cod_gain_frac <= 0)    {        /* if gcu <= 0 -> predErrFact = 0 < MIN_PRED_ERR_FACT */        /* -> set qua_ener(_MR122) directly                   */        qua_ener = MIN_QUA_ENER;             move16 ();        qua_ener_MR122 = MIN_QUA_ENER_MR122; move16 ();    }    else    {        /* convert gcode0 from DPF to standard fraction/exponent format */        /* with normalized frac, i.e. 16384 <= frac <= 32767            */        /* Note: exponent correction (exp=exp-14) is done after div_s   */        frac_gcode0 = extract_l (Pow2 (14, frac_gcode0));        /* make sure cod_gain_frac < frac_gcode0  for div_s */        if (test (), sub(cod_gain_frac, frac_gcode0) >= 0)        {            cod_gain_frac = shr (cod_gain_frac, 1);            cod_gain_exp = add (cod_gain_exp, 1);        }        /*          predErrFact             = gcu / gcode0             = cod_gain_frac/frac_gcode0 * 2^(cod_gain_exp-(exp_gcode0-14))             = div_s (c_g_f, frac_gcode0)*2^-15 * 2^(c_g_e-exp_gcode0+14)             = div_s * 2^(cod_gain_exp-exp_gcode0 - 1)        */        frac = div_s (cod_gain_frac, frac_gcode0);        tmp = sub (sub (cod_gain_exp, exp_gcode0), 1);        Log2 (L_deposit_l (frac), &exp, &frac);        exp = add (exp, tmp);        /* calculate prediction error (log2, Q10) */        qua_ener_MR122 = shr_r (frac, 5);        qua_ener_MR122 = add (qua_ener_MR122, shl (exp, 10));        if (test (), sub(qua_ener_MR122, MIN_QUA_ENER_MR122) < 0)        {            qua_ener = MIN_QUA_ENER;             move16 ();            qua_ener_MR122 = MIN_QUA_ENER_MR122; move16 ();        }        else if (test (), sub(qua_ener_MR122, MAX_QUA_ENER_MR122) > 0)        {            qua_ener = MAX_QUA_ENER;             move16 ();            qua_ener_MR122 = MAX_QUA_ENER_MR122; move16 ();        }        else        {            /* calculate prediction error (20*log10, Q10) */            L_tmp = Mpy_32_16(exp, frac, 24660);            /* 24660 Q12 ~= 6.0206 = 20*log10(2) */            qua_ener = round (L_shl (L_tmp, 13));            /* Q12 * Q0 = Q13 -> Q26 -> Q10     */        }    }    /* update MA predictor memory */    gc_pred_update(pred_st, qua_ener_MR122, qua_ener);}/************************************************************************* * * FUNCTION:  MR475_gain_quant() * * PURPOSE: Quantization of pitch and codebook gains for two subframes *          (using predicted codebook gain) * *************************************************************************/Word16MR475_gain_quant(              /* o  : index of quantization.                 */    gc_predState *pred_st,     /* i/o: gain predictor state struct            */                               /* data from subframe 0 (or 2) */    Word16 sf0_exp_gcode0,     /* i  : predicted CB gain (exponent),      Q0  */    Word16 sf0_frac_gcode0,    /* i  : predicted CB gain (fraction),      Q15 */    Word16 sf0_exp_coeff[],    /* i  : energy coeff. (5), exponent part,  Q0  */    Word16 sf0_frac_coeff[],   /* i  : energy coeff. (5), fraction part,  Q15 */                               /*      (frac_coeff and exp_coeff computed in  */                               /*       calc_filt_energies())                 */    Word16 sf0_exp_target_en,  /* i  : exponent of target energy,         Q0  */    Word16 sf0_frac_target_en, /* i  : fraction of target energy,         Q15 */                               /* data from subframe 1 (or 3) */    Word16 sf1_code_nosharp[], /* i  : innovative codebook vector (L_SUBFR)   */                               /*      (whithout pitch sharpening)            */    Word16 sf1_exp_gcode0,     /* i  : predicted CB gain (exponent),      Q0  */    Word16 sf1_frac_gcode0,    /* i  : predicted CB gain (fraction),      Q15 */    Word16 sf1_exp_coeff[],    /* i  : energy coeff. (5), exponent part,  Q0  */    Word16 sf1_frac_coeff[],   /* i  : energy coeff. (5), fraction part,  Q15 */                               /*      (frac_coeff and exp_coeff computed in  */                               /*       calc_filt_energies())                 */    Word16 sf1_exp_target_en,  /* i  : exponent of target energy,         Q0  */    Word16 sf1_frac_target_en, /* i  : fraction of target energy,         Q15 */    Word16 gp_limit,           /* i  : pitch gain limit                       */    Word16 *sf0_gain_pit,      /* o  : Pitch gain,                        Q14 */    Word16 *sf0_gain_cod,      /* o  : Code gain,                         Q1  */    Word16 *sf1_gain_pit,      /* o  : Pitch gain,                        Q14 */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -