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
|
/*
Butterworth effect file for SoX
Copyright (C) 1999 Jan Paul Schmidt <jps@fundament.org>
This source code is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This source code is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Code based on the butterworth implementation in
Sound Processing Kit - A C++ Class Library for Audio Signal Processing
Copyright (C) 1995-1998 Kai Lassfolk
as described in
Computer music: synthesis, composition, and performance
Charles Dodge, Thomas A. Jerse
[2nd ed.]
Page 214
*/
#include <math.h>
#include "st_i.h"
#include "btrworth.h"
int st_butterworth_start (eff_t effp)
{
butterworth_t butterworth = (butterworth_t) effp->priv;
butterworth->x [0] = 0.0;
butterworth->x [1] = 0.0;
butterworth->y [0] = 0.0;
butterworth->y [1] = 0.0;
return (ST_SUCCESS);
}
int st_butterworth_flow (eff_t effp, st_sample_t *ibuf, st_sample_t *obuf,
st_size_t *isamp, st_size_t *osamp)
{
butterworth_t butterworth = (butterworth_t) effp->priv;
double in;
double out;
int len;
int done;
len = ((*isamp > *osamp) ? *osamp : *isamp);
for (done = 0; done < len; done++) {
in = *ibuf++;
/*
* Substituting butterworth->a [x] and butterworth->b [x] with
* variables, which are set outside of the loop, did not increased
* speed on my AMD Box. GCC seems to do a good job :o)
*/
out =
butterworth->a [0] * in +
butterworth->a [1] * butterworth->x [0] +
butterworth->a [2] * butterworth->x [1] -
butterworth->b [0] * butterworth->y [0] -
butterworth->b [1] * butterworth->y [1];
butterworth->x [1] = butterworth->x [0];
butterworth->x [0] = in;
butterworth->y [1] = butterworth->y [0];
butterworth->y [0] = out;
if (out < -2147483647.0) {
out = -2147483647.0;
}
else if (out > 2147483647.0) {
out = 2147483647.0;
}
*obuf++ = out;
}
*isamp = len;
*osamp = len;
return (ST_SUCCESS);
}
|