remove extraneous svn:executable properties
[asterisk/asterisk.git] / codecs / lpc10 / invert.c
1 /*
2
3 $Log$
4 Revision 1.15  2004/06/26 03:50:14  markster
5 Merge source cleanups (bug #1911)
6
7 Revision 1.14  2003/02/12 13:59:15  matteo
8 mer feb 12 14:56:57 CET 2003
9
10 Revision 1.1.1.1  2003/02/12 13:59:15  matteo
11 mer feb 12 14:56:57 CET 2003
12
13 Revision 1.2  2000/01/05 08:20:39  markster
14 Some OSS fixes and a few lpc changes to make it actually work
15
16  * Revision 1.1  1996/08/19  22:32:00  jaf
17  * Initial revision
18  *
19
20 */
21
22 /*  -- translated by f2c (version 19951025).
23    You must link the resulting object file with the libraries:
24         -lf2c -lm   (in that order)
25 */
26
27 #include "f2c.h"
28
29 #ifdef P_R_O_T_O_T_Y_P_E_S
30 extern int invert_(integer *order, real *phi, real *psi, real *rc);
31 #endif
32
33 /* **************************************************************** */
34
35 /*      INVERT Version 45G */
36
37 /* $Log$
38  * Revision 1.15  2004/06/26 03:50:14  markster
39  * Merge source cleanups (bug #1911)
40  *
41 /* Revision 1.14  2003/02/12 13:59:15  matteo
42 /* mer feb 12 14:56:57 CET 2003
43 /*
44 /* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
45 /* mer feb 12 14:56:57 CET 2003
46 /*
47 /* Revision 1.2  2000/01/05 08:20:39  markster
48 /* Some OSS fixes and a few lpc changes to make it actually work
49 /*
50  * Revision 1.1  1996/08/19  22:32:00  jaf
51  * Initial revision
52  * */
53 /* Revision 1.3  1996/03/18  20:52:47  jaf */
54 /* Just added a few comments about which array indices of the arguments */
55 /* are used, and mentioning that this subroutine has no local state. */
56
57 /* Revision 1.2  1996/03/13  16:51:32  jaf */
58 /* Comments added explaining that none of the local variables of this */
59 /* subroutine need to be saved from one invocation to the next. */
60
61 /* Eliminated a comment from the original, describing a local array X */
62 /* that appeared nowhere in the code. */
63
64 /* Revision 1.1  1996/02/07 14:47:20  jaf */
65 /* Initial revision */
66
67
68 /* **************************************************************** */
69
70 /*  Invert a covariance matrix using Choleski decomposition method. */
71
72 /* Input: */
73 /*  ORDER            - Analysis order */
74 /*  PHI(ORDER,ORDER) - Covariance matrix */
75 /*                    Indices (I,J) read, where ORDER .GE. I .GE. J .GE. 1.*/
76 /*                     All other indices untouched. */
77 /*  PSI(ORDER)       - Column vector to be predicted */
78 /*                     Indices 1 through ORDER read. */
79 /* Output: */
80 /*  RC(ORDER)        - Pseudo reflection coefficients */
81 /*                    Indices 1 through ORDER written, and then possibly read.
82 */
83 /* Internal: */
84 /*  V(ORDER,ORDER)   - Temporary matrix */
85 /*                     Same indices written as read from PHI. */
86 /*                     Many indices may be read and written again after */
87 /*                     initially being copied from PHI, but all indices */
88 /*                     are written before being read. */
89
90 /*  NOTE: Temporary matrix V is not needed and may be replaced */
91 /*    by PHI if the original PHI values do not need to be preserved. */
92
93 /* Subroutine */ int invert_(integer *order, real *phi, real *psi, real *rc)
94 {
95     /* System generated locals */
96     integer phi_dim1, phi_offset, i__1, i__2, i__3;
97     real r__1, r__2;
98
99     /* Local variables */
100     real save;
101     integer i__, j, k;
102     real v[100] /* was [10][10] */;
103
104 /*       Arguments */
105 /* $Log$
106  * Revision 1.15  2004/06/26 03:50:14  markster
107  * Merge source cleanups (bug #1911)
108  *
109 /* Revision 1.14  2003/02/12 13:59:15  matteo
110 /* mer feb 12 14:56:57 CET 2003
111 /*
112 /* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
113 /* mer feb 12 14:56:57 CET 2003
114 /*
115 /* Revision 1.2  2000/01/05 08:20:39  markster
116 /* Some OSS fixes and a few lpc changes to make it actually work
117 /*
118  * Revision 1.1  1996/08/19  22:32:00  jaf
119  * Initial revision
120  * */
121 /* Revision 1.3  1996/03/29  22:03:47  jaf */
122 /* Removed definitions for any constants that were no longer used. */
123
124 /* Revision 1.2  1996/03/26  19:34:33  jaf */
125 /* Added comments indicating which constants are not needed in an */
126 /* application that uses the LPC-10 coder. */
127
128 /* Revision 1.1  1996/02/07  14:43:51  jaf */
129 /* Initial revision */
130
131 /*   LPC Configuration parameters: */
132 /* Frame size, Prediction order, Pitch period */
133 /*      Parameters/constants */
134 /*       Local variables that need not be saved */
135 /*  Decompose PHI into V * D * V' where V is a triangular matrix whose */
136 /*   main diagonal elements are all 1, V' is the transpose of V, and */
137 /*   D is a vector.  Here D(n) is stored in location V(n,n). */
138     /* Parameter adjustments */
139     --rc;
140     --psi;
141     phi_dim1 = *order;
142     phi_offset = phi_dim1 + 1;
143     phi -= phi_offset;
144
145     /* Function Body */
146     i__1 = *order;
147     for (j = 1; j <= i__1; ++j) {
148         i__2 = *order;
149         for (i__ = j; i__ <= i__2; ++i__) {
150             v[i__ + j * 10 - 11] = phi[i__ + j * phi_dim1];
151         }
152         i__2 = j - 1;
153         for (k = 1; k <= i__2; ++k) {
154             save = v[j + k * 10 - 11] * v[k + k * 10 - 11];
155             i__3 = *order;
156             for (i__ = j; i__ <= i__3; ++i__) {
157                 v[i__ + j * 10 - 11] -= v[i__ + k * 10 - 11] * save;
158             }
159         }
160 /*  Compute intermediate results, which are similar to RC's */
161         if ((r__1 = v[j + j * 10 - 11], abs(r__1)) < 1e-10f) {
162             goto L100;
163         }
164         rc[j] = psi[j];
165         i__2 = j - 1;
166         for (k = 1; k <= i__2; ++k) {
167             rc[j] -= rc[k] * v[j + k * 10 - 11];
168         }
169         v[j + j * 10 - 11] = 1.f / v[j + j * 10 - 11];
170         rc[j] *= v[j + j * 10 - 11];
171 /* Computing MAX */
172 /* Computing MIN */
173         r__2 = rc[j];
174         r__1 = min(r__2,.999f);
175         rc[j] = max(r__1,-.999f);
176     }
177     return 0;
178 /*  Zero out higher order RC's if algorithm terminated early */
179 L100:
180     i__1 = *order;
181     for (i__ = j; i__ <= i__1; ++i__) {
182         rc[i__] = 0.f;
183     }
184 /*  Back substitute for PC's (if needed) */
185 /* 110  DO J = ORDER,1,-1 */
186 /*         PC(J) = RC(J) */
187 /*         DO I = 1,J-1 */
188 /*            PC(J) = PC(J) - PC(I)*V(J,I) */
189 /*         END DO */
190 /*      END DO */
191     return 0;
192 } /* invert_ */
193