📄 lsp_lsf.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 + -