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

📄 nec_exc_module.c

📁 MPEG2/MPEG4编解码参考程序(实现了MPEG4的部分功能)
💻 C
字号:
/*This software module was originally developed byToshiyuki Nomura (NEC Corporation)and edited byin the course of development of theMPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and 3.This software module is an implementation of a part of one or moreMPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4 Audiostandard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio standardsfree license to this software module or modifications thereof for use inhardware or software products claiming conformance to the MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software module inhardware or software products are advised that this use may infringeexisting patents. The original developer of this software module andhis/her company, the subsequent editors and their companies, and ISO/IEChave no liability for use of this software module or modificationsthereof in an implementation. Copyright is not released for nonMPEG-2 NBC/MPEG-4 Audio conforming products. The original developerretains full right to use the code for his/her  own purpose, assign ordonate the code to a third party and to inhibit third party from usingthe code for non MPEG-2 NBC/MPEG-4 Audio conforming products.This copyright notice must be included in all copies or derivative works.Copyright (c)1996.*//* *	MPEG-4 Audio Verification Model (LPC-ABS Core) *	 *	Excitation Other Subroutines * *	Ver1.0	96.12.16	T.Nomura(NEC) */#include <stdio.h>#include <stdlib.h>#include <math.h>#include "buffersHandle.h"       /* handler, defines, enums */#include "bitstream.h"#include "lpc_common.h"#include "nec_exc_proto.h"#include "nec_abs_const.h"#include "fix_acb_int.tbl"void nec_lpc2par( float a[], float rc[], long m ){   int		j, mr, k;   float	*tmp_fa, *b, d;   if((tmp_fa = (float *)calloc (m, sizeof(float)))==NULL) {      printf("\n Memory allocation error in nec_lpc2par \n");      exit(1);   }   if((b = (float *)calloc (m, sizeof(float)))==NULL) {      printf("\n Memory allocation error in nec_lpc2par \n");      exit(1);   }   for (j = 0; j < m; j++) tmp_fa[j] = a[j];   for (mr = m - 1; mr >= 0; mr--) {      d = 1.0 - tmp_fa[mr] * tmp_fa[mr];      rc[mr] = tmp_fa[mr];      for (k = 0; k <= mr; k++)	 b[k] = tmp_fa[k];      for (k = 0; k < mr; k++)	 tmp_fa[k] = (b[k] - b[mr] * b[mr - k - 1]) / d;   }   free( tmp_fa );   free( b );}void nec_zero_filt(		   float	x[], 		/* input */		   float	y[], 		/* output */		   float	alpha[],	/* input */		   float	g_den[],	/* input */		   float	g_num[],	/* input */		   long		order,		/* configuration input */		   long		len )		/* configuration input */{   long		i;   float	*syn, *zero1, *zero2;   if((syn = (float *)calloc (len, sizeof(float)))==NULL) {      printf("\n Memory allocation error in zero_filt \n");      exit(1);   }   if((zero1 = (float *)calloc (order, sizeof(float)))==NULL) {      printf("\n Memory allocation error in zero_filt \n");      exit(1);   }   if((zero2 = (float *)calloc (order, sizeof(float)))==NULL) {      printf("\n Memory allocation error in zero_filt \n");      exit(1);   }   for ( i = 0; i < order; i++ ) zero1[i] = 0.0;   nec_syn_filt(x, alpha, zero1, syn, order, len);   for ( i = 0; i < order; i++ ) zero1[i] = zero2[i] = 0.0;   nec_pw_filt(y, syn, order, g_den, g_num, zero1, zero2, len);   free( syn );   free( zero1 );   free( zero2 );}void nec_pw_imprs(		  float	y[],		/* output */		  float	a[],		/* input */		  long	m,		/* configuration input */		  float	g_den[],	/* input */		  float	g_num[],	/* input */		  long n )		/* configuration input */{   long		i;   float	*in;   if((in = (float *)calloc (n, sizeof(float)))==NULL) {      printf("\n Memory allocation error in imprs2 \n");      exit(1);   }   for ( i = 0; i < n; i++ ) in[i] = 0.0;   in[0] = 1.0;   nec_zero_filt( in, y, a, g_den, g_num, m, n );   free( in );}void nec_comb_filt(		   float	exc[],		/* input */		   float	comb_exc[],	/* output */		   long		len_sf,		/* configuration input */		   long		I_part,		/* input */		   long		flag )		/* input */{   long		sample;   float	dum_dbl;   static float	comb_ga[4] = { 0.0, 0.0, ((float)19661/(float)32768), ((float)26214/(float)32768) };   if ( I_part == 0 ) {      for (sample = 0; sample < len_sf; sample++) {	 comb_exc[sample] = exc[sample];      }   }   else {      for (sample = 0; sample < len_sf; sample++) {	 if ( sample - I_part >= 0 ) dum_dbl = comb_exc[sample - I_part];	 else			     dum_dbl = 0.0;	 dum_dbl = exc[sample] + comb_ga[flag] * dum_dbl;	 comb_exc[sample] = dum_dbl;      }   }}void nec_syn_filt(		  float	di[],	/* input */		  float	a[],	/* input */		  float	pm[],	/* input/output */		  float	xr[],	/* output */		  long	np,	/* configuration input */		  long	n )	/* configuration input */{   long		i,j;   float	s;   for (j=0; j < n; j++) {      s = (float)0.0;      for (i=0; i < np; i++)	 s = s - a[i] * pm[i];      xr[j] = di[j] + s;      for (i=2; i < np+1; i++)	 pm[np-i+1] = pm[np-i];      pm[0] = xr[j];   }}void nec_pw_filt(		 float		y[],	/* output */		 float		x[],	/* input */		 long		m,	/* configuration input */		 float		gd[],	/* input */		 float		gn[],	/* input */		 float		pmem1[],/* input/output */		 float		pmem2[],/* input/output */		 long		n )	/* configuration input */{   long		i, j;   float	s, s2;   for (j = 0; j < n; j++) {      s = x[j];      /* calculation of numerator */      for (i = 0; i < m; i++) {         s = s + gn[i] * pmem1[i];      }      s2 = s;      /* calculation of denominator */      for (i = 0; i < m; i++) {         s2 = s2 - gd[i] * pmem2[i];      }      y[j] = s2;      for (i = 2; i < m+1; i++) {	 pmem1[m-i+1] = pmem1[m-i];	 pmem2[m-i+1] = pmem2[m-i];      }      pmem1[0] = x[j];      pmem2[0] = y[j];   }}long nec_acb_generation(long idx, long len_sf, float mem_ac[],			       float exci[], float exco[],			       float ga, long type,                                long SampleRateMode){   long		i, k, kk, sample;   long		F_part, I_part, F_part0, I_part0;   float	dum_dbl;   float	*P_FILm;   static long	flag_cl = 0;   static long	idx2lag_int[1<<NEC_ACB_BIT_WB], idx2lag_frac[1<<NEC_ACB_BIT_WB];   static long pitch_max, idx_max, pitch_iftap;   /*--- INITIALIZATION ---*/   if (flag_cl == 0) {      flag_cl = 1;    if(fs8kHz==SampleRateMode) {      pitch_max = NEC_PITCH_MAX;      idx_max = 255;      pitch_iftap = NEC_PITCH_IFTAP;      for (i = 0; i <= 161; i++) {	 idx2lag_int[i] = 17 + 2 * i / NEC_PITCH_RSLTN;	 idx2lag_frac[i] = (2 * i) % NEC_PITCH_RSLTN;      }      for (i = 162; i <= 199; i++) {	 idx2lag_int[i] = 71 + 3 * (i - 162) / NEC_PITCH_RSLTN;	 idx2lag_frac[i] = (3 * (i - 162)) % NEC_PITCH_RSLTN;      }      for (i = 200; i <= 254; i++) {	 idx2lag_int[i] = 90 + (i - 200);	 idx2lag_frac[i] = 0;      }      idx2lag_int[255] = 0;      idx2lag_frac[255] = 0;    }else {      pitch_max = NEC_PITCH_MAX_FRQ16;      idx_max = 511;      pitch_iftap = NEC_PITCH_IFTAP16;      for (i = 0; i <= 215; i++) {	 idx2lag_int[i] = 20 + 2 * i / NEC_PITCH_RSLTN;	 idx2lag_frac[i] = (2 * i) % NEC_PITCH_RSLTN;      }      for (i = 216; i <= 397; i++) {	 idx2lag_int[i] = 92 + 3 * (i - 216) / NEC_PITCH_RSLTN;	 idx2lag_frac[i] = (3 * (i - 216)) % NEC_PITCH_RSLTN;      }      for (i = 398; i <= 510; i++) {	 idx2lag_int[i] = 183 + (i - 398);	 idx2lag_frac[i] = 0;      }      idx2lag_int[511] = 0;      idx2lag_frac[511] = 0;    }   }   if(fs8kHz==SampleRateMode) {     P_FILm = nb_FIL;   } else {     P_FILm = wb_FIL;   }   /*--- EXCITATION GENERATION ---*/   I_part = idx2lag_int[idx];   F_part = idx2lag_frac[idx];   if ( idx == idx_max ) {      for (i = 0; i < len_sf; i++) exco[i] = exci[i];      return I_part;   }   F_part0 = 0;   if ( type == 0 ) {      for (sample = 0; sample < len_sf; ) {	 F_part0 += F_part;	 I_part0 = I_part + (F_part0/NEC_PITCH_RSLTN);	 F_part0 = F_part0 % NEC_PITCH_RSLTN;	 for ( i = 0; i < I_part0 && sample < len_sf; i++, sample++ ) {	    dum_dbl = 0.0;	    for (k = -pitch_iftap; k <= pitch_iftap; k++) {	       kk = (k+1) * NEC_PITCH_RSLTN - F_part0;	       dum_dbl += P_FILm[abs(kk)]*mem_ac[pitch_max+pitch_iftap+1-(I_part0-i+k+1)];	    }	    dum_dbl = exci[sample] + ga * dum_dbl;	    exco[sample] = dum_dbl;	    mem_ac[pitch_max+pitch_iftap+1+sample] = dum_dbl;	 }      }   } else {      for (sample = 0; sample < len_sf; sample++) {	 dum_dbl = 0.0;	 for (k = -pitch_iftap; k <= pitch_iftap; k++) {	    kk = (k+1) * NEC_PITCH_RSLTN - F_part;	    dum_dbl += P_FILm[abs(kk)]*mem_ac[pitch_max+pitch_iftap+1-(I_part+k+1)+sample];	 }	 exco[sample] = dum_dbl;	 mem_ac[pitch_max+pitch_iftap+1+sample] = exci[sample];      }   }   return I_part;}void nec_mk_target(		   float InputSignal[],		   float target[],		   long  sbfrm_size,		   long  lpc_order,		   float int_Qlps_coefficients[],		   float Wden_coeff[],		   float Wnum_coeff[],		   float mem_past_in[],		   float mem_past_win[],		   float mem_past_syn[],		   float mem_past_wsyn[]		   ){   int		i;   float	*xr, *xr1, *fk, *cur_wsp;   float	*pmw, *pmw1, *pmw2;   /*------ Memory Allocation ----------*/   if((xr = (float *)calloc (sbfrm_size, sizeof(float)))==NULL) {      printf("\n Memory allocation error in nec_mk_target \n");      exit(1);   }   if((xr1 = (float *)calloc (sbfrm_size, sizeof(float)))==NULL) {      printf("\n Memory allocation error in nec_mk_target \n");      exit(1);   }   if((fk = (float *)calloc (sbfrm_size, sizeof(float)))==NULL) {      printf("\n Memory allocation error in nec_mk_target \n");      exit(1);   }   if((cur_wsp = (float *)calloc (sbfrm_size, sizeof(float)))==NULL) {      printf("\n Memory allocation error in nec_mk_target \n");      exit(1);   }   if((pmw = (float *)calloc (lpc_order, sizeof(float)))==NULL) {      printf("\n Memory allocation error in nec_mk_target \n");      exit(1);   }   if((pmw1 = (float *)calloc (lpc_order, sizeof(float)))==NULL) {      printf("\n Memory allocation error in nec_mk_target \n");      exit(1);   }   if((pmw2 = (float *)calloc (lpc_order, sizeof(float)))==NULL) {      printf("\n Memory allocation error in nec_mk_target \n");      exit(1);   }   nec_pw_filt(cur_wsp, InputSignal, lpc_order,	       Wden_coeff, Wnum_coeff,	       mem_past_in, mem_past_win, sbfrm_size);   for ( i = 0; i < sbfrm_size; i++ ) xr1[i] = 0.0;   for ( i = 0; i < lpc_order; i++) pmw[i] = mem_past_syn[i];   nec_syn_filt(xr1, int_Qlps_coefficients,		pmw, xr, lpc_order, sbfrm_size);   for ( i = 0; i < lpc_order; i++) pmw1[i] = mem_past_syn[i];   for ( i = 0; i < lpc_order; i++) pmw2[i] = mem_past_wsyn[i];   nec_pw_filt(fk, xr, lpc_order,	       Wden_coeff, Wnum_coeff, pmw1, pmw2, sbfrm_size);   for(i = 0; i < sbfrm_size; i++){      target[i] = cur_wsp[i] - fk[i];   }   free( xr );   free( xr1 );   free( fk );   free( cur_wsp );   free( pmw );   free( pmw1 );   free( pmw2 );}

⌨️ 快捷键说明

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