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

📄 code_lsf.c

📁 4.8k/s速率FS1016标准语音压缩源码
💻 C
字号:
          /*LINTLIBRARY*/          /*PROTOLIB1*/#include <math.h>#include "main.h"#include "lsftable.h"#include "code_lsf.h"

/* I can't figure out how to set this in the makefile using MS developer, so
I'm just going to set it here */
#define NEW_LSF_CODE 1int	BITS[10] = {3, 4, 4, 4, 4, 3, 3, 3, 3, 3};#define FSCALE	8000.0#ifdef NEW_LSF_CODE#define MIN_LSF_DIST	39#else#define MIN_LSF_DIST	0#endifstatic void AssignLSFFreqs(int	findex[ORDER],float	qlsp[ORDER]);static void CalcLSFFreq(float	lsp[ORDER],int	frequency,float	lsf[ORDER]);static void CheckMono(int	table[LSFTABLE_LENGTH][LSFTABLE_WIDTH],int	index[],int	num,float	lsf[],int	level,float	*errorup,float	*errordn,int	*nonmono);static void CorrectNonMono(float	errorup,float	errordn,int	findex[],int	where,int	level);static void InitLSFQuant(int	table[LSFTABLE_LENGTH][LSFTABLE_WIDTH],int	lsf[],int	level,int	lsfnum);static void QuantizeLSF(float 	input,int	level[],int 	nlevel,int	*findex);/***************************************************************************                                                                         ** ROUTINE*		QuanLSF** FUNCTION*		Quantize line spectral frequencies* SYNOPSIS*		QuanLSF(lsf, qlsf, freq_index)**   formal**                       data    I/O*       name            type    type    function*       -------------------------------------------------------------------*	lsf		float	 i	Unquantized LSFs*	qlsf		float 	 o	Quantized LSFs*	freq_index	int	 o	Indexes into frequency array***************************************************************************/void QuanLSF(float	lsf[ORDER],float	qlsf[ORDER],int	freq_index[ORDER]){float	freqs[ORDER];int	i, level;int	LSFInit[16];float	errorup, errordn;int	nonmonotonic=FALSE;/*  Calculate frequencies for LSPs */	CalcLSFFreq(lsf, 8000, freqs);/*  For each LSF */	for(i=0;i<ORDER;i++)	{/*  Calculate quantization level for ith LSF based on bit allocation */	  level = (int)pow(2.0, (double)BITS[i]) - 1;/*  Assign initial quantized LSFs */	  InitLSFQuant(LSFTable, LSFInit, level, i);/*  Quantize LSFs */	  QuantizeLSF(freqs[i], LSFInit, level+1, &freq_index[i]);/*  Check for monotonicity */	  if(i>0)	    CheckMono(LSFTable, freq_index, i, freqs, level, &errorup, &errordn, &nonmonotonic);/*  Correct if nonmonotonic */	  if (nonmonotonic)	    CorrectNonMono(errorup, errordn, freq_index, i, level);	}/*  Quantize LSF frequencies using indices found above */	AssignLSFFreqs(freq_index, qlsf);}/***************************************************************************                                                                         ** ROUTINE*		CalcLSFFreq** FUNCTION*		Calculate LSFs from LSPs using input frequency* SYNOPSIS*		CalcLSFFreq(lsp, frequency, lsf)**   formal**                       data    I/O*       name            type    type    function*       -------------------------------------------------------------------*	lsp		float	  i	Frame of input line spectral pairs*	frequency	int	  i	Sampling frequency*	lsf		float	  o	Frame of output line spectral frequencies***************************************************************************/void CalcLSFFreq(float	lsf[ORDER],int	frequency,float	freqs[ORDER]){int	i;/*  Calculate LSF based on sampling frequency */	for(i=0;i<ORDER;i++)	{	  freqs[i] = (float)frequency * lsf[i];	}}/***************************************************************************                                                                         ** ROUTINE*		InitLSFQuant** FUNCTION*		Initialize Quantized LSFs* SYNOPSIS*		InitLSFQuant(table, lsf, n)**   formal**                       data    I/O*       name            type    type    function*       -------------------------------------------------------------------*	table		int	  i	Table of LSFs*	lsf		float	  o	Frame of output line spectral frequencies*	level		int	  i	Number of levels*	lsfnum		int	  i	LSF number (not amount, but item number) ***************************************************************************/void InitLSFQuant(int	table[LSFTABLE_LENGTH][LSFTABLE_WIDTH],int	lsf[],int	level,int	lsfnum){int	i;/*  Assign values from table */	for(i=0;i<=level;i++)	{	  lsf[i] = table[lsfnum][i];	}}/***************************************************************************                                                                         ** ROUTINE*		CheckMono** FUNCTION*		Check frequencies indices for monotonicity* SYNOPSIS*		CheckMono(table, index, num, lsf, errorup, errordn, nonmono)**   formal**                       data    I/O*       name            type    type    function*       -------------------------------------------------------------------*	table		int	  i	Table of LSFs*	index		int	  i	Index into table*	num		int	  i	LSF number*	lsf		float	  i	Line spectral frequencies*	level		int	  i	Quantization level*	errorup		float	  o	Upward error correction*	errordn		float	  o	Downward error correction*	nonmono		int	  o	Flag indicating lack of monotonicity***************************************************************************/void CheckMono(int	table[LSFTABLE_LENGTH][LSFTABLE_WIDTH],int	index[],int	num,float	lsf[],int	level,float	*errorup,float	*errordn,int	*nonmono){/*  Check this frequency agains the previous one */	if(table[num][index[num]] - MIN_LSF_DIST <= table[num-1][index[num-1]])	{	  *errorup = fabs(lsf[num] - 			table[num][min(index[num]+1, level)])		 +   fabs(lsf[num-1] -			table[num-1][index[num-1]]);	  *errordn = fabs(lsf[num] -			table[num][index[num]])		 +   fabs(lsf[num-1] -			table[num-1][max(index[num-1]-1, 0)]);	  *nonmono = TRUE;	}	else	  *nonmono = FALSE;}/***************************************************************************                                                                         ** ROUTINE*		CorrectNonMono** FUNCTION*		Correct index for minimum error if nonmonotonic* SYNOPSIS*		CorrectNonMono(errorup, errordn, findex, where, level)**   formal**                       data    I/O*       name            type    type    function*       -------------------------------------------------------------------*	errorup		float	 i	Error adjustment measurement*	errordn		float	 i	Error adjustment measurement*	findex		float	i/o	Frequency index into LSFTable*	where		int	 i	Current LSF level*	level		int	 i	Number of quantization levels available***************************************************************************/void CorrectNonMono(float	errorup,float	errordn,int	findex[],int	where,int	level){	if (errorup < errordn) {	  findex[where] = min(findex[where]+1, level);	  while (LSFTable[where][findex[where]] - MIN_LSF_DIST < 			LSFTable[where-1][findex[where-1]])	{	    findex[where] = min(findex[where]+1, level);	  }	}	else	{	  if (where == 1) {	    findex[where-1] = max(findex[where-1]-1, 0);	  }	  else	{	    if (LSFTable[where-1][max(findex[where-1]-1,0)] - MIN_LSF_DIST >			LSFTable[where-2][findex[where-2]]) 	{	      findex[where-1] = max(findex[where-1]-1, 0);	    }	    else	{	      findex[where] = min(findex[where]+1, level);	      while(LSFTable[where][findex[where]] - MIN_LSF_DIST < 			LSFTable[where-1][findex[where-1]])	{	        findex[where] = min(findex[where]+1, level);	      }	    }		    	  }	}}/***************************************************************************                                                                         ** ROUTINE*		AssignLSFFreqs** FUNCTION*		Correct index for minimum error if nonmonotonic* SYNOPSIS*		AssignLSFFreqs(findex, qlsp)**   formal**                       data    I/O*       name            type    type    function*       -------------------------------------------------------------------*	findex		int	 i	Frequency index into LSF Table*	qlsp		int	 o	Quantized line spectral parameter***************************************************************************/void AssignLSFFreqs(int	findex[ORDER],float	qlsp[ORDER]){int	i;/* Quantize LSF frequencies using indices passed in */	for(i=0;i<ORDER;i++)	{	  qlsp[i] =  ((float)LSFTable[i][findex[i]] / FSCALE);	}}/**************************************************************************** ROUTINE*               UnquanLSF** FUNCTION*                *               Independent nonuniform scalar lsf decoder ** SYNOPSIS*               UnquanLSF(findex,order,lsf)**   formal **                       data    I/O*       name            type    type    function*       -------------------------------------------------------------------*       findex		int	i	lsf frequency index*	no		int	i	lpc order*	lsf		float	o	lsf quantized frequency****************************************************************************** CALLED BY**	codeparm***************************************************************************/void UnquanLSF(int 	findex[], int	order,float 	lsf[]){  int i;  /* *** choose appropriate frequency by findex */    for (i = 0; i < order; i++)  {    lsf[i] = LSFTable[i][findex[i]]/FSCALE;  }}/**************************************************************************** ROUTINE*		QuantizeLSF** FUNCTION*		Nearest output level scalar quantizer** SYNOPSIS*		QuantizeLSF(input, level, nlevel, findex)**   formal **                       data    I/O*       name            type    type    function*       -------------------------------------------------------------------*	input		real	i	Scalar to be quantized*	level(nlevel)	real	i	Output level table*	nlevel		int	i	Number of quantizer levels*	findex		int	o	Index to quantized output (zero based!)*****************************************************************************/void QuantizeLSF(float 	input,int	level[],int 	nlevel,int	*findex){int 	i;float 	dist, low=0.0;/*	*** Quantize to nearest output level:	*/	low = (float)fabs((double)(input - level[0]));	*findex = 0;	for(i = 1; i< nlevel; i++)	{	   dist = (float)fabs((double)(input - level[i]));	   if ((dist < low) || (i == 0)) 	   {	      low = dist;	      *findex = i;	   }	}	}

⌨️ 快捷键说明

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