view fft/kissfft/FFT.js @ 8:c6577c4b3780

KissFFT example -- but am having trouble with calling conventions when both Emscripten examples are present
author Chris Cannam
date Mon, 05 Oct 2015 13:58:09 +0100
parents
children 26056e866c29
line wrap: on
line source
"use strict";

var kissFFTModule = KissFFTModule({});

var kiss_fftr_alloc = kissFFTModule.cwrap(
    'kiss_fftr_alloc', 'number', ['number', 'number', 'number', 'number' ]
);

var kiss_fftr = kissFFTModule.cwrap(
    'kiss_fftr', 'void', ['number', 'number', 'number' ]
);

var kiss_fftri = kissFFTModule.cwrap(
    'kiss_fftri', 'void', ['number', 'number', 'number' ]
);

var kiss_fftr_free = kissFFTModule.cwrap(
    'kiss_fftr_free', 'void', ['number']
);

function KissFFT(size) {
    this.size = size;
    this.fcfg = kiss_fftr_alloc(size, false);
    this.icfg = kiss_fftr_alloc(size, true);
    this.ptr = kissFFTModule._malloc(size*4 + (size+2)*4);
    this.ri = new Uint8Array(kissFFTModule.HEAPU8.buffer, this.ptr, size*4);
    this.ci = new Uint8Array(kissFFTModule.HEAPU8.buffer, this.ptr + size*4, (size+2)*4);
    this.forward = function(real) {
	var ptr = this.ptr;
	var size = this.size;
	this.ri.set(new Uint8Array(real.buffer));
	kiss_fftr(this.fcfg, ptr, ptr + this.size*4);
	var out = new Float32Array(kissFFTModule.HEAPU8.buffer, ptr + size*4, size+2);
	return out;
    }
    this.inverse = function(cpx) {
	var ptr = this.ptr;
	var size = this.size;
	this.ci.set(new Uint8Array(cpx.buffer));
	kiss_fftri(this.icfg, ptr + size*4, ptr);
	var out = new Float32Array(kissFFTModule.HEAPU8.buffer, ptr, size);
	return out;
    }
    this.discard = function() {
	kissFFTModule._free(this.ptr);
	kiss_fftr_free(this.fcfg);
	kiss_fftr_free(this.icfg);
    }
}