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

📄 interp.c

📁 4.8k/s速率FS1016标准语音压缩源码
💻 C
字号:
#include "main.h"#include "interp.h"#include <stdio.h>static void InterpolateSubFrame(float	cur_lsf[ORDER],float	prev_lsf[ORDER],float	lsfint[NUM_SF][ORDER],int	sf);static void AnalCheckForMonotonicity(float	cur_lsfint[NUM_SF][ORDER],float	prev_lsfint[ORDER],int	sf,int	frame_num);static void SynthCheckForMonotonicity(float	cur_lsf[ORDER],float	prev_lsf[ORDER]);/***************************************************************************                                                                         ** ROUTINE*		Interpolate** FUNCTION*		Interpolation of LSFs* SYNOPSIS*		Interpolate(lsf, lsfint, where, frame_num)**   formal**                       data    I/O*       name            type    type    function*       -------------------------------------------------------------------*	lsf		float	 i	Frame of LSFs*	lsfint		float	 o	Frame of interpolated LSFs*	where		int	 i	analysis/synthesis flag*	frame_num	int	 i	Current frame number***************************************************************************** CALLED BY**	Analysis Synthesis***************************************************************************/void Interpolate(float 	lsf[ORDER],float	lsfint[NUM_SF][ORDER],int 	where,int	frame_num){int		i;static float	prev_ana_sf_lsf[ORDER];static float	prev_ana_ff_lsf[ORDER]= { 	0.03, 0.05, 0.09, 0.13, 0.19, 						0.23, 0.29, 0.33, 0.39, 0.44				   	};static float	prev_syn_lsf[ORDER]= 	{ 	0.03, 0.05, 0.09, 0.13, 0.19, 						0.23, 0.29, 0.33, 0.39, 0.44				   	};/*  Perform interpolation depending on whether this is analysis or synthesis */switch(where)	{/*  Analysis interpolation *//*-----------------------------------------------------------------------*/	case ANALYSIS: 	  for(i=0;i<NUM_SF;i++)	{/*  Interpolate for each subframe into interpolation matrix */	    InterpolateSubFrame(lsf, prev_ana_ff_lsf, lsfint, i);/*  Check for Nonmonotonic LSFs */	    AnalCheckForMonotonicity(lsfint, prev_ana_sf_lsf, i, frame_num);	  }/*  Update values for next pass */	  for(i=0;i<ORDER;i++)	{	    /*  Update previous subframe LSFs */	    prev_ana_sf_lsf[i] = lsfint[NUM_SF-1][i];	    /*  Update previous full frame LSFs */	    prev_ana_ff_lsf[i] = lsf[i];	  }	  break;/*-----------------------------------------------------------------------*/	case SYNTHESIS:/*  Check for Nonmonotonic LSFs */	  SynthCheckForMonotonicity(lsf, prev_syn_lsf);/*  Interpolate LSFs for each subframe into interpolation matrix */	  for(i=0;i<NUM_SF;i++)	{	    InterpolateSubFrame(lsf, prev_syn_lsf, lsfint, i);	  }/*  Update LSF history */	  for(i=0;i<ORDER;i++)	{	    prev_syn_lsf[i] = lsf[i];	  }	  break;/*-----------------------------------------------------------------------*/}}/***************************************************************************                                                                         ** ROUTINE*		InterpolateSubFrame** FUNCTION*		Interpolation one LSF subframe* SYNOPSIS*		InterpolateSubFrame(cur_lsf, prev_lsf, lsfint, sf)**   formal**                       data    I/O*       name            type    type    function*       -------------------------------------------------------------------*	cur_lsf		float	 i	Current Frame of LSFs*	prev_lsf	float	 i	Previous Frame of LSFs*	lsfint		float	 o	Frame of interpolated LSFs*	sf		int	 i	Current subframe number***************************************************************************/float win[2][4] = {	0.875, 0.625, 0.375, 0.125,                          0.125, 0.375, 0.625, 0.875	};void InterpolateSubFrame(float	cur_lsf[ORDER],float	prev_lsf[ORDER],float	lsfint[NUM_SF][ORDER],int	sf){int		i;/*  Interpolate for this subframe */	for(i=0;i<ORDER;i++)	{	  lsfint[sf][i] = win[0][sf] * prev_lsf[i]  +  win[1][sf] * cur_lsf[i];	}}/***************************************************************************                                                                         ** ROUTINE*		AnalCheckForMonotonicity** FUNCTION*		Check for nonmonotonic LSFs within interpolated matrix* SYNOPSIS*		AnalCheckForMonotonicity(cur_lsfint, prev_lsfint, sf, frame_num)**   formal**                       data    I/O*       name            type    type    function*       -------------------------------------------------------------------*	cur_lsfint	float	i/o	Current frame of interpolated LSFs*	prev_lsfint	float	 o	Previous frame of interpolated LSFs*	sf		int	 i	Current sub frame number*	frame_num	int	 i	Current frame number***************************************************************************/void AnalCheckForMonotonicity(float	cur_lsfint[NUM_SF][ORDER],float	prev_lsfint[ORDER],int	sf,int	frame_num){int	nonmono=FALSE;int	i;float	temp;/*  Check for nonotonically increasing LSFs, swap crossed LSFs */	for(i=1;i<ORDER;i++)	{	  if(cur_lsfint[sf][i] <= cur_lsfint[sf][i-1])	{	    printf("Analysis Interpolation:\n\tSwapping nonmono LSFs @ frame %d\n", frame_num);	    temp = cur_lsfint[sf][i];	    cur_lsfint[sf][i] = cur_lsfint[sf][i-1];	    cur_lsfint[sf][i-1] = temp;	  }	}/*  Recheck for monotonically increasing LSFs and substitute old LSFs */	for(i=1;i<ORDER;i++)	{	  if (cur_lsfint[sf][i] <= cur_lsfint[sf][i-1])	    nonmono = TRUE;	}	if (nonmono)	{	  printf("Analysis Interpolation:\n\tResetting interpolated LSF at frame %d\n",frame_num);	  for (i=0;i<ORDER;i++)	{	    if(i==0)	      cur_lsfint[sf][i] = prev_lsfint[i];	    else	      cur_lsfint[sf][i] = cur_lsfint[sf-1][i];	  }	}}/***************************************************************************                                                                         ** ROUTINE*		SynthCheckForMonotonicity** FUNCTION*		Check for nonmonotonic LSFs * SYNOPSIS*		SynthCheckForMonotonicity()**   formal**                       data    I/O*       name            type    type    function*       -------------------------------------------------------------------*	cur_lsf		float	i/o	Current frame's LSFs*	prev_lsf	float	 i	Previous frame's LSFs***************************************************************************/void SynthCheckForMonotonicity(float	cur_lsf[ORDER],float	prev_lsf[ORDER]){int	i;int	nonmono;/*  Try to fix any nonmonotonic LSFs by repeating pair	*/	for (i = 1; i < ORDER; i++)	{	  if (cur_lsf[i] <= cur_lsf[i - 1])	  {	    printf("Synthesis Interpolation: try to fix any nonmonotonic LSFs\n");	    cur_lsf[i] = prev_lsf[i];	    cur_lsf[i - 1] = prev_lsf[i - 1];    	  }  	}/*  Check fixed LSPs (also check for pairs too close?)	*/  	nonmono = FALSE;  	for (i = 1; i < ORDER; i++)  	{  	  if (cur_lsf[i] <= cur_lsf[i - 1])    	  nonmono = TRUE;  	}/*  If fix fails, repeat entire LSP vector		*/  	if (nonmono)  	{  	  printf("Synthesis Interpolation: repeat entire LSP vector\n");  	  for (i = 0; i < ORDER; i++)  	  {  	    cur_lsf[i] = prev_lsf[i];  	  }  	}}

⌨️ 快捷键说明

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