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

📄 codeparm.c

📁 手机加密通话软件
💻 C
📖 第 1 页 / 共 2 页
字号:


}

/*

*************************************************************************
*                                                                         *
* ROUTINE
*		Pack
*
* FUNCTION
*		Pack CELP parameters
* SYNOPSIS
*		Pack(NParams, Params, BitAllocs, NumPacked, Channel)
*
*   formal
*
*                       data    I/O
*       name            type    type    function
*       -------------------------------------------------------------------
*	NParams		int	 i	Number of parameters to pack
*	Params		int	 i	Frame of encoded analysis parameters
*	BitAllocs	int	 i	Bit allocations for each parameter
*	NumPacked	int	 o	Number of bits packed
*	Channel		int	 o	Frame of channel bits
*
**************************************************************************/

void Pack(
int		NParams,
int		Params[],
int		BitAllocs[], 
int		*NumPacked,
int		Channel[])
{
int		i, j, k=0;

	for(i=0; i<NParams; i++) { /* For each parameter */
	  for(j=0;j<BitAllocs[i]; j++) { /* For each bit in each parameter */
	    Channel[k++] = (Params[i] & (1<<j)) >> j;
	  }
	}

	*NumPacked = k;

}

/*

*************************************************************************
*                                                                         *
* ROUTINE
*		Unpack
*
* FUNCTION
*		Unpack CELP parameters
* SYNOPSIS
*		Unpack(NParams, BitAllocs, Channel, NumUnpacked, Params)
*
*   formal
*
*                       data    I/O
*       name            type    type    function
*       -------------------------------------------------------------------
*	NParams		int	 i	Number of parameters to unpack
*	BitAllocs	int	 i	Bit allocations for each parameter
*	Channel		int	 i	Frame of channel bits
*	NumUnpacked	int	 o	Number of bits unpacked
*	Params		int	 o	Frame of analysis parameters
*
**************************************************************************/

void Unpack(
int		NParams,
int		BitAllocs[],
int		Channel[],
int		*NumUnpacked,
int		Params[]) 
{
int	i, j, k=0;

	for(i=0; i<NParams; i++) { /* For each parameter */
	  Params[i] = 0;
	  for(j=0; j<BitAllocs[i]; j++) { /* For each bit in each parameter */
	    Params[i] |= Channel[k++] << j;
	  }
	}

	*NumUnpacked = k;

}

/*

*************************************************************************
*                                                                         *
* ROUTINE
*		ADelayEncode
*
* FUNCTION
*		Encode the Adaptive Delay
* SYNOPSIS
*		ADelayEncode(UDelay, QDelay)
*
*   formal
*
*                       data    I/O
*       name            type    type    function
*       -------------------------------------------------------------------
*	UDelay		float	 i	Unquantized adaptive delay
*	QDelay		int	 o	Quantized adaptive delay
*
**************************************************************************/

#include "adencode.h"
extern float DelayTable[MAX_NUM_ADAPT];

void ACBDelayEncode(
float	Udelay, 
int	*Qdelay)
{
int		i, j;
static int	even=FALSE;
static int	LastIndex=1;
int		MinDelayPtr, MaxDelayPtr;

	if(!even)	{
/*  On odd frames search through delay table until a match is found */
	  for(i=0;i<MAX_NUM_ADAPT;i++)	{
	    if (Udelay == DelayTable[i])	{
	      LastIndex = i;
	      break;
	    }
	  }

/*  Retrieve encoded delay value from table */
	  *Qdelay = adencode[i];

	}
	else		{	
/*  On even frames search for delta delay */
	  MinDelayPtr = LastIndex - (NUM_DELTA_ADELAYS / 2 - 1);
	  MaxDelayPtr = LastIndex + (NUM_DELTA_ADELAYS / 2);
	  if (MinDelayPtr < 0)	{
	    MinDelayPtr = 0;
	    MaxDelayPtr = NUM_DELTA_ADELAYS - 1;
	  }
	  if (MaxDelayPtr > NUM_FULL_ADELAYS-1)	{
	    MaxDelayPtr = NUM_FULL_ADELAYS - 1;
	    MinDelayPtr = NUM_FULL_ADELAYS - NUM_DELTA_ADELAYS;
	  }
	  for(i=MinDelayPtr, j=0; i<=MaxDelayPtr; i++, j++)	{
	    if (Udelay == DelayTable[i])	{
	      *Qdelay = j;
	      break;
	    }
	  }
	  
	}


/*  Update even flag */
	even = (even) ? FALSE : TRUE;

}
/*

*************************************************************************
*                                                                         *
* ROUTINE
*		ACBDelayDecode
*
* FUNCTION
*		Decode the Adaptive Delay
* SYNOPSIS
*		ACBDelayDecode(QDelay, UDelay)
*
*   formal
*
*                       data    I/O
*       name            type    type    function
*       -------------------------------------------------------------------
*	QDelay		int	 i	Quantized adaptive delay
*	UDelay		float	 o	Unquantized adaptive delay
*
**************************************************************************/

