Update of /cvsroot/pure-data/externals/fftw In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv16542
Added Files: LICENSE.txt Makefile Makefile.in README.txt configure.ac fftw_config.h fftw_config.h.in fftw~-help.pd fftw~.c fftw~.h fftw~.pd ifftw~-help.pd ifftw~.c ifftw~.pd rfftw~-help.pd rfftw~.c rfftw~.pd rifftw~-help.pd rifftw~.c rifftw~.pd Log Message: library providing FFT-objects using the (fast!) libFFTW
--- NEW FILE: fftw~.pd --- #N canvas 0 0 450 300 10; #X obj 163 69 inlet~; #X obj 188 89 inlet~; #X obj 163 159 outlet~; #X obj 188 179 outlet~; #X obj 162 127 fft~; #X text 1 29 fall-back abstraction when there is no libFFTW installed ; #X connect 0 0 4 0; #X connect 1 0 4 1; #X connect 4 0 2 0; #X connect 4 1 3 0;
--- NEW FILE: fftw~.c --- /* Copyright (c) 1997-1999 Miller Puckette and others. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */
#include "fftw~.h"
#ifdef HAVE_LIBFFTW3F
/* Support for fftw3 by Tim Blechmann */
/* ------------------------ fft~ -------------------------------- */ static t_class *sigfftw_class;
typedef struct fftw { t_object x_obj; float x_f;
fftwf_plan plan; fftwf_iodim dim; } t_sigfftw;
static void *sigfftw_new(void) { t_sigfftw *x = (t_sigfftw *)pd_new(sigfftw_class); outlet_new(&x->x_obj, gensym("signal")); outlet_new(&x->x_obj, gensym("signal")); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); x->x_f = 0; return (x); }
static void sigfftw_free(t_sigfftw * x) { fftwf_destroy_plan(x->plan); }
static t_int *sigfftw_perform(t_int *w) { fftwf_execute(*(fftwf_plan *)w[1]);
return (w+2); }
static void sigfftw_dsp(t_sigfftw *x, t_signal **sp) { int n = sp[0]->s_n; float *in1 = sp[0]->s_vec; float *in2 = sp[1]->s_vec; float *out1 = sp[2]->s_vec; float *out2 = sp[3]->s_vec;
x->dim.n=n; x->dim.is=1; x->dim.os=1; x->plan = fftwf_plan_guru_split_dft(1, &(x->dim), 0, NULL, in1, in2, out1, out2, FFTW_ESTIMATE); dsp_add(sigfftw_perform, 1, &x->plan); }
EXTERNAL_SETUP fftw_tilde_setup(void) { sigfftw_class = class_new(gensym("fftw~"), sigfftw_new, (t_method) sigfftw_free, sizeof(t_sigfftw), 0, 0); CLASS_MAINSIGNALIN(sigfftw_class, t_sigfftw, x_f); class_addmethod(sigfftw_class, (t_method)sigfftw_dsp, gensym("dsp"), 0); } #endif
--- NEW FILE: rifftw~.c --- /* Copyright (c) 1997-1999 Miller Puckette and others. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */
#include "fftw~.h"
#ifdef HAVE_LIBFFTW3F
/* Support for fftw3 by Tim Blechmann */
/* ----------------------- rifft~ -------------------------------- */
static t_class *sigrifftw_class;
typedef struct rifftw { t_object x_obj; float x_f;
fftwf_plan plan; fftwf_iodim dim; } t_sigrifftw;
static void *sigrifftw_new(void) { t_sigrifftw *x = (t_sigrifftw *)pd_new(sigrifftw_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, gensym("signal")); x->x_f = 0; return (x); }
static void sigrifftw_free(t_sigrifftw *x) { fftwf_destroy_plan(x->plan); }
static t_int *sigrifftw_perform(t_int *w) { fftw_siginvert((t_sample *)w[2],w[3]); fftwf_execute(*(fftwf_plan*)w[1]);
return (w+4); }
static void sigrifftw_dsp(t_sigrifftw *x, t_signal **sp) { int n = sp[0]->s_n, n2 = (n>>1); float *in1 = sp[0]->s_vec; float *in2 = sp[1]->s_vec; float *out = sp[2]->s_vec;
if (n < 4) { error("fft: minimum 4 points"); return; }
else { x->dim.n=n; x->dim.is=1; x->dim.os=1; x->plan = fftwf_plan_guru_split_dft_c2r(1, &(x->dim), 0, NULL, in1, in2, out, FFTW_ESTIMATE | FFTW_PRESERVE_INPUT); dsp_add_zero(in1+ n/2, n/2); dsp_add(sigrifftw_perform,3,&x->plan,in2,n2); } }
EXTERNAL_SETUP rifftw_tilde_setup(void) { sigrifftw_class = class_new(gensym("rifftw~"), sigrifftw_new, (t_method)sigrifftw_free, sizeof(t_sigrifftw), 0, 0); CLASS_MAINSIGNALIN(sigrifftw_class, t_sigrifftw, x_f); class_addmethod(sigrifftw_class, (t_method)sigrifftw_dsp, gensym("dsp"), 0); } #endif
--- NEW FILE: Makefile.in --- LIBNAME =fftw~ VERSION =0.1
PREFIX =@prefix@@PDLIBDIR@
INSTALL_BIN=$(PREFIX)/extra
EXT = @EXT@ DEFS = @DFLAGS@ -DVERSION="$(VERSION)" IFLAGS = -I. @INCLUDES@ $(INCLUDES)
CC = @CC@ LD = @LD@ STRIP = @STRIP@ @STRIPFLAGS@
AFLAGS = LFLAGS = @LFLAGS@ WFLAGS =
MAKEDEP_FLAGS = @MAKEDEP_FLAGS@
TARNAME = $(LIBNAME)-@VERSION@.tgz BINTARNAME = $(LIBNAME)-@VERSION@-bin.tgz
.SUFFIXES: .$(EXT)
CFLAGS = $(DEFS) $(IFLAGS) $(WFLAGS) @CFLAGS@
LIBS = @LIBS@
SOURCES=$(sort $(filter %.c, $(wildcard *.c))) OTARGETS = $(SOURCES:.c=.o) TARGETS = $(SOURCES:.c=.$(EXT))
ifeq (,$(findstring fftw3, $(LIBS) )) all: @echo "nothing to be done (no fftw3)"
else all: $(TARGETS)
endif
clean: -rm -f *.o *.d
binclean: -rm -f *.$(EXT)
distclean: clean binclean -rm -f *~ _* config.* -rm -rf autom4te.cache
install: install-bin install-doc
install-bin: all -install -d $(INSTALL_BIN) -install -m 644 *.$(EXT) $(INSTALL_BIN)
install-doc: -install -d $(INSTALL_BIN) -install -m 644 *.pd $(INSTALL_BIN)
dist: distclean (cd ..;tar czvf $(TARNAME) $(LIBNAME))
distbin: distclean all clean (cd ..; tar cvzf $(BINTARNAME) $(LIBNAME))
everything: clean all install distclean
%.$(EXT): %.o $(LD) $(LFLAGS) -o $@ *.o $(LIBS) $(STRIP) $@
$(LIBNAME): $(OTARGETS) $(LD) $(LFLAGS) -o $(LIBNAME).$(EXT) *.o $(LIBS) $(STRIP) $(LIBNAME).$(EXT)
## dependencies: as proposed by the GNU-make documentation ## see http://www.gnu.org/software/make/manual/html_node/make_47.html#SEC51 -include $(SOURCES:.c=.d) %.d: %.c @set -e; rm -f $@; \ $(CC) $(MAKEDEP_FLAGS) $(CFLAGS) $< > $@.$$$$; \ sed 's,($*).o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \ rm -f $@.$$$$
configure: configure.ac autoconf
Makefile: Makefile.in configure ./configure
--- NEW FILE: rifftw~.pd --- #N canvas 0 0 450 300 10; #X obj 163 69 inlet~; #X obj 163 159 outlet~; #X obj 162 127 rifft~; #X obj 206 99 inlet~; #X text 1 29 fall-back abstraction when there is no libFFTW installed ; #X connect 0 0 2 0; #X connect 2 0 1 0; #X connect 3 0 2 1;
--- NEW FILE: rfftw~.pd --- #N canvas 0 0 450 300 10; #X obj 163 69 inlet~; #X obj 163 159 outlet~; #X obj 198 179 outlet~; #X obj 162 127 rfft~; #X text 1 29 fall-back abstraction when there is no libFFTW installed ; #X connect 0 0 3 0; #X connect 3 0 1 0; #X connect 3 1 2 0;
--- NEW FILE: Makefile ---
default: ./configure && make
--- NEW FILE: fftw~.h --- #ifndef FFTW_TILDE_H_ #define FFTW_TILDE_H_
#include "fftw_config.h"
#include "m_pd.h"
#ifdef HAVE_LIBFFTW3F # include "fftw3.h" # include <string.h> #endif
#define EXTERNAL_SETUP void
static void fftw_siginvert(t_sample * s, t_int n) { while (n!=0) { --n; s[n]=-s[n]; } } #endif /* FFTW_TILDE_H_ */
--- NEW FILE: ifftw~.pd --- #N canvas 0 0 450 300 10; #X obj 163 69 inlet~; #X obj 198 89 inlet~; #X obj 163 159 outlet~; #X obj 198 179 outlet~; #X obj 162 127 ifft~; #X text 1 29 fall-back abstraction when there is no libFFTW installed ; #X connect 0 0 4 0; #X connect 1 0 4 1; #X connect 4 0 2 0; #X connect 4 1 3 0;
--- NEW FILE: rfftw~.c --- /* Copyright (c) 1997-1999 Miller Puckette and others. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */
#include "fftw~.h"
#ifdef HAVE_LIBFFTW3F
/* Support for fftw3 by Tim Blechmann */
/* ----------------------- rfft~ --------------------------------- */
static t_class *sigrfftw_class;
typedef struct rfftw { t_object x_obj; float x_f;
fftwf_plan plan; fftwf_iodim dim; } t_sigrfftw;
static void *sigrfftw_new(void) { t_sigrfftw *x = (t_sigrfftw *)pd_new(sigrfftw_class); outlet_new(&x->x_obj, gensym("signal")); outlet_new(&x->x_obj, gensym("signal")); x->x_f = 0; return (x); }
static void sigrfftw_free(t_sigrfftw *x) { fftwf_destroy_plan(x->plan); }
static t_int *sigrfftw_perform(t_int *w) { fftwf_execute(*(fftwf_plan*)w[1]); fftw_siginvert((t_sample*)w[2],(t_int)w[3]);
return (w+4); }
static void sigrfftw_dsp(t_sigrfftw *x, t_signal **sp) { int n = sp[0]->s_n, n2 = (n>>1); float *in = sp[0]->s_vec; float *out1 = sp[1]->s_vec; float *out2 = sp[2]->s_vec;
if (n < 4) { error("fft: minimum 4 points"); return; } else { x->dim.n=n; x->dim.is=1; x->dim.os=1; x->plan = fftwf_plan_guru_split_dft_r2c(1, &(x->dim), 0, NULL, in, out1, out2, FFTW_ESTIMATE | FFTW_PRESERVE_INPUT); dsp_add(sigrfftw_perform,3,&x->plan,out2+1,n2-1); }
dsp_add_zero(out1 + n2, n2); dsp_add_zero(out2 + n2, n2); }
EXTERNAL_SETUP rfftw_tilde_setup(void) { sigrfftw_class = class_new(gensym("rfftw~"), sigrfftw_new, (t_method)sigrfftw_free, sizeof(t_sigrfftw), 0, 0); CLASS_MAINSIGNALIN(sigrfftw_class, t_sigrfftw, x_f); class_addmethod(sigrfftw_class, (t_method)sigrfftw_dsp, gensym("dsp"), 0); } #endif
--- NEW FILE: fftw~-help.pd --- #N canvas 99 336 541 313 10; #X obj 164 93 fftw~; #X text 87 56 forward complex FFT using libFFTW; #X text 88 136 this object is a drop-in replacement for pd's built-in fft-object; #X text 105 205 for help see; #X obj 213 204 fft~;
--- NEW FILE: rfftw~-help.pd --- #N canvas 0 0 605 326 10; #X text 105 205 for help see; #X text 85 56 forward real FFT using libFFTW; #X obj 164 93 rfftw~; #X obj 213 204 rfft~; #X text 88 136 this object is a drop-in replacement for pd's built-in rfft-object;
--- NEW FILE: configure.ac --- dnl Process this file with autoconf to produce a configure script. AC_INIT(fftw_config.h.in)
AC_CONFIG_HEADER(fftw_config.h)
dnl Checks for programs. AC_PROG_CC
AC_SUBST(STK) AC_SUBST(DFLAGS) AC_SUBST(LFLAGS) AC_SUBST(EXT) AC_SUBST(LD) AC_SUBST(STRIP) AC_SUBST(STRIPFLAGS) AC_SUBST(REFERENCEPATH) AC_SUBST(PDLIBDIR) AC_SUBST(INCLUDES) AC_SUBST(VERSION) AC_SUBST(HAVE_LIBFFTW3F)
AC_ARG_WITH(pdversion, [ --with-pdversion=<ver> enforce a certain pd-version (e.g. 0.37)]) AC_ARG_WITH(extension, [ --with-extension=<ext> enforce a certain extension for the dynamic library (e.g. dll)])
dnl Checks for libraries. dnl Replace `main' with a function in -lc: AC_CHECK_LIB(c, main) AC_CHECK_LIB(crtdll, fclose)
dnl Replace `main' with a function in -lm: AC_CHECK_LIB(m, main) dnl Replace `main' with a function in -lpthread: dnl AC_CHECK_LIB(pthread, main) dnl Replace `main' with a function in -lstk: dnl AC_CHECK_LIB(stk, main, STK=yes)
AC_CHECK_LIB(fftw3f, fftwf_execute)
if test "x$includedir" != "x"; then for id in $includedir do if test -d $id; then INCLUDES="-I$id $INCLUDES"; fi done fi if test "x$libdir" != "x"; then for id in $libdir do if test -d $id; then LIBS="-L$id $LIBS"; fi done fi
AC_CHECK_LIB(pd, nullfn)
dnl Checks for header files. AC_HEADER_STDC AC_CHECK_HEADERS(stdlib.h stdio.h string.h math.h time.h sys/time.h)
dnl Checks for typedefs, structures, and compiler characteristics. AC_HEADER_TIME
dnl Checks for library functions. AC_FUNC_MMAP AC_CHECK_FUNCS(select socket strerror)
dnl check for "-mms-bitfields" cflag dnl why is there no generic compiler-check for a given flag ? dnl it would make things so easy: AC_CHECK_FLAG([-mms-bitfields],,) AC_MSG_CHECKING("ms-bitfields") cat > conftest.c << EOF int main(){ return 0; } EOF if ${CC} ${INCLUDES} ${DFLAGS} -o conftest.o conftest.c ${CFLAGS} -mms-bitfields > /dev/null 2>&1 then echo "yes" CFLAGS="${CFLAGS} -mms-bitfields" else echo "no" fi
### make-depend flags if test "x$ac_cv_c_compiler_gnu" = "xyes"; then AC_SUBST(MAKEDEP_FLAGS, "-MM") else AC_SUBST(MAKEDEP_FLAGS, "-M") fi
dnl isn't there a better way to check for good linker/stripper ?
dnl if we don't have $LD set, we set it to $(CC) dnl LD=${LD:=$CC} AC_CHECK_TOOL([LD], [ld], [${CC}])
dnl if we don't have $STRIP set, we set it to ${host}-strip or strip
dnl if we don't have $STRIP set, we set it to ${host}-strip or strip AC_CHECK_TOOL([STRIP], [strip], [true]) AC_MSG_CHECKING([if strip is GNU strip]) if $STRIP -V | grep GNU > /dev/null then AC_SUBST(STRIPFLAGS, "--strip-unneeded") AC_MSG_RESULT([yes]) else AC_SUBST(STRIPFLAGS,"-x") AC_MSG_RESULT([no]) fi
dnl dnl OK, checks for machines are here now dnl if test `uname -s` = Linux; then LFLAGS="-export_dynamic -shared" CFLAGS="-fPIC $CFLAGS" EXT=pd_linux fi
dnl This should use '-bundle_loader /path/to/pd/bin/pd' instead of'-undefined suppress' dnl then strip might do something if test `uname -s` = Darwin; then LD=cc LFLAGS="-bundle -undefined suppress -flat_namespace" EXT=pd_darwin STRIPFLAGS= fi
if test `uname | sed -e 's/^MINGW.*/NT/'` = NT; then LD=gcc INCLUDES="-I@prefix@/src" DFLAGS="-D__WIN32__ ${DFLAGS}" LFLAGS="-shared @prefix@/bin/pd.dll" EXT=dll else PDLIBDIR="/lib/pd" fi
if test `uname -s` = IRIX64; then LFLAGS="-n32 -DUNIX -DIRIX -DN32 -woff 1080,1064,1185 \ -OPT:roundoff=3 -OPT:IEEE_arithmetic=3 -OPT:cray_ivdep=true \ -shared -rdata_shared" EXT=pd_irix6 dnl DFLAGS="-DUNIX -DIRIX6 ${DFLAGS}" STRIPFLAGS="--strip-unneeded" fi
if test `uname -s` = IRIX32; then LFLAGS="-o32 -DUNIX -DIRIX -O2 -shared -rdata_shared" EXT=pd_irix5 dnl DFLAGS="-DUNIX -DIRIX5 ${DFLAGS}" STRIPFLAGS="--strip-unneeded" fi
if test "x$with_extension" != "x" then EXT=$with_extension fi
dnl Checks for pd-version, to set the correct help-path AC_MSG_CHECKING("pd>=0.37")
if test "$with_pdversion" != "" then echo -n "($with_pdversion)... " PD_VERSION="$with_pdversion" else if test "x$cross_compiling" = "xno" then
cat > conftest.c << EOF #include <stdio.h> #include "m_pd.h" int main(){ printf("%d.%d\n", PD_MAJOR_VERSION, PD_MINOR_VERSION); return 0; } EOF
if $CC $INCLUDES -o conftest.o conftest.c > /dev/null 2>&1 then PD_VERSION=`./conftest.o` else PD_VERSION="" fi echo -n $PD_VERSION else dnl we are cross-compiling... echo -n "(X)..." PD_VERSION="0.38" fi fi
let PD_MAJORVERSION=`echo $PD_VERSION | cut -d"." -f1`+0 let PD_MINORVERSION=`echo $PD_VERSION | cut -d"." -f2`+0
if test "$PD_MAJORVERSION" -gt 0 || test "$PD_MINORVERSION" -ge 37 then REFERENCEPATH=extra/help- echo " yes" else REFERENCEPATH=doc/5.reference/ echo " no" fi
AC_OUTPUT(Makefile)
rm -f conftest.*
--- NEW FILE: rifftw~-help.pd --- #N canvas 0 0 450 300 10; #X text 105 205 for help see; #X obj 164 93 rifftw~; #X obj 212 204 rifft~; #X text 88 136 this object is a drop-in replacement for pd's built-in rifft-object; #X text 87 56 inverse real FFT using libFFTW;
--- NEW FILE: ifftw~-help.pd --- #N canvas 0 0 450 300 10; #X text 105 205 for help see; #X text 87 56 inverse complex FFT using libFFTW; #X obj 164 93 ifftw~; #X obj 213 204 ifft~; #X text 88 136 this object is a drop-in replacement for pd's built-in ifft-object;
--- NEW FILE: ifftw~.c --- /* Copyright (c) 1997-1999 Miller Puckette and others. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */
#include "fftw~.h"
#ifdef HAVE_LIBFFTW3F /* Support for fftw3 by Tim Blechmann */
/* ------------------------ ifft~ -------------------------------- */
static t_class *sigifftw_class;
typedef struct fftw { t_object x_obj; float x_f;
fftwf_plan plan; fftwf_iodim dim; } t_sigifftw;
static void *sigifftw_new(void) { t_sigifftw *x = (t_sigifftw *)pd_new(sigifftw_class); outlet_new(&x->x_obj, gensym("signal")); outlet_new(&x->x_obj, gensym("signal")); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); x->x_f = 0; return (x); }
static void sigifftw_free(t_sigifftw * x) { fftwf_destroy_plan(x->plan); }
static t_int *sigifftw_perform(t_int *w) { fftwf_execute(*(fftwf_plan *)w[1]);
return (w+2); }
static void sigifftw_dsp(t_sigifftw *x, t_signal **sp) { int n = sp[0]->s_n; float *in1 = sp[0]->s_vec; float *in2 = sp[1]->s_vec; float *out1 = sp[2]->s_vec; float *out2 = sp[3]->s_vec;
x->dim.n=n; x->dim.is=1; x->dim.os=1; x->plan = fftwf_plan_guru_split_dft(1, &(x->dim), 0, NULL, in2, in1, out2, out1, FFTW_ESTIMATE); dsp_add(sigifftw_perform, 1, &x->plan); }
EXTERNAL_SETUP ifftw_tilde_setup(void) { sigifftw_class = class_new(gensym("ifftw~"), sigifftw_new, (t_method) sigifftw_free, sizeof(t_sigifftw), 0, 0); CLASS_MAINSIGNALIN(sigifftw_class, t_sigifftw, x_f); class_addmethod(sigifftw_class, (t_method)sigifftw_dsp, gensym("dsp"), 0); }
#endif
--- NEW FILE: LICENSE.txt --- This software is copyrighted by Miller Puckette and others. The following terms (the "Standard Improved BSD License") apply to all files associated with the software unless explicitly disclaimed in individual files:
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--- NEW FILE: fftw_config.h.in --- #undef HAVE_LIBFFTW3F
--- NEW FILE: README.txt --- fftw~ - FFT objects for pd
a set of alternative fft~-objects, using the fftw-library. these objects should behave exactly like the original ones:
[fftw~] <-> [fft~] [ifftw~] <-> [ifft~] [rfftw~] <-> [rfft~] [rifftw~] <-> [rifft~]
REASONING: the code in here has originally been written by tim blechmann and was meant to be part of pd itself. since miller puckette is somewhat reluctant to integrate these fftw-enabled objects into vanilla pd, this library provides another way to get high-performance FFTs.
TODO: search for a way to override the default FFT-objects in pd with these. (i think cyclone uses such a mechanism)
AUTHORS: tim blechmann IOhannes m zmölnig
LICENSING: since this code was originally meant to be part of pd, it is licensed under the same license as pd itself. see LICENSE.txt for details
--- NEW FILE: fftw_config.h --- /* fftw_config.h. Generated from fftw_config.h.in by configure. */ #define HAVE_LIBFFTW3F 1