[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