This is lpa.c in view mode; [Download] [Up]
#include "pv.h" /* * given N samples of digital waveform x, lpa computes M+1 coefficients * by maximum entropy (autocorrelation) method for spectral estimation-- * these are returned in b[] (b[0] is always set to 1). lpa itself returns * the a0 (residual energy) coefficient. */ float lpa( x, N, b, M ) float x[], b[] ; int N, M ; { int i, j ; float s, at ; float a0, *rx, *rc ; char *malloc() ; rx = (float *) malloc( (M+2)*sizeof(float) ) ; rc = (float *) malloc( (M+2)*sizeof(float) ) ; for ( i = 0 ; i <= M + 1 ; i++ ) for ( rx[i] = j = 0 ; j < N - i ; j++ ) rx[i] += x[j]*x[i + j] ; b[0] = 1. ; b[1] = rc[0] = rx[0] != 0. ? -rx[1]/rx[0] : 0. ; a0 = rx[0] + rx[1]*rc[0] ; for ( i = 1 ; i < M ; i++ ) { for ( s = j = 0 ; j <= i ; j++ ) s += rx[i - j + 1]*b[j] ; rc[i] = a0 != 0. ? -s/a0 : 0. ; for ( j = 1 ; j <= (i + 1)>>1 ; j++ ) { at = b[j] + rc[i]*b[i-j+1] ; b[i-j+1] += rc[i]*b[j] ; b[j] = at ; } b[i+1] = rc[i] ; a0 += rc[i]*s ; /* if ( a0 <= 0. ) { fprintf( stderr, "lpa: matrix singularity" ) ; return( a0 ) ; } */ } free( rx ) ; free( rc ) ; return( a0 ) ; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.