#include "addecode.h"

void ACBDelayDecode(
int	QDelay, 
float	*UDelay)
{
static int 	even = FALSE;
static int	LastIndex = 0;
static int	first = TRUE;
static int	DeltaDecodeTable[NUM_FULL_ADELAYS];
int		MaxDelayPtr, MinDelayPtr;
int		i;

/*  Generate table for delta delay decoding */
	if(first)	{
	  first = FALSE;
	  for (i = 0; i < NUM_FULL_ADELAYS; i++)
  	  {
    	    DeltaDecodeTable[adencode[i]] = i;
  	  }
	}

	if (!even)	{
/*  On even subframes decode from table */
	  *UDelay = addecode[QDelay];
	  LastIndex = DeltaDecodeTable[QDelay];
	}
	else		{
/*  On odd subframes decode relative to previous frame */
	  MinDelayPtr = LastIndex - (NUM_DELTA_ADELAYS / 2 - 1);
	  MaxDelayPtr = LastIndex + (NUM_DELTA_ADELAYS / 2);
	  if (MinDelayPtr < 0)	{
	    MinDelayPtr = 0;
	    MaxDelayPtr = NUM_DELTA_ADELAYS - 1;
	  }
	  if (MaxDelayPtr > NUM_FULL_ADELAYS-1)	{
	    MaxDelayPtr = NUM_FULL_ADELAYS - 1;
	    MinDelayPtr = NUM_FULL_ADELAYS - NUM_DELTA_ADELAYS;
	  }
	  *UDelay = DelayTable[MinDelayPtr + QDelay];
	}

/*  Update even */
	even = (even) ? FALSE:TRUE;
}
/*

*************************************************************************
*                                                                         *
* ROUTINE
*		FS1016Encode
*
* FUNCTION
*		Translate from bit structure to FS1016 compatible array
* SYNOPSIS
*		FS1016Encode(InStruct, OutArray)
*
*   formal
*
*                       data    I/O
*       name            type    type    function
*       -------------------------------------------------------------------
*	InStruct	TX_BITS	 i	Structure of quantized parameters
*	OutArray	int	 o	Array of FS1016 compatible parameters
*
**************************************************************************/

int FS1016Encode(
TX_BITS	InStruct,
int	OutArray[])
{
int	i, j=0;

/*  Put the LSFs into the array */
	for(i=0;i<ORDER;i++)	{
	  OutArray[j++] = InStruct.lsf[i];
	}

/*  Put each subframe's parameters into the array */
	for(i=0;i<NUM_SF;i++)	{
	  OutArray[j++] = InStruct.AdaptiveDelay[i];
	  OutArray[j++] = InStruct.AdaptiveGain[i];
	  OutArray[j++] = InStruct.StochasticIndex[i];
	  OutArray[j++] = InStruct.StochasticGain[i];
	}

/*  Now put in the Bishnu bit */
	OutArray[j++] = InStruct.Bishnu;

/*  Next the Hamming Code */
	OutArray[j++] = InStruct.Hamming;

/*  And last the sync bit */
	OutArray[j] = InStruct.Sync;

/*  Let the calling routine know how many parameters were filled */
	return(j+1);

}
/*

*************************************************************************
*                                                                         *
* ROUTINE
*		FS1016Decode
*
* FUNCTION
*		Translate to bit structure from FS1016 compatible array
* SYNOPSIS
*		FS1016Encode(InArray, OutStruct)
*
*   formal
*
*                       data    I/O
*       name            type    type    function
*       -------------------------------------------------------------------
*	InArray		int	 i	Array of FS1016 compatible parameters
*	OutStruct	TX_BITS	 o	Structure of quantized parameters
*
**************************************************************************/

int FS1016Decode(
int	InArray[],
TX_BITS	*OutStruct)
{
int	i, j=0;

/*  Get the LSFs from the array */
	for(i=0;i<ORDER;i++)	{
	  OutStruct->lsf[i] = InArray[j++];
	}

/*  Put each subframe's parameters into the array */
	for(i=0;i<NUM_SF;i++)	{
	  OutStruct->AdaptiveDelay[i] = InArray[j++];
	  OutStruct->AdaptiveGain[i] = InArray[j++];
	  OutStruct->StochasticIndex[i] = InArray[j++];
	  OutStruct->StochasticGain[i] = InArray[j++];
	}

/*  Now put in the Bishnu bit */
	OutStruct->Bishnu = InArray[j++];

/*  Next the Hamming Code */
	OutStruct->Hamming = InArray[j++];

/*  And last the sync bit */
	OutStruct->Sync = InArray[j];


/*  Let the calling routine know how many parameters were filled */
	return(j+1);

}

⌨️ 快捷键说明

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