Audio
view release on metacpan or search on metacpan
sqrt(SQR(xReal(x,i))+SQR(xImag(x,i))),
180*(atan2(xImag(x,i),xReal(x,i)))/M_PI);
}
}
void
Audio_difference(int n, float *a, float *b)
{
int i;
for (i=0; i < n; i++)
b[i] = a[i+1] - a[i];
}
#ifdef ORIGINAL
void
Audio_autocorrelation(int N, float *x,unsigned p,float *r)
{
int k;
for (k=0; k <= p; k++)
{int n;
r[k] = 0.0;
for (n=0; n < N-k; n++)
r[k] += x[n]*x[n+k];
/* What the heck is this doing ? !
- well it is normalizing each entry which makes a kind
of sense when using it to spot period
but makes result useless for LPC via Audio_durbin() below.
*/
r[k] /= (float) (N-k);
}
}
#else
void
Audio_autocorrelation(int N, float *x,unsigned p,float *r)
{
unsigned i;
for (i = 0; i <= p; i++)
{
unsigned j;
float sum = 0.0;
for(j = 0; j < N - i; j++)
sum += x[j] * x[j + i];
r[i]= sum;
}
}
#endif
#ifdef __GNUC__
void
Audio_durbin(int NUM_POLES, float *R,float *aa)
{double E[NUM_POLES+1];
double k[NUM_POLES+1];
double a[NUM_POLES+1][NUM_POLES+1];
double G = R[0];
int i;
/* Set everything to NaN */
memset(a,-1,sizeof(a));
memset(k,-1,sizeof(k));
memset(E,-1,sizeof(E));
E[0] = R[0];
for (i=1; i <= NUM_POLES; i++)
{int j;
k[i] = 0.0;
for (j=1; j < i; j++)
k[i] += a[j][i-1]*R[i-j];
k[i] -= R[i];
k[i] /= E[i-1];
a[i][i] = -k[i];
for (j=1; j < i; j++)
{
a[j][i] = a[j][i-1]+k[i]*a[i-j][i-1];
}
E[i] = (1.0 - k[i]*k[i])*E[i-1];
}
for (i=1; i <= NUM_POLES; i++)
{
aa[i] = a[i][NUM_POLES];
G -= aa[i]*R[i];
}
/* Return gain as element zero */
if (G < 0.0)
G = -G;
aa[0] = sqrt(G);
}
#else
#define a(I,J) *(A+N*(I)+(J))
void
Audio_durbin(int NUM_POLES, float *R,float *aa)
{
int N = NUM_POLES+1;
double *E;
double *k;
double *A;
double G = R[0];
int i;
Newz('D',E,N,double);
Newz('D',k,N,double);
Newz('D',A,N*N,double);
E[0] = R[0];
for (i=1; i <= NUM_POLES; i++)
{int j;
k[i] = 0.0;
for (j=1; j < i; j++)
k[i] += a(j,i-1)*R[i-j];
k[i] -= R[i];
k[i] /= E[i-1];
a(i,i) = -k[i];
for (j=1; j < i; j++)
{
a(j,i) = a(j,i-1)+k[i]*a(i-j,i-1);
}
E[i] = (1.0 - k[i]*k[i])*E[i-1];
}
for (i=1; i <= NUM_POLES; i++)
( run in 1.547 second using v1.01-cache-2.11-cpan-39bf76dae61 )