090a79e83089bc4525f80586259e87aaa3c41080
[speexdsp.git] / libspeex / speex.c
1 #include <stdlib.h>
2 #include <string.h>
3 #include <math.h>
4 #include "speex.h"
5 #include "lpc.h"
6 #include "lsp.h"
7
8 #ifndef M_PI
9 #define M_PI           3.14159265358979323846  /* pi */
10 #endif
11
12 #define sqr(x) ((x)*(x))
13
14 void encoder_init(EncState *st)
15 {
16    int i;
17    st->frameSize = 128;
18    st->windowSize = 256;
19    st->nbSubframes=4;
20    st->subframeSize=32;
21    st->lpcSize = 10;
22    st->bufSize = 256;
23    st->inBuf = malloc(st->bufSize*sizeof(float));
24    for (i=0;i<st->bufSize;i++)
25       st->inBuf[i]=0;
26    st->window = malloc(st->windowSize*sizeof(float));
27    /* Hanning window */
28    for (i=0;i<st->windowSize;i++)
29       st->window[i]=.5*(1-cos(2*M_PI*i/st->windowSize));
30    st->buf2 = malloc(st->windowSize*sizeof(float));
31    st->lpc = malloc((st->lpcSize+1)*sizeof(float));
32    st->autocorr = malloc((st->lpcSize+1)*sizeof(float));
33    /* Create the window for autocorrelation (lag-windowing) */
34    st->lagWindow = malloc((st->lpcSize+1)*sizeof(float));
35    for (i=0;i<st->lpcSize+1;i++)
36       st->lagWindow[i]=exp(-.5*sqr(2*M_PI*.01*i));
37    st->lsp = malloc(st->lpcSize*sizeof(float));
38    st->old_lsp = malloc(st->lpcSize*sizeof(float));
39    st->rc = malloc(st->lpcSize*sizeof(float));
40    st->first = 1;
41 }
42
43 void encoder_destroy(EncState *st)
44 {
45    free(st->inBuf);
46    free(st->window);
47    free(st->buf2);
48    free(st->lpc);
49    free(st->autocorr);
50    free(st->lagWindow);
51    free(st->lsp);
52    free(st->old_lsp);
53    free(st->rc);
54 }
55
56 void encode(EncState *st, float *in, int *outSize, void *bits)
57 {
58    int i, roots;
59    float error;
60
61    /* Copy new data in input buffer */
62    memmove(st->inBuf, st->inBuf+st->bufSize-st->frameSize, (st->bufSize-st->frameSize)*sizeof(float));
63    for (i=0;i<st->frameSize;i++)
64       st->inBuf[st->bufSize-st->frameSize+i] = in[i];
65
66    /* Window for analysis */
67    for (i=0;i<st->windowSize;i++)
68       st->buf2[i] = st->inBuf[i] * st->window[i];
69    /* Compute auto-correlation */
70    autocorr(st->buf2, st->autocorr, st->lpcSize+1, st->windowSize);
71    st->autocorr[0] += 1;        /* prevents NANs */
72    st->autocorr[0] *= 1.0001;   /* 40 dB noise floor */
73    /* Perform lag windowing here, equivalent to filtering in the power-spectrum domain */
74    for (i=0;i<st->lpcSize+1;i++)
75       st->autocorr[i] *= st->lagWindow[i];
76    /* Levinson-Durbin */
77    error = wld(st->lpc+1, st->autocorr, st->rc, st->lpcSize);
78    st->lpc[0]=1;
79    for (i=0;i<st->lpcSize+1;i++)
80       printf("%f ", st->lpc[i]);
81    printf ("\nprediction error = %f, R[0] = %f, gain = %f\n", error, st->autocorr[0], 
82            st->autocorr[0]/error);
83    /* LPC to LSPs (x-domain) transform */
84    roots=lpc_to_lsp (st->lpc, st->lpcSize, st->lsp, 6, 0.02);
85    for (i=0;i<roots;i++)
86       printf("%f ", st->lsp[i]);
87    printf ("\nfound %d roots\n", roots);
88
89    /* Quantize LSPs */
90
91    /* Back to "quantized" LPC */
92    lsp_to_lpc(st->lsp, st->lpc, roots);
93    for (i=0;i<st->lpcSize+1;i++)
94       printf("%f ", st->lpc[i]);
95    printf ("\n\n");
96
97    /* Compute "weighted" residue */
98
99    /* Find pitch */
100
101    for (i=0;i<st->lpcSize;i++)
102       st->old_lsp[i] = st->lsp[i];
103    st->first = 0;
104
105 }
106
107
108 void decoder_init(DecState *st)
109 {
110 }
111
112 void decoder_destroy(DecState *st)
113 {
114 }
115
116 void decode(DecState *st, float *bits, float *out)
117 {
118 }