2
* Sound Tools High-Pass effect file.
4
* (C) 2000 Chris Bagwell <cbagwell@sprynet.com>
5
* See License file for further copyright information.
7
* Algorithm: Recursive single pole high-pass filter
9
* Reference: The Scientist and Engineer's Guide to Digital Processing
11
* output[N] = A0 * input[N] + A1 * input[N-1] + B1 * output[N-1]
13
* X = exp(-2.0 * pi * Fc)
17
* Fc = cutoff freq / sample rate
19
* Mimics an RC high-pass filter:
35
/* Private data for Highpass effect */
36
typedef struct highpstuff {
45
int st_highp_getopts(eff_t effp, int n, char **argv)
47
highp_t highp = (highp_t) effp->priv;
49
if ((n < 1) || !sscanf(argv[0], "%f", &highp->cutoff))
51
st_fail("Usage: highp cutoff");
60
int st_highp_start(eff_t effp)
62
highp_t highp = (highp_t) effp->priv;
63
if (highp->cutoff > effp->ininfo.rate/2)
65
st_fail("Highpass: cutoff must be < sample rate / 2 (Nyquest rate)\n");
69
highp->B1 = exp((-2.0 * M_PI * (highp->cutoff / effp->ininfo.rate)));
70
highp->A0 = (1 + highp->B1) / 2;
71
highp->A1 = (-1 * (1 + highp->B1)) / 2;
78
* Processed signed long samples from ibuf to obuf.
79
* Return number of samples processed.
81
int st_highp_flow(eff_t effp, st_sample_t *ibuf, st_sample_t *obuf,
82
st_size_t *isamp, st_size_t *osamp)
84
highp_t highp = (highp_t) effp->priv;
89
len = ((*isamp > *osamp) ? *osamp : *isamp);
91
for(done = 0; done < len; done++) {
94
highp->A1 * highp->inm1 +
95
highp->B1 * highp->outm1;
98
else if (d > 2147483647L)
110
* Do anything required when you stop reading samples.
111
* Don't close input file!
113
int st_highp_stop(eff_t effp)