www.pudn.com > CryptoPhone-src-031122.zip > do_pfilt.c


/* Copyright 2001,2002,2003 NAH6 
 * All Rights Reserved 
 * 
 * Parts Copyright DoD, Parts Copyright Starium 
 * 
 */ 
#include  
#include  
#include "celpfilt.h" 
 
/************************************************************************** 
* 
* ROUTINE 
*		do_pfilt 
*		do_pfilt_dynamic 
* 
* FUNCTION 
*		pole filter - given a filter structure 
*		do_pfilt uses static coefficients 
*		do_pfilt_dynamic uses changing coefficients 
* 
* SYNOPSIS 
*		subroutine do_pfilt(flt, data) 
*		subroutine do_pfilt_dynamic(flt, coef, data) 
* 
*   formal  
* 
*                       data    I/O 
*       name            type    type    function 
*       -------------------------------------------------------------------	 
*	flt		FILTER	i/o	FILTER structure 
*	coef		float	 i	coefficients 
*	data		float	i/o	input/filtered output data	 
* 
*************************************************************************** 
*        
* DESCRIPTION 
* 
*	Recursive all-pole in-place time-domain filter. 
*	The transfer function 1/A(z) is implemented 
*	in a direct form realisation. 
* 
*                   N       -i 
*       H(z) = 1 / SUM a(i)z         with a(0) = +1.0 
*                  i=0 
* 
*	NOTE:  a(0) is not used for the actual computing, 
*	as can easily be seen in the following flow graph. 
* 
*       x(t) ->---+------->--------(z0)-----> y(t) 
*                 |                  | 
*                 +-------< -a1 ----z1 
*                 |                  | 
*                 +-------< -a2 ----z2 
*                 |                  | 
*                 :                  : 
*                 |                  | 
*                 +-------< -aN ----zN 
* 
* 
*************************************************************************** 
* 
* CALLED BY 
* 
*	FindAdaptResidual FindLPCResidual UpdateEverything 
*	HPF_InSpeech HPF_OutSpeech LPC_Synthesis PostFilter 
* 
***************************************************************************/ 
 
void do_pfilt( 
FILTER *flt, 
float data[]) 
{ 
  int t, j; 
 
  if (flt->coef[0] != 1.0) 
  { 
    printf("polefilt:  bad coefficients\n"); 
    exit(1); 
  } 
 
  for (t = 0; t < flt->data_length; t++) 
  { 
    flt->memory[0] = data[t]; 
    for (j = flt->order; j > 0; j--) 
    { 
      flt->memory[0] -= flt->coef[j] * flt->memory[j]; 
      flt->memory[j]  = flt->memory[j-1]; 
    } 
    data[t] = flt->memory[0]; 
  } 
} 
 
void do_pfilt_dynamic( 
FILTER 	*flt, 
float	coef[], 
float 	data[]) 
{ 
  int t, j; 
 
  if (coef[0] != 1.0) 
  { 
    printf("polefilt:  bad coefficients\n"); 
    exit(1); 
  } 
 
  for (t = 0; t < flt->data_length; t++) 
  { 
    flt->memory[0] = data[t]; 
    for (j = flt->order; j > 0; j--) 
    { 
      flt->memory[0] -= coef[j] * flt->memory[j]; 
      flt->memory[j]  = flt->memory[j-1]; 
    } 
    data[t] = flt->memory[0]; 
  } 
}