useful script on bladecenters
[tridge/junkcode.git] / tstcomp.c
1 #include <stdlib.h>
2 #include <stdio.h>
3
4 #define MAX_ORDER 30
5 #define FRAME 128
6
7 typedef unsigned short uint16;
8
9 void lpredict(float *adc, int wsize, float *lpc, int order) 
10 {
11   int   i, j;
12   float ci, sum;
13   float tmp[MAX_ORDER];
14   float acf[MAX_ORDER];
15
16   for(i = 0; i <= order; i++) {
17     sum = 0.0;
18     for(j = 0; j < wsize - i; j++) sum += adc[j] * adc[j + i];
19     acf[i] = sum;
20   }
21   
22   /* find lpc coefficients */
23   lpc[0] = 1.0;
24   for(i = 1; i <= order; i++) {
25     ci = 0.0;
26     for(j = 1; j < i; j++) ci += lpc[j] * acf[i-j];
27     lpc[i] = ci;
28     for(j = 1; j < i; j++) tmp[j] = lpc[j] - ci * lpc[i-j];
29     for(j = 1; j < i; j++) lpc[j] = tmp[j];
30   }
31 }
32
33 void lpc2signal(float *adc, int wsize, float *lpc, int order) 
34 {
35   int   i, j;
36   float ci, sum;
37
38   for(i = 0; i <= order; i++) {
39     sum = 0.0;
40     for(j = 0; j < wsize - i; j++) sum += adc[j] * adc[j + i];
41     acf[i] = sum;
42   }
43   
44   /* find lpc coefficients */
45   lpc[0] = 1.0;
46   for(i = 1; i <= order; i++) {
47     ci = 0.0;
48     for(j = 1; j < i; j++) ci += lpc[j] * acf[i-j];
49     lpc[i] = ci;
50     for(j = 1; j < i; j++) tmp[j] = lpc[j] - ci * lpc[i-j];
51     for(j = 1; j < i; j++) lpc[j] = tmp[j];
52   }
53 }
54
55
56 void s_compress(uint16 *udat,float *dat,int framesize)
57 {
58   int i;
59   
60   /* to floats */
61   for (i=0;i<framesize;i++) dat[i] = udat[i];
62
63   lpredict(dat,framesize,lpc,order);
64
65 }
66
67 main()
68 {
69   float dat[FRAME];
70   uint16 udat[FRAME];
71
72   while (!feof(stdin))
73     {
74       /* read one frame of data */
75       if (fread(udat,2,FRAME,stdin) != FRAME) break;
76
77       /* compress it */
78       s_compress(udat,dat,FRAME);
79
80       /* uncompress */
81       s_uncompress(udat,dat,FRAME);
82
83       /* and write it out */
84       fwrite(udat,2,FRAME,stdout);
85     }
86 }