Version 0.1.12 from FTP
[asterisk/asterisk.git] / codecs / lpc10 / preemp.c
1 /*
2
3 $Log$
4 Revision 1.11  2000/01/05 08:20:39  markster
5 Version 0.1.12 from FTP
6
7 Revision 1.2  2000/01/05 08:20:39  markster
8 Some OSS fixes and a few lpc changes to make it actually work
9
10  * Revision 1.1  1996/08/19  22:30:58  jaf
11  * Initial revision
12  *
13
14 */
15
16 #ifdef P_R_O_T_O_T_Y_P_E_S
17 extern int preemp_(real *inbuf, real *pebuf, integer *nsamp, real *coef, real *z__);
18 #endif
19
20 /*  -- translated by f2c (version 19951025).
21    You must link the resulting object file with the libraries:
22         -lf2c -lm   (in that order)
23 */
24
25 #include "f2c.h"
26
27 /* ******************************************************************* */
28
29 /*      PREEMP Version 55 */
30
31 /* $Log$
32  * Revision 1.11  2000/01/05 08:20:39  markster
33  * Version 0.1.12 from FTP
34  *
35 /* Revision 1.2  2000/01/05 08:20:39  markster
36 /* Some OSS fixes and a few lpc changes to make it actually work
37 /*
38  * Revision 1.1  1996/08/19  22:30:58  jaf
39  * Initial revision
40  * */
41 /* Revision 1.3  1996/03/14  23:16:29  jaf */
42 /* Just added a few comments about which array indices of the arguments */
43 /* are used, and mentioning that this subroutine has no local state. */
44
45 /* Revision 1.2  1996/03/11  23:23:34  jaf */
46 /* Added a bunch of comments to an otherwise simple subroutine. */
47
48 /* Revision 1.1  1996/02/07 14:48:48  jaf */
49 /* Initial revision */
50
51
52 /* ******************************************************************* */
53
54 /*   Preemphasize speech with a single-zero filter. */
55 /*  (When coef = .9375, preemphasis is as in LPC43.) */
56
57 /* Inputs: */
58 /*  NSAMP  - Number of samples to filter */
59 /*  INBUF  - Input speech buffer */
60 /*           Indices 1 through NSAMP are read. */
61 /*  COEF   - Preemphasis coefficient */
62 /* Input/Output: */
63 /*  Z      - Filter state */
64 /* Output: */
65 /*  PEBUF  - Preemphasized speech buffer (can be equal to INBUF) */
66 /*           Indices 1 through NSAMP are modified. */
67
68 /* This subroutine has no local state. */
69
70 /* Subroutine */ int preemp_(real *inbuf, real *pebuf, integer *nsamp, real *
71         coef, real *z__)
72 {
73     /* System generated locals */
74     integer i__1;
75
76     /* Local variables */
77     real temp;
78     integer i__;
79
80 /*       Arguments */
81 /*       Local variables */
82
83 /*       None of these need to have their values saved from one */
84 /*       invocation to the next. */
85
86 /*       Logically, this subroutine computes the output sequence */
87 /*       pebuf(1:nsamp) defined by: */
88
89 /*       pebuf(i) = inbuf(i) - coef * inbuf(i-1) */
90
91 /*       where inbuf(0) is defined by the value of z given as input to */
92 /*       this subroutine. */
93
94 /*       What is this filter's frequency response and phase response? */
95
96 /*       Why is this filter applied to the speech? */
97
98 /*       Could it be more efficient to apply multiple filters */
99 /*       simultaneously, by combining them into one equivalent filter? */
100
101 /*       Are there ever cases when "factoring" one high-order filter into 
102 */
103 /*       multiple smaller-order filter actually reduces the number of */
104 /*       arithmetic operations needed to perform them? */
105 /*       When I first read this subroutine, I didn't understand why the */
106 /*       variable temp was used.  It seemed that the statements in the do 
107 */
108 /*       loop could be replaced with the following: */
109
110 /*           pebuf(i) = inbuf(i) - coef * z */
111 /*           z = inbuf(i) */
112
113 /*       The reason for temp is so that even if pebuf and inbuf are the */
114 /*       same arrays in memory (i.e., they are aliased), then this */
115 /*       subroutine will still work correctly.  I didn't realize this */
116 /*       until seeing the comment after PEBUF above that says "(can be */
117 /*       equal to INBUF)". */
118     /* Parameter adjustments */
119     --pebuf;
120     --inbuf;
121
122     /* Function Body */
123     i__1 = *nsamp;
124     for (i__ = 1; i__ <= i__1; ++i__) {
125         temp = inbuf[i__] - *coef * *z__;
126         *z__ = inbuf[i__];
127         pebuf[i__] = temp;
128 /* L10: */
129     }
130     return 0;
131 } /* preemp_ */
132