Update to KissFFT, fix memory corruption - warvox - VoIP based wardialing tool, forked from rapid7/warvox.
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
---
(DIR) commit 2fa86135084bce9519f207f26a5a084d24902bb0
(DIR) parent ebfa9cc7945f832c08fdcf59f33c2271c1a550b9
(HTM) Author: HD Moore <hd_moore@rapid7.com>
Date: Thu, 5 Mar 2009 19:01:10 +0000
Update to KissFFT, fix memory corruption
Diffstat:
M src/ruby-kissfft/main.c | 29 ++++++++---------------------
M src/ruby-kissfft/test_kissfft.rb | 34 +++++++++++++++++++++----------
2 files changed, 31 insertions(+), 32 deletions(-)
---
(DIR) diff --git a/src/ruby-kissfft/main.c b/src/ruby-kissfft/main.c
@@ -42,9 +42,7 @@ rbkiss_s_fftr(VALUE class, VALUE r_nfft, VALUE r_rate, VALUE r_buckets, VALUE r_
int n;
int sidx;
int avgctr=0;
- int remove_dc=0;
int nrows=0;
- float * vals=NULL;
int stereo=0;
int nfft;
@@ -91,9 +89,9 @@ rbkiss_s_fftr(VALUE class, VALUE r_nfft, VALUE r_rate, VALUE r_buckets, VALUE r_
nfreqs=nfft/2+1;
CHECKNULL( cfg=kiss_fftr_alloc(nfft,0,0,0) );
- CHECKNULL( tbuf=(kiss_fft_scalar*)malloc(sizeof(kiss_fft_scalar)*nfft ) );
- CHECKNULL( fbuf=(kiss_fft_cpx*)malloc(sizeof(kiss_fft_cpx)*nfreqs ) );
- CHECKNULL( mag2buf=(float*)malloc(sizeof(float)*nfreqs ) );
+ CHECKNULL( tbuf=(kiss_fft_scalar*)malloc(sizeof(kiss_fft_scalar)*(nfft + 2) ) );
+ CHECKNULL( fbuf=(kiss_fft_cpx*)malloc(sizeof(kiss_fft_cpx)*(nfft + 2)) );
+ CHECKNULL( mag2buf=(float*)malloc(sizeof(float)*(nfft + 2) ));
memset(mag2buf,0,sizeof(mag2buf)*nfreqs);
@@ -115,13 +113,6 @@ rbkiss_s_fftr(VALUE class, VALUE r_nfft, VALUE r_rate, VALUE r_buckets, VALUE r_
}
}
- // Handle DC
- if (remove_dc) {
- float avg = 0;
- for (i=0;i<nfft;++i) avg += tbuf[i];
- avg /= nfft;
- for (i=0;i<nfft;++i) tbuf[i] -= (kiss_fft_scalar)avg;
- }
/* do FFT */
kiss_fftr(cfg,tbuf,fbuf);
@@ -131,19 +122,17 @@ rbkiss_s_fftr(VALUE class, VALUE r_nfft, VALUE r_rate, VALUE r_buckets, VALUE r_
}
if (++avgctr == navg) {
+ float eps = 1;
avgctr=0;
++nrows;
- vals = (float*)realloc(vals,sizeof(float)*nrows*nfreqs);
- float eps = 1;
- set = rb_ary_new();
// RESULTS
+ set = rb_ary_new();
for (i=0;i<nfreqs;++i) {
- vals[(nrows - 1) * nfreqs + i] = 10 * log10( mag2buf[i] / navg + eps );
-
+ float pwr = 10 * log10( mag2buf[i] / navg + eps );
tmp = rb_ary_new();
rb_ary_push(tmp, rb_float_new( (float)i * ( ( (float)rate / 2) / (float)nfreqs) ));
- rb_ary_push(tmp, rb_float_new( vals[(nrows - 1) * nfreqs + i] ));
+ rb_ary_push(tmp, rb_float_new( pwr));
rb_ary_push(set, tmp);
}
rb_ary_push(res, set);
@@ -152,10 +141,8 @@ rbkiss_s_fftr(VALUE class, VALUE r_nfft, VALUE r_rate, VALUE r_buckets, VALUE r_
inp_idx += nfft;
}
- cleanup:
- if(vals) free(vals);
free(cfg);
- free(tbuf);
+ free(tbuf);
free(fbuf);
free(mag2buf);
return(res);
(DIR) diff --git a/src/ruby-kissfft/test_kissfft.rb b/src/ruby-kissfft/test_kissfft.rb
@@ -17,19 +17,31 @@ class KissFFT::UnitTest < Test::Unit::TestCase
puts "KissFFT version: #{KissFFT.version}"
end
def test_fftr
- data = ( [*(1..100)] * 1000).flatten
+ data = File.read('sample.data').unpack('s*')
- r = KissFFT.fftr(8192, 8000, 1, data)
- r.each do |x|
- mf = 0
- mp = 0
- x.each do |o|
- if(o[1] > mp)
- mp = o[1]
- mf = o[0]
- end
+ min = 1
+ res = KissFFT.fftr(8192, 8000, 1, data)
+
+ tones = {}
+ res.each do |x|
+ rank = x.sort{|a,b| a[1].to_i <=> b[1].to_i }.reverse
+ rank[0..10].each do |t|
+ f = t[0].round
+ p = t[1].round
+ next if f == 0
+ next if p < min
+ tones[ f ] ||= []
+ tones[ f ] << t
end
- puts "#{mf} @ #{mp}"
end
+
+ tones.keys.sort.each do |t|
+ next if tones[t].length < 2
+ puts "#{t}hz"
+ tones[t].each do |x|
+ puts "\t#{x[0]}hz @ #{x[1]}"
+ end
+ end
+
end
end