Chris@19: "use strict"; Chris@19: Chris@19: var fftwModule = FFTWModule({}); Chris@19: Chris@19: var fftwf_plan_dft_r2c_1d = fftwModule.cwrap( Chris@19: 'fftwf_plan_dft_r2c_1d', 'number', ['number', 'number', 'number', 'number'] Chris@19: ); Chris@19: Chris@19: var fftwf_plan_dft_c2r_1d = fftwModule.cwrap( Chris@19: 'fftwf_plan_dft_c2r_1d', 'number', ['number', 'number', 'number', 'number'] Chris@19: ); Chris@19: Chris@19: var fftwf_execute = fftwModule.cwrap( Chris@19: 'fftwf_execute', 'void', ['number'] Chris@19: ); Chris@19: Chris@19: var fftwf_destroy_plan = fftwModule.cwrap( Chris@19: 'fftwf_destroy_plan', 'void', ['number'] Chris@19: ); Chris@19: Chris@19: function FFTW(size) { Chris@19: Chris@19: this.size = size; Chris@19: this.rptr = fftwModule._malloc(size*4 + (size+2)*4); Chris@19: this.cptr = this.rptr + size*4; Chris@19: this.r = new Float32Array(fftwModule.HEAPU8.buffer, this.rptr, size); Chris@19: this.c = new Float32Array(fftwModule.HEAPU8.buffer, this.cptr, size+2); Chris@19: Chris@19: var FFTW_ESTIMATE = (1 << 6); Chris@19: this.fplan = fftwf_plan_dft_r2c_1d(size, this.rptr, this.cptr, FFTW_ESTIMATE); Chris@19: this.iplan = fftwf_plan_dft_c2r_1d(size, this.cptr, this.rptr, FFTW_ESTIMATE); Chris@19: Chris@19: this.forward = function(real) { Chris@19: this.r.set(real); Chris@19: fftwf_execute(this.fplan); Chris@21: return new Float32Array(fftwModule.HEAPU8.buffer, this.cptr, this.size+2); Chris@19: } Chris@19: Chris@19: this.inverse = function(cpx) { Chris@19: this.c.set(cpx); Chris@19: fftwf_execute(this.iplan); Chris@21: return new Float32Array(fftwModule.HEAPU8.buffer, this.rptr, this.size); Chris@19: } Chris@19: Chris@19: this.dispose = function() { Chris@19: fftwf_destroy_plan(this.fplan); Chris@19: fftwf_destroy_plan(this.iplan); Chris@19: fftwModule._free(this.rptr); Chris@19: } Chris@19: } Chris@19: