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

📄 nec_exc_mp_config.c

📁 C写的MPEG4音频源代码(G.723/G.729)
💻 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) *	 *	Multi-Pulse Excitation Configuration Subroutines * *	Ver1.0	96.12.16	T.Nomura(NEC) *	Ver2.0	97.03.17	T.Nomura(NEC) */#include <stdio.h>#include <stdlib.h>#include <math.h>#include "buffersHandle.h"       /* handler, defines, enums */#include "bitstream.h"#include "nec_abs_const.h"#include "nec_abs_proto.h"#include "nec_exc_proto.h"#define	NEC_MAX_PULSE	12#define	NEC_MIN_PULSE	3static long nec_pulse_bit(long len, long num, long bit[]);static void nec_pulse_pos(long len, long num, long bit[], long pos[]);void nec_enh_mp_position(			 long	len,		/* input */			 long	num[],		/* input */			 long	idx[],		/* input */			 long	num_enh,	/* input */			 long	bit[],		/* output */			 long	pos[] )		/* output */{   long		i, j, k, l, m, n;   long		max_num, pul_loc, min_ctr, min_chn;   long		*bit_pos_org, *chn_pos_org, *chn_ctr, *ctr_tmp;   long		*bit_pos, *chn_pos;   static long	num_org = 10;   if((bit_pos_org = (long *)calloc (num_org, sizeof(long)))==NULL) {      printf("\n Memory allocation error in nec_enh_mp_position \n");      exit(1);   }   if((chn_pos_org = (long *)calloc (num_org*len, sizeof(long)))==NULL) {      printf("\n Memory allocation error in nec_enh_mp_position \n");      exit(1);   }   if((chn_ctr = (long *)calloc (num_org, sizeof(long)))==NULL) {      printf("\n Memory allocation error in nec_enh_mp_position \n");      exit(1);   }   if((ctr_tmp = (long *)calloc (num_org, sizeof(long)))==NULL) {      printf("\n Memory allocation error in nec_enh_mp_position \n");      exit(1);   }   nec_mp_position(len, num_org, bit_pos_org, chn_pos_org);   for ( i = 0; i < num_org; i++ ) chn_ctr[i] = 0;   max_num = 0;   for ( i = 0; i <= num_enh; i++ ) {      if ( num[i] > max_num ) max_num = num[i];   }   if((bit_pos = (long *)calloc (max_num, sizeof(long)))==NULL) {      printf("\n Memory allocation error in nec_enh_mp_position \n");      exit(1);   }   if((chn_pos = (long *)calloc (max_num*len, sizeof(long)))==NULL) {      printf("\n Memory allocation error in nec_enh_mp_position \n");      exit(1);   }   nec_mp_position(len, num[0], bit_pos, chn_pos);   for ( n = 0; n < num_enh; n++ ) {      for ( i = num[n]-1, k = 0; i >= 0; i-- ) {	 pul_loc = 0;	 for ( j = 0; j < bit_pos[i]; j++ ) {	    pul_loc |= ((idx[n]>>k)&0x1)<<j;	    k++;	 }	 pul_loc = chn_pos[i*len+pul_loc];	 for ( l = 0; l < num_org; l++ ) {	    for ( m = 0; m < (1<<bit_pos_org[l]); m++ ) {	       if ( pul_loc == chn_pos_org[l*len+m] ) {		  chn_ctr[l]++;		  break;	       }	    }	 }      }      for ( i = 0; i < num_org; i++ ) ctr_tmp[i] = chn_ctr[i];      for ( i = 0; i < num[n+1]; i++ ) {	 min_ctr = len;	 for ( j = 0; j < num_org; j++ ) {	    if ( ctr_tmp[j] < min_ctr ) {	       min_ctr = ctr_tmp[j];	       min_chn = j;	    }	 }	 ctr_tmp[min_chn] = len;	 bit_pos[i] = bit_pos_org[min_chn];	 for ( j = 0; j < (1<<bit_pos_org[min_chn]); j++ )	    chn_pos[i*len+j] = chn_pos_org[min_chn*len+j];      }   }   for ( i = 0; i < num[num_enh]; i++ ) {      bit[i] = bit_pos[i];      for ( j = 0; j < (1<<bit[i]); j++ )	 pos[i*len+j] = chn_pos[i*len+j];   }   free( bit_pos_org );   free( chn_pos_org );   free( chn_ctr );   free( ctr_tmp );   free( bit_pos );   free( chn_pos );}void nec_mp_config(		   long len,		/* input */		   long tgt_bit,	/* input */		   long *pos_bit,	/* output */		   long *sgn_bit )	/* output */{   long	num;   long tmp[NEC_MAX_PULSE], tbit, dbit, min_dbit, opt_bit;   if ( (len%2) != 0 ) {      printf("\n Configuration error in nec_mp_config \n");      exit(1);   }   min_dbit = 8*sizeof(long)-1;   opt_bit = -1;   for ( num = NEC_MIN_PULSE; num <= NEC_MAX_PULSE; num++ ) {      tbit = nec_pulse_bit( len, num, tmp );      if ( tbit == -1 ) continue;      tbit += num;      dbit = tgt_bit - tbit;      if ( dbit < 0 ) dbit = -dbit;      if ( dbit < min_dbit ) {	 min_dbit = dbit;	 opt_bit = tbit;	 *pos_bit = tbit - num;	 *sgn_bit = num;      }   }   if ( opt_bit == -1 ) {      printf("\n Configuration error in nec_mp_config \n");      exit(1);   }}void nec_mp_position(			    long	len,			    long	num,			    long	bit[],			    long	pos[] ){   long	tbit;   tbit = nec_pulse_bit( len, num, bit );   if ( tbit == -1 ) {      printf("\n Configuration error in nec_mp_position \n");      exit(1);   }   nec_pulse_pos( len, num, bit, pos );}static long nec_pulse_bit(			  long	len,			  long	num,			  long	bit[] ){   long	i, j, k, l;   long	xnum, ynum;   long	*tbit, *nbit;   long err_flg, ttl_bit;   if ( len < 2*num ) {      return -1;   }   if((tbit = (long *)calloc (len/2+1, sizeof(long)))==NULL) {      printf("\n Memory allocation error in nec_pulse_bit \n");      exit(1);   }   if((nbit = (long *)calloc (len/2+1, sizeof(long)))==NULL) {      printf("\n Memory allocation error in nec_pulse_bit \n");      exit(1);   }   xnum = len / 2;   for ( i = 0; i < xnum; i++ ) tbit[i] = 1;   tbit[xnum] = 0;   err_flg = 0;   while ( xnum > num ) {      tbit[xnum] = 0;      ynum = xnum;      for ( i = 0, j = 0; i < xnum; j++ ) {	 if (  tbit[i] == tbit[i+1] ) {	    nbit[j] = tbit[i]+1;	    i = i + 2;	    ynum--;	    if ( ynum <= num ) {	       for ( k = j+1, l = i; k < ynum; k++ ) {		  nbit[k] = tbit[l++];	       }	       break;	    }	 } else	{	    nbit[j] = tbit[i];	    i++;	 }      }      if ( xnum == ynum ) {	 err_flg = 1;	 break;      }      xnum = ynum;      for ( i = 0; i < xnum; i++ ) tbit[i] = nbit[i];   }   if ( err_flg == 1 ) {      free(tbit);      free(nbit);      return -1;   }   ttl_bit = 0;   for ( i = 0; i < num; i++ ) {      ttl_bit += tbit[i];      bit[i] = tbit[i];   }   free(tbit);   free(nbit);   return ttl_bit;}static void nec_pulse_pos(			  long	len,			  long	num,			  long	bit[],			  long	pos[] ){   long	i, j, k, l;   long	*ch_num;   long	mbit, dbit, num_p, mrg_ch, step;   if((ch_num = (long *)calloc (len/2, sizeof(long)))==NULL) {      printf("\n Memory allocation error in nec_pulse_pos \n");      exit(1);   }   mbit = 8*sizeof(long)-1;   for ( i = 0; i < num; i++ ) {      if ( bit[i] < mbit ) mbit = bit[i];   }   num_p = 1 << mbit;   step = len / num_p;   for ( i = 0; i < step; i++ ) ch_num[i] = -1;   for ( i = 0; i < num; i++ ) {      dbit = bit[i] - mbit;      mrg_ch = 1 << dbit;      for ( j = 0, k = 0; k < mrg_ch; ) {	 if ( ch_num[j] == -1 ) {	    ch_num[j] = i;	    k++;	    j += (long)((float)step/mrg_ch + 0.5);	    j = j % step;	 } else j++;      }   }   for ( i = 0; i < num; i++ ) {      l = 0;      for ( k = 0; k < step; k++ ) {	 if ( i == ch_num[k] ) {	    for ( j = 0; j < num_p; j++ ) {	       pos[i*len+l] = k + step * j;	       l++;	    }	 }      }   }   free(ch_num);}

⌨️ 快捷键说明

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