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

📄 int_lsf.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.073    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec    Available from http://www.3gpp.org(C) 2004, 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.****************************************************************************************//*------------------------------------------------------------------------------ Pathname: ./audio/gsm-amr/c/src/int_lsf.c     Date: 04/20/2000------------------------------------------------------------------------------ REVISION HISTORY Description: Put file into template and first pass at optimization. Description: Made changes based on comments from the review meeting. Used    pointers instead of index addressing in the arrays. Description: Added type definition to the input/output section. Fixed tabs.              Deleted pseudo-code. Description: Synchronized file with UMTS versin 3.2.0. Updated coding              template. Removed unnecessary include files. Description: Made the following changes per comments from Phase 2/3 review:              1. Modified FOR loops to count down.              2. Made some cosmetic changes in the Pseudo-code section. Description: Changed to pass in overflow flag pointer to the add() routine. Description:  Replaced "int" and/or "char" with OSCL defined types. Description:------------------------------------------------------------------------------*//*----------------------------------------------------------------------------; INCLUDES----------------------------------------------------------------------------*/#include    "int_lsf.h"#include    "typedef.h"#include    "basic_op.h"#include    "cnst.h"/*----------------------------------------------------------------------------; MACROS; Define module specific macros here----------------------------------------------------------------------------*//*----------------------------------------------------------------------------; 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----------------------------------------------------------------------------*//*------------------------------------------------------------------------------ FUNCTION NAME: Int_lsf------------------------------------------------------------------------------ INPUT AND OUTPUT DEFINITIONS Inputs:    lsf_old = LSF vector at the 4th SF of past frame (Word16)    lsf_new = LSF vector at the 4th SF of present frame (Word16)    i_subfr = Current subframe (equal to 0,40,80 or 120) (Word16)    lsf_out = interpolated LSF parameters for current subframe (Word16) Outputs:    lsf_out   = new interpolated LSF parameters for current subframe    pOverflow = pointer of type Flag * to overflow indicator. Returns:    None. Global Variables Used:    None. Local Variables Needed:    None.------------------------------------------------------------------------------ FUNCTION DESCRIPTION This function interpolates the LSFs for selected subframe. The 20 ms speech frame is divided into 4 subframes. The LSFs are interpolated at the 1st, 2nd and 3rd subframe and only forwarded at the 4th subframe.                      |------|------|------|------|                         sf1    sf2    sf3    sf4                   F0                          F1                 sf1:   3/4 F0 + 1/4 F1         sf3:   1/4 F0 + 3/4 F1                 sf2:   1/2 F0 + 1/2 F1         sf4:       F1------------------------------------------------------------------------------ REQUIREMENTS None.------------------------------------------------------------------------------ REFERENCES int_lsf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001------------------------------------------------------------------------------ PSEUDO-CODEvoid Int_lsf(    Word16 lsf_old[], // i : LSF vector at the 4th SF of past frame    Word16 lsf_new[], // i : LSF vector at the 4th SF of present frame    Word16 i_subfr,   // i : Pointer to current sf (equal to 0,40,80 or 120)    Word16 lsf_out[]  // o : interpolated LSF parameters for current sf){    Word16 i;    if ( i_subfr == 0 )    {       for (i = 0; i < M; i++) {          lsf_out[i] = add(sub(lsf_old[i], shr(lsf_old[i], 2)),                           shr(lsf_new[i], 2));       }    }    else if ( sub(i_subfr, 40) == 0 )    {       for (i = 0; i < M; i++) {          lsf_out[i] = add(shr(lsf_old[i],1), shr(lsf_new[i], 1) );       }    }    else if ( sub(i_subfr, 80) == 0 )    {       for (i = 0; i < M; i++) {          lsf_out[i] = add(shr(lsf_old[i], 2),                           sub(lsf_new[i], shr(lsf_new[i], 2)));       }    }    else if ( sub(i_subfr, 120) == 0 )    {       for (i = 0; i < M; i++) {          lsf_out[i] = lsf_new[i];       }    }    return;}------------------------------------------------------------------------------ RESOURCES USED [optional] When the code is written for a specific target processor the the resources used should be documented below. HEAP MEMORY USED: x bytes STACK MEMORY USED: x bytes CLOCK CYCLES: (cycle count equation for this function) + (variable                used to represent cycle count for each subroutine                called)     where: (cycle count variable) = cycle count for [subroutine                                     name]------------------------------------------------------------------------------ CAUTION [optional] [State any special notes, constraints or cautions for users of this function]------------------------------------------------------------------------------*/void Int_lsf(    Word16 lsf_old[], /* i : LSF vector at the 4th SF of past frame         */    Word16 lsf_new[], /* i : LSF vector at the 4th SF of present frame      */    Word16 i_subfr,   /* i : Current sf (equal to 0,40,80 or 120)           */    Word16 lsf_out[], /* o : interpolated LSF parameters for current sf     */    Flag  *pOverflow  /* o : flag set if overflow occurs                    */){    register Word16 i;    register Word16 temp1;    register Word16 temp2;    if (i_subfr == 0)    {        for (i = M - 1; i >= 0; i--)        {            if (*(lsf_old + i) < 0)            {                temp1 = ~(~(*(lsf_old + i)) >> 2);            }            else            {                temp1 = *(lsf_old + i) >> 2;            }            if (*(lsf_new + i) < 0)            {                temp2 = ~(~(*(lsf_new + i)) >> 2);            }            else            {                temp2 = *(lsf_new + i) >> 2;            }            *(lsf_out + i) = add((Word16)(*(lsf_old + i) - temp1),                                 (Word16)temp2,                                 pOverflow);        }    }    else if (i_subfr == 40)    {        for (i = M - 1; i >= 0; i--)        {            if (*(lsf_old + i) < 0)            {                temp1 = ~(~(*(lsf_old + i)) >> 1);            }            else            {                temp1 = *(lsf_old + i) >> 1;            }            if (*(lsf_new + i) < 0)            {                temp2 = ~(~(*(lsf_new + i)) >> 1);            }            else            {                temp2 = *(lsf_new + i) >> 1;            }            *(lsf_out + i) = add(                                 temp1,                                 temp2,                                 pOverflow);        }    }    else if (i_subfr == 80)    {        for (i = M - 1; i >= 0; i--)        {            if (*(lsf_old + i) < 0)            {                temp1 = ~(~(*(lsf_old + i)) >> 2);            }            else            {                temp1 = *(lsf_old + i) >> 2;            }            if (*(lsf_new + i) < 0)            {                temp2 = ~(~(*(lsf_new + i)) >> 2);            }            else            {                temp2 = *(lsf_new + i) >> 2;            }            *(lsf_out + i) = add((Word16)temp1,                                 (Word16)(*(lsf_new + i) - temp2),                                 pOverflow);        }    }    else if (i_subfr == 120)    {        for (i = M - 1; i >= 0; i--)        {            *(lsf_out + i) = *(lsf_new + i);        }    }    return;}

⌨️ 快捷键说明

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