[PD-cvs] SF.net SVN: pure-data: [9825] trunk/externals/mrpeach
mrpeach at users.sourceforge.net
mrpeach at users.sourceforge.net
Fri May 16 23:20:03 CEST 2008
Revision: 9825
http://pure-data.svn.sourceforge.net/pure-data/?rev=9825&view=rev
Author: mrpeach
Date: 2008-05-16 14:20:02 -0700 (Fri, 16 May 2008)
Log Message:
-----------
A running mean external with settable length.
Added Paths:
-----------
trunk/externals/mrpeach/runningmean/
trunk/externals/mrpeach/runningmean/runningmean.c
trunk/externals/mrpeach/runningmean/runningmean.pd_linux
Added: trunk/externals/mrpeach/runningmean/runningmean.c
===================================================================
--- trunk/externals/mrpeach/runningmean/runningmean.c (rev 0)
+++ trunk/externals/mrpeach/runningmean/runningmean.c 2008-05-16 21:20:02 UTC (rev 9825)
@@ -0,0 +1,127 @@
+/* runningmean.c MP 20080516 */
+/* output the running mean of the input */
+#include "m_pd.h"
+
+/* We implement a circular buffer x_data of length x_n and */
+/* add all the values in it and divide by the */
+/* number of values to get the mean x_mean. */
+
+/* for simplicity and to avoid reallocation problems, we preallocate a longish array for the data */
+#define RUNNINGMEAN_MAX 1024 /* arbitrary maximum length of the data list*/
+
+typedef struct _runningmean
+{
+ t_object x_obj;
+ t_int x_in1;
+ t_int x_in2;
+ t_int x_in3;
+ t_outlet *x_out;
+ t_inlet *x_inlet2;
+ t_int x_n;
+ t_float x_data[RUNNINGMEAN_MAX];
+ t_float x_mean;
+ t_int x_pointer;
+} t_runningmean;
+
+static t_class *runningmean_class;
+
+void runningmean_setup(void);
+static void *runningmean_new(t_symbol *s, t_floatarg f);
+static void runningmean_free(t_runningmean *x);
+static void runningmean_bang(t_runningmean *x);
+static void runningmean_float(t_runningmean *x, t_float f);
+static void runningmean_length(t_runningmean *x, t_float f);
+static void runningmean_zero(t_runningmean *x);
+
+static void runningmean_float(t_runningmean *x, t_float f)
+{
+ float *p = x->x_data;
+ float total = 0;
+ int i;
+
+ /* add a float at the current location, overwriting the oldest data */
+ x->x_data[x->x_pointer] = f;
+ if (++x->x_pointer >= x->x_n) x->x_pointer = 0; /* wrap pointer */
+ for (i = 0; i < x->x_n; ++i) total += *p++;
+ x->x_mean = total/x->x_n;
+ outlet_float(x->x_out, x->x_mean);
+ return;
+}
+
+static void runningmean_bang(t_runningmean *x)
+{
+ outlet_float(x->x_out, x->x_mean);
+ return;
+}
+
+static void runningmean_length(t_runningmean *x, t_float f)
+{
+
+ if ((f >= 1) && ((int)f == f) && (f < RUNNINGMEAN_MAX))
+ {
+ x->x_n = (int)f;
+ runningmean_zero(x);
+ }
+ else post("runningmean length must be an integer between 1 and %d.", RUNNINGMEAN_MAX);
+ return;
+}
+
+static void runningmean_zero(t_runningmean *x)
+{
+ float *p = x->x_data;
+ int i;
+
+ /* zero the entire array */
+ for (i = 0; i < RUNNINGMEAN_MAX; ++i) *p++ = 0;
+ x->x_mean = 0;
+ x->x_pointer = 0;
+ return;
+}
+
+
+static void runningmean_free(t_runningmean *x)
+{
+ return;
+}
+
+static void *runningmean_new(t_symbol *s, t_floatarg f)
+{
+ t_runningmean *x;
+
+ post("runningmean_new %f", f);
+
+ x = (t_runningmean *)pd_new(runningmean_class);
+ if (x == NULL) return (x);
+ x->x_out = outlet_new((t_object *)x, &s_float);
+ x->x_inlet2 = inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("length"));
+ if (!((f >= 1) && ((int)f == f) && (f < RUNNINGMEAN_MAX)))
+ {
+ post("runningmean length %f must be an integer between 1 and %d, using %d", f, RUNNINGMEAN_MAX, RUNNINGMEAN_MAX);
+ f = RUNNINGMEAN_MAX;
+ }
+ {
+ x->x_n = (int)f;
+ runningmean_zero(x);
+ }
+ return (x);
+}
+
+void runningmean_setup(void)
+{
+ runningmean_class = class_new
+ (
+ gensym("runningmean"),
+ (t_newmethod)runningmean_new,
+ (t_method)runningmean_free,
+ sizeof(t_runningmean),
+ CLASS_DEFAULT,
+ A_DEFFLOAT,
+ 0
+ ); /* one argument for length */
+ class_addbang(runningmean_class, runningmean_bang);
+ class_addfloat(runningmean_class, runningmean_float);
+ class_addmethod(runningmean_class, (t_method)runningmean_length, gensym("length"), A_FLOAT, 0);
+ class_addmethod(runningmean_class, (t_method)runningmean_zero, gensym("clear"), 0);
+}
+/* end runningmean.c */
+
Added: trunk/externals/mrpeach/runningmean/runningmean.pd_linux
===================================================================
(Binary files differ)
Property changes on: trunk/externals/mrpeach/runningmean/runningmean.pd_linux
___________________________________________________________________
Name: svn:executable
+ *
Name: svn:mime-type
+ application/octet-stream
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Pd-cvs
mailing list