Импульс WebSsembly (kissfft) в узле js
Я пытаюсь запустить библиотеку wasm pulsefft в узле.
Я загружаю модуль wasm, а затем использую этот код для предоставления двух функций:
const loadPulse = require('./load-pulse')
const pulse = {}
module.exports = loadPulse().then((kissfft) => {
const lib = kissfft.exports
pulse['fftComplex'] = function (size) {
this.size = size;
this.fcfg = lib._kiss_fft_alloc(size, false);
this.icfg = lib._kiss_fft_alloc(size, true);
this.inptr = lib._malloc(size*8 + size*8);
this.outptr = this.inptr + size*8;
this.cin = new Float32Array(HEAPU8.buffer, this.inptr, size*2);
this.cout = new Float32Array(HEAPU8.buffer, this.outptr, size*2);
this.forward = function(cin) {
this.cin.set(cin);
lib._kiss_fft(this.fcfg, this.inptr, this.outptr);
return new Float32Array(HEAPU8.buffer,
this.outptr, this.size * 2);
}
this.inverse = function(cin) {
this.cin.set(cpx);
lib._kiss_fft(this.icfg, this.inptr, this.outptr);
return new Float32Array(HEAPU8.buffer,
this.outptr, this.size * 2);
}
this.dispose = function() {
lib._free(this.inptr);
lib._free(this.fcfg);
lib._free(this.icfg);
}
};
pulse['fftReal'] = function (size) {
this.size = size;
this.fcfg = lib._kiss_fftr_alloc(size, false);
this.icfg = lib._kiss_fftr_alloc(size, true);
this.rptr = lib._malloc(size*4 + (size+2)*4);
this.cptr = this.rptr + size*4;
this.ri = new Float32Array(HEAPU8.buffer, this.rptr, size);
this.ci = new Float32Array(HEAPU8.buffer, this.cptr, size+2);
this.forward = function(real) {
this.ri.set(real);
lib._kiss_fftr(this.fcfg, this.rptr, this.cptr);
return new Float32Array(HEAPU8.buffer, this.cptr, this.size + 2); //changed here
}
this.inverse = function(cpx) {
this.ci.set(cpx);
lib._kiss_fftri(this.icfg, this.cptr, this.rptr);
return new Float32Array(HEAPU8.buffer, this.rptr, this.size);
}
this.dispose = function() {
lib._free(this.rptr);
lib._free(this.fcfg);
lib._free(this.icfg);
}
}
return pulse
})
Этот код изначально взят из библиотеки pulsefft с небольшими изменениями для узла. Когда я запускаю код, я вижу эту ошибку:
"ReferenceError: HEAPU8 не определено", этот HEAPU8, я думаю, из emscripten и находится в файле js, который генерируется из emscripten. У меня в браузере все работает нормально. Как я могу включить этот модуль в узел?
Я использую этот код для загрузки модуля:
const fs = require('fs');
const path = require('path')
module.exports = function () {
return new Promise((resolve, reject) => {
WebAssembly.compile(fs.readFileSync(path.resolve(__dirname, './src/WASMkissFFT.wasm'))).then((module) => {
const imports = {
env: {
DYNAMICTOP_PTR: 0,
STACKTOP: 0,
STACK_MAX: 0,
abort: function() {},
enlargeMemory: function() {},
getTotalMemory: function() {},
abortOnCannotGrowMemory: function() {},
___lock: function() {},
___syscall6: function() {},
___setErrNo: function() {},
___syscall140: function() {},
_emscripten_memcpy_big: function() {},
___syscall54: function() {},
___unlock: function() {},
___syscall146: function() {},
_exit: function() {},
memory: new WebAssembly.Memory({initial: 256, maximum: 256}),
table: new WebAssembly.Table({initial: 6, element: 'anyfunc', maximum: 6}),
memoryBase: 0,
tableBase: 0,
}
};
resolve(new WebAssembly.Instance(module, imports))
})
})
}