diff --git a/external/ruby-kissfft/Gemfile b/external/ruby-kissfft/Gemfile new file mode 100755 index 0000000000..1aa98e4b2e --- /dev/null +++ b/external/ruby-kissfft/Gemfile @@ -0,0 +1,2 @@ +source "http://rubygems.org" +gemspec diff --git a/external/ruby-kissfft/COPYING b/external/ruby-kissfft/LICENSE similarity index 96% rename from external/ruby-kissfft/COPYING rename to external/ruby-kissfft/LICENSE index 6a8be8e4a5..3ec3bcf60f 100644 --- a/external/ruby-kissfft/COPYING +++ b/external/ruby-kissfft/LICENSE @@ -1,7 +1,8 @@ Kiss FFT library ================== -Copyright (c) 2003-2006 Mark Borgerding + +Copyright (c) 2003-2010 Mark Borgerding All rights reserved. @@ -13,11 +14,10 @@ Redistribution and use in source and binary forms, with or without modification, THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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. - Ruby wrapper layer ================== -Copyright (C) 2009 H D Moore +Copyright (C) 2009-2012 H D Moore < hdm[at]rapid7.com > All rights reserved. diff --git a/external/ruby-kissfft/Rakefile b/external/ruby-kissfft/Rakefile new file mode 100755 index 0000000000..29955274e0 --- /dev/null +++ b/external/ruby-kissfft/Rakefile @@ -0,0 +1 @@ +require "bundler/gem_tasks" diff --git a/external/ruby-kissfft/_kiss_fft_guts.h b/external/ruby-kissfft/ext/kissfft/_kiss_fft_guts.h similarity index 90% rename from external/ruby-kissfft/_kiss_fft_guts.h rename to external/ruby-kissfft/ext/kissfft/_kiss_fft_guts.h index 1c1d4d7fcc..ba66144403 100644 --- a/external/ruby-kissfft/_kiss_fft_guts.h +++ b/external/ruby-kissfft/ext/kissfft/_kiss_fft_guts.h @@ -1,5 +1,5 @@ /* -Copyright (c) 2003-2004, Mark Borgerding +Copyright (c) 2003-2010, Mark Borgerding All rights reserved. @@ -148,3 +148,17 @@ struct kiss_fft_state{ /* a debugging function */ #define pcpx(c)\ fprintf(stderr,"%g + %gi\n",(double)((c)->r),(double)((c)->i) ) + + +#ifdef KISS_FFT_USE_ALLOCA +// define this to allow use of alloca instead of malloc for temporary buffers +// Temporary buffers are used in two case: +// 1. FFT sizes that have "bad" factors. i.e. not 2,3 and 5 +// 2. "in-place" FFTs. Notice the quotes, since kissfft does not really do an in-place transform. +#include +#define KISS_FFT_TMP_ALLOC(nbytes) alloca(nbytes) +#define KISS_FFT_TMP_FREE(ptr) +#else +#define KISS_FFT_TMP_ALLOC(nbytes) KISS_FFT_MALLOC(nbytes) +#define KISS_FFT_TMP_FREE(ptr) KISS_FFT_FREE(ptr) +#endif diff --git a/external/ruby-kissfft/extconf.rb b/external/ruby-kissfft/ext/kissfft/extconf.rb similarity index 100% rename from external/ruby-kissfft/extconf.rb rename to external/ruby-kissfft/ext/kissfft/extconf.rb diff --git a/external/ruby-kissfft/kiss_fft.c b/external/ruby-kissfft/ext/kissfft/kiss_fft.c similarity index 92% rename from external/ruby-kissfft/kiss_fft.c rename to external/ruby-kissfft/ext/kissfft/kiss_fft.c index fb048e7b37..465d6c97a0 100644 --- a/external/ruby-kissfft/kiss_fft.c +++ b/external/ruby-kissfft/ext/kissfft/kiss_fft.c @@ -1,5 +1,5 @@ /* -Copyright (c) 2003-2004, Mark Borgerding +Copyright (c) 2003-2010, Mark Borgerding All rights reserved. @@ -18,21 +18,6 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND fixed or floating point complex numbers. It also delares the kf_ internal functions. */ -static kiss_fft_cpx *scratchbuf=NULL; -static size_t nscratchbuf=0; -static kiss_fft_cpx *tmpbuf=NULL; -static size_t ntmpbuf=0; - -#define CHECKBUF(buf,nbuf,n) \ - do { \ - if ( nbuf < (size_t)(n) ) {\ - free(buf); \ - buf = (kiss_fft_cpx*)KISS_FFT_MALLOC(sizeof(kiss_fft_cpx)*(n)); \ - nbuf = (size_t)(n); \ - } \ - }while(0) - - static void kf_bfly2( kiss_fft_cpx * Fout, const size_t fstride, @@ -69,6 +54,7 @@ static void kf_bfly4( const size_t m2=2*m; const size_t m3=3*m; + tw3 = tw2 = tw1 = st->twiddles; do { @@ -222,29 +208,30 @@ static void kf_bfly_generic( kiss_fft_cpx t; int Norig = st->nfft; - CHECKBUF(scratchbuf,nscratchbuf,p); + kiss_fft_cpx * scratch = (kiss_fft_cpx*)KISS_FFT_TMP_ALLOC(sizeof(kiss_fft_cpx)*p); for ( u=0; u=Norig) twidx-=Norig; - C_MUL(t,scratchbuf[q] , twiddles[twidx] ); + C_MUL(t,scratch[q] , twiddles[twidx] ); C_ADDTO( Fout[ k ] ,t); } k += m; } } + KISS_FFT_TMP_FREE(scratch); } static @@ -265,7 +252,8 @@ void kf_work( #ifdef _OPENMP // use openmp extensions at the // top-level (not recursive) - if (fstride==1) { + if (fstride==1 && p<=5) + { int k; // execute the p different work units in different threads @@ -380,14 +368,15 @@ kiss_fft_cfg kiss_fft_alloc(int nfft,int inverse_fft,void * mem,size_t * lenmem } - - void kiss_fft_stride(kiss_fft_cfg st,const kiss_fft_cpx *fin,kiss_fft_cpx *fout,int in_stride) { if (fin == fout) { - CHECKBUF(tmpbuf,ntmpbuf,st->nfft); + //NOTE: this is not really an in-place FFT algorithm. + //It just performs an out-of-place FFT into a temp buffer + kiss_fft_cpx * tmpbuf = (kiss_fft_cpx*)KISS_FFT_TMP_ALLOC( sizeof(kiss_fft_cpx)*st->nfft); kf_work(tmpbuf,fin,1,in_stride, st->factors,st); memcpy(fout,tmpbuf,sizeof(kiss_fft_cpx)*st->nfft); + KISS_FFT_TMP_FREE(tmpbuf); }else{ kf_work( fout, fin, 1,in_stride, st->factors,st ); } @@ -399,17 +388,9 @@ void kiss_fft(kiss_fft_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout) } -/* not really necessary to call, but if someone is doing in-place ffts, they may want to free the - buffers from CHECKBUF - */ void kiss_fft_cleanup(void) { - free(scratchbuf); - scratchbuf = NULL; - nscratchbuf=0; - free(tmpbuf); - tmpbuf=NULL; - ntmpbuf=0; + // nothing needed any more } int kiss_fft_next_fast_size(int n) diff --git a/external/ruby-kissfft/kiss_fft.h b/external/ruby-kissfft/ext/kissfft/kiss_fft.h similarity index 96% rename from external/ruby-kissfft/kiss_fft.h rename to external/ruby-kissfft/ext/kissfft/kiss_fft.h index e799137f86..64c50f4aae 100644 --- a/external/ruby-kissfft/kiss_fft.h +++ b/external/ruby-kissfft/ext/kissfft/kiss_fft.h @@ -5,7 +5,6 @@ #include #include #include -#include #ifdef __cplusplus extern "C" { @@ -27,9 +26,11 @@ extern "C" { #ifdef USE_SIMD # include # define kiss_fft_scalar __m128 -#define KISS_FFT_MALLOC(nbytes) memalign(16,nbytes) +#define KISS_FFT_MALLOC(nbytes) _mm_malloc(nbytes,16) +#define KISS_FFT_FREE _mm_free #else #define KISS_FFT_MALLOC malloc +#define KISS_FFT_FREE free #endif diff --git a/external/ruby-kissfft/kiss_fftr.c b/external/ruby-kissfft/ext/kissfft/kiss_fftr.c similarity index 99% rename from external/ruby-kissfft/kiss_fftr.c rename to external/ruby-kissfft/ext/kissfft/kiss_fftr.c index bfd989fee5..b8e238b1e2 100644 --- a/external/ruby-kissfft/kiss_fftr.c +++ b/external/ruby-kissfft/ext/kissfft/kiss_fftr.c @@ -19,9 +19,9 @@ struct kiss_fftr_state{ kiss_fft_cfg substate; kiss_fft_cpx * tmpbuf; kiss_fft_cpx * super_twiddles; -#ifdef USE_SIMD - long pad; -#endif +#ifdef USE_SIMD + void * pad; +#endif }; kiss_fftr_cfg kiss_fftr_alloc(int nfft,int inverse_fft,void * mem,size_t * lenmem) diff --git a/external/ruby-kissfft/kiss_fftr.h b/external/ruby-kissfft/ext/kissfft/kiss_fftr.h similarity index 100% rename from external/ruby-kissfft/kiss_fftr.h rename to external/ruby-kissfft/ext/kissfft/kiss_fftr.h diff --git a/external/ruby-kissfft/main.c b/external/ruby-kissfft/ext/kissfft/main.c similarity index 100% rename from external/ruby-kissfft/main.c rename to external/ruby-kissfft/ext/kissfft/main.c diff --git a/external/ruby-kissfft/kissfft.gemspec b/external/ruby-kissfft/kissfft.gemspec new file mode 100644 index 0000000000..6596f704c1 --- /dev/null +++ b/external/ruby-kissfft/kissfft.gemspec @@ -0,0 +1,16 @@ +# -*- encoding: utf-8 -*- + +Gem::Specification.new do |s| + s.name = "kissfft" + s.version = "0.0.1" + s.authors = ["HD Moore"] + s.email = ["hdm@rapid7.com"] + s.homepage = "" + s.summary = %q{Ruby wrapper around the KisFFT library for performing FFTs} + s.description = %q{Provides access to the KissFFT library for performing fast-fourier transforms from Ruby } + + s.files = Dir.glob('lib/**/*.rb') + Dir.glob('ext/**/*.{c,h,rb}') + [ "LICENSE" ] + s.test_files = Dir.glob('test/**/*.{rb,data}') + s.extensions = [ 'ext/kissfft/extconf.rb' ] + s.require_paths = ["lib"] +end diff --git a/external/ruby-kissfft/sample.data b/external/ruby-kissfft/tests/sample.data similarity index 100% rename from external/ruby-kissfft/sample.data rename to external/ruby-kissfft/tests/sample.data diff --git a/external/ruby-kissfft/test_kissfft.rb b/external/ruby-kissfft/tests/test_kissfft.rb similarity index 100% rename from external/ruby-kissfft/test_kissfft.rb rename to external/ruby-kissfft/tests/test_kissfft.rb