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

📄 lsp_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/lsp_lsf.c Functions: Lsp_lsf            Lsf_lsp     Date: 03/28/2000------------------------------------------------------------------------------ REVISION HISTORY Description: Updated template used to PV coding template. Description: Deleted variables listed in the Local Stores Needed/Modified              section. Description: Synchronized file with UMTS version 3.2.0. Updated coding              template and removed unnecessary include files. Description: Replaced basic_op.h with the header file of the math functions              used in the file. Description: Changed to accept the pOverflow flag for EPOC compatibility. Description: Placed table declarations in a .c file, rather than an included .tab.  The tables are now referenced via an extern in this file. Description:  For Lsp_lsf()              1. Eliminated unused include file typedef.h.              2. Replaced array addressing by pointers Description:  Replaced "int" and/or "char" with defined types.               Added proper casting (Word32) to some left shifting operations Description: Changed round function name to pv_round to avoid conflict with              round function in C standard library. Description: Added #ifdef __cplusplus around extern'ed table. Description:------------------------------------------------------------------------------ MODULE DESCRIPTION This file contains the functions that convert line spectral pairs (LSP) to line spectral frequencies (LSF) and vice-versa.------------------------------------------------------------------------------*//*----------------------------------------------------------------------------; INCLUDES----------------------------------------------------------------------------*/#include "lsp_lsf.h"#include "basicop_malloc.h"#include "basic_op.h"/*--------------------------------------------------------------------------*/#ifdef __cplusplusextern "C"{#endif    /*----------------------------------------------------------------------------    ; 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 VARIABLE DEFINITIONS    ; Variable declaration - defined here and used outside this module    ----------------------------------------------------------------------------*/    extern const Word16 table[];    extern const Word16 slope[];    /*--------------------------------------------------------------------------*/#ifdef __cplusplus}#endif/*------------------------------------------------------------------------------ FUNCTION NAME: Lsf_lsp------------------------------------------------------------------------------ INPUT AND OUTPUT DEFINITIONS Inputs:    lsf = buffer containing normalized line spectral frequencies; valid          range is between 0 and 0.5 (Word16)    lsp = buffer containing line spectral pairs; valid range is between          -1 and 1 (Word16)    m = LPC order (Word16) Outputs:    lsp contains the newly calculated line spectral pairs Returns:    None Global Variables Used:    table = cosine table Local Variables Needed:    None------------------------------------------------------------------------------ FUNCTION DESCRIPTION This function performs the LSF to LSP transformation using the equation:    lsf[i] = arccos(lsp[i])/(2*pi) The transformation from lsp[i] to lsf[i] is approximated by a look-up table and interpolation.------------------------------------------------------------------------------ REQUIREMENTS None------------------------------------------------------------------------------ REFERENCES lsp_lsf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001------------------------------------------------------------------------------ PSEUDO-CODEvoid Lsf_lsp (    Word16 lsf[],       // (i) : lsf[m] normalized (range: 0.0<=val<=0.5)    Word16 lsp[],       // (o) : lsp[m] (range: -1<=val<1)    Word16 m            // (i) : LPC order){    Word16 i, ind, offset;    Word32 L_tmp;    for (i = 0; i < m; i++)    {        ind = shr (lsf[i], 8);      // ind    = b8-b15 of lsf[i]        offset = lsf[i] & 0x00ff;    // offset = b0-b7  of lsf[i]        // lsp[i] = table[ind]+ ((table[ind+1]-table[ind])*offset) / 256        L_tmp = L_mult (sub (table[ind + 1], table[ind]), offset);        lsp[i] = add (table[ind], extract_l (L_shr (L_tmp, 9)));    }    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 Lsf_lsp(    Word16 lsf[],       /* (i) : lsf[m] normalized (range: 0.0<=val<=0.5) */    Word16 lsp[],       /* (o) : lsp[m] (range: -1<=val<1)                */    Word16 m,           /* (i) : LPC order                                */    Flag   *pOverflow   /* (o) : Flag set when overflow occurs            */){    Word16 i, ind, offset;    Word32 L_tmp;    for (i = 0; i < m; i++)    {        ind = lsf[i] >> 8;           /* ind    = b8-b15 of lsf[i] */        offset = lsf[i] & 0x00ff;    /* offset = b0-b7  of lsf[i] */        /* lsp[i] = table[ind]+ ((table[ind+1]-table[ind])*offset) / 256 */        L_tmp = ((Word32)(table[ind + 1] - table[ind]) * offset) >> 8;        lsp[i] = add(table[ind], (Word16) L_tmp, pOverflow);    }    return;}/****************************************************************************//*------------------------------------------------------------------------------ FUNCTION NAME: Lsp_lsf------------------------------------------------------------------------------ INPUT AND OUTPUT DEFINITIONS Inputs:    lsp = buffer containing line spectral pairs; valid range is between          -1 and 1 (Word16)    lsf = buffer containing normalized line spectral frequencies; valid          range is between 0 and 0.5 (Word16)    m = LPC order (Word16) Outputs:    lsf contains the newly calculated normalized line spectral frequencies Returns:    None Global Variables Used:    table = cosine table    slope = table to used to calculate inverse cosine Local Variables Needed:    None------------------------------------------------------------------------------ FUNCTION DESCRIPTION This function performs the LSP to LSF transformation using the equation:    lsp[i] = cos(2*pi*lsf[i]) The transformation from lsf[i] to lsp[i] is approximated by a look-up table and interpolation.------------------------------------------------------------------------------ REQUIREMENTS None------------------------------------------------------------------------------ REFERENCES lsp_lsf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001------------------------------------------------------------------------------ PSEUDO-CODEvoid Lsp_lsf (    Word16 lsp[],       // (i)  : lsp[m] (range: -1<=val<1)    Word16 lsf[],       // (o)  : lsf[m] normalized (range: 0.0<=val<=0.5)    Word16 m            // (i)  : LPC order){    Word16 i, ind;    Word32 L_tmp;    ind = 63;                        // begin at end of table -1    for (i = m - 1; i >= 0; i--)    {        // find value in table that is just greater than lsp[i]        while (sub (table[ind], lsp[i]) < 0)        {            ind--;        }        // acos(lsp[i])= ind*256 + ( ( lsp[i]-table[ind] ) *           slope[ind] )/4096        L_tmp = L_mult (sub (lsp[i], table[ind]), slope[ind]);        //(lsp[i]-table[ind])*slope[ind])>>12        lsf[i] = pv_round (L_shl (L_tmp, 3));        lsf[i] = add (lsf[i], shl (ind, 8));    }    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 Lsp_lsf(    Word16 lsp[],       /* (i)  : lsp[m] (range: -1<=val<1)                */    Word16 lsf[],       /* (o)  : lsf[m] normalized (range: 0.0<=val<=0.5) */    Word16 m,           /* (i)  : LPC order                                */    Flag  *pOverflow    /* (o)  : Flag set when overflow occurs            */){    Word16 i;    Word16 ind;    Word16 temp;    Word32 L_tmp;    Word16 *p_lsp = &lsp[m-1];    Word16 *p_lsf = &lsf[m-1];    OSCL_UNUSED_ARG(pOverflow);    ind = 63;                        /* begin at end of table -1 */    for (i = m - 1; i >= 0; i--)    {        /* find value in table that is just greater than lsp[i] */        temp = *(p_lsp--);        while (table[ind] < temp)        {            ind--;        }        /* acos(lsp[i])= ind*256 + ( ( lsp[i]-table[ind] ) *           slope[ind] )/4096 */        L_tmp = (Word32)(temp - table[ind]) * slope[ind];        /*(lsp[i]-table[ind])*slope[ind])>>12*/        L_tmp  = (L_tmp + 0x00000800) >> 12;        *(p_lsf--) = (Word16)(L_tmp) + (ind << 8);    }    return;}

⌨️ 快捷键说明

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