aboutsummaryrefslogtreecommitdiffstats
path: root/codecs/lpc10/preemp.c
blob: 3dfcd35439c504dc8a10e5de9bc542dccfdd57a2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/*

$Log$
Revision 1.6  2000/01/05 08:20:39  markster
Version 0.1.7 from FTP

Revision 1.2  2000/01/05 08:20:39  markster
Some OSS fixes and a few lpc changes to make it actually work

 * Revision 1.1  1996/08/19  22:30:58  jaf
 * Initial revision
 *

*/

#ifdef P_R_O_T_O_T_Y_P_E_S
extern int preemp_(real *inbuf, real *pebuf, integer *nsamp, real *coef, real *z__);
#endif

/*  -- translated by f2c (version 19951025).
   You must link the resulting object file with the libraries:
	-lf2c -lm   (in that order)
*/

#include "f2c.h"

/* ******************************************************************* */

/* 	PREEMP Version 55 */

/* $Log$
 * Revision 1.6  2000/01/05 08:20:39  markster
 * Version 0.1.7 from FTP
 *
/* Revision 1.2  2000/01/05 08:20:39  markster
/* Some OSS fixes and a few lpc changes to make it actually work
/*
 * Revision 1.1  1996/08/19  22:30:58  jaf
 * Initial revision
 * */
/* Revision 1.3  1996/03/14  23:16:29  jaf */
/* Just added a few comments about which array indices of the arguments */
/* are used, and mentioning that this subroutine has no local state. */

/* Revision 1.2  1996/03/11  23:23:34  jaf */
/* Added a bunch of comments to an otherwise simple subroutine. */

/* Revision 1.1  1996/02/07 14:48:48  jaf */
/* Initial revision */


/* ******************************************************************* */

/*   Preemphasize speech with a single-zero filter. */
/*  (When coef = .9375, preemphasis is as in LPC43.) */

/* Inputs: */
/*  NSAMP  - Number of samples to filter */
/*  INBUF  - Input speech buffer */
/*           Indices 1 through NSAMP are read. */
/*  COEF   - Preemphasis coefficient */
/* Input/Output: */
/*  Z      - Filter state */
/* Output: */
/*  PEBUF  - Preemphasized speech buffer (can be equal to INBUF) */
/*           Indices 1 through NSAMP are modified. */

/* This subroutine has no local state. */

/* Subroutine */ int preemp_(real *inbuf, real *pebuf, integer *nsamp, real *
	coef, real *z__)
{
    /* System generated locals */
    integer i__1;

    /* Local variables */
    real temp;
    integer i__;

/*       Arguments */
/*       Local variables */

/*       None of these need to have their values saved from one */
/*       invocation to the next. */

/*       Logically, this subroutine computes the output sequence */
/*       pebuf(1:nsamp) defined by: */

/*       pebuf(i) = inbuf(i) - coef * inbuf(i-1) */

/*       where inbuf(0) is defined by the value of z given as input to */
/*       this subroutine. */

/*       What is this filter's frequency response and phase response? */

/*       Why is this filter applied to the speech? */

/*       Could it be more efficient to apply multiple filters */
/*       simultaneously, by combining them into one equivalent filter? */

/*       Are there ever cases when "factoring" one high-order filter into 
*/
/*       multiple smaller-order filter actually reduces the number of */
/*       arithmetic operations needed to perform them? */
/*       When I first read this subroutine, I didn't understand why the */
/*       variable temp was used.  It seemed that the statements in the do 
*/
/*       loop could be replaced with the following: */

/*           pebuf(i) = inbuf(i) - coef * z */
/*           z = inbuf(i) */

/*       The reason for temp is so that even if pebuf and inbuf are the */
/*       same arrays in memory (i.e., they are aliased), then this */
/*       subroutine will still work correctly.  I didn't realize this */
/*       until seeing the comment after PEBUF above that says "(can be */
/*       equal to INBUF)". */
    /* Parameter adjustments */
    --pebuf;
    --inbuf;

    /* Function Body */
    i__1 = *nsamp;
    for (i__ = 1; i__ <= i__1; ++i__) {
	temp = inbuf[i__] - *coef * *z__;
	*z__ = inbuf[i__];
	pebuf[i__] = temp;
/* L10: */
    }
    return 0;
} /* preemp_ */