diff options
-rw-r--r-- | modules/ead.c | 2 | ||||
-rw-r--r-- | modules/eadsr.c | 2 | ||||
-rw-r--r-- | modules/ear.c | 2 | ||||
-rw-r--r-- | modules/extlib_util.h | 50 | ||||
-rw-r--r-- | modules/fdn.c | 2 | ||||
-rw-r--r-- | modules/filters.h | 232 | ||||
-rw-r--r-- | modules/permut.c | 2 | ||||
-rw-r--r-- | modules/tabreadmix.c | 2 |
8 files changed, 288 insertions, 6 deletions
diff --git a/modules/ead.c b/modules/ead.c index 37a979d..1fe09b7 100644 --- a/modules/ead.c +++ b/modules/ead.c @@ -19,7 +19,7 @@ #include <m_pd.h> #include <math.h> -#include "../include/extlib_util.h" +#include "extlib_util.h" /* pointer to */ t_class *ead_class; diff --git a/modules/eadsr.c b/modules/eadsr.c index 6acacac..8111223 100644 --- a/modules/eadsr.c +++ b/modules/eadsr.c @@ -19,7 +19,7 @@ #include <m_pd.h> #include <math.h> -#include "../include/extlib_util.h" +#include "extlib_util.h" typedef struct eadsrctl { diff --git a/modules/ear.c b/modules/ear.c index a9f646b..ac70ab1 100644 --- a/modules/ear.c +++ b/modules/ear.c @@ -19,7 +19,7 @@ #include <m_pd.h> #include <math.h> -#include "../include/extlib_util.h" +#include "extlib_util.h" typedef struct earctl { diff --git a/modules/extlib_util.h b/modules/extlib_util.h new file mode 100644 index 0000000..e6c074b --- /dev/null +++ b/modules/extlib_util.h @@ -0,0 +1,50 @@ +/* + * Prototypes for utility functions used in pd externals + * Copyright (c) 2000-2003 by Tom Schouten + * + * This program 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 program 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 General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef CREB_EXTLIB_UTIL_H +#define CREB_EXTLIB_UTIL_H + +#include <math.h> +#include "m_pd.h" + +/* envelope stuff */ + +/* exponential range for envelopes is 60dB */ +#define ENVELOPE_RANGE 0.001f +#define ENVELOPE_MAX (1.0f - ENVELOPE_RANGE) +#define ENVELOPE_MIN ENVELOPE_RANGE + +/* convert milliseconds to 1-p, with p a real pole */ +float milliseconds_2_one_minus_realpole(float time); + + +typedef union +{ + unsigned int i; + float f; +} t_flint; + +/* check if floating point number is denormal */ + +//#define IS_DENORMAL(f) (((*(unsigned int *)&(f))&0x7f800000) == 0) + +#define IS_DENORMAL(f) (((((t_flint)(f)).i) & 0x7f800000) == 0) + +#endif /* CREB_EXTLIB_UTIL_H */ + diff --git a/modules/fdn.c b/modules/fdn.c index 20bbaae..65682b7 100644 --- a/modules/fdn.c +++ b/modules/fdn.c @@ -28,7 +28,7 @@ check filtering code */ #include <m_pd.h> #include <math.h> -#include "../include/extlib_util.h" +#include "extlib_util.h" #include <stdlib.h> #include <stdio.h> diff --git a/modules/filters.h b/modules/filters.h new file mode 100644 index 0000000..8a32363 --- /dev/null +++ b/modules/filters.h @@ -0,0 +1,232 @@ +/* this file contains a 37th attempt to write a general purpose iir filter toolset */ + +/* defined as inline functions with call by reference to enable compiler ref/deref optim */ + +#ifndef CREB_FILTERS_H +#define CREB_FILTERS_H + +/* the typedef */ +#ifndef T +#define T float +#endif + + +/* the prototype for a word */ +#define P static inline void +#define PP static void + + +/* the 'reference' arguments */ +#define A *a +#define B *b +#define C *c +#define D *d +#define X *x +#define Y *y +#define S *s + + +/* the opcodes */ + +/* add */ +P cadd (T X, T Y, T A, T B, T C, T D) { X = A + C; Y = B + D;} +P cadd2 (T A, T B, T C, T D) { A += C; B += D;} +P vcadd (T X, T A, T C) { cadd(x,x+1,a,a+1,c,c+1); } +P vcadd2 (T A, T C) { cadd2(a,a+1,c,c+1); } + + +/* mul */ +P cmul_r (T X, T A, T B, T C, T D) { X = A * C - B * D;} +P cmul_i (T Y, T A, T B, T C, T D) { Y = A * D + B * C;} +P cmul (T X, T Y, T A, T B, T C, T D) +{ + cmul_r (x, a, b, c, d); + cmul_i (y, a, b, c, d); +} +P cmul2 (T A, T B, T C, T D) +{ + T x = A; + T y = B; + cmul (&x, &y, a, b, c, d); + A = x; + B = y; +} + +P vcmul (T X, T A, T C) { cmul(x,x+1,a,a+1,c,c+1); } +P vcmul2 (T A, T C) { cmul2(a,a+1,c,c+1); } + + +/* norm */ +static inline float vcnorm(T X) { return hypot(x[0], x[1]); } + + + +/* swap */ +P vcswap(T Y, T X) +{ + float t[2] = {x[0], x[1]}; + x[0] = y[0]; + x[1] = y[1]; + y[0] = t[0]; + y[1] = t[1]; +} + + +/* inverse */ +P vcinv(T Y, T X) +{ + float scale = 1.0f / vcnorm(x); + y[0] = scale * x[0]; + y[1] = scale * x[1]; +} + +P vcinv1(T X) +{ + float scale = 1.0f / vcnorm(x); + x[0] *= scale; + x[1] *= scale; +} + +/* exp */ + +/* X = exp(Y) */ +P vcexp2 (T Y, T X) +{ + T r = exp(x[0]); + y[0] = cos (x[1]); + y[1] = sin (x[1]); + y[0] *= r; + y[1] *= r; +} + +P vcexp1 (T X) +{ + T y[2]; + vcexp2(y,x); + x[0] = y[0]; + x[1] = y[1]; +} + +/* + FILTERS + + the transfer function is defined in terms of the "engineering" + bilateral z-transform of the discrete impulse response h[n]. + + H(z) = Sum{n = -inf -> inf} h[n] z^(-n) + + a unit delay operating on a singnal S(z) is therefore + represented as z^(-1) S(z) + +*/ + + + + + + + +/* biquads */ + +/* biquad, orthogonal (poles & zeros), real in, out, state, pole, output */ +P biq_orth_r (T X, T Y, T S, T A, T C) +{ + Y = X + c[0] * s[0] - c[1] * s[1]; /* mind sign of c[1] */ + vcmul2(s, a); + S += X; +} + + +/* biquad, orthogonal, complex one-pole, with scaling */ + +/* complex one pole: (output = s[0] + is[1]): C / (1-A z^(-1)) */ + +P one_pole_complex (T X, T Y, T S, T A, T C) +{ + vcmul(y, s, a); + vcadd2(y, x); + s[0] = y[0]; + s[1] = y[1]; + vcmul(y, s, c); +} + +/* complex conj two pole: (output = s[0] : (Re(C) - Re(C*Conj(A))) / (1 - A z^(-1)) (1 - Conj(A) z^(-1)) */ + +P two_pole_complex_conj (T X, T Y, T S, T A, T C) +{ + vcmul2(s, a); + s[0] += x[0]; + y[0] = s[0] * c[0] - s[1] * c[1]; +} + + + +/* support functions for IIR filter design */ + +/* evaluate pole and allzero TF in z^-1 given the complex zeros/poles: + p(z) (or p(z)^-1) = \product (1-z_i z^-1) */ +PP eval_zero_poly(float *val, float *arg, float *zeros, int nb_zeros) +{ + int i; + float a[2] = {arg[0], arg[1]}; + vcinv1(a); + val[0] = 1.0f; + val[1] = 0.0f; + a[0] *= -1; + a[1] *= -1; + for (i=0; i<nb_zeros; i++){ + float t[2]; + vcmul(t, a, zeros + 2*i); + t[0] += 1.0f; + vcmul2(val, t); + } +} + +PP eval_pole_poly(float *val, float *arg, float *poles, int nb_poles) +{ + eval_zero_poly(val, arg, poles, nb_poles); + vcinv1(val); +} + + +/* since it's more efficient to store half of the poles for a real impulse + response, these functions compute p(z) conj(p(conj(z))) */ + +PP eval_conj_zero_poly(float *val, float *arg, float *zeros, int nb_zeros) +{ + float t[2]; + float a[2] = {arg[0], arg[1]}; + eval_zero_poly(t, a, zeros, nb_zeros); + a[1] *= -1; + eval_zero_poly(val, a, zeros, nb_zeros); + val[1] *= -1; + vcmul2(val, t); +} + +PP eval_conj_pole_poly(float *val, float *arg, float *poles, int nb_poles) +{ + eval_conj_zero_poly(val, arg, poles, nb_poles); + vcinv1(val); +} + +PP eval_conj_pole_zero_ratfunc(float *val, float *arg, float *poles, float *zeros, int nb_poles, int nb_zeros) +{ + float t[2]; + eval_conj_zero_poly(t, arg, zeros, nb_zeros); + eval_conj_pole_poly(val, arg, poles, nb_zeros); + vcmul2(val, t); +} + + + +/* bandlimited IIR impulse: + + * design analog butterworth filter + * obtain the partial fraction expansion of the transfer function + * determine the state increment as a function of fractional delay of impulse location + (sample the impulse response) + +*/ + +#endif /* CREB_FILTERS_H */ + diff --git a/modules/permut.c b/modules/permut.c index 22da5dd..a81cc12 100644 --- a/modules/permut.c +++ b/modules/permut.c @@ -21,7 +21,7 @@ #include <m_pd.h> #include <math.h> -#include "../include/extlib_util.h" +#include "extlib_util.h" #include <stdlib.h> typedef struct permutctl diff --git a/modules/tabreadmix.c b/modules/tabreadmix.c index 9343fc2..d787f02 100644 --- a/modules/tabreadmix.c +++ b/modules/tabreadmix.c @@ -19,7 +19,7 @@ #include <m_pd.h> #include <math.h> -#include "../include/extlib_util.h" +#include "extlib_util.h" /******************** tabreadmix~ ***********************/ |