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

📄 phi_lpc.c

📁 MPEG-4编解码的实现(包括MPEG4视音频编解码)
💻 C
📖 第 1 页 / 共 5 页
字号:
/*====================================================================*/
/*         MPEG-4 Audio (ISO/IEC 14496-3) Copyright Header            */
/*====================================================================*/
/*
This software module was originally developed by Rakesh Taori and Andy
Gerrits (Philips Research Laboratories, Eindhoven, The Netherlands) in
the course of development of the MPEG-4 Audio (ISO/IEC 14496-3). This
software module is an implementation of a part of one or more MPEG-4
Audio (ISO/IEC 14496-3) tools as specified by the MPEG-4 Audio
(ISO/IEC 14496-3). ISO/IEC gives users of the MPEG-4 Audio (ISO/IEC
14496-3) free license to this software module or modifications thereof
for use in hardware or software products claiming conformance to the
MPEG-4 Audio (ISO/IEC 14496-3). Those intending to use this software
module in hardware or software products are advised that its use may
infringe existing patents. The original developer of this software
module and his/her company, the subsequent editors and their
companies, and ISO/IEC have no liability for use of this software
module or modifications thereof in an implementation. Copyright is not
released for non MPEG-4 Audio (ISO/IEC 14496-3) conforming products.
CN1 retains full right to use the code for his/her own purpose, assign
or donate the code to a third party and to inhibit third parties from
using the code for non MPEG-4 Audio (ISO/IEC 14496-3) conforming
products.  This copyright notice must be included in all copies or
derivative works. Copyright 1996.
*/
/*====================================================================*/
/*======================================================================*/
/*                                                                      */
/*      SOURCE_FILE:    PHI_LPC.C                                       */
/*      PACKAGE:        WDBxx                                           */
/*      COMPONENT:      Linear Prediction Subroutines                   */
/*                                                                      */
/*======================================================================*/

/*======================================================================*/
/*      I N C L U D E S                                                 */
/*======================================================================*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <malloc.h> 
#include <float.h>
#include <assert.h>

#include "buffersHandle.h"       /* handler, defines, enums */

#include "bitstream.h"
#include "phi_cons.h"  
#include "phi_priv.h"
#include "phi_lpc.h"
#include "phi_lpcq.h"
#include "phi_lsfr.h"
#include "nec_abs_proto.h"
#include "pan_celp_const.h"
#include "pan_celp_proto.h"
#include "att_proto.h"
#include "nec_abs_const.h"
#include "nec_lspnw20.tbl"


#define NEC_PAI			3.141592
#define	NEC_LSPPRDCT_ORDER	4
#define NEC_NUM_LSPSPLIT1	2
#define NEC_NUM_LSPSPLIT2	4
#define NEC_QLSP_CAND		2
#define NEC_LSP_MINWIDTH_FRQ16	0.028
#define NEC_MAX_LSPVQ_ORDER	20


#define DEBUG_YM        /* flag for halting LPC analysis : '98/11/27 */

/*======================================================================*/
/*     L O C A L    F U N C T I O N S     P R O T O T Y P E S           */ 
/*======================================================================*/

/*======================================================================*/
/*   Modified Panasonic/NEC functions                                   */
/*======================================================================*/

static void mod_nec_lsp_sort( float x[], long order , PHI_PRIV_TYPE *PHI_Priv);

/*======================================================================*/

static void mod_nec_psvq( float *, float *, float *,
		     long, long, float *, long *, long );

/*======================================================================*/

static void mod_nb_abs_lsp_quantizer (
    float current_lsp[],	    	/* in: current LSP to be quantized */
    float previous_Qlsp[],          /* In: previous Quantised LSP */
    float current_Qlsp[],	        /* out: quantized LSP */ 
    long lpc_indices[], 		    /* out: LPC code indices */
    long lpc_order,			        /* in: order of LPC */
    long num_lpc_indices,           /* in: number of LPC indices */
    long n_lpc_analysis             /* in: number of LP analysis per frame */
);

/*======================================================================*/

static void mod_nec_bws_lsp_quantizer(
		       float lsp[],		/* input  */
		       float qlsp8[],		/* input  */
		       float qlsp[],		/* output  */
		       long indices[],		/* output  */
		       long lpc_order,		/* configuration input */
		       long lpc_order_8,	/* configuration input */
		       long num_lpc_indices, 	/* configuration input */
		       float blsp[NEC_LSPPRDCT_ORDER][NEC_MAX_LSPVQ_ORDER],
		       PHI_PRIV_TYPE *PHI_Priv	      /* In/Out: PHI private data (instance context) */
);

