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

📄 dec_alg_codebook.cpp

📁 实现3GPP的GSM中AMR语音的CODECS。
💻 CPP
字号:
/* ------------------------------------------------------------------ * Copyright (C) 2008 PacketVideo * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. * See the License for the specific language governing permissions * and limitations under the License. * ------------------------------------------------------------------- *//****************************************************************************************Portions of this file are derived from the following 3GPP standard:    3GPP TS 26.173    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec    Available from http://www.3gpp.org(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)Permission to distribute, modify and use this file under the standard licenseterms listed above has been obtained from the copyright holder.****************************************************************************************//*------------------------------------------------------------------------------ Filename: dec_alg_codebook.cpp     Date: 05/08/2004------------------------------------------------------------------------------ REVISION HISTORY Description:------------------------------------------------------------------------------ INPUT AND OUTPUT DEFINITIONS------------------------------------------------------------------------------ FUNCTION DESCRIPTION        decoding of algebraic codebook------------------------------------------------------------------------------ REQUIREMENTS------------------------------------------------------------------------------ REFERENCES------------------------------------------------------------------------------ PSEUDO-CODE------------------------------------------------------------------------------*//*----------------------------------------------------------------------------; INCLUDES----------------------------------------------------------------------------*/#include "pv_amr_wb_type_defs.h"#include "pvamrwbdecoder_basic_op.h"#include "q_pulse.h"/*----------------------------------------------------------------------------; MACROS; Define module specific macros here----------------------------------------------------------------------------*//*----------------------------------------------------------------------------; DEFINES; Include all pre-processor statements here. Include conditional; compile variables also.----------------------------------------------------------------------------*/#define NB_POS 16                          /* pos in track, mask for sign bit *//*----------------------------------------------------------------------------; DEFINES; Include all pre-processor statements here. Include conditional; compile variables also.----------------------------------------------------------------------------*//*----------------------------------------------------------------------------; LOCAL FUNCTION DEFINITIONS; Function Prototype declaration----------------------------------------------------------------------------*//*----------------------------------------------------------------------------; LOCAL STORE/BUFFER/POINTER DEFINITIONS; Variable declaration - defined here and used outside this module----------------------------------------------------------------------------*//*----------------------------------------------------------------------------; EXTERNAL FUNCTION REFERENCES; Declare functions defined elsewhere and referenced in this module----------------------------------------------------------------------------*//*----------------------------------------------------------------------------; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES; Declare variables used in this module but defined elsewhere----------------------------------------------------------------------------*//*----------------------------------------------------------------------------; FUNCTION CODE----------------------------------------------------------------------------*/void dec_1p_N1(int32 index, int16 N, int16 offset, int16 pos[]){    int16 pos1;    int32 mask, i;    mask = ((1 << N) - 1);    /*-------------------------------------------------------*     * Decode 1 pulse with N+1 bits:                         *     *-------------------------------------------------------*/    pos1 = ((index & mask) + offset);    i = ((index >> N) & 1L);            /* i = ((index >> N) & 1); */    if (i == 1)    {        pos1 += NB_POS;    }    pos[0] = pos1;}/*----------------------------------------------------------------------------; FUNCTION CODE----------------------------------------------------------------------------*/void dec_2p_2N1(int32 index, int16 N, int16 offset, int16 pos[]){    int16 pos1, pos2, tmp;    int32 mask, i;    mask = (int32)(sub_int16(shl_int16(1, N), 1)); /* mask = ((1<<N)-1); */    /*-------------------------------------------------------*     * Decode 2 pulses with 2*N+1 bits:                      *     *-------------------------------------------------------*/    /* pos1 = (((index >> N) & mask) + offset); */    pos1 = (int16)(add_int32((shr_int32(index, N) & mask), (int32)(offset)));    tmp = shl_int16(N, 1);    i = (index >> tmp) & 1L;         /* i = (index >> (2*N)) & 1; */    pos2 = add_int16((int16)(index & mask), offset); /* pos2 = ((index & mask) + offset); */    if (pos2 < pos1)              /* ((pos2 - pos1) < 0) */    {        if (i == 1)        {                                  /* (i == 1) */            pos1 += NB_POS;      /* pos1 += NB_POS; */        }        else        {            pos2 += NB_POS;      /* pos2 += NB_POS;	 */        }    }    else    {        if (i == 1)        {                                  /* (i == 1) */            pos1 += NB_POS;      /* pos1 += NB_POS; */            pos2 += NB_POS;      /* pos2 += NB_POS; */        }    }    pos[0] = pos1;    pos[1] = pos2;    return;}/*----------------------------------------------------------------------------; FUNCTION CODE----------------------------------------------------------------------------*/void dec_3p_3N1(int32 index, int16 N, int16 offset, int16 pos[]){    int16 j, tmp;    int32 mask, idx;    /*-------------------------------------------------------*     * Decode 3 pulses with 3*N+1 bits:                      *     *-------------------------------------------------------*/    tmp = sub_int16(shl_int16(N, 1), 1);               /* mask = ((1<<((2*N)-1))-1); */    mask = ((1 << ((2 * N) - 1)) - 1);    idx = index & mask;    j = offset;    tmp = (N << 1) - 1;    if (((index >> tmp) & 1L) != 0L)    {                                      /* if (((index >> ((2*N)-1)) & 1) == 1){ */        j += (1 << (N - 1)); /* j += (1<<(N-1)); */    }    dec_2p_2N1(idx, (int16)(N - 1), j, pos);    mask = ((1 << (N + 1)) - 1);    tmp = N << 1;                     /* idx = (index >> (2*N)) & mask; */    idx = (index >> tmp) & mask;    dec_1p_N1(idx, N, offset, pos + 2);    return;}/*----------------------------------------------------------------------------; FUNCTION CODE----------------------------------------------------------------------------*/void dec_4p_4N1(int32 index, int16 N, int16 offset, int16 pos[]){    int16 j, tmp;    int32 mask, idx;    /*-------------------------------------------------------*     * Decode 4 pulses with 4*N+1 bits:                      *     *-------------------------------------------------------*/    tmp = (N << 1) - 1;    mask = (1L << tmp) - 1L;    idx = index & mask;    j = offset;    tmp = (N << 1) - 1;    if (((index >> tmp) & 1L) != 0L)    {                                      /* (((index >> ((2*N)-1)) & 1) == 1) */        j += (1 << (N - 1)); /* j += (1<<(N-1)); */    }    dec_2p_2N1(idx, (int16)(N - 1), j, pos);    tmp = (N << 1) + 1;             /* mask = ((1<<((2*N)+1))-1); */    mask = (1L << tmp) - 1L;    idx = (index >> (N << 1)) & mask;   /* idx = (index >> (2*N)) & mask; */    dec_2p_2N1(idx, N, offset, pos + 2);      /* dec_2p_2N1(idx, N, offset, pos+2); */    return;}/*----------------------------------------------------------------------------; FUNCTION CODE----------------------------------------------------------------------------*/void dec_4p_4N(int32 index, int16 N, int16 offset, int16 pos[]){    int16 j, n_1, tmp;    /*-------------------------------------------------------*     * Decode 4 pulses with 4*N bits:                        *     *-------------------------------------------------------*/    n_1 = N - 1;    j = offset + (1 << n_1);          /* j = offset + (1 << n_1); */    tmp = (N << 2) - 2;    switch ((index >> tmp) & 3)    {                                      /* ((index >> ((4*N)-2)) & 3) */        case 0:            tmp = (n_1 << 2) + 1;            if ((index >> tmp) & 1)            {                                  /* (((index >> ((4*n_1)+1)) & 1) == 0) */                dec_4p_4N1(index, n_1, j, pos);            }            else            {                dec_4p_4N1(index, n_1, offset, pos);            }            break;        case 1:            tmp = (3 * n_1) + 1; /* dec_1p_N1((index>>((3*n_1)+1)), n_1, offset, pos) */            dec_1p_N1(index >> tmp, n_1, offset, pos);            dec_3p_3N1(index, n_1, j, pos + 1);            break;        case 2:            tmp = (n_1 << 1) + 1;       /* dec_2p_2N1((index>>((2*n_1)+1)), n_1, offset, pos); */            dec_2p_2N1(index >> tmp, n_1, offset, pos);            dec_2p_2N1(index, n_1, j, pos + 2);            break;        case 3:            tmp = n_1 + 1;                 /* dec_3p_3N1((index>>(n_1+1)), n_1, offset, pos); */            dec_3p_3N1(index >> tmp, n_1, offset, pos);            dec_1p_N1(index, n_1, j, pos + 3);            break;    }    return;}/*----------------------------------------------------------------------------; FUNCTION CODE----------------------------------------------------------------------------*/void dec_5p_5N(int32 index, int16 N, int16 offset, int16 pos[]){    int16 j, n_1, tmp;    int32 idx;    /*-------------------------------------------------------*     * Decode 5 pulses with 5*N bits:                        *     *-------------------------------------------------------*/    n_1 = (int16)(N - 1);    j = add_int16(offset, shl_int16(1, n_1));          /* j = offset + (1 << n_1); */    tmp = (N << 1) + 1;             /* idx = (index >> ((2*N)+1)); */    idx = index >> tmp;    tmp = (5 * N) - 1;    /* ((5*N)-1)) */    if ((index >> tmp) & 1)    /* ((index >> ((5*N)-1)) & 1)  */    {        dec_3p_3N1(idx, n_1, j, pos);        dec_2p_2N1(index, N, offset, pos + 3);    }    else    {        dec_3p_3N1(idx, n_1, offset, pos);        dec_2p_2N1(index, N, offset, pos + 3);    }    return;}/*----------------------------------------------------------------------------; FUNCTION CODE----------------------------------------------------------------------------*/void dec_6p_6N_2(int32 index, int16 N, int16 offset, int16 pos[]){    int16 j, n_1, offsetA, offsetB;    n_1 = N - 1;    j = offset + (1 << n_1);       /* j = offset + (1 << n_1); */    /* !!  N and n_1 are constants -> it doesn't need to be operated by Basic Operators */    offsetA = offsetB = j;    if (((index >> (6*N - 5)) & 1L) == 0)    {                                      /* if (((index >> ((6*N)-5)) & 1) == 0) */        offsetA = offset;    }    else    {        offsetB = offset;    }    switch ((index >> (6*N - 4)) & 3)    {                                      /* (index >> ((6*N)-4)) & 3 */        case 0:            dec_5p_5N(index >> N, n_1, offsetA, pos);  /* dec_5p_5N(index>>N, n_1, offsetA, pos); */            dec_1p_N1(index, n_1, offsetA, pos + 5);            break;        case 1:            dec_5p_5N(index >> N, n_1, offsetA, pos);  /* dec_5p_5N(index>>N, n_1, offsetA, pos); */            dec_1p_N1(index, n_1, offsetB, pos + 5);            break;        case 2:            dec_4p_4N(index >> (2*n_1 + 1), n_1, offsetA, pos); /* dec_4p_4N(index>>((2*n_1)+1 ), n_1, offsetA, pos); */            dec_2p_2N1(index, n_1, offsetB, pos + 4);            break;        case 3:            dec_3p_3N1(index >> (3*n_1 + 1), n_1, offset, pos); /* dec_3p_3N1(index>>((3*n_1)+ 1), n_1, offset, pos); */            dec_3p_3N1(index, n_1, j, pos + 3);            break;    }    return;}

⌨️ 快捷键说明

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