annotate fft/kissfft/FFT.js @ 40:223f770b5341 kissfft-double tip

Try a double-precision kissfft
author Chris Cannam
date Wed, 07 Sep 2016 10:40:32 +0100
parents a47f895d79c0
children
rev   line source
Chris@8 1 "use strict";
Chris@8 2
Chris@8 3 var kissFFTModule = KissFFTModule({});
Chris@8 4
Chris@8 5 var kiss_fftr_alloc = kissFFTModule.cwrap(
Chris@8 6 'kiss_fftr_alloc', 'number', ['number', 'number', 'number', 'number' ]
Chris@8 7 );
Chris@8 8
Chris@8 9 var kiss_fftr = kissFFTModule.cwrap(
Chris@8 10 'kiss_fftr', 'void', ['number', 'number', 'number' ]
Chris@8 11 );
Chris@8 12
Chris@8 13 var kiss_fftri = kissFFTModule.cwrap(
Chris@8 14 'kiss_fftri', 'void', ['number', 'number', 'number' ]
Chris@8 15 );
Chris@8 16
Chris@8 17 var kiss_fftr_free = kissFFTModule.cwrap(
Chris@8 18 'kiss_fftr_free', 'void', ['number']
Chris@8 19 );
Chris@8 20
Chris@37 21 var kiss_fft_alloc = kissFFTModule.cwrap(
Chris@37 22 'kiss_fft_alloc', 'number', ['number', 'number', 'number', 'number' ]
Chris@37 23 );
Chris@37 24
Chris@37 25 var kiss_fft = kissFFTModule.cwrap(
Chris@37 26 'kiss_fft', 'void', ['number', 'number', 'number' ]
Chris@37 27 );
Chris@37 28
Chris@37 29 var kiss_fft_free = kissFFTModule.cwrap(
Chris@37 30 'kiss_fft_free', 'void', ['number']
Chris@37 31 );
Chris@37 32
Chris@8 33 function KissFFT(size) {
Chris@19 34
Chris@8 35 this.size = size;
Chris@37 36 this.fcfg = kiss_fft_alloc(size, false);
Chris@37 37 this.icfg = kiss_fft_alloc(size, true);
Chris@40 38
Chris@40 39 var samplesize = 8;
Chris@40 40 this.inptr = kissFFTModule._malloc(size*samplesize*2 + size*samplesize*2);
Chris@40 41 this.outptr = this.inptr + size*samplesize*2;
Chris@37 42
Chris@40 43 this.cin = new Float64Array(kissFFTModule.HEAPU8.buffer, this.inptr, size*2);
Chris@40 44 this.cout = new Float64Array(kissFFTModule.HEAPU8.buffer, this.outptr, size*2);
Chris@37 45
Chris@37 46 this.forward = function(cin) {
Chris@37 47 this.cin.set(cin);
Chris@37 48 kiss_fft(this.fcfg, this.inptr, this.outptr);
Chris@40 49 return new Float64Array(kissFFTModule.HEAPU8.buffer,
Chris@37 50 this.outptr, this.size * 2);
Chris@37 51 }
Chris@37 52
Chris@37 53 this.inverse = function(cin) {
Chris@37 54 this.cin.set(cpx);
Chris@37 55 kiss_fft(this.icfg, this.inptr, this.outptr);
Chris@40 56 return new Float64Array(kissFFTModule.HEAPU8.buffer,
Chris@37 57 this.outptr, this.size * 2);
Chris@37 58 }
Chris@37 59
Chris@37 60 this.dispose = function() {
Chris@37 61 kissFFTModule._free(this.inptr);
Chris@37 62 kiss_fft_free(this.fcfg);
Chris@37 63 kiss_fft_free(this.icfg);
Chris@37 64 }
Chris@37 65 }
Chris@37 66
Chris@37 67 function KissFFTR(size) {
Chris@37 68
Chris@37 69 this.size = size;
Chris@8 70 this.fcfg = kiss_fftr_alloc(size, false);
Chris@8 71 this.icfg = kiss_fftr_alloc(size, true);
Chris@19 72
Chris@40 73 var samplesize = 8;
Chris@40 74 this.rptr = kissFFTModule._malloc(size*samplesize + (size+2)*samplesize);
Chris@40 75 this.cptr = this.rptr + size*samplesize;
Chris@19 76
Chris@40 77 this.ri = new Float64Array(kissFFTModule.HEAPU8.buffer, this.rptr, size);
Chris@40 78 this.ci = new Float64Array(kissFFTModule.HEAPU8.buffer, this.cptr, size+2);
Chris@19 79
Chris@8 80 this.forward = function(real) {
Chris@19 81 this.ri.set(real);
Chris@19 82 kiss_fftr(this.fcfg, this.rptr, this.cptr);
Chris@40 83 return new Float64Array(kissFFTModule.HEAPU8.buffer,
Chris@21 84 this.cptr, this.size + 2);
Chris@8 85 }
Chris@19 86
Chris@8 87 this.inverse = function(cpx) {
Chris@19 88 this.ci.set(cpx);
Chris@19 89 kiss_fftri(this.icfg, this.cptr, this.rptr);
Chris@40 90 return new Float64Array(kissFFTModule.HEAPU8.buffer,
Chris@21 91 this.rptr, this.size);
Chris@8 92 }
Chris@19 93
Chris@19 94 this.dispose = function() {
Chris@19 95 kissFFTModule._free(this.rptr);
Chris@8 96 kiss_fftr_free(this.fcfg);
Chris@8 97 kiss_fftr_free(this.icfg);
Chris@8 98 }
Chris@8 99 }
Chris@8 100