/*======================================================================*/

static void mod_nb_abs_lsp_decode(
    unsigned long lpc_indices[], 		    /* in: LPC code indices */
    float prev_Qlsp[],    		    /* in: previous LSP vector */
    float current_Qlsp[],	        /* out: quantized LSP vector */ 
    long lpc_order,			        /* in: order of LPC */
    long num_lpc_indices            /* in: number of LPC indices */
);		       

/*======================================================================*/

static void mod_nec_bws_lsp_decoder(
		     unsigned long indices[],		/* input  */
		     float qlsp8[],		/* input  */
		     float qlsp[],		/* output  */
		     long lpc_order,		/* configuration input */
		     long lpc_order_8,		/* configuration input */
		     long num_lpc_indices,  	/* configuration input */
		     float blsp[NEC_LSPPRDCT_ORDER][NEC_MAX_LSPVQ_ORDER],
		     PHI_PRIV_TYPE *PHI_Priv	/* In/Out: PHI private data (instance context) */
);

/*======================================================================*/	

static void mod_wb_celp_lsp_quantizer (
    float current_lsp[],	    	/* in: current LSP to be quantized */
    float previous_Qlsp[],          /* In: previous Quantised LSP */
    float current_Qlsp[],	        /* out: quantized LSP */ 
    long lpc_indices[], 		    /* out: LPC code indices */
    long lpc_order,			        /* in: order of LPC */
    long num_lpc_indices,           /* in: number of LPC indices */
    long n_lpc_analysis             /* in: number of LP analysis per frame */
);


/*======================================================================*/

static void mod_wb_celp_lsp_decode(
    unsigned long lpc_indices[], 		    /* in: LPC code indices */
    float prev_Qlsp[],    		    /* in: previous LSP vector */
    float current_Qlsp[],	        /* out: quantized LSP vector */ 
    long lpc_order,			        /* in: order of LPC */
    long num_lpc_indices            /* in: number of LPC indices */
);

/*======================================================================*/
/*   Function Prototype: PHI_Apar2Rfc                                   */
/*======================================================================*/
static void PHI_Apar2Rfc
(
int    P,               /* In:  LPC Order                               */
float ap[],             /* In:  Polynomial coefficients [0..P-1]        */
float rfc[]             /* Out: Reflection coefficients [0..P-1]        */
);

/*======================================================================*/
/*   Function Prototype: PHI_Rfc2Apar                                   */
/*======================================================================*/
static void PHI_Rfc2Apar
(
int   P,                /* In:  LPC Order                               */
float rq[],             /* In:  Reflection coefficients [0..P-1]        */
float aq[]              /* Out: a-parameters [0..P-1]                   */   
);

/*======================================================================*/
/*   Function Prototype: PHI_CalcAcf                                    */
/*======================================================================*/
static void PHI_CalcAcf
(
double sp_in[],         /* In:  Input segment [0..N-1]                  */
double acf[],           /* Out: Autocorrelation coeffs [0..P]           */
int N,                  /* In:  Number of samples in the segment        */ 
int P                   /* In:  LPC Order                               */
);

/*======================================================================*/
/*   Function Prototype: PHI_LevinsonDurbin                             */
/*======================================================================*/
static int PHI_LevinsonDurbin    /* Retun Value: 1 if unstable filter   */ 
( 
double acf[],           /* In:  Autocorrelation coeffs [0..P]           */         
double apar[],          /* Out: Polynomial coeffciients  [0..P-1]       */           
double rfc[],           /* Out: Reflection coefficients [0..P-1]        */
int P,                  /* In:  LPC Order                               */
double * E              /* Out: Residual energy at the last stage       */
);

/*======================================================================*/
/*   Function Prototype: PHI_Rfc2Lar                                    */
/*======================================================================*/
static void PHI_Rfc2Lar
(
int   P,                /* In:  LPC Order                               */
float rfc[],            /* In:  Array of reflection coeffs[0..P-1]      */
float lar[]             /* Out: Array of log area ratios[0..P-1]        */
);

/*======================================================================*/
/*   Function Prototype: PHI_Lar2Rfc                                    */
/*======================================================================*/
static int PHI_Lar2Rfc
(
int   P,                /* In:  LPC Order                               */
float lar[],            /* In:  Array of log area ratios[0..P-1]        */
float rfc[]             /* Out: Array of reflection coeffs[0..P-1]      */
);

