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

📄 phase_dispersion.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: phase_dispersion.cpp     Date: 05/08/2007------------------------------------------------------------------------------ REVISION HISTORY Description:------------------------------------------------------------------------------ INPUT AND OUTPUT DEFINITIONS     int16 gain_code,               (i) Q0  : gain of code     int16 gain_pit,                (i) Q14 : gain of pitch     int16 code[],                  (i/o)   : code vector     int16 mode,                    (i)     : level, 0=hi, 1=lo, 2=off     int16 disp_mem[],              (i/o)   : static memory (size = 8)     int16 ScratchMem[]------------------------------------------------------------------------------ FUNCTION DESCRIPTION    post-processing to enhance noise in low bit rate.------------------------------------------------------------------------------ REQUIREMENTS------------------------------------------------------------------------------ REFERENCES------------------------------------------------------------------------------ PSEUDO-CODE------------------------------------------------------------------------------*//*----------------------------------------------------------------------------; INCLUDES----------------------------------------------------------------------------*/#include "pv_amr_wb_type_defs.h"#include "pvamrwbdecoder_basic_op.h"#include "pvamrwbdecoder_cnst.h"#include "pvamrwbdecoder_mem_funcs.h"#include "pvamrwbdecoder_acelp.h"#include "pvamrwb_math_op.h"/*----------------------------------------------------------------------------; MACROS; Define module specific macros here----------------------------------------------------------------------------*//*----------------------------------------------------------------------------; DEFINES; Include all pre-processor statements here. Include conditional; compile variables also.----------------------------------------------------------------------------*/#define pitch_0_9  14746                   /* 0.9 in Q14 */#define pitch_0_6  9830                    /* 0.6 in Q14 */#define L_SUBFR 64/*----------------------------------------------------------------------------; LOCAL FUNCTION DEFINITIONS; Function Prototype declaration----------------------------------------------------------------------------*//*----------------------------------------------------------------------------; LOCAL STORE/BUFFER/POINTER DEFINITIONS; Variable declaration - defined here and used outside this module----------------------------------------------------------------------------*//* impulse response with phase dispersion *//* 2.0 - 6.4 kHz phase dispersion */const int16 ph_imp_low[L_SUBFR] ={    20182,  9693,  3270, -3437, 2864, -5240,  1589, -1357,    600,  3893, -1497,  -698, 1203, -5249,  1199,  5371,    -1488,  -705, -2887,  1976,  898,   721, -3876,  4227,    -5112,  6400, -1032, -4725, 4093, -4352,  3205,  2130,    -1996, -1835,  2648, -1786, -406,   573,  2484, -3608,    3139, -1363, -2566,  3808, -639, -2051,  -541,  2376,    3932, -6262,  1432, -3601, 4889,   370,   567, -1163,    -2854,  1914,    39, -2418, 3454,  2975, -4021,  3431};/* 3.2 - 6.4 kHz phase dispersion */const int16 ph_imp_mid[L_SUBFR] ={    24098, 10460, -5263,  -763,  2048,  -927,  1753, -3323,    2212,   652, -2146,  2487, -3539,  4109, -2107,  -374,    -626,  4270, -5485,  2235,  1858, -2769,   744,  1140,    -763, -1615,  4060, -4574,  2982, -1163,   731, -1098,    803,   167,  -714,   606,  -560,   639,    43, -1766,    3228, -2782,   665,   763,   233, -2002,  1291,  1871,    -3470,  1032,  2710, -4040,  3624, -4214,  5292, -4270,    1563,   108,  -580,  1642, -2458,   957,  544,   2540};/*----------------------------------------------------------------------------; 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 phase_dispersion(    int16 gain_code,             /* (i) Q0  : gain of code             */    int16 gain_pit,              /* (i) Q14 : gain of pitch            */    int16 code[],                /* (i/o)   : code vector              */    int16 mode,                  /* (i)     : level, 0=hi, 1=lo, 2=off */    int16 disp_mem[],            /* (i/o)   : static memory (size = 8) */    int16 ScratchMem[]){    int16 i, j, state;    int16 *prev_gain_pit, *prev_gain_code, *prev_state;    int16 *code2 = ScratchMem;    prev_state = disp_mem;    prev_gain_code = disp_mem + 1;    prev_gain_pit = disp_mem + 2;    pv_memset((void *)code2, 0, (2*L_SUBFR)*sizeof(*code2));    if (gain_pit < pitch_0_6)    {        state = 0;    }    else if (gain_pit < pitch_0_9)    {        state = 1;    }    else    {        state = 2;    }    for (i = 5; i > 0; i--)    {        prev_gain_pit[i] = prev_gain_pit[i - 1];    }    prev_gain_pit[0] = gain_pit;    if (sub_int16(gain_code, *prev_gain_code) > shl_int16(*prev_gain_code, 1))    {        /* onset */        if (state < 2)        {            state++;        }    }    else    {        j = 0;        for (i = 0; i < 6; i++)        {            if (prev_gain_pit[i] < pitch_0_6)            {                j++;            }        }        if (j > 2)        {            state = 0;        }        if (state > *prev_state + 1)        {            state--;        }    }    *prev_gain_code = gain_code;    *prev_state = state;    /* circular convolution */    state += mode;              /* level of dispersion */    if (state == 0)    {        for (i = 0; i < L_SUBFR; i++)        {            if (code[i] != 0)            {                for (j = 0; j < L_SUBFR; j++)                {                    code2[i + j] = add_int16(code2[i + j], mult_int16_r(code[i], ph_imp_low[j]));                }            }        }    }    else if (state == 1)    {        for (i = 0; i < L_SUBFR; i++)        {            if (code[i] != 0)            {                for (j = 0; j < L_SUBFR; j++)                {                    code2[i + j] = add_int16(code2[i + j], mult_int16_r(code[i], ph_imp_mid[j]));                }            }        }    }    if (state < 2)    {        for (i = 0; i < L_SUBFR; i++)        {            code[i] = add_int16(code2[i], code2[i + L_SUBFR]);        }    }    return;}

⌨️ 快捷键说明

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