📄 nec_bws_exc_generation.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 Generation Subroutines * * Ver1.0 97.09.08 T.Nomura(NEC) */#include <stdio.h>#include <stdlib.h>#include <math.h>#include "buffersHandle.h" /* handler, defines, enums */#include "bitstream.h"#include "nec_abs_proto.h"#include "nec_abs_const.h"#include "nec_exc_proto.h"#define NEC_LAG_IDX_RNG 8void nec_bws_excitation_generation( float LpcCoef[], /* input */ unsigned long shape_indices[], /* input */ unsigned long gain_indices[], /* input */ unsigned long rms_index, /* input */ unsigned long signal_mode, /* input */ float decoded_excitation[], /* output */ float *adapt_gain, /* output */ long *acb_delay, /* output */ long lpc_order, /* configuration input */ long sbfrm_size, /* configuration input */ long n_subframes, /* configuration input */ long frame_bit_allocation[], /* configuration input */ long num_shape_cbks, /* configuration input */ long num_gain_cbks, /* configuration input */ float bws_mp_exc[], long acb_idx_8[], long postfilter){ static float mem_past_exc[NEC_PITCH_MAX_MAXIMUM + NEC_PITCH_IFTAP16+1]; static float qxnorm[NEC_MAX_NSF]; static long flag_mem = 0; static long c_subframe, vu_flag; static long op_lag_tmp[NEC_MAX_NSF]; long i; float *acbexc, *mpexc, *excitation; float g_ac, g_ec; float g_mp8,*mpexc_8; long lag_idx, mp_pos_idx, mp_sgn_idx, ga_idx; long integer_lag; long lagbit, posbit, sgnbit, gainbit; long num_pulse; long pitch_max; long ip16,fp16; long st_idx; pitch_max = NEC_PITCH_MAX_FRQ16; if (flag_mem == 0){ for ( i = 0; i < pitch_max+NEC_PITCH_IFTAP16+1; i++ ) { mem_past_exc[i] = 0.0; } c_subframe = 0; flag_mem = 1; } c_subframe = c_subframe % n_subframes; if(c_subframe ==0){ for(i = 0; i < n_subframes; i++){ if(acb_idx_8[i] <= 161){ ip16 = (17 + 2 * acb_idx_8[i] / NEC_PITCH_RSLTN) * 2; fp16 = (2 * acb_idx_8[i]) % NEC_PITCH_RSLTN; } else if(acb_idx_8[i] <= 199){ ip16 = (71 + 3 * (acb_idx_8[i] - 162)/NEC_PITCH_RSLTN) * 2; fp16 = (3 * (acb_idx_8[i] - 162)) % NEC_PITCH_RSLTN; } else if(acb_idx_8[i] <= 254){ ip16 = (90 + (acb_idx_8[i] - 200)) * 2; fp16 = 0; } else{ ip16 = 0; fp16 = 0; } if ( fp16 != 0 ) ip16++; if(ip16==0) op_lag_tmp[i] = NEC_PITCH_LIMIT_FRQ16; else op_lag_tmp[i] = (ip16 - 32)*NEC_PITCH_RSLTN/2 + 2; } } lagbit =frame_bit_allocation[c_subframe*(num_shape_cbks+num_gain_cbks)+0]; posbit =frame_bit_allocation[c_subframe*(num_shape_cbks+num_gain_cbks)+1]; sgnbit =frame_bit_allocation[c_subframe*(num_shape_cbks+num_gain_cbks)+2]; gainbit=frame_bit_allocation[c_subframe*(num_shape_cbks+num_gain_cbks)+3]; /* Frame Operation */ if(c_subframe==0) { vu_flag = (long)signal_mode; if ( vu_flag == 0 ) { nec_bws_rms_dec(qxnorm, n_subframes, (float)NEC_RMS_MAX_U, (float)NEC_MU_LAW_U, (long)(NEC_BIT_RMS), (long)rms_index); } else { nec_bws_rms_dec(qxnorm, n_subframes, (float)NEC_RMS_MAX_V, (float)NEC_MU_LAW_V, (long)(NEC_BIT_RMS), (long)rms_index); } } qxnorm[c_subframe] = qxnorm[c_subframe] * (float)sqrt((float)sbfrm_size); /*------ Memory Allocation ----------*/ if((acbexc = (float *)calloc (sbfrm_size, sizeof(float)))==NULL) { printf("\n Memory allocation error in nec_abs_exc_generation \n"); exit(1); } if((mpexc = (float *)calloc (sbfrm_size, sizeof(float)))==NULL) { printf("\n Memory allocation error in nec_abs_exc_generation \n"); exit(1); } if((excitation = (float *)calloc (sbfrm_size, sizeof(float)))==NULL) { printf("\n Memory allocation error in nec_abs_exc_generation \n"); exit(1); } if((mpexc_8 = (float *)calloc(sbfrm_size,sizeof(float))) == NULL){ printf("\n Memory allocation error in nec_abs_exc_generation \n"); exit(1); } /* decode INDICES */ lag_idx = (long)shape_indices[c_subframe*num_shape_cbks+0]; st_idx = op_lag_tmp[c_subframe] - NEC_LAG_IDX_RNG/2; if(st_idx < 0) st_idx = 0; if((st_idx + NEC_LAG_IDX_RNG -1) >= NEC_PITCH_LIMIT_FRQ16) st_idx = NEC_PITCH_LIMIT_FRQ16 - NEC_LAG_IDX_RNG; if(op_lag_tmp[c_subframe]== NEC_PITCH_LIMIT_FRQ16) lag_idx = NEC_PITCH_LIMIT_FRQ16; else lag_idx = lag_idx + st_idx; mp_pos_idx = (long)shape_indices[c_subframe*num_shape_cbks+1]; mp_sgn_idx = (long)shape_indices[c_subframe*num_shape_cbks+2]; ga_idx = (long)gain_indices[c_subframe*num_gain_cbks+0]; /* Adaptive Code Book Decode */ nec_bws_acb_dec(acbexc,lag_idx,sbfrm_size,lagbit,mem_past_exc,&integer_lag); /* Multi-Pulse Excitation Decode */ for ( i = 0; i < sbfrm_size/2; i++ ) { mpexc_8[2*i] = bws_mp_exc[i]; mpexc_8[2*i+1] = 0.0; } num_pulse = sgnbit; nec_bws_mp_dec(vu_flag,&g_ac, &g_ec, &g_mp8, qxnorm[c_subframe], LpcCoef, integer_lag, mp_pos_idx, mp_sgn_idx, mpexc, acbexc, lpc_order, sbfrm_size, num_pulse, gainbit, ga_idx ); for(i = 0; i < sbfrm_size; i++){ excitation[i] = g_ac * acbexc[i] + g_ec * mpexc[i] + g_mp8 * mpexc_8[i]; } if ( postfilter ) { nec_bws_pitch_enhancement(excitation,decoded_excitation, mem_past_exc, vu_flag, lag_idx, sbfrm_size ); } else { for(i = 0; i < sbfrm_size; i++){ decoded_excitation[i] = excitation[i]; } } for(i = 0; i < pitch_max + NEC_PITCH_IFTAP16+1 - sbfrm_size; i++){ mem_past_exc[i] = mem_past_exc[i + sbfrm_size]; } for(i = 0; i < sbfrm_size; i++){ mem_past_exc[pitch_max + NEC_PITCH_IFTAP16+1 - sbfrm_size + i] = excitation[i]; } *adapt_gain = g_ac; *acb_delay = 0; c_subframe++; free( acbexc ); free( mpexc ); free( mpexc_8 ); free( excitation );}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -