98184e4f038d89b627e0f097a69b09e923573e69
[asterisk/asterisk.git] / codecs / lpc10 / ivfilt.c
1 /*
2
3 $Log$
4 Revision 1.14  2003/02/12 13:59:15  matteo
5 mer feb 12 14:56:57 CET 2003
6
7 Revision 1.1.1.1  2003/02/12 13:59:15  matteo
8 mer feb 12 14:56:57 CET 2003
9
10 Revision 1.2  2000/01/05 08:20:39  markster
11 Some OSS fixes and a few lpc changes to make it actually work
12
13  * Revision 1.1  1996/08/19  22:31:53  jaf
14  * Initial revision
15  *
16
17 */
18
19 #ifdef P_R_O_T_O_T_Y_P_E_S
20 extern int ivfilt_(real *lpbuf, real *ivbuf, integer *len, integer *nsamp, real *ivrc);
21 #endif
22
23 /*  -- translated by f2c (version 19951025).
24    You must link the resulting object file with the libraries:
25         -lf2c -lm   (in that order)
26 */
27
28 #include "f2c.h"
29
30 /* ********************************************************************* */
31
32 /*      IVFILT Version 48 */
33
34 /* $Log$
35  * Revision 1.14  2003/02/12 13:59:15  matteo
36  * mer feb 12 14:56:57 CET 2003
37  *
38 /* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
39 /* mer feb 12 14:56:57 CET 2003
40 /*
41 /* Revision 1.2  2000/01/05 08:20:39  markster
42 /* Some OSS fixes and a few lpc changes to make it actually work
43 /*
44  * Revision 1.1  1996/08/19  22:31:53  jaf
45  * Initial revision
46  * */
47 /* Revision 1.3  1996/03/15  21:36:29  jaf */
48 /* Just added a few comments about which array indices of the arguments */
49 /* are used, and mentioning that this subroutine has no local state. */
50
51 /* Revision 1.2  1996/03/13  00:01:00  jaf */
52 /* Comments added explaining that none of the local variables of this */
53 /* subroutine need to be saved from one invocation to the next. */
54
55 /* Revision 1.1  1996/02/07 14:47:34  jaf */
56 /* Initial revision */
57
58
59 /* ********************************************************************* */
60
61 /*   2nd order inverse filter, speech is decimated 4:1 */
62
63 /* Input: */
64 /*  LEN    - Length of speech buffers */
65 /*  NSAMP  - Number of samples to filter */
66 /*  LPBUF  - Low pass filtered speech buffer */
67 /*           Indices LEN-NSAMP-7 through LEN read. */
68 /* Output: */
69 /*  IVBUF  - Inverse filtered speech buffer */
70 /*           Indices LEN-NSAMP+1 through LEN written. */
71 /*  IVRC   - Inverse filter reflection coefficients (for voicing) */
72 /*          Indices 1 and 2 both written (also read, but only after writing).
73 */
74
75 /* This subroutine has no local state. */
76
77 /* Subroutine */ int ivfilt_(real *lpbuf, real *ivbuf, integer *len, integer *
78         nsamp, real *ivrc)
79 {
80     /* System generated locals */
81     integer i__1;
82
83     /* Local variables */
84     integer i__, j, k;
85     real r__[3], pc1, pc2;
86
87 /*      Arguments */
88 /*       Local variables that need not be saved */
89 /*       Local state */
90 /*       None */
91 /*  Calculate Autocorrelations */
92     /* Parameter adjustments */
93     --ivbuf;
94     --lpbuf;
95     --ivrc;
96
97     /* Function Body */
98     for (i__ = 1; i__ <= 3; ++i__) {
99         r__[i__ - 1] = 0.f;
100         k = i__ - 1 << 2;
101         i__1 = *len;
102         for (j = (i__ << 2) + *len - *nsamp; j <= i__1; j += 2) {
103             r__[i__ - 1] += lpbuf[j] * lpbuf[j - k];
104         }
105     }
106 /*  Calculate predictor coefficients */
107     pc1 = 0.f;
108     pc2 = 0.f;
109     ivrc[1] = 0.f;
110     ivrc[2] = 0.f;
111     if (r__[0] > 1e-10f) {
112         ivrc[1] = r__[1] / r__[0];
113         ivrc[2] = (r__[2] - ivrc[1] * r__[1]) / (r__[0] - ivrc[1] * r__[1]);
114         pc1 = ivrc[1] - ivrc[1] * ivrc[2];
115         pc2 = ivrc[2];
116     }
117 /*  Inverse filter LPBUF into IVBUF */
118     i__1 = *len;
119     for (i__ = *len + 1 - *nsamp; i__ <= i__1; ++i__) {
120         ivbuf[i__] = lpbuf[i__] - pc1 * lpbuf[i__ - 4] - pc2 * lpbuf[i__ - 8];
121     }
122     return 0;
123 } /* ivfilt_ */
124