From 2994949cca515f63fb82fa1d114ce07eb213220d Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 25 May 2006 16:03:20 +0000 Subject: moved headers from externals/creb/include to externals/creb/modules to dramatically simplify build process (I discussed this with Tom, he said he would make the changes to his own source repository, this is just a copy) svn path=/trunk/externals/creb/; revision=5126 --- modules/ead.c | 2 +- modules/eadsr.c | 2 +- modules/ear.c | 2 +- modules/extlib_util.h | 50 +++++++++++ modules/fdn.c | 2 +- modules/filters.h | 232 ++++++++++++++++++++++++++++++++++++++++++++++++++ modules/permut.c | 2 +- modules/tabreadmix.c | 2 +- 8 files changed, 288 insertions(+), 6 deletions(-) create mode 100644 modules/extlib_util.h create mode 100644 modules/filters.h 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 #include -#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 #include -#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 #include -#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 +#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 #include -#include "../include/extlib_util.h" +#include "extlib_util.h" #include #include 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 #include -#include "../include/extlib_util.h" +#include "extlib_util.h" #include 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 #include -#include "../include/extlib_util.h" +#include "extlib_util.h" /******************** tabreadmix~ ***********************/ -- cgit v1.2.1