/*======================================================================*/
/*   Function Prototype: PHI_PackLpcCodes                               */
/*======================================================================*/
static void PHI_PackLpcCodes
(
const long  lpc_order,        /*In:  Order of LPC                       */
const long  rfc_code[],       /*In:  Array of Refl. Coeffs[0..order-1]  */
const long  pack_array_size,  /*In:  Array size after packing           */
      long  packed_code[]     /*Out: Packed Array[0..pack_array-size-1] */
);

/*======================================================================*/
/*   Function Prototype: PHI_UnpackLpcCodes                             */
/*======================================================================*/
static void PHI_UnpackLpcCodes
(
const long  lpc_order,        /*In:  Order of LPC                       */      
      long  rfc_code[],       /*Out: Array of Refl. Coeffs[0..order-1]  */
const long  pack_array_size,  /*In:  Array size after packing           */
const long  packed_code[]     /*In:  Packed Array[0..pack_array-size-1] */
);

/*======================================================================*/
/*   Function Prototype: PHI_lpc_analysis                               */
/*======================================================================*/
void PHI_lpc_analysis
(
float PP_InputSignal[],         /* In:  Input Signal                    */
float lpc_coefficients[],       /* Out: LPC Coefficients[0..lpc_order-1]*/
float *first_order_lpc_par,     /* Out: a_parameter for 1st-order fit   */
long  frame_size,               /* In:  Number of samples in frame      */
float  HamWin[],                /* In:  Hamming Window                  */
long  window_offset,            /* In:  offset for window w.r.t curr. fr*/
long  window_size,              /* In:  LPC Analysis-Window Size        */
float gamma_be[],               /* In:  Bandwidth expansion coeffs.     */
long  lpc_order                 /* In:  Order of LPC                    */
);

/*======================================================================*/
/*   Function Definition:PHI_InitLpcAnalysisEncoder                     */
/*======================================================================*/
void PHI_InitLpcAnalysisEncoder
(
long  win_size[],               /* In:  LPC Analysis-Window Size        */
long  n_lpc_analysis,           /* In:  Numberof LPC Analysis Frame     */
long  order,                    /* In:  Order of LPC                    */
long  order_8,                  /* In:  Order of LPC                    */
float gamma_be,                 /* In:  Bandwidth Expansion Coefficient */
long  bit_rate,                 /* In:  Bit Rate                        */
long  sampling_frequency,       /* In:  Sampling Frequency              */
long  SampleRateMode,           /* In:  SampleRateMode                  */ 
long  frame_size,               /* In:  Frame Size                      */
long  num_lpc_indices,          /* In:  Number of LPC indices           */  
long  n_subframes,              /* In:  Number of subframes             */
long  num_shape_cbks,           /* In:  Number of Shape Codebooks       */
long  num_gain_cbks,            /* In:  Number of Gain Codebooks        */
long  frame_bit_allocation[],   /* In:  Frame bit allocation            */
long num_indices,
long QuantizationMode,
PHI_PRIV_TYPE *PHI_Priv		/* In/Out: PHI private data (instance context) */
)
{
    int     x;
    int i,j;
    /* -----------------------------------------------------------------*/
    /* Create Arrays for Hamming Window and gamma array                 */
    /* -----------------------------------------------------------------*/
    if
    (
    (( PHI_Priv->PHI_mem_i = (float *)malloc((unsigned int)order * sizeof(float))) == NULL ) ||
    (( PHI_Priv->PHI_current_lar = (float *)malloc((unsigned int)order * sizeof(float))) == NULL )||
    (( PHI_Priv->PHI_prev_lar = (float *)malloc((unsigned int)order * sizeof(float))) == NULL )||
    (( PHI_Priv->PHI_prev_indices = (long *)malloc((unsigned int)order * sizeof(long))) == NULL )
   )
    {
		printf("MALLOC FAILURE in Routine InitLpcAnalysis \n");
		exit(1);
    }
    
    /* -----------------------------------------------------------------*/
    /* Create Array for Quantiser BLSP                                  */
    /* -----------------------------------------------------------------*/
    for ( i = 0; i < NEC_LSPPRDCT_ORDER; i++ ) 
    {
       for ( j = 0; j < (int)order; j++ ) 
       {
	       if ( j >= (int)(order/2) )
	           PHI_Priv->blsp_previous[i][j]=(float)NEC_PAI/(float)(order+1)*(j+1);

⌨️ 快捷键说明

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