spectrogram-js 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spectrogram-js.es.js","sources":["../node_modules/webfft/lib/kissfft/KissFFT.mjs","../node_modules/webfft/lib/kissfft/webfftWrapper.js","../node_modules/webfft/lib/indutny/fft.js","../node_modules/webfft/lib/indutny/webfftWrapper.js","../node_modules/webfft/lib/cross/Cross.mjs","../node_modules/webfft/lib/cross/FFT.js","../node_modules/webfft/lib/cross/webfftWrapper.js","../node_modules/webfft/lib/nayuki/fft.js","../node_modules/webfft/lib/nayuki/webfftWrapper.js","../node_modules/webfft/lib/nayukic/NayukiCFFT.mjs","../node_modules/webfft/lib/nayukic/FFT.js","../node_modules/webfft/lib/nayukic/webfftWrapper.js","../node_modules/webfft/lib/nockert/complex.js","../node_modules/webfft/lib/nockert/webfftWrapper.js","../node_modules/webfft/lib/mljs/fftlib.js","../node_modules/webfft/lib/mljs/webfftWrapper.js","../node_modules/webfft/lib/utils/checkCapabilities.js","../node_modules/webfft/lib/kissfftmodified/KissFFT.mjs","../node_modules/webfft/lib/kissfftmodified/webfftWrapper.js","../node_modules/webfft/lib/indutnymodified/fft.js","../node_modules/webfft/lib/main.js","../src/dsp/fft.ts","../src/core/SpectrogramModel.ts","../src/dsp/window.ts","../src/core/DataChunk.ts","../src/render/AxisRenderer.ts","../src/render/ColorMap.ts","../src/render/CanvasRenderer.ts","../src/spectrogram.ts"],"sourcesContent":["\nvar KissFFTModule = (() => {\n var _scriptDir = import.meta.url;\n \n return (\nfunction(moduleArg = {}) {\n\nvar Module=moduleArg;var readyPromiseResolve,readyPromiseReject;Module[\"ready\"]=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject});var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram=\"./this.program\";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=true;var ENVIRONMENT_IS_WORKER=false;var scriptDirectory=\"\";function locateFile(path){if(Module[\"locateFile\"]){return Module[\"locateFile\"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!=\"undefined\"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf(\"blob:\")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,\"\").lastIndexOf(\"/\")+1)}else{scriptDirectory=\"\"}{read_=url=>{var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.responseType=\"arraybuffer\";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,true);xhr.responseType=\"arraybuffer\";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=title=>document.title=title}else{}var out=Module[\"print\"]||console.log.bind(console);var err=Module[\"printErr\"]||console.error.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module[\"arguments\"])arguments_=Module[\"arguments\"];if(Module[\"thisProgram\"])thisProgram=Module[\"thisProgram\"];if(Module[\"quit\"])quit_=Module[\"quit\"];var wasmBinary;if(Module[\"wasmBinary\"])wasmBinary=Module[\"wasmBinary\"];var noExitRuntime=Module[\"noExitRuntime\"]||true;if(typeof WebAssembly!=\"object\"){abort(\"no native wasm support detected\")}var wasmMemory;var wasmExports;var ABORT=false;var EXITSTATUS;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;Module[\"HEAP8\"]=HEAP8=new Int8Array(b);Module[\"HEAP16\"]=HEAP16=new Int16Array(b);Module[\"HEAP32\"]=HEAP32=new Int32Array(b);Module[\"HEAPU8\"]=HEAPU8=new Uint8Array(b);Module[\"HEAPU16\"]=HEAPU16=new Uint16Array(b);Module[\"HEAPU32\"]=HEAPU32=new Uint32Array(b);Module[\"HEAPF32\"]=HEAPF32=new Float32Array(b);Module[\"HEAPF64\"]=HEAPF64=new Float64Array(b)}var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function preRun(){if(Module[\"preRun\"]){if(typeof Module[\"preRun\"]==\"function\")Module[\"preRun\"]=[Module[\"preRun\"]];while(Module[\"preRun\"].length){addOnPreRun(Module[\"preRun\"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function postRun(){if(Module[\"postRun\"]){if(typeof Module[\"postRun\"]==\"function\")Module[\"postRun\"]=[Module[\"postRun\"]];while(Module[\"postRun\"].length){addOnPostRun(Module[\"postRun\"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){if(Module[\"onAbort\"]){Module[\"onAbort\"](what)}what=\"Aborted(\"+what+\")\";err(what);ABORT=true;EXITSTATUS=1;what+=\". Build with -sASSERTIONS for more info.\";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix=\"data:application/octet-stream;base64,\";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}var wasmBinaryFile;wasmBinaryFile=\"data:application/octet-stream;base64,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GCAZkzgCBCAHIBcgHpM4AgAgBUEIaiEFIAdBCGohByAEQQhqIQQgAUEIaiEBIABBCGohACAJQQFqIgkgBkcNAAsMAQsgBSgCACELIAlBA3QQByEIAkAgCUECSA0AIAZBAEwNACAFQYgCaiENIAlBfHEhDiAJQQNxIQogCUEBa0EDSSEPQQAhBwNAIAchAUEAIQRBACEDIA9FBEADQCAIIARBA3QiBWogACABQQN0aikCADcCACAIIAVBCHJqIAAgASAGaiIBQQN0aikCADcCACAIIAVBEHJqIAAgASAGaiIBQQN0aikCADcCACAIIAVBGHJqIAAgASAGaiIBQQN0aikCADcCACAEQQRqIQQgASAGaiEBIANBBGoiAyAORw0ACwtBACEFIAoEQANAIAggBEEDdGogACABQQN0aikCADcCACAEQQFqIQQgASAGaiEBIAVBAWoiBSAKRw0ACwsgCCkCACIvp74hFUEAIQwgByEDA0AgACADQQN0aiIFIC83AgAgAiADbCEQIAUqAgQhFEEBIQEgFSETQQAhBANAIAUgEyAIIAFBA3RqIhEqAgAiFiANIAQgEGoiBCALQQAgBCALThtrIgRBA3RqIhIqAgAiF5QgEioCBCIYIBEqAgQiGZSTkiITOAIAIAUgFCAWIBiUIBcgGZSSkiIUOAIEIAFBAWoiASAJRw0ACyADIAZqIQMgDEEBaiIMIAlHDQALIAdBAWoiByAGRw0ACwsgCBAGCwsDAAELwQEBAn8jAEEQayIBJAACfCAAvUIgiKdB/////wdxIgJB+8Ok/wNNBEBEAAAAAAAA8D8gAkGewZryA0kNARogAEQAAAAAAAAAABAEDAELIAAgAKEgAkGAgMD/B08NABoCQAJAAkACQCAAIAEQC0EDcQ4DAAECAwsgASsDACABKwMIEAQMAwsgASsDACABKwMIQQEQA5oMAgsgASsDACABKwMIEASaDAELIAErAwAgASsDCEEBEAMLIQAgAUEQaiQAIAALuBgDFH8EfAF+IwBBMGsiCCQAAkACQAJAIAC9IhpCIIinIgNB/////wdxIgZB+tS9gARNBEAgA0H//z9xQfvDJEYNASAGQfyyi4AETQRAIBpCAFkEQCABIABEAABAVPsh+b+gIgBEMWNiGmG00L2gIhY5AwAgASAAIBahRDFjYhphtNC9oDkDCEEB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IAIgC0chCiACQQFqIQIgCg0ACwsgBUGgAWogBkEDdGogADkDACAEQQBKIQIgBEEBayEEIAINAAsLRAAAAAAAAAAAIQAgA0EATgRAIAMhAgNAIAIiBEEBayECIAAgBUGgAWogBEEDdGorAwCgIQAgBA0ACwsgCCAAmiAAIAwbOQMAIAUrA6ABIAChIQBBASECIANBAEoEQANAIAAgBUGgAWogAkEDdGorAwCgIQAgAiADRyEEIAJBAWohAiAEDQALCyAIIACaIAAgDBs5AwggBUGwBGokACAHQQdxIQMgCCsDACEAIBpCAFMEQCABIACaOQMAIAEgCCsDCJo5AwhBACADayEDDAELIAEgADkDACABIAgrAwg5AwgLIAhBMGokACADC8UBAQJ/IwBBEGsiASQAAkAgAL1CIIinQf////8HcSICQfvDpP8DTQRAIAJBgIDA8gNJDQEgAEQAAAAAAAAAAEEAEAMhAAwBCyACQYCAwP8HTwRAIAAgAKEhAAwBCwJAAkACQAJAIAAgARALQQNxDgMAAQIDCyABKwMAIAErAwhBARADIQAMAwsgASsDACABKwMIEAQhAAwCCyABKwMAIAErAwhBARADmiEADAELIAErAwAgASsDCBAEmiEACyABQRBqJAAgAAuhBAEDfyABIAJGBEAgACgCAEEDdBAHIgQgAUEBQQEgAEEIaiAAEAggBCECAkAgACgCAEEDdCIDQYAETwRAIAEgAiADEAEMAQsgASADaiEAAkAgASACc0EDcUUEQAJAIAFBA3FFDQAgA0UNAANAIAEgAi0AADoAACACQQFqIQIgAUEBaiIBQQNxRQ0BIAAgAUsNAAsLAkAgAEF8cSIDQcAASQ0AIAEgA0FAaiIFSw0AA0AgASACKAIANgIAIAEgAigCBDYCBCABIAIoAgg2AgggASACKAIMNgIMIAEgAigCEDYCECABIAIoAhQ2AhQgASACKAIYNgIYIAEgAigCHDYCHCABIAIoAiA2AiAgASACKAIkNgIkIAEgAigCKDYCKCABIAIoAiw2AiwgASACKAIwNgIwIAEgAigCNDYCNCABIAIoAjg2AjggASACKAI8NgI8IAJBQGshAiABQUBrIgEgBU0NAAsLIAEgA08NAQNAIAEgAigCADYCACACQQRqIQIgAUEEaiIBIANJDQALDAELIABBBEkNACAB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\";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}var binary=tryParseAsDataURI(file);if(binary){return binary}if(readBinary){return readBinary(file)}throw\"sync fetching of the wasm failed: you can preload it to Module['wasmBinary'] manually, or emcc.py will do that for you when generating HTML (but not JS)\"}function instantiateSync(file,info){var module;var binary=getBinarySync(file);module=new WebAssembly.Module(binary);var instance=new WebAssembly.Instance(module,info);return[instance,module]}function createWasm(){var info={\"a\":wasmImports};function receiveInstance(instance,module){var exports=instance.exports;wasmExports=exports;wasmMemory=wasmExports[\"c\"];updateMemoryViews();wasmTable=wasmExports[\"j\"];addOnInit(wasmExports[\"d\"]);removeRunDependency(\"wasm-instantiate\");return exports}addRunDependency(\"wasm-instantiate\");if(Module[\"instantiateWasm\"]){try{return Module[\"instantiateWasm\"](info,receiveInstance)}catch(e){err(\"Module.instantiateWasm callback failed with error: \"+e);readyPromiseReject(e)}}var result=instantiateSync(wasmBinaryFile,info);return receiveInstance(result[0])}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var _emscripten_memcpy_big=(dest,src,num)=>HEAPU8.copyWithin(dest,src,src+num);var abortOnCannotGrowMemory=requestedSize=>{abort(\"OOM\")};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;abortOnCannotGrowMemory(requestedSize)};function getCFunc(ident){var func=Module[\"_\"+ident];return func}var writeArrayToMemory=(array,buffer)=>{HEAP8.set(array,buffer)};var lengthBytesUTF8=str=>{var len=0;for(var i=0;i<str.length;++i){var c=str.charCodeAt(i);if(c<=127){len++}else if(c<=2047){len+=2}else if(c>=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx};var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);var stringToUTF8OnStack=str=>{var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8(str,ret,size);return ret};var UTF8Decoder=typeof TextDecoder!=\"undefined\"?new TextDecoder(\"utf8\"):undefined;var UTF8ArrayToString=(heapOrArray,idx,maxBytesToRead)=>{var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str=\"\";while(idx<endPtr){var u0=heapOrArray[idx++];if(!(u0&128)){str+=String.fromCharCode(u0);continue}var u1=heapOrArray[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}var u2=heapOrArray[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u0=(u0&7)<<18|u1<<12|u2<<6|heapOrArray[idx++]&63}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}return str};var UTF8ToString=(ptr,maxBytesToRead)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):\"\";var ccall=function(ident,returnType,argTypes,args,opts){var toC={\"string\":str=>{var ret=0;if(str!==null&&str!==undefined&&str!==0){ret=stringToUTF8OnStack(str)}return ret},\"array\":arr=>{var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType===\"string\"){return UTF8ToString(ret)}if(returnType===\"boolean\")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);function onDone(ret){if(stack!==0)stackRestore(stack);return convertReturnValue(ret)}ret=onDone(ret);return ret};var cwrap=function(ident,returnType,argTypes,opts){var numericArgs=!argTypes||argTypes.every(type=>type===\"number\"||type===\"boolean\");var numericRet=returnType!==\"string\";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return function(){return ccall(ident,returnType,argTypes,arguments,opts)}};var wasmImports={b:_emscripten_memcpy_big,a:_emscripten_resize_heap};var asm=createWasm();var ___wasm_call_ctors=asm[\"d\"];var _kiss_fft_free=Module[\"_kiss_fft_free\"]=asm[\"e\"];var _free=Module[\"_free\"]=asm[\"f\"];var _kiss_fft_alloc=Module[\"_kiss_fft_alloc\"]=asm[\"g\"];var _malloc=Module[\"_malloc\"]=asm[\"h\"];var _kiss_fft=Module[\"_kiss_fft\"]=asm[\"i\"];var ___errno_location=asm[\"__errno_location\"];var stackSave=asm[\"k\"];var stackRestore=asm[\"l\"];var stackAlloc=asm[\"m\"];function intArrayFromBase64(s){try{var decoded=atob(s);var bytes=new Uint8Array(decoded.length);for(var i=0;i<decoded.length;++i){bytes[i]=decoded.charCodeAt(i)}return bytes}catch(_){throw new Error(\"Converting base64 string to bytes failed.\")}}function tryParseAsDataURI(filename){if(!isDataURI(filename)){return}return intArrayFromBase64(filename.slice(dataURIPrefix.length))}Module[\"ccall\"]=ccall;Module[\"cwrap\"]=cwrap;var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(){if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module[\"calledRun\"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);if(Module[\"onRuntimeInitialized\"])Module[\"onRuntimeInitialized\"]();postRun()}if(Module[\"setStatus\"]){Module[\"setStatus\"](\"Running...\");setTimeout(function(){setTimeout(function(){Module[\"setStatus\"](\"\")},1);doRun()},1)}else{doRun()}}if(Module[\"preInit\"]){if(typeof Module[\"preInit\"]==\"function\")Module[\"preInit\"]=[Module[\"preInit\"]];while(Module[\"preInit\"].length>0){Module[\"preInit\"].pop()()}}run();\n\n\n return moduleArg\n}\n\n);\n})();\nexport default KissFFTModule;","import KissFFTModule from \"./KissFFT.mjs\";\n\n(\"use strict\");\n\nvar kissFFTModule = KissFFTModule({});\n\nvar kiss_fft_alloc = kissFFTModule.cwrap(\"kiss_fft_alloc\", \"number\", [\n \"number\",\n \"number\",\n \"number\",\n \"number\",\n]);\n\nvar kiss_fft = kissFFTModule.cwrap(\"kiss_fft\", \"void\", [\n \"number\",\n \"number\",\n \"number\",\n]);\n\nvar kiss_fft_free = kissFFTModule.cwrap(\"kiss_fft_free\", \"void\", [\"number\"]);\n\nclass KissFftWrapperWasm {\n constructor(size) {\n this.size = size;\n this.fcfg = kiss_fft_alloc(this.size, false);\n this.icfg = kiss_fft_alloc(this.size, true);\n\n this.inptr = kissFFTModule._malloc(this.size * 8);\n\n this.cin = new Float32Array(\n kissFFTModule.HEAPU8.buffer,\n this.inptr,\n this.size * 2,\n );\n }\n\n fft = function (inputArray) {\n // TODO: figure out how to move this into the constructor without breaking things (unit tests will catch it)\n const outptr = kissFFTModule._malloc(this.size * 8);\n\n const cout = new Float32Array(\n kissFFTModule.HEAPU8.buffer,\n outptr,\n this.size * 2,\n );\n\n this.cin.set(inputArray);\n\n kiss_fft(this.fcfg, this.inptr, outptr);\n\n // we need to free the memory of outptr before we return, so we need this too\n let outputArray = new Float32Array(this.size * 2);\n outputArray.set(cout);\n\n kissFFTModule._free(outptr);\n\n return outputArray;\n };\n\n dispose() {\n kiss_fft_free(this.fcfg);\n kiss_fft_free(this.icfg);\n kissFFTModule._free(this.inptr);\n }\n}\n\nexport default KissFftWrapperWasm;\n","\"use strict\";\n\nfunction FFT_indutny(size) {\n this.size = size | 0;\n if (this.size <= 1 || (this.size & (this.size - 1)) !== 0)\n throw new Error(\"FFT size must be a power of two and bigger than 1\");\n\n this._csize = size << 1;\n\n // NOTE: Use of `var` is intentional for old V8 versions\n var table = new Array(this.size * 2);\n for (var i = 0; i < table.length; i += 2) {\n const angle = (Math.PI * i) / this.size;\n table[i] = Math.cos(angle);\n table[i + 1] = -Math.sin(angle);\n }\n this.table = table;\n\n // Find size's power of two\n var power = 0;\n for (var t = 1; this.size > t; t <<= 1) power++;\n\n // Calculate initial step's width:\n // * If we are full radix-4 - it is 2x smaller to give inital len=8\n // * Otherwise it is the same as `power` to give len=4\n this._width = power % 2 === 0 ? power - 1 : power;\n\n // Pre-compute bit-reversal patterns\n this._bitrev = new Array(1 << this._width);\n for (var j = 0; j < this._bitrev.length; j++) {\n this._bitrev[j] = 0;\n for (var shift = 0; shift < this._width; shift += 2) {\n var revShift = this._width - shift - 2;\n this._bitrev[j] |= ((j >>> shift) & 3) << revShift;\n }\n }\n\n this._out = null;\n this._data = null;\n this._inv = 0;\n}\n\nFFT_indutny.prototype.fromComplexArray = function fromComplexArray(complex, storage) {\n var res = storage || new Array(complex.length >>> 1);\n for (var i = 0; i < complex.length; i += 2) res[i >>> 1] = complex[i];\n return res;\n};\n\nFFT_indutny.prototype.createComplexArray = function createComplexArray() {\n const res = new Array(this._csize);\n for (var i = 0; i < res.length; i++) res[i] = 0;\n return res;\n};\n\nFFT_indutny.prototype.toComplexArray = function toComplexArray(input, storage) {\n var res = storage || this.createComplexArray();\n for (var i = 0; i < res.length; i += 2) {\n res[i] = input[i >>> 1];\n res[i + 1] = 0;\n }\n return res;\n};\n\nFFT_indutny.prototype.completeSpectrum = function completeSpectrum(spectrum) {\n var size = this._csize;\n var half = size >>> 1;\n for (var i = 2; i < half; i += 2) {\n spectrum[size - i] = spectrum[i];\n spectrum[size - i + 1] = -spectrum[i + 1];\n }\n};\n\nFFT_indutny.prototype.transform = function transform(out, data) {\n if (out === data) throw new Error(\"Input and output buffers must be different\");\n\n this._out = out;\n this._data = data;\n this._inv = 0;\n this._transform4();\n this._out = null;\n this._data = null;\n};\n\nFFT_indutny.prototype.realTransform = function realTransform(out, data) {\n if (out === data) throw new Error(\"Input and output buffers must be different\");\n\n this._out = out;\n this._data = data;\n this._inv = 0;\n this._realTransform4();\n this._out = null;\n this._data = null;\n};\n\nFFT_indutny.prototype.inverseTransform = function inverseTransform(out, data) {\n if (out === data) throw new Error(\"Input and output buffers must be different\");\n\n this._out = out;\n this._data = data;\n this._inv = 1;\n this._transform4();\n for (var i = 0; i < out.length; i++) out[i] /= this.size;\n this._out = null;\n this._data = null;\n};\n\n// radix-4 implementation\n//\n// NOTE: Uses of `var` are intentional for older V8 version that do not\n// support both `let compound assignments` and `const phi`\nFFT_indutny.prototype._transform4 = function _transform4() {\n var out = this._out;\n var size = this._csize;\n\n // Initial step (permute and transform)\n var width = this._width;\n var step = 1 << width;\n var len = (size / step) << 1;\n\n var outOff;\n var t;\n var bitrev = this._bitrev;\n if (len === 4) {\n for (outOff = 0, t = 0; outOff < size; outOff += len, t++) {\n const off = bitrev[t];\n this._singleTransform2(outOff, off, step);\n }\n } else {\n // len === 8\n for (outOff = 0, t = 0; outOff < size; outOff += len, t++) {\n const off = bitrev[t];\n this._singleTransform4(outOff, off, step);\n }\n }\n\n // Loop through steps in decreasing order\n var inv = this._inv ? -1 : 1;\n var table = this.table;\n for (step >>= 2; step >= 2; step >>= 2) {\n len = (size / step) << 1;\n var quarterLen = len >>> 2;\n\n // Loop through offsets in the data\n for (outOff = 0; outOff < size; outOff += len) {\n // Full case\n var limit = outOff + quarterLen;\n for (var i = outOff, k = 0; i < limit; i += 2, k += step) {\n const A = i;\n const B = A + quarterLen;\n const C = B + quarterLen;\n const D = C + quarterLen;\n\n // Original values\n const Ar = out[A];\n const Ai = out[A + 1];\n const Br = out[B];\n const Bi = out[B + 1];\n const Cr = out[C];\n const Ci = out[C + 1];\n const Dr = out[D];\n const Di = out[D + 1];\n\n // Middle values\n const MAr = Ar;\n const MAi = Ai;\n\n const tableBr = table[k];\n const tableBi = inv * table[k + 1];\n const MBr = Br * tableBr - Bi * tableBi;\n const MBi = Br * tableBi + Bi * tableBr;\n\n const tableCr = table[2 * k];\n const tableCi = inv * table[2 * k + 1];\n const MCr = Cr * tableCr - Ci * tableCi;\n const MCi = Cr * tableCi + Ci * tableCr;\n\n const tableDr = table[3 * k];\n const tableDi = inv * table[3 * k + 1];\n const MDr = Dr * tableDr - Di * tableDi;\n const MDi = Dr * tableDi + Di * tableDr;\n\n // Pre-Final values\n const T0r = MAr + MCr;\n const T0i = MAi + MCi;\n const T1r = MAr - MCr;\n const T1i = MAi - MCi;\n const T2r = MBr + MDr;\n const T2i = MBi + MDi;\n const T3r = inv * (MBr - MDr);\n const T3i = inv * (MBi - MDi);\n\n // Final values\n const FAr = T0r + T2r;\n const FAi = T0i + T2i;\n\n const FCr = T0r - T2r;\n const FCi = T0i - T2i;\n\n const FBr = T1r + T3i;\n const FBi = T1i - T3r;\n\n const FDr = T1r - T3i;\n const FDi = T1i + T3r;\n\n out[A] = FAr;\n out[A + 1] = FAi;\n out[B] = FBr;\n out[B + 1] = FBi;\n out[C] = FCr;\n out[C + 1] = FCi;\n out[D] = FDr;\n out[D + 1] = FDi;\n }\n }\n }\n};\n\n// radix-2 implementation\n//\n// NOTE: Only called for len=4\nFFT_indutny.prototype._singleTransform2 = function _singleTransform2(outOff, off, step) {\n const out = this._out;\n const data = this._data;\n\n const evenR = data[off];\n const evenI = data[off + 1];\n const oddR = data[off + step];\n const oddI = data[off + step + 1];\n\n const leftR = evenR + oddR;\n const leftI = evenI + oddI;\n const rightR = evenR - oddR;\n const rightI = evenI - oddI;\n\n out[outOff] = leftR;\n out[outOff + 1] = leftI;\n out[outOff + 2] = rightR;\n out[outOff + 3] = rightI;\n};\n\n// radix-4\n//\n// NOTE: Only called for len=8\nFFT_indutny.prototype._singleTransform4 = function _singleTransform4(outOff, off, step) {\n const out = this._out;\n const data = this._data;\n const inv = this._inv ? -1 : 1;\n const step2 = step * 2;\n const step3 = step * 3;\n\n // Original values\n const Ar = data[off];\n const Ai = data[off + 1];\n const Br = data[off + step];\n const Bi = data[off + step + 1];\n const Cr = data[off + step2];\n const Ci = data[off + step2 + 1];\n const Dr = data[off + step3];\n const Di = data[off + step3 + 1];\n\n // Pre-Final values\n const T0r = Ar + Cr;\n const T0i = Ai + Ci;\n const T1r = Ar - Cr;\n const T1i = Ai - Ci;\n const T2r = Br + Dr;\n const T2i = Bi + Di;\n const T3r = inv * (Br - Dr);\n const T3i = inv * (Bi - Di);\n\n // Final values\n const FAr = T0r + T2r;\n const FAi = T0i + T2i;\n\n const FBr = T1r + T3i;\n const FBi = T1i - T3r;\n\n const FCr = T0r - T2r;\n const FCi = T0i - T2i;\n\n const FDr = T1r - T3i;\n const FDi = T1i + T3r;\n\n out[outOff] = FAr;\n out[outOff + 1] = FAi;\n out[outOff + 2] = FBr;\n out[outOff + 3] = FBi;\n out[outOff + 4] = FCr;\n out[outOff + 5] = FCi;\n out[outOff + 6] = FDr;\n out[outOff + 7] = FDi;\n};\n\n// Real input radix-4 implementation\nFFT_indutny.prototype._realTransform4 = function _realTransform4() {\n var out = this._out;\n var size = this._csize;\n\n // Initial step (permute and transform)\n var width = this._width;\n var step = 1 << width;\n var len = (size / step) << 1;\n\n var outOff;\n var t;\n var bitrev = this._bitrev;\n if (len === 4) {\n for (outOff = 0, t = 0; outOff < size; outOff += len, t++) {\n const off = bitrev[t];\n this._singleRealTransform2(outOff, off >>> 1, step >>> 1);\n }\n } else {\n // len === 8\n for (outOff = 0, t = 0; outOff < size; outOff += len, t++) {\n const off = bitrev[t];\n this._singleRealTransform4(outOff, off >>> 1, step >>> 1);\n }\n }\n\n // Loop through steps in decreasing order\n var inv = this._inv ? -1 : 1;\n var table = this.table;\n for (step >>= 2; step >= 2; step >>= 2) {\n len = (size / step) << 1;\n var halfLen = len >>> 1;\n var quarterLen = halfLen >>> 1;\n var hquarterLen = quarterLen >>> 1;\n\n // Loop through offsets in the data\n for (outOff = 0; outOff < size; outOff += len) {\n for (var i = 0, k = 0; i <= hquarterLen; i += 2, k += step) {\n var A = outOff + i;\n var B = A + quarterLen;\n var C = B + quarterLen;\n var D = C + quarterLen;\n\n // Original values\n var Ar = out[A];\n var Ai = out[A + 1];\n var Br = out[B];\n var Bi = out[B + 1];\n var Cr = out[C];\n var Ci = out[C + 1];\n var Dr = out[D];\n var Di = out[D + 1];\n\n // Middle values\n var MAr = Ar;\n var MAi = Ai;\n\n var tableBr = table[k];\n var tableBi = inv * table[k + 1];\n var MBr = Br * tableBr - Bi * tableBi;\n var MBi = Br * tableBi + Bi * tableBr;\n\n var tableCr = table[2 * k];\n var tableCi = inv * table[2 * k + 1];\n var MCr = Cr * tableCr - Ci * tableCi;\n var MCi = Cr * tableCi + Ci * tableCr;\n\n var tableDr = table[3 * k];\n var tableDi = inv * table[3 * k + 1];\n var MDr = Dr * tableDr - Di * tableDi;\n var MDi = Dr * tableDi + Di * tableDr;\n\n // Pre-Final values\n var T0r = MAr + MCr;\n var T0i = MAi + MCi;\n var T1r = MAr - MCr;\n var T1i = MAi - MCi;\n var T2r = MBr + MDr;\n var T2i = MBi + MDi;\n var T3r = inv * (MBr - MDr);\n var T3i = inv * (MBi - MDi);\n\n // Final values\n var FAr = T0r + T2r;\n var FAi = T0i + T2i;\n\n var FBr = T1r + T3i;\n var FBi = T1i - T3r;\n\n out[A] = FAr;\n out[A + 1] = FAi;\n out[B] = FBr;\n out[B + 1] = FBi;\n\n // Output final middle point\n if (i === 0) {\n var FCr = T0r - T2r;\n var FCi = T0i - T2i;\n out[C] = FCr;\n out[C + 1] = FCi;\n continue;\n }\n\n // Do not overwrite ourselves\n if (i === hquarterLen) continue;\n\n // In the flipped case:\n // MAi = -MAi\n // MBr=-MBi, MBi=-MBr\n // MCr=-MCr\n // MDr=MDi, MDi=MDr\n var ST0r = T1r;\n var ST0i = -T1i;\n var ST1r = T0r;\n var ST1i = -T0i;\n var ST2r = -inv * T3i;\n var ST2i = -inv * T3r;\n var ST3r = -inv * T2i;\n var ST3i = -inv * T2r;\n\n var SFAr = ST0r + ST2r;\n var SFAi = ST0i + ST2i;\n\n var SFBr = ST1r + ST3i;\n var SFBi = ST1i - ST3r;\n\n var SA = outOff + quarterLen - i;\n var SB = outOff + halfLen - i;\n\n out[SA] = SFAr;\n out[SA + 1] = SFAi;\n out[SB] = SFBr;\n out[SB + 1] = SFBi;\n }\n }\n }\n};\n\n// radix-2 implementation\n//\n// NOTE: Only called for len=4\nFFT_indutny.prototype._singleRealTransform2 = function _singleRealTransform2(outOff, off, step) {\n const out = this._out;\n const data = this._data;\n\n const evenR = data[off];\n const oddR = data[off + step];\n\n const leftR = evenR + oddR;\n const rightR = evenR - oddR;\n\n out[outOff] = leftR;\n out[outOff + 1] = 0;\n out[outOff + 2] = rightR;\n out[outOff + 3] = 0;\n};\n\n// radix-4\n//\n// NOTE: Only called for len=8\nFFT_indutny.prototype._singleRealTransform4 = function _singleRealTransform4(outOff, off, step) {\n const out = this._out;\n const data = this._data;\n const inv = this._inv ? -1 : 1;\n const step2 = step * 2;\n const step3 = step * 3;\n\n // Original values\n const Ar = data[off];\n const Br = data[off + step];\n const Cr = data[off + step2];\n const Dr = data[off + step3];\n\n // Pre-Final values\n const T0r = Ar + Cr;\n const T1r = Ar - Cr;\n const T2r = Br + Dr;\n const T3r = inv * (Br - Dr);\n\n // Final values\n const FAr = T0r + T2r;\n\n const FBr = T1r;\n const FBi = -T3r;\n\n const FCr = T0r - T2r;\n\n const FDr = T1r;\n const FDi = T3r;\n\n out[outOff] = FAr;\n out[outOff + 1] = 0;\n out[outOff + 2] = FBr;\n out[outOff + 3] = FBi;\n out[outOff + 4] = FCr;\n out[outOff + 5] = 0;\n out[outOff + 6] = FDr;\n out[outOff + 7] = FDi;\n};\n\nexport default FFT_indutny;\n","import FFT_indutny from \"./fft.js\";\r\n\r\nclass IndutnyFftWrapperJavascript {\r\n constructor(size) {\r\n this.size = size;\r\n this.indutnyFft = new FFT_indutny(size);\r\n }\r\n\r\n fft(inputArr) {\r\n const outputArr = new Float32Array(2 * this.size);\r\n this.indutnyFft.transform(outputArr, inputArr);\r\n return outputArr;\r\n }\r\n}\r\n\r\nexport default IndutnyFftWrapperJavascript;\r\n","\nvar CrossModule = (() => {\n var _scriptDir = import.meta.url;\n \n return (\nfunction(moduleArg = {}) {\n\nvar Module=moduleArg;var readyPromiseResolve,readyPromiseReject;Module[\"ready\"]=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject});var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram=\"./this.program\";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=true;var ENVIRONMENT_IS_WORKER=false;var scriptDirectory=\"\";function locateFile(path){if(Module[\"locateFile\"]){return Module[\"locateFile\"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!=\"undefined\"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf(\"blob:\")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,\"\").lastIndexOf(\"/\")+1)}else{scriptDirectory=\"\"}{read_=url=>{var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.responseType=\"arraybuffer\";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,true);xhr.responseType=\"arraybuffer\";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=title=>document.title=title}else{}var out=Module[\"print\"]||console.log.bind(console);var err=Module[\"printErr\"]||console.error.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module[\"arguments\"])arguments_=Module[\"arguments\"];if(Module[\"thisProgram\"])thisProgram=Module[\"thisProgram\"];if(Module[\"quit\"])quit_=Module[\"quit\"];var wasmBinary;if(Module[\"wasmBinary\"])wasmBinary=Module[\"wasmBinary\"];var noExitRuntime=Module[\"noExitRuntime\"]||true;if(typeof WebAssembly!=\"object\"){abort(\"no native wasm support detected\")}var wasmMemory;var wasmExports;var ABORT=false;var EXITSTATUS;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;Module[\"HEAP8\"]=HEAP8=new Int8Array(b);Module[\"HEAP16\"]=HEAP16=new Int16Array(b);Module[\"HEAP32\"]=HEAP32=new Int32Array(b);Module[\"HEAPU8\"]=HEAPU8=new Uint8Array(b);Module[\"HEAPU16\"]=HEAPU16=new Uint16Array(b);Module[\"HEAPU32\"]=HEAPU32=new Uint32Array(b);Module[\"HEAPF32\"]=HEAPF32=new Float32Array(b);Module[\"HEAPF64\"]=HEAPF64=new Float64Array(b)}var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function preRun(){if(Module[\"preRun\"]){if(typeof Module[\"preRun\"]==\"function\")Module[\"preRun\"]=[Module[\"preRun\"]];while(Module[\"preRun\"].length){addOnPreRun(Module[\"preRun\"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function postRun(){if(Module[\"postRun\"]){if(typeof Module[\"postRun\"]==\"function\")Module[\"postRun\"]=[Module[\"postRun\"]];while(Module[\"postRun\"].length){addOnPostRun(Module[\"postRun\"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){if(Module[\"onAbort\"]){Module[\"onAbort\"](what)}what=\"Aborted(\"+what+\")\";err(what);ABORT=true;EXITSTATUS=1;what+=\". Build with -sASSERTIONS for more info.\";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix=\"data:application/octet-stream;base64,\";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}var wasmBinaryFile;wasmBinaryFile=\"data:application/octet-stream;base64,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ACACSwRAQbgeIAI2AgALIAIgBmohAUHoISEAAkACQAJAA0AgASAAKAIARwRAIAAoAggiAA0BDAILCyAALQAMQQhxRQ0BC0HoISEAA0AgAyAAKAIAIgFPBEAgASAAKAIEaiIEIANLDQMLIAAoAgghAAwACwALIAAgAjYCACAAIAAoAgQgBmo2AgQgAkF4IAJrQQdxaiIHIAVBA3I2AgQgAUF4IAFrQQdxaiIGIAUgB2oiBWshACADIAZGBEBBwB4gBTYCAEG0HkG0HigCACAAaiIANgIAIAUgAEEBcjYCBAwIC0G8HigCACAGRgRAQbweIAU2AgBBsB5BsB4oAgAgAGoiADYCACAFIABBAXI2AgQgACAFaiAANgIADAgLIAYoAgQiA0EDcUEBRw0GIANBeHEhCSADQf8BTQRAIAYoAgwiASAGKAIIIgJGBEBBqB5BqB4oAgBBfiADQQN2d3E2AgAMBwsgAiABNgIMIAEgAjYCCAwGCyAGKAIYIQggBiAGKAIMIgJHBEAgBigCCCIBIAI2AgwgAiABNgIIDAULIAZBFGoiASgCACIDRQRAIAYoAhAiA0UNBCAGQRBqIQELA0AgASEEIAMiAkEUaiIBKAIAIgMNACACQRBqIQEgAigCECIDDQALIARBADYCAAwEC0G0HiAGQShrIgBBeCACa0EHcSIBayIINgIAQcAeIAEgAmoiATYCACABIAhBAXI2AgQgACACakEoNgIEQcQeQZAiKAIANgIAIAMgBEEnIARrQQdxakEvayIAIAAgA0EQakkbIgFBGzYCBCABQfAhKQIANwIQIAFB6CEpAgA3AghB8CEgAUEIajYCAEHsISAGNgIAQeghIAI2AgBB9CFBADYCACABQRhqIQADQCAAQQc2AgQgAEEIaiECIABBBGohACACIARJDQALIAEgA0YNACABIAEoAgRBfnE2AgQgAyABIANrIgJBAXI2AgQgASACNgIAIAJB/wFNBEAgAkF4cUHQHmohAAJ/QageKAIAIgFBASACQQN2dCICcUUEQEGoHiABIAJyNgIAIAAMAQsgACgCCAshASAAIAM2AgggASADNgIMIAMgADYCDCADIAE2AggMAQtBHyEAIAJB////B00EQCACQSYgAkEIdmciAGt2QQFxIABBAXRrQT5qIQALIAMgADYCHCADQgA3AhAgAEECdEHY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\";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}var binary=tryParseAsDataURI(file);if(binary){return binary}if(readBinary){return readBinary(file)}throw\"sync fetching of the wasm failed: you can preload it to Module['wasmBinary'] manually, or emcc.py will do that for you when generating HTML (but not JS)\"}function instantiateSync(file,info){var module;var binary=getBinarySync(file);module=new WebAssembly.Module(binary);var instance=new WebAssembly.Instance(module,info);return[instance,module]}function createWasm(){var info={\"a\":wasmImports};function receiveInstance(instance,module){var exports=instance.exports;wasmExports=exports;wasmMemory=wasmExports[\"b\"];updateMemoryViews();wasmTable=wasmExports[\"e\"];addOnInit(wasmExports[\"c\"]);removeRunDependency(\"wasm-instantiate\");return exports}addRunDependency(\"wasm-instantiate\");if(Module[\"instantiateWasm\"]){try{return Module[\"instantiateWasm\"](info,receiveInstance)}catch(e){err(\"Module.instantiateWasm callback failed with error: \"+e);readyPromiseReject(e)}}var result=instantiateSync(wasmBinaryFile,info);return receiveInstance(result[0])}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var abortOnCannotGrowMemory=requestedSize=>{abort(\"OOM\")};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;abortOnCannotGrowMemory(requestedSize)};function getCFunc(ident){var func=Module[\"_\"+ident];return func}var writeArrayToMemory=(array,buffer)=>{HEAP8.set(array,buffer)};var lengthBytesUTF8=str=>{var len=0;for(var i=0;i<str.length;++i){var c=str.charCodeAt(i);if(c<=127){len++}else if(c<=2047){len+=2}else if(c>=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx};var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);var stringToUTF8OnStack=str=>{var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8(str,ret,size);return ret};var UTF8Decoder=typeof TextDecoder!=\"undefined\"?new TextDecoder(\"utf8\"):undefined;var UTF8ArrayToString=(heapOrArray,idx,maxBytesToRead)=>{var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str=\"\";while(idx<endPtr){var u0=heapOrArray[idx++];if(!(u0&128)){str+=String.fromCharCode(u0);continue}var u1=heapOrArray[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}var u2=heapOrArray[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u0=(u0&7)<<18|u1<<12|u2<<6|heapOrArray[idx++]&63}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}return str};var UTF8ToString=(ptr,maxBytesToRead)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):\"\";var ccall=function(ident,returnType,argTypes,args,opts){var toC={\"string\":str=>{var ret=0;if(str!==null&&str!==undefined&&str!==0){ret=stringToUTF8OnStack(str)}return ret},\"array\":arr=>{var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType===\"string\"){return UTF8ToString(ret)}if(returnType===\"boolean\")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);function onDone(ret){if(stack!==0)stackRestore(stack);return convertReturnValue(ret)}ret=onDone(ret);return ret};var cwrap=function(ident,returnType,argTypes,opts){var numericArgs=!argTypes||argTypes.every(type=>type===\"number\"||type===\"boolean\");var numericRet=returnType!==\"string\";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return function(){return ccall(ident,returnType,argTypes,arguments,opts)}};var wasmImports={a:_emscripten_resize_heap};var asm=createWasm();var ___wasm_call_ctors=asm[\"c\"];var _fftCross=Module[\"_fftCross\"]=asm[\"d\"];var ___errno_location=asm[\"__errno_location\"];var _malloc=Module[\"_malloc\"]=asm[\"f\"];var _free=Module[\"_free\"]=asm[\"g\"];var stackSave=asm[\"h\"];var stackRestore=asm[\"i\"];var stackAlloc=asm[\"j\"];function intArrayFromBase64(s){try{var decoded=atob(s);var bytes=new Uint8Array(decoded.length);for(var i=0;i<decoded.length;++i){bytes[i]=decoded.charCodeAt(i)}return bytes}catch(_){throw new Error(\"Converting base64 string to bytes failed.\")}}function tryParseAsDataURI(filename){if(!isDataURI(filename)){return}return intArrayFromBase64(filename.slice(dataURIPrefix.length))}Module[\"ccall\"]=ccall;Module[\"cwrap\"]=cwrap;var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(){if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module[\"calledRun\"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);if(Module[\"onRuntimeInitialized\"])Module[\"onRuntimeInitialized\"]();postRun()}if(Module[\"setStatus\"]){Module[\"setStatus\"](\"Running...\");setTimeout(function(){setTimeout(function(){Module[\"setStatus\"](\"\")},1);doRun()},1)}else{doRun()}}if(Module[\"preInit\"]){if(typeof Module[\"preInit\"]==\"function\")Module[\"preInit\"]=[Module[\"preInit\"]];while(Module[\"preInit\"].length>0){Module[\"preInit\"].pop()()}}run();\n\n\n return moduleArg\n}\n\n);\n})();\nexport default CrossModule;","import CrossModule from \"./Cross.mjs\";\n\n(\"use strict\");\n\nvar crossModule = CrossModule({});\n\nvar fftCross = crossModule.cwrap(\"fftCross\", \"void\", [\n \"number\",\n \"number\",\n \"number\",\n \"number\",\n \"number\",\n \"number\",\n]);\n\nfunction FFTCross(size) {\n this.size = size;\n this.n = size * 8;\n this.ptr = crossModule._malloc(this.n * 4);\n this.ri = new Uint8Array(crossModule.HEAPU8.buffer, this.ptr, this.n);\n this.ii = new Uint8Array(\n crossModule.HEAPU8.buffer,\n this.ptr + this.n,\n this.n,\n );\n\n this.transform = function (real, imag, inverse) {\n var ptr = this.ptr;\n var n = this.n;\n this.ri.set(new Uint8Array(real.buffer));\n this.ii.set(new Uint8Array(imag.buffer));\n fftCross(this.size, inverse, ptr, ptr + n, ptr + n * 2, ptr + n * 3);\n var ro = new Float64Array(\n crossModule.HEAPU8.buffer,\n ptr + n * 2,\n this.size,\n );\n var io = new Float64Array(\n crossModule.HEAPU8.buffer,\n ptr + n * 3,\n this.size,\n );\n return { real: ro, imag: io };\n };\n\n this.dispose = function () {\n crossModule._free(this.ptr);\n };\n}\n\nexport default FFTCross;\n","import FFTCross from \"./FFT.js\";\r\n\r\nclass CrossFftWrapperWasm {\r\n constructor(size) {\r\n this.size = size;\r\n this.fftcross = new FFTCross(size);\r\n this.real = new Float64Array(this.size);\r\n this.imag = new Float64Array(this.size);\r\n }\r\n\r\n fft(inputArr) {\r\n for (var i = 0; i < this.size; i++) {\r\n this.real[i] = inputArr[2 * i];\r\n this.imag[i] = inputArr[2 * i + 1];\r\n }\r\n const out = this.fftcross.transform(this.real, this.imag, false);\r\n const outputArr = new Float32Array(2 * this.size);\r\n for (var i = 0; i < this.size; i++) {\r\n outputArr[2 * i] = out.real[i];\r\n outputArr[2 * i + 1] = out.imag[i];\r\n }\r\n return outputArr;\r\n }\r\n}\r\n\r\nexport default CrossFftWrapperWasm;\r\n","/*\n * Free FFT and convolution (JavaScript)\n *\n * Copyright (c) 2014 Project Nayuki\n * http://www.nayuki.io/page/free-small-fft-in-multiple-languages\n *\n * (MIT License)\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n * - The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * - The Software is provided \"as is\", without warranty of any kind, express or\n * implied, including but not limited to the warranties of merchantability,\n * fitness for a particular purpose and noninfringement. In no event shall the\n * authors or copyright holders be liable for any claim, damages or other\n * liability, whether in an action of contract, tort or otherwise, arising from,\n * out of or in connection with the Software or the use or other dealings in the\n * Software.\n *\n * Slightly restructured by Chris Cannam, cannam@all-day-breakfast.com\n */\n\n\"use strict\";\n\n/*\n * Construct an object for calculating the discrete Fourier transform (DFT) of size n, where n is a power of 2.\n */\nfunction FFTNayuki(n) {\n this.n = n;\n this.levels = -1;\n\n for (var i = 0; i < 32; i++) {\n if (1 << i == n) {\n this.levels = i; // Equal to log2(n)\n }\n }\n if (this.levels == -1) {\n throw \"Length is not a power of 2\";\n }\n\n this.cosTable = new Array(n / 2);\n this.sinTable = new Array(n / 2);\n for (var i = 0; i < n / 2; i++) {\n this.cosTable[i] = Math.cos((2 * Math.PI * i) / n);\n this.sinTable[i] = Math.sin((2 * Math.PI * i) / n);\n }\n\n /*\n * Computes the discrete Fourier transform (DFT) of the given complex vector, storing the result back into the vector.\n * The vector's length must be equal to the size n that was passed to the object constructor, and this must be a power of 2. Uses the Cooley-Tukey decimation-in-time radix-2 algorithm.\n */\n this.forward = function (real, imag) {\n var n = this.n;\n\n // Bit-reversed addressing permutation\n for (var i = 0; i < n; i++) {\n var j = reverseBits(i, this.levels);\n if (j > i) {\n var temp = real[i];\n real[i] = real[j];\n real[j] = temp;\n temp = imag[i];\n imag[i] = imag[j];\n imag[j] = temp;\n }\n }\n\n // Cooley-Tukey decimation-in-time radix-2 FFT\n for (var size = 2; size <= n; size *= 2) {\n var halfsize = size / 2;\n var tablestep = n / size;\n for (var i = 0; i < n; i += size) {\n for (var j = i, k = 0; j < i + halfsize; j++, k += tablestep) {\n var tpre = real[j + halfsize] * this.cosTable[k] + imag[j + halfsize] * this.sinTable[k];\n var tpim = -real[j + halfsize] * this.sinTable[k] + imag[j + halfsize] * this.cosTable[k];\n real[j + halfsize] = real[j] - tpre;\n imag[j + halfsize] = imag[j] - tpim;\n real[j] += tpre;\n imag[j] += tpim;\n }\n }\n }\n\n // Returns the integer whose value is the reverse of the lowest 'bits' bits of the integer 'x'.\n function reverseBits(x, bits) {\n var y = 0;\n for (var i = 0; i < bits; i++) {\n y = (y << 1) | (x & 1);\n x >>>= 1;\n }\n return y;\n }\n };\n\n /*\n * Computes the inverse discrete Fourier transform (IDFT) of the given complex vector, storing the result back into the vector.\n * The vector's length must be equal to the size n that was passed to the object constructor, and this must be a power of 2. This is a wrapper function. This transform does not perform scaling, so the inverse is not a true inverse.\n */\n this.inverse = function (real, imag) {\n forward(imag, real);\n };\n}\n\nexport default FFTNayuki;\n","import FFTNayuki from \"./fft.js\"; // this one has the sin/cos tables precomputed\r\n\r\nclass NayukiFftWrapperJavascript {\r\n constructor(size) {\r\n this.size = size;\r\n this.fftNayuki = new FFTNayuki(size);\r\n }\r\n\r\n fft(inputArr) {\r\n // it uses the same buffer for input and output\r\n const real = new Float32Array(this.size);\r\n const imag = new Float32Array(this.size);\r\n const outputArr = new Float32Array(this.size * 2);\r\n\r\n for (var i = 0; i < this.size; ++i) {\r\n real[i] = inputArr[i * 2];\r\n imag[i] = inputArr[i * 2 + 1];\r\n }\r\n this.fftNayuki.forward(real, imag); // this does the FFT, it uses the same buffer for input and output\r\n for (var i = 0; i < this.size; ++i) {\r\n outputArr[i * 2] = real[i];\r\n outputArr[i * 2 + 1] = imag[i];\r\n }\r\n return outputArr;\r\n }\r\n}\r\n\r\nexport default NayukiFftWrapperJavascript;\r\n","\nvar NayukiCModule = (() => {\n var _scriptDir = import.meta.url;\n \n return (\nfunction(moduleArg = {}) {\n\nvar Module=moduleArg;var readyPromiseResolve,readyPromiseReject;Module[\"ready\"]=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject});var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram=\"./this.program\";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=true;var ENVIRONMENT_IS_WORKER=false;var scriptDirectory=\"\";function locateFile(path){if(Module[\"locateFile\"]){return Module[\"locateFile\"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!=\"undefined\"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf(\"blob:\")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,\"\").lastIndexOf(\"/\")+1)}else{scriptDirectory=\"\"}{read_=url=>{var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.responseType=\"arraybuffer\";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,true);xhr.responseType=\"arraybuffer\";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=title=>document.title=title}else{}var out=Module[\"print\"]||console.log.bind(console);var err=Module[\"printErr\"]||console.error.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module[\"arguments\"])arguments_=Module[\"arguments\"];if(Module[\"thisProgram\"])thisProgram=Module[\"thisProgram\"];if(Module[\"quit\"])quit_=Module[\"quit\"];var wasmBinary;if(Module[\"wasmBinary\"])wasmBinary=Module[\"wasmBinary\"];var noExitRuntime=Module[\"noExitRuntime\"]||true;if(typeof WebAssembly!=\"object\"){abort(\"no native wasm support detected\")}var wasmMemory;var wasmExports;var ABORT=false;var EXITSTATUS;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;Module[\"HEAP8\"]=HEAP8=new Int8Array(b);Module[\"HEAP16\"]=HEAP16=new Int16Array(b);Module[\"HEAP32\"]=HEAP32=new Int32Array(b);Module[\"HEAPU8\"]=HEAPU8=new Uint8Array(b);Module[\"HEAPU16\"]=HEAPU16=new Uint16Array(b);Module[\"HEAPU32\"]=HEAPU32=new Uint32Array(b);Module[\"HEAPF32\"]=HEAPF32=new Float32Array(b);Module[\"HEAPF64\"]=HEAPF64=new Float64Array(b)}var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function preRun(){if(Module[\"preRun\"]){if(typeof Module[\"preRun\"]==\"function\")Module[\"preRun\"]=[Module[\"preRun\"]];while(Module[\"preRun\"].length){addOnPreRun(Module[\"preRun\"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function postRun(){if(Module[\"postRun\"]){if(typeof Module[\"postRun\"]==\"function\")Module[\"postRun\"]=[Module[\"postRun\"]];while(Module[\"postRun\"].length){addOnPostRun(Module[\"postRun\"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){if(Module[\"onAbort\"]){Module[\"onAbort\"](what)}what=\"Aborted(\"+what+\")\";err(what);ABORT=true;EXITSTATUS=1;what+=\". Build with -sASSERTIONS for more info.\";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix=\"data:application/octet-stream;base64,\";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}var wasmBinaryFile;wasmBinaryFile=\"data:application/octet-stream;base64,AGFzbQEAAAABNgpgAX8Bf2ABfwBgBH9/f38AYAN8fH8BfGACfHwBfGACfH8BfGABfAF8YAAAYAJ8fwF/YAABfwIHAQFhAWEAAAMSEQEAAAMEBQYHCAECAgAAAQkABAUBcAEBAQUGAQGAAoACBggBfwFBoKIECwc5DgFiAgABYwAIAWQAAgFlAAEBZgARAWcADQFoAAoBaQAKAWoADAFrAAsBbAEAAW0AEAFuAA8BbwAOCvdfEdILAQd/AkAgAEUNACAAQQhrIgIgAEEEaygCACIBQXhxIgBqIQUCQCABQQFxDQAgAUEDcUUNASACIAIoAgAiAWsiAkG4HigCAEkNASAAIAFqIQACQAJAQbweKAIAIAJHBEAgAUH/AU0EQCABQQN2IQQgAigCDCIBIAIoAggiA0YEQEGoHkGoHigCAEF+IAR3cTYCAAwFCyADIAE2AgwgASADNgIIDAQLIAIoAhghBiACIAIoAgwiAUcEQCACKAIIIgMgATYCDCABIAM2AggMAwsgAkEUaiIEKAIAIgNFBEAgAigCECIDRQ0CIAJBEGohBAsDQCAEIQcgAyIBQRRqIgQoAgAiAw0AIAFBEGohBCABKAIQIgMNAAsgB0EANgIADAILIAUoAgQiAUEDcUEDRw0CQbAeIAA2AgAgBSABQX5xNgIEIAIgAEEBcjYCBCAFIAA2AgAPC0EAIQELIAZFDQACQCACKAIcIgNBAnRB2CBqIgQoAgAgAkYEQCAEIAE2AgAgAQ0BQaweQaweKAIAQX4gA3dxNgIADAILIAZBEEEUIAYoAhAgAkYbaiABNgIAIAFFDQELIAEgBjYCGCACKAIQIgMEQCABIAM2AhAgAyABNgIYCyACKAIUIgNFDQAgASADNgIUIAMgATYCGAsgAiAFTw0AIAUoAgQiAUEBcUUNAAJAAkACQAJAIAFBAnFFBEBBwB4oAgAgBUYEQEHAHiACNgIAQbQeQbQeKAIAIABqIgA2AgAgAiAAQQFyNgIEIAJBvB4oAgBHDQZBsB5BADYCAEG8HkEANgIADwtBvB4oAgAgBUYEQEG8HiACNgIAQbAeQbAeKAIAIABqIgA2AgAgAiAAQQFyNgIEIAAgAmogADYCAA8LIAFBeHEgAGohACABQf8BTQRAIAFBA3YhBCAFKAIMIgEgBSgCCCIDRgRAQageQageKAIAQX4gBHdxNgIADAULIAMgATYCDCABIAM2AggMBAsgBSgCGCEGIAUgBSgCDCIBRwRAQbgeKAIAGiAFKAIIIgMgATYCDCABIAM2AggMAwsgBUEUaiIEKAIAIgNFBEAgBSgCECIDRQ0CIAVBEGohBAsDQCAEIQcgAyIBQRRqIgQoAgAiAw0AIAFBEGohBCABKAIQIgMNAAsgB0EANgIADAILIAUgAUF+cTYCBCACIABBAXI2AgQgACACaiAANgIADAMLQQAhAQsgBkUNAAJAIAUoAhwiA0ECdEHYIGoiBCgCACAFRgRAIAQgATYCACABDQFBrB5BrB4oAgBBfiADd3E2AgAMAgsgBkEQQRQgBigCECAFRhtqIAE2AgAgAUUNAQsgASAGNgIYIAUoAhAiAwRAIAEgAzYCECADIAE2AhgLIAUoAhQiA0UNACABIAM2AhQgAyABNgIYCyACIABBAXI2AgQgACACaiAANgIAIAJBvB4oAgBHDQBBsB4gADYCAA8LIABB/wFNBEAgAEF4cUHQHmohAQJ/QageKAIAIgNBASAAQQN2dCIAcUUEQEGoHiAAIANyNgIAIAEMAQsgASgCCAshACABIAI2AgggACACNgIMIAIgATYCDCACIAA2AggPC0EfIQMgAEH///8HTQRAIABBJiAAQQh2ZyIBa3ZBAXEgAUEBdGtBPmohAwsgAiADNgIcIAJCADcCECADQQJ0QdggaiEBAkACQAJAQaweKAIAIgRBASADdCIHcUUEQEGsHiAEIAdyNgIAIAEgAjYCACACIAE2AhgMAQsgAEEZIANBAXZrQQAgA0EfRxt0IQMgASgCACEBA0AgASIEKAIEQXhxIABGDQIgA0EddiEBIANBAXQhAyAEIAFBBHFqIgdBEGooAgAiAQ0ACyAHIAI2AhAgAiAENgIYCyACIAI2AgwgAiACNgIIDAELIAQoAggiACACNgIMIAQgAjYCCCACQQA2AhggAiAENgIMIAIgADYCCAtByB5ByB4oAgBBAWsiAEF/IAAbNgIACwvGJwELfyMAQRBrIgokAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAEH0AU0EQEGoHigCACIGQRAgAEELakF4cSAAQQtJGyIFQQN2IgB2IgFBA3EEQAJAIAFBf3NBAXEgAGoiAkEDdCIBQdAeaiIAIAFB2B5qKAIAIgEoAggiBEYEQEGoHiAGQX4gAndxNgIADAELIAQgADYCDCAAIAQ2AggLIAFBCGohACABIAJBA3QiAkEDcjYCBCABIAJqIgEgASgCBEEBcjYCBAwPCyAFQbAeKAIAIgdNDQEgAQRAAkBBAiAAdCICQQAgAmtyIAEgAHRxaCIBQQN0IgBB0B5qIgIgAEHYHmooAgAiACgCCCIERgRAQageIAZBfiABd3EiBjYCAAwBCyAEIAI2AgwgAiAENgIICyAAIAVBA3I2AgQgACAFaiIIIAFBA3QiASAFayIEQQFyNgIEIAAgAWogBDYCACAHBEAgB0F4cUHQHmohAUG8HigCACECAn8gBkEBIAdBA3Z0IgNxRQRAQageIAMgBnI2AgAgAQwBCyABKAIICyEDIAEgAjYCCCADIAI2AgwgAiABNgIMIAIgAzYCCAsgAEEIaiEAQbweIAg2AgBBsB4gBDYCAAwPC0GsHigCACILRQ0BIAtoQQJ0QdggaigCACICKAIEQXhxIAVrIQMgAiEBA0ACQCABKAIQIgBFBEAgASgCFCIARQ0BCyAAKAIEQXhxIAVrIgEgAyABIANJIgEbIQMgACACIAEbIQIgACEBDAELCyACKAIYIQkgAiACKAIMIgRHBEBBuB4oAgAaIAIoAggiACAENgIMIAQgADYCCAwOCyACQRRqIgEoAgAiAEUEQCACKAIQIgBFDQMgAkEQaiEBCwNAIAEhCCAAIgRBFGoiASgCACIADQAgBEEQaiEBIAQoAhAiAA0ACyAIQQA2AgAMDQtBfyEFIABBv39LDQAgAEELaiIAQXhxIQVBrB4oAgAiCEUNAEEAIAVrIQMCQAJAAkACf0EAIAVBgAJJDQAaQR8gBUH///8HSw0AGiAFQSYgAEEIdmciAGt2QQFxIABBAXRrQT5qCyIHQQJ0QdggaigCACIBRQRAQQAhAAwBC0EAIQAgBUEZIAdBAXZrQQAgB0EfRxt0IQIDQAJAIAEoAgRBeHEgBWsiBiADTw0AIAEhBCAGIgMNAEEAIQMgASEADAMLIAAgASgCFCIGIAYgASACQR12QQRxaigCECIBRhsgACAGGyEAIAJBAXQhAiABDQALCyAAIARyRQRAQQAhBEECIAd0IgBBACAAa3IgCHEiAEUNAyAAaEECdEHYIGooAgAhAAsgAEUNAQsDQCAAKAIEQXhxIAVrIgIgA0khASACIAMgARshAyAAIAQgARshBCAAKAIQIgEEfyABBSAAKAIUCyIADQALCyAERQ0AIANBsB4oAgAgBWtPDQAgBCgCGCEHIAQgBCgCDCICRwRAQbgeKAIAGiAEKAIIIgAgAjYCDCACIAA2AggMDAsgBEEUaiIBKAIAIgBFBEAgBCgCECIARQ0DIARBEGohAQsDQCABIQYgACICQRRqIgEoAgAiAA0AIAJBEGohASACKAIQIgANAAsgBkEANgIADAsLIAVBsB4oAgAiBE0EQEG8HigCACEAAkAgBCAFayIBQRBPBEAgACAFaiICIAFBAXI2AgQgACAEaiABNgIAIAAgBUEDcjYCBAwBCyAAIARBA3I2AgQgACAEaiIBIAEoAgRBAXI2AgRBACECQQAhAQtBsB4gATYCAEG8HiACNgIAIABBCGohAAwNCyAFQbQeKAIAIgJJBEBBtB4gAiAFayIBNgIAQcAeQcAeKAIAIgAgBWoiAjYCACACIAFBAXI2AgQgACAFQQNyNgIEIABBCGohAAwNC0EAIQAgBUEvaiIDAn9BgCIoAgAEQEGIIigCAAwBC0GMIkJ/NwIAQYQiQoCggICAgAQ3AgBBgCIgCkEMakFwcUHYqtWqBXM2AgBBlCJBADYCAEHkIUEANgIAQYAgCyIBaiIGQQAgAWsiCHEiASAFTQ0MQeAhKAIAIgQEQEHYISgCACIHIAFqIgkgB00NDSAEIAlJDQ0LAkBB5CEtAABBBHFFBEACQAJAAkACQEHAHigCACIEBEBB6CEhAANAIAQgACgCACIHTwRAIAcgACgCBGogBEsNAwsgACgCCCIADQALC0EAEAMiAkF/Rg0DIAEhBkGEIigCACIAQQFrIgQgAnEEQCABIAJrIAIgBGpBACAAa3FqIQYLIAUgBk8NA0HgISgCACIABEBB2CEoAgAiBCAGaiIIIARNDQQgACAISQ0ECyAGEAMiACACRw0BDAULIAYgAmsgCHEiBhADIgIgACgCACAAKAIEakYNASACIQALIABBf0YNASAFQTBqIAZNBEAgACECDAQLQYgiKAIAIgIgAyAGa2pBACACa3EiAhADQX9GDQEgAiAGaiEGIAAhAgwDCyACQX9HDQILQeQhQeQhKAIAQQRyNgIACyABEAMhAkEAEAMhACACQX9GDQUgAEF/Rg0FIAAgAk0NBSAAIAJrIgYgBUEoak0NBQtB2CFB2CEoAgAgBmoiADYCAEHcISgCACAASQRAQdwhIAA2AgALAkBBwB4oAgAiAwRAQeghIQADQCACIAAoAgAiASAAKAIEIgRqRg0CIAAoAggiAA0ACwwEC0G4HigCACIAQQAgACACTRtFBEBBuB4gAjYCAAtBACEAQewhIAY2AgBB6CEgAjYCAEHIHkF/NgIAQcweQYAiKAIANgIAQfQhQQA2AgADQCAAQQN0IgFB2B5qIAFB0B5qIgQ2AgAgAUHcHmogBDYCACAAQQFqIgBBIEcNAAtBtB4gBkEoayIAQXggAmtBB3EiAWsiBDYCAEHAHiABIAJqIgE2AgAgASAEQQFyNgIEIAAgAmpBKDYCBEHEHkGQIigCADYCAAwECyACIANNDQIgASADSw0CIAAoAgxBCHENAiAAIAQgBmo2AgRBwB4gA0F4IANrQQdxIgBqIgE2AgBBtB5BtB4oAgAgBmoiAiAAayIANgIAIAEgAEEBcjYCBCACIANqQSg2AgRBxB5BkCIoAgA2AgAMAwtBACEEDAoLQQAhAgwIC0G4HigCACACSwRAQbgeIAI2AgALIAIgBmohAUHoISEAAkACQAJAA0AgASAAKAIARwRAIAAoAggiAA0BDAILCyAALQAMQQhxRQ0BC0HoISEAA0AgAyAAKAIAIgFPBEAgASAAKAIEaiIEIANLDQMLIAAoAgghAAwACwALIAAgAjYCACAAIAAoAgQgBmo2AgQgAkF4IAJrQQdxaiIHIAVBA3I2AgQgAUF4IAFrQQdxaiIGIAUgB2oiBWshACADIAZGBEBBwB4gBTYCAEG0HkG0HigCACAAaiIANgIAIAUgAEEBcjYCBAwIC0G8HigCACAGRgRAQbweIAU2AgBBsB5BsB4oAgAgAGoiADYCACAFIABBAXI2AgQgACAFaiAANgIADAgLIAYoAgQiA0EDcUEBRw0GIANBeHEhCSADQf8BTQRAIAYoAgwiASAGKAIIIgJGBEBBqB5BqB4oAgBBfiADQQN2d3E2AgAMBwsgAiABNgIMIAEgAjYCCAwGCyAGKAIYIQggBiAGKAIMIgJHBEAgBigCCCIBIAI2AgwgAiABNgIIDAULIAZBFGoiASgCACIDRQRAIAYoAhAiA0UNBCAGQRBqIQELA0AgASEEIAMiAkEUaiIBKAIAIgMNACACQRBqIQEgAigCECIDDQALIARBADYCAAwEC0G0HiAGQShrIgBBeCACa0EHcSIBayIINgIAQcAeIAEgAmoiATYCACABIAhBAXI2AgQgACACakEoNgIEQcQeQZAiKAIANgIAIAMgBEEnIARrQQdxakEvayIAIAAgA0EQakkbIgFBGzYCBCABQfAhKQIANwIQIAFB6CEpAgA3AghB8CEgAUEIajYCAEHsISAGNgIAQeghIAI2AgBB9CFBADYCACABQRhqIQADQCAAQQc2AgQgAEEIaiECIABBBGohACACIARJDQALIAEgA0YNACABIAEoAgRBfnE2AgQgAyABIANrIgJBAXI2AgQgASACNgIAIAJB/wFNBEAgAkF4cUHQHmohAAJ/QageKAIAIgFBASACQQN2dCICcUUEQEGoHiABIAJyNgIAIAAMAQsgACgCCAshASAAIAM2AgggASADNgIMIAMgADYCDCADIAE2AggMAQtBHyEAIAJB////B00EQCACQSYgAkEIdmciAGt2QQFxIABBAXRrQT5qIQALIAMgADYCHCADQgA3AhAgAEECdEHYIGohAQJAAkBBrB4oAgAiBEEBIAB0IgZxRQRAQaweIAQgBnI2AgAgASADNgIADAELIAJBGSAAQQF2a0EAIABBH0cbdCEAIAEoAgAhBANAIAQiASgCBEF4cSACRg0CIABBHXYhBCAAQQF0IQAgASAEQQRxaiIGKAIQIgQNAAsgBiADNgIQCyADIAE2AhggAyADNgIMIAMgAzYCCAwBCyABKAIIIgAgAzYCDCABIAM2AgggA0EANgIYIAMgATYCDCADIAA2AggLQbQeKAIAIgAgBU0NAEG0HiAAIAVrIgE2AgBBwB5BwB4oAgAiACAFaiICNgIAIAIgAUEBcjYCBCAAIAVBA3I2AgQgAEEIaiEADAgLQaQeQTA2AgBBACEADAcLQQAhAgsgCEUNAAJAIAYoAhwiAUECdEHYIGoiBCgCACAGRgRAIAQgAjYCACACDQFBrB5BrB4oAgBBfiABd3E2AgAMAgsgCEEQQRQgCCgCECAGRhtqIAI2AgAgAkUNAQsgAiAINgIYIAYoAhAiAQRAIAIgATYCECABIAI2AhgLIAYoAhQiAUUNACACIAE2AhQgASACNgIYCyAAIAlqIQAgBiAJaiIGKAIEIQMLIAYgA0F+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\";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}var binary=tryParseAsDataURI(file);if(binary){return binary}if(readBinary){return readBinary(file)}throw\"sync fetching of the wasm failed: you can preload it to Module['wasmBinary'] manually, or emcc.py will do that for you when generating HTML (but not JS)\"}function instantiateSync(file,info){var module;var binary=getBinarySync(file);module=new WebAssembly.Module(binary);var instance=new WebAssembly.Instance(module,info);return[instance,module]}function createWasm(){var info={\"a\":wasmImports};function receiveInstance(instance,module){var exports=instance.exports;wasmExports=exports;wasmMemory=wasmExports[\"b\"];updateMemoryViews();wasmTable=wasmExports[\"l\"];addOnInit(wasmExports[\"c\"]);removeRunDependency(\"wasm-instantiate\");return exports}addRunDependency(\"wasm-instantiate\");if(Module[\"instantiateWasm\"]){try{return Module[\"instantiateWasm\"](info,receiveInstance)}catch(e){err(\"Module.instantiateWasm callback failed with error: \"+e);readyPromiseReject(e)}}var result=instantiateSync(wasmBinaryFile,info);return receiveInstance(result[0])}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var abortOnCannotGrowMemory=requestedSize=>{abort(\"OOM\")};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;abortOnCannotGrowMemory(requestedSize)};function getCFunc(ident){var func=Module[\"_\"+ident];return func}var writeArrayToMemory=(array,buffer)=>{HEAP8.set(array,buffer)};var lengthBytesUTF8=str=>{var len=0;for(var i=0;i<str.length;++i){var c=str.charCodeAt(i);if(c<=127){len++}else if(c<=2047){len+=2}else if(c>=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx};var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);var stringToUTF8OnStack=str=>{var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8(str,ret,size);return ret};var UTF8Decoder=typeof TextDecoder!=\"undefined\"?new TextDecoder(\"utf8\"):undefined;var UTF8ArrayToString=(heapOrArray,idx,maxBytesToRead)=>{var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str=\"\";while(idx<endPtr){var u0=heapOrArray[idx++];if(!(u0&128)){str+=String.fromCharCode(u0);continue}var u1=heapOrArray[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}var u2=heapOrArray[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u0=(u0&7)<<18|u1<<12|u2<<6|heapOrArray[idx++]&63}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}return str};var UTF8ToString=(ptr,maxBytesToRead)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):\"\";var ccall=function(ident,returnType,argTypes,args,opts){var toC={\"string\":str=>{var ret=0;if(str!==null&&str!==undefined&&str!==0){ret=stringToUTF8OnStack(str)}return ret},\"array\":arr=>{var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType===\"string\"){return UTF8ToString(ret)}if(returnType===\"boolean\")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);function onDone(ret){if(stack!==0)stackRestore(stack);return convertReturnValue(ret)}ret=onDone(ret);return ret};var cwrap=function(ident,returnType,argTypes,opts){var numericArgs=!argTypes||argTypes.every(type=>type===\"number\"||type===\"boolean\");var numericRet=returnType!==\"string\";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return function(){return ccall(ident,returnType,argTypes,arguments,opts)}};var wasmImports={a:_emscripten_resize_heap};var asm=createWasm();var ___wasm_call_ctors=asm[\"c\"];var _malloc=Module[\"_malloc\"]=asm[\"d\"];var _free=Module[\"_free\"]=asm[\"e\"];var _precalc=Module[\"_precalc\"]=asm[\"f\"];var _precalc_f=Module[\"_precalc_f\"]=asm[\"g\"];var _dispose=Module[\"_dispose\"]=asm[\"h\"];var _dispose_f=Module[\"_dispose_f\"]=asm[\"i\"];var _transform_radix2_precalc=Module[\"_transform_radix2_precalc\"]=asm[\"j\"];var _transform_radix2_precalc_f=Module[\"_transform_radix2_precalc_f\"]=asm[\"k\"];var ___errno_location=asm[\"__errno_location\"];var stackSave=asm[\"m\"];var stackRestore=asm[\"n\"];var stackAlloc=asm[\"o\"];function intArrayFromBase64(s){try{var decoded=atob(s);var bytes=new Uint8Array(decoded.length);for(var i=0;i<decoded.length;++i){bytes[i]=decoded.charCodeAt(i)}return bytes}catch(_){throw new Error(\"Converting base64 string to bytes failed.\")}}function tryParseAsDataURI(filename){if(!isDataURI(filename)){return}return intArrayFromBase64(filename.slice(dataURIPrefix.length))}Module[\"ccall\"]=ccall;Module[\"cwrap\"]=cwrap;var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(){if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module[\"calledRun\"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);if(Module[\"onRuntimeInitialized\"])Module[\"onRuntimeInitialized\"]();postRun()}if(Module[\"setStatus\"]){Module[\"setStatus\"](\"Running...\");setTimeout(function(){setTimeout(function(){Module[\"setStatus\"](\"\")},1);doRun()},1)}else{doRun()}}if(Module[\"preInit\"]){if(typeof Module[\"preInit\"]==\"function\")Module[\"preInit\"]=[Module[\"preInit\"]];while(Module[\"preInit\"].length>0){Module[\"preInit\"].pop()()}}run();\n\n\n return moduleArg\n}\n\n);\n})();\nexport default NayukiCModule;","import NayukiCModule from \"./NayukiCFFT.mjs\";\n\n(\"use strict\");\n\nvar nayukiCModule = NayukiCModule({});\n\nvar nc_precalc = nayukiCModule.cwrap(\"precalc\", \"number\", [\"number\"]);\n\nvar nc_dispose = nayukiCModule.cwrap(\"dispose\", \"void\", [\"number\"]);\n\nvar nc_transform_radix2_precalc = nayukiCModule.cwrap(\n \"transform_radix2_precalc\",\n \"void\",\n [\"number\", \"number\", \"number\", \"number\"],\n);\n\nvar nc_precalc_f = nayukiCModule.cwrap(\"precalc_f\", \"number\", [\"number\"]);\n\nvar nc_dispose_f = nayukiCModule.cwrap(\"dispose_f\", \"void\", [\"number\"]);\n\nvar nc_transform_radix2_precalc_f = nayukiCModule.cwrap(\n \"transform_radix2_precalc_f\",\n \"void\",\n [\"number\", \"number\", \"number\", \"number\"],\n);\n\nfunction FFTNayukiC(n) {\n this.n = n;\n this.rptr = nayukiCModule._malloc(n * 4 + n * 4);\n this.iptr = this.rptr + n * 4;\n this.rarr = new Float32Array(nayukiCModule.HEAPU8.buffer, this.rptr, n);\n this.iarr = new Float32Array(nayukiCModule.HEAPU8.buffer, this.iptr, n);\n this.tables = nc_precalc_f(n);\n\n this.forward = function (real, imag) {\n this.rarr.set(real);\n this.iarr.set(imag);\n nc_transform_radix2_precalc_f(this.rptr, this.iptr, this.n, this.tables);\n real.set(this.rarr);\n imag.set(this.iarr);\n };\n\n this.dispose = function () {\n nayukiCModule._free(this.rptr);\n nc_dispose_f(this.tables);\n };\n}\n\nexport default FFTNayukiC;\n","import FFTNayukiC from \"./FFT.js\";\r\n\r\nclass NayukiWasmFftWrapperWasm {\r\n constructor(size) {\r\n this.size = size;\r\n this.fftNayuki = new FFTNayukiC(size);\r\n }\r\n\r\n fft(inputArr) {\r\n // it uses the same buffer for input and output\r\n const real = new Float32Array(this.size);\r\n const imag = new Float32Array(this.size);\r\n const outputArr = new Float32Array(this.size * 2);\r\n\r\n for (var i = 0; i < this.size; ++i) {\r\n real[i] = inputArr[i * 2];\r\n imag[i] = inputArr[i * 2 + 1];\r\n }\r\n this.fftNayuki.forward(real, imag); // this does the FFT, it uses the same buffer for input and output\r\n for (var i = 0; i < this.size; ++i) {\r\n outputArr[i * 2] = real[i];\r\n outputArr[i * 2 + 1] = imag[i];\r\n }\r\n return outputArr;\r\n }\r\n}\r\n\r\nexport default NayukiWasmFftWrapperWasm;\r\n","/* Copyright (c) 2012, Jens Nockert <jens@ofmlabs.org>, Jussi Kalliokoski <jussi@ofmlabs.org>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nif (!FFT) {\n var FFT = {};\n}\n\nvoid (function (namespace) {\n \"use strict\";\n\n function butterfly2(output, outputOffset, outputStride, fStride, state, m) {\n var t = state.twiddle;\n\n for (var i = 0; i < m; i++) {\n var s0_r = output[2 * (outputOffset + outputStride * i)],\n s0_i = output[2 * (outputOffset + outputStride * i) + 1];\n var s1_r = output[2 * (outputOffset + outputStride * (i + m))],\n s1_i = output[2 * (outputOffset + outputStride * (i + m)) + 1];\n\n var t1_r = t[2 * (0 + fStride * i)],\n t1_i = t[2 * (0 + fStride * i) + 1];\n\n var v1_r = s1_r * t1_r - s1_i * t1_i,\n v1_i = s1_r * t1_i + s1_i * t1_r;\n\n var r0_r = s0_r + v1_r,\n r0_i = s0_i + v1_i;\n var r1_r = s0_r - v1_r,\n r1_i = s0_i - v1_i;\n\n (output[2 * (outputOffset + outputStride * i)] = r0_r),\n (output[2 * (outputOffset + outputStride * i) + 1] = r0_i);\n (output[2 * (outputOffset + outputStride * (i + m))] = r1_r),\n (output[2 * (outputOffset + outputStride * (i + m)) + 1] = r1_i);\n }\n }\n\n function butterfly3(output, outputOffset, outputStride, fStride, state, m) {\n var t = state.twiddle;\n var m1 = m,\n m2 = 2 * m;\n var fStride1 = fStride,\n fStride2 = 2 * fStride;\n\n var e = t[2 * (0 + fStride * m) + 1];\n\n for (var i = 0; i < m; i++) {\n var s0_r = output[2 * (outputOffset + outputStride * i)],\n s0_i = output[2 * (outputOffset + outputStride * i) + 1];\n\n var s1_r = output[2 * (outputOffset + outputStride * (i + m1))],\n s1_i = output[2 * (outputOffset + outputStride * (i + m1)) + 1];\n var t1_r = t[2 * (0 + fStride1 * i)],\n t1_i = t[2 * (0 + fStride1 * i) + 1];\n var v1_r = s1_r * t1_r - s1_i * t1_i,\n v1_i = s1_r * t1_i + s1_i * t1_r;\n\n var s2_r = output[2 * (outputOffset + outputStride * (i + m2))],\n s2_i = output[2 * (outputOffset + outputStride * (i + m2)) + 1];\n var t2_r = t[2 * (0 + fStride2 * i)],\n t2_i = t[2 * (0 + fStride2 * i) + 1];\n var v2_r = s2_r * t2_r - s2_i * t2_i,\n v2_i = s2_r * t2_i + s2_i * t2_r;\n\n var i0_r = v1_r + v2_r,\n i0_i = v1_i + v2_i;\n\n var r0_r = s0_r + i0_r,\n r0_i = s0_i + i0_i;\n (output[2 * (outputOffset + outputStride * i)] = r0_r),\n (output[2 * (outputOffset + outputStride * i) + 1] = r0_i);\n\n var i1_r = s0_r - i0_r * 0.5;\n var i1_i = s0_i - i0_i * 0.5;\n\n var i2_r = (v1_r - v2_r) * e;\n var i2_i = (v1_i - v2_i) * e;\n\n var r1_r = i1_r - i2_i;\n var r1_i = i1_i + i2_r;\n (output[2 * (outputOffset + outputStride * (i + m1))] = r1_r),\n (output[2 * (outputOffset + outputStride * (i + m1)) + 1] = r1_i);\n\n var r2_r = i1_r + i2_i;\n var r2_i = i1_i - i2_r;\n (output[2 * (outputOffset + outputStride * (i + m2))] = r2_r),\n (output[2 * (outputOffset + outputStride * (i + m2)) + 1] = r2_i);\n }\n }\n\n function butterfly4(output, outputOffset, outputStride, fStride, state, m) {\n var t = state.twiddle;\n var m1 = m,\n m2 = 2 * m,\n m3 = 3 * m;\n var fStride1 = fStride,\n fStride2 = 2 * fStride,\n fStride3 = 3 * fStride;\n\n for (var i = 0; i < m; i++) {\n var s0_r = output[2 * (outputOffset + outputStride * i)],\n s0_i = output[2 * (outputOffset + outputStride * i) + 1];\n\n var s1_r = output[2 * (outputOffset + outputStride * (i + m1))],\n s1_i = output[2 * (outputOffset + outputStride * (i + m1)) + 1];\n var t1_r = t[2 * (0 + fStride1 * i)],\n t1_i = t[2 * (0 + fStride1 * i) + 1];\n var v1_r = s1_r * t1_r - s1_i * t1_i,\n v1_i = s1_r * t1_i + s1_i * t1_r;\n\n var s2_r = output[2 * (outputOffset + outputStride * (i + m2))],\n s2_i = output[2 * (outputOffset + outputStride * (i + m2)) + 1];\n var t2_r = t[2 * (0 + fStride2 * i)],\n t2_i = t[2 * (0 + fStride2 * i) + 1];\n var v2_r = s2_r * t2_r - s2_i * t2_i,\n v2_i = s2_r * t2_i + s2_i * t2_r;\n\n var s3_r = output[2 * (outputOffset + outputStride * (i + m3))],\n s3_i = output[2 * (outputOffset + outputStride * (i + m3)) + 1];\n var t3_r = t[2 * (0 + fStride3 * i)],\n t3_i = t[2 * (0 + fStride3 * i) + 1];\n var v3_r = s3_r * t3_r - s3_i * t3_i,\n v3_i = s3_r * t3_i + s3_i * t3_r;\n\n var i0_r = s0_r + v2_r,\n i0_i = s0_i + v2_i;\n var i1_r = s0_r - v2_r,\n i1_i = s0_i - v2_i;\n var i2_r = v1_r + v3_r,\n i2_i = v1_i + v3_i;\n var i3_r = v1_r - v3_r,\n i3_i = v1_i - v3_i;\n\n var r0_r = i0_r + i2_r,\n r0_i = i0_i + i2_i;\n\n if (state.inverse) {\n var r1_r = i1_r - i3_i;\n var r1_i = i1_i + i3_r;\n } else {\n var r1_r = i1_r + i3_i;\n var r1_i = i1_i - i3_r;\n }\n\n var r2_r = i0_r - i2_r,\n r2_i = i0_i - i2_i;\n\n if (state.inverse) {\n var r3_r = i1_r + i3_i;\n var r3_i = i1_i - i3_r;\n } else {\n var r3_r = i1_r - i3_i;\n var r3_i = i1_i + i3_r;\n }\n\n (output[2 * (outputOffset + outputStride * i)] = r0_r),\n (output[2 * (outputOffset + outputStride * i) + 1] = r0_i);\n (output[2 * (outputOffset + outputStride * (i + m1))] = r1_r),\n (output[2 * (outputOffset + outputStride * (i + m1)) + 1] = r1_i);\n (output[2 * (outputOffset + outputStride * (i + m2))] = r2_r),\n (output[2 * (outputOffset + outputStride * (i + m2)) + 1] = r2_i);\n (output[2 * (outputOffset + outputStride * (i + m3))] = r3_r),\n (output[2 * (outputOffset + outputStride * (i + m3)) + 1] = r3_i);\n }\n }\n\n function butterfly(output, outputOffset, outputStride, fStride, state, m, p) {\n var t = state.twiddle,\n n = state.n,\n scratch = new Float64Array(2 * p);\n\n for (var u = 0; u < m; u++) {\n for (var q1 = 0, k = u; q1 < p; q1++, k += m) {\n var x0_r = output[2 * (outputOffset + outputStride * k)],\n x0_i = output[2 * (outputOffset + outputStride * k) + 1];\n (scratch[2 * q1] = x0_r), (scratch[2 * q1 + 1] = x0_i);\n }\n\n for (var q1 = 0, k = u; q1 < p; q1++, k += m) {\n var tOffset = 0;\n\n var x0_r = scratch[2 * 0],\n x0_i = scratch[2 * 0 + 1];\n (output[2 * (outputOffset + outputStride * k)] = x0_r),\n (output[2 * (outputOffset + outputStride * k) + 1] = x0_i);\n\n for (var q = 1; q < p; q++) {\n tOffset = (tOffset + fStride * k) % n;\n\n var s0_r = output[2 * (outputOffset + outputStride * k)],\n s0_i = output[2 * (outputOffset + outputStride * k) + 1];\n\n var s1_r = scratch[2 * q],\n s1_i = scratch[2 * q + 1];\n var t1_r = t[2 * tOffset],\n t1_i = t[2 * tOffset + 1];\n var v1_r = s1_r * t1_r - s1_i * t1_i,\n v1_i = s1_r * t1_i + s1_i * t1_r;\n\n var r0_r = s0_r + v1_r,\n r0_i = s0_i + v1_i;\n (output[2 * (outputOffset + outputStride * k)] = r0_r),\n (output[2 * (outputOffset + outputStride * k) + 1] = r0_i);\n }\n }\n }\n }\n\n function work(output, outputOffset, outputStride, f, fOffset, fStride, inputStride, factors, state) {\n var p = factors.shift();\n var m = factors.shift();\n\n if (m == 1) {\n for (var i = 0; i < p * m; i++) {\n var x0_r = f[2 * (fOffset + fStride * inputStride * i)],\n x0_i = f[2 * (fOffset + fStride * inputStride * i) + 1];\n (output[2 * (outputOffset + outputStride * i)] = x0_r),\n (output[2 * (outputOffset + outputStride * i) + 1] = x0_i);\n }\n } else {\n for (var i = 0; i < p; i++) {\n work(\n output,\n outputOffset + outputStride * i * m,\n outputStride,\n f,\n fOffset + i * fStride * inputStride,\n fStride * p,\n inputStride,\n factors.slice(),\n state\n );\n }\n }\n\n switch (p) {\n case 2:\n butterfly2(output, outputOffset, outputStride, fStride, state, m);\n break;\n case 3:\n butterfly3(output, outputOffset, outputStride, fStride, state, m);\n break;\n case 4:\n butterfly4(output, outputOffset, outputStride, fStride, state, m);\n break;\n default:\n butterfly(output, outputOffset, outputStride, fStride, state, m, p);\n break;\n }\n }\n\n var complex = function (n, inverse) {\n if (arguments.length < 2) {\n throw new RangeError(\"You didn't pass enough arguments, passed `\" + arguments.length + \"'\");\n }\n\n var n = ~~n,\n inverse = !!inverse;\n\n if (n < 1) {\n throw new RangeError(\"n is outside range, should be positive integer, was `\" + n + \"'\");\n }\n\n var state = {\n n: n,\n inverse: inverse,\n\n factors: [],\n twiddle: new Float64Array(2 * n),\n scratch: new Float64Array(2 * n)\n };\n\n var t = state.twiddle,\n theta = (2 * Math.PI) / n;\n\n for (var i = 0; i < n; i++) {\n if (inverse) {\n var phase = theta * i;\n } else {\n var phase = -theta * i;\n }\n\n t[2 * i] = Math.cos(phase);\n t[2 * i + 1] = Math.sin(phase);\n }\n\n var p = 4,\n v = Math.floor(Math.sqrt(n));\n\n while (n > 1) {\n while (n % p) {\n switch (p) {\n case 4:\n p = 2;\n break;\n case 2:\n p = 3;\n break;\n default:\n p += 2;\n break;\n }\n\n if (p > v) {\n p = n;\n }\n }\n\n n /= p;\n\n state.factors.push(p);\n state.factors.push(n);\n }\n\n this.state = state;\n };\n\n complex.prototype.simple = function (output, input, t) {\n this.process(output, 0, 1, input, 0, 1, t);\n };\n\n complex.prototype.process = function (output, outputOffset, outputStride, input, inputOffset, inputStride, t) {\n var outputStride = ~~outputStride,\n inputStride = ~~inputStride;\n\n var type = t == \"real\" ? t : \"complex\";\n\n if (outputStride < 1) {\n throw new RangeError(\"outputStride is outside range, should be positive integer, was `\" + outputStride + \"'\");\n }\n\n if (inputStride < 1) {\n throw new RangeError(\"inputStride is outside range, should be positive integer, was `\" + inputStride + \"'\");\n }\n\n if (type == \"real\") {\n for (var i = 0; i < this.state.n; i++) {\n var x0_r = input[inputOffset + inputStride * i];\n var x0_i = 0.0;\n\n (this.state.scratch[2 * i] = x0_r), (this.state.scratch[2 * i + 1] = x0_i);\n }\n\n work(output, outputOffset, outputStride, this.state.scratch, 0, 1, 1, this.state.factors.slice(), this.state);\n } else {\n if (input == output) {\n work(this.state.scratch, 0, 1, input, inputOffset, 1, inputStride, this.state.factors.slice(), this.state);\n\n for (var i = 0; i < this.state.n; i++) {\n var x0_r = this.state.scratch[2 * i],\n x0_i = this.state.scratch[2 * i + 1];\n\n (output[2 * (outputOffset + outputStride * i)] = x0_r),\n (output[2 * (outputOffset + outputStride * i) + 1] = x0_i);\n }\n } else {\n work(\n output,\n outputOffset,\n outputStride,\n input,\n inputOffset,\n 1,\n inputStride,\n this.state.factors.slice(),\n this.state\n );\n }\n }\n };\n\n namespace.complex = complex;\n})(FFT);\n\nexport default FFT;\n","import FFT from \"./complex.js\";\r\n\r\nclass NockertFftWrapperJavascript {\r\n constructor(size) {\r\n this.size = size;\r\n this.nockertfft = new FFT.complex(size, false); // 2nd arg is for inverse\r\n }\r\n\r\n fft(inputArr) {\r\n const outputArr = new Float32Array(2 * this.size);\r\n this.nockertfft.simple(outputArr, inputArr, \"complex\");\r\n return outputArr;\r\n }\r\n}\r\n\r\nexport default NockertFftWrapperJavascript;\r\n","// core operations\nlet _n = 0; // order\nlet _bitrev = null; // bit reversal table\nlet _cstb = null; // sin/cos table\n\nfunction init(n) {\n if (n !== 0 && (n & (n - 1)) === 0) {\n _n = n;\n _initArray();\n _makeBitReversalTable();\n _makeCosSinTable();\n } else {\n throw new Error(\"init: radix-2 required\");\n }\n}\n\n// 1D-FFT\nfunction fft1d(re, im) {\n fastFourierTransform(re, im, 1);\n}\n\n// 1D-IFFT\nfunction ifft1d(re, im) {\n let n = 1 / _n;\n fastFourierTransform(re, im, -1);\n for (let i = 0; i < _n; i++) {\n re[i] *= n;\n im[i] *= n;\n }\n}\n\n// 1D-IFFT\nfunction bt1d(re, im) {\n fastFourierTransform(re, im, -1);\n}\n\n// 2D-FFT Not very useful if the number of rows have to be equal to cols\nfunction fft2d(re, im) {\n let tre = [];\n let tim = [];\n let i = 0;\n // x-axis\n for (let y = 0; y < _n; y++) {\n i = y * _n;\n for (let x1 = 0; x1 < _n; x1++) {\n tre[x1] = re[x1 + i];\n tim[x1] = im[x1 + i];\n }\n fft1d(tre, tim);\n for (let x2 = 0; x2 < _n; x2++) {\n re[x2 + i] = tre[x2];\n im[x2 + i] = tim[x2];\n }\n }\n // y-axis\n for (let x = 0; x < _n; x++) {\n for (let y1 = 0; y1 < _n; y1++) {\n i = x + y1 * _n;\n tre[y1] = re[i];\n tim[y1] = im[i];\n }\n fft1d(tre, tim);\n for (let y2 = 0; y2 < _n; y2++) {\n i = x + y2 * _n;\n re[i] = tre[y2];\n im[i] = tim[y2];\n }\n }\n}\n\n// 2D-IFFT\nfunction ifft2d(re, im) {\n let tre = [];\n let tim = [];\n let i = 0;\n // x-axis\n for (let y = 0; y < _n; y++) {\n i = y * _n;\n for (let x1 = 0; x1 < _n; x1++) {\n tre[x1] = re[x1 + i];\n tim[x1] = im[x1 + i];\n }\n ifft1d(tre, tim);\n for (let x2 = 0; x2 < _n; x2++) {\n re[x2 + i] = tre[x2];\n im[x2 + i] = tim[x2];\n }\n }\n // y-axis\n for (let x = 0; x < _n; x++) {\n for (let y1 = 0; y1 < _n; y1++) {\n i = x + y1 * _n;\n tre[y1] = re[i];\n tim[y1] = im[i];\n }\n ifft1d(tre, tim);\n for (let y2 = 0; y2 < _n; y2++) {\n i = x + y2 * _n;\n re[i] = tre[y2];\n im[i] = tim[y2];\n }\n }\n}\n\n// core operation of FFT\nfunction fastFourierTransform(re, im, inv) {\n let d;\n let h;\n let ik;\n let m;\n let tmp;\n let wr;\n let wi;\n let xr;\n let xi;\n let n4 = _n >> 2;\n // bit reversal\n for (let l = 0; l < _n; l++) {\n m = _bitrev[l];\n if (l < m) {\n tmp = re[l];\n re[l] = re[m];\n re[m] = tmp;\n tmp = im[l];\n im[l] = im[m];\n im[m] = tmp;\n }\n }\n // butterfly operation\n for (let k = 1; k < _n; k <<= 1) {\n h = 0;\n d = _n / (k << 1);\n for (let j = 0; j < k; j++) {\n wr = _cstb[h + n4];\n wi = inv * _cstb[h];\n for (let i = j; i < _n; i += k << 1) {\n ik = i + k;\n xr = wr * re[ik] + wi * im[ik];\n xi = wr * im[ik] - wi * re[ik];\n re[ik] = re[i] - xr;\n re[i] += xr;\n im[ik] = im[i] - xi;\n im[i] += xi;\n }\n h += d;\n }\n }\n}\n\n// initialize the array (supports TypedArray)\nfunction _initArray() {\n if (typeof Uint32Array !== \"undefined\") {\n _bitrev = new Uint32Array(_n);\n } else {\n _bitrev = [];\n }\n if (typeof Float64Array !== \"undefined\") {\n _cstb = new Float64Array(_n * 1.25);\n } else {\n _cstb = [];\n }\n}\n\n//function _paddingZero() {\n// // TODO\n//}\n\nfunction _makeBitReversalTable() {\n let i = 0;\n let j = 0;\n let k = 0;\n _bitrev[0] = 0;\n while (++i < _n) {\n k = _n >> 1;\n while (k <= j) {\n j -= k;\n k >>= 1;\n }\n j += k;\n _bitrev[i] = j;\n }\n}\n\n// makes trigonometric function table\nfunction _makeCosSinTable() {\n let n2 = _n >> 1;\n let n4 = _n >> 2;\n let n8 = _n >> 3;\n let n2p4 = n2 + n4;\n let t = Math.sin(Math.PI / _n);\n let dc = 2 * t * t;\n let ds = Math.sqrt(dc * (2 - dc));\n let c = (_cstb[n4] = 1);\n let s = (_cstb[0] = 0);\n t = 2 * dc;\n for (let i = 1; i < n8; i++) {\n c -= dc;\n dc += t * c;\n s += ds;\n ds -= t * s;\n _cstb[i] = s;\n _cstb[n4 - i] = c;\n }\n if (n8 !== 0) {\n _cstb[n8] = Math.sqrt(0.5);\n }\n for (let j = 0; j < n4; j++) {\n _cstb[n2 - j] = _cstb[j];\n }\n for (let k = 0; k < n2p4; k++) {\n _cstb[k + n2] = -_cstb[k];\n }\n}\n\nconst FFT = {\n init,\n fft1d,\n ifft1d,\n fft2d,\n ifft2d,\n fft: fft1d,\n ifft: ifft1d,\n bt: bt1d\n};\n\nexport default FFT;\n","import FFT from \"./fftlib.js\";\r\n\r\nclass MljsWebFftWrapperJavascript {\r\n constructor(size) {\r\n this.size = size;\r\n this.FFT_mljs = FFT;\r\n this.FFT_mljs.init(size);\r\n }\r\n\r\n fft(inputArr) {\r\n const input_real = new Float32Array(this.size);\r\n const input_imag = new Float32Array(this.size);\r\n const outputArr = new Float32Array(2 * this.size);\r\n\r\n for (var i = 0; i < this.size; ++i) {\r\n input_real[i] = inputArr[i * 2];\r\n input_imag[i] = inputArr[i * 2 + 1];\r\n }\r\n\r\n this.FFT_mljs.fft(input_real, input_imag); // performs fft in-place\r\n\r\n for (var i = 0; i < this.size; ++i) {\r\n outputArr[i * 2] = input_real[i];\r\n outputArr[i * 2 + 1] = input_imag[i];\r\n }\r\n return outputArr;\r\n }\r\n}\r\n\r\nexport default MljsWebFftWrapperJavascript;\r\n","// The following SIMD checkers were taken from 'wasm-feature-detect' NPM package:\nasync function relaxedSimd() {\n return await WebAssembly.validate(\n new Uint8Array([\n 0, 97, 115, 109, 1, 0, 0, 0, 1, 5, 1, 96, 0, 1, 123, 3, 2, 1, 0, 10, 15,\n 1, 13, 0, 65, 1, 253, 15, 65, 2, 253, 15, 253, 128, 2, 11,\n ]),\n );\n}\n\nasync function simd() {\n return await WebAssembly.validate(\n new Uint8Array([\n 0, 97, 115, 109, 1, 0, 0, 0, 1, 5, 1, 96, 0, 1, 123, 3, 2, 1, 0, 10, 10,\n 1, 8, 0, 65, 0, 253, 15, 253, 98, 11,\n ]),\n );\n}\n\n// Define the async function to check for Wasm and SIMD support\nasync function checkBrowserCapabilities() {\n let browserName = \"Other\";\n let browserVersion = \"Unknown\";\n let osName = \"Other\";\n let osVersion = \"Unknown\";\n let uad = navigator.userAgentData;\n let ua = navigator.userAgent;\n\n // Check if Edge, Chrome, or Opera (uses User Agent Data API)\n try {\n if (uad) {\n const values = await uad.getHighEntropyValues([\n \"architecture\",\n \"model\",\n \"platform\",\n \"platformVersion\",\n \"uaFullVersion\",\n ]);\n\n const brandInfo = uad.brands.find((brand) =>\n [\"Microsoft Edge\", \"Google Chrome\", \"Opera\"].includes(brand.brand),\n );\n browserName = brandInfo ? brandInfo.brand : \"Other\";\n browserVersion = brandInfo ? `v${brandInfo.version}` : \"Unknown\";\n osName = values.platform ? values.platform : \"Other\";\n osVersion = values.platformVersion\n ? `v${values.platformVersion}`\n : \"Unknown\";\n }\n\n // user agent string parsing for mobile and firefox, safari\n // other browsers included in case mobile\n if (browserName === \"Other\" || osName === \"Other\") {\n const uaArr = ua.split(\" \");\n const uaBrowser = uaArr[uaArr.length - 1];\n const isFirefox = /Firefox/.test(uaBrowser);\n // CriOS is Chrome for iOS and Chrome is Chrome for Android\n const isSafari =\n /Safari/.test(uaBrowser) &&\n !/CriOS/.test(uaBrowser) &&\n !/Chrome/.test(uaBrowser);\n const isChrome = /CriOS/.test(uaBrowser) || /Chrome/.test(uaBrowser);\n const isEdge = /Edg/.test(uaBrowser);\n const isOpera = /OPR/.test(uaBrowser);\n\n const browsers = [\n {\n name: \"Mozilla Firefox\",\n regex: /Firefox\\/(\\d+\\.\\d+)/,\n flag: isFirefox,\n },\n { name: \"Safari\", regex: /Version\\/(\\d+\\.\\d+)/, flag: isSafari },\n {\n name: \"Google Chrome\",\n regex: /CriOS|Chrome\\/(\\d+\\.\\d+)/,\n flag: isChrome,\n },\n { name: \"Microsoft Edge\", regex: /Edg\\/(\\d+\\.\\d+)/, flag: isEdge },\n { name: \"Opera\", regex: /OPR\\/(\\d+\\.\\d+)/, flag: isOpera },\n ];\n\n for (const browser of browsers) {\n if (browser.flag) {\n browserName = browser.name;\n const versionMatch = uaBrowser.match(browser.regex);\n browserVersion = versionMatch ? versionMatch[1] : \"Unknown\";\n break;\n }\n }\n\n const osMatch = ua.match(/\\(([^)]+)\\)/);\n const osDetails = osMatch ? osMatch[1].split(\"; \") : [];\n console.log(osMatch);\n console.log(osDetails);\n\n const windowsVersionMap = {\n \"10.0\": \"10\",\n \"6.3\": \"8.1\",\n \"6.2\": \"8\",\n \"6.1\": \"7\",\n \"6.0\": \"Vista\",\n \"5.2\": \"XP 64-bit\",\n \"5.1\": \"XP\",\n \"5.0\": \"2000\",\n };\n\n const osInfo = [\n {\n name: \"Windows\",\n regex: /Windows NT/,\n transform: (s) => windowsVersionMap[s.split(\" \")[2]],\n index: 0,\n },\n {\n name: \"Mac OS X\",\n regex: /Mac OS X/,\n transform: (s) => s.replace(\"_\", \".\").split(\" \")[3],\n index: 0,\n },\n {\n name: \"Linux\",\n regex: /Linux/,\n transform: () => \"Unknown\", // Precise Linux version can be difficult to determine\n index: 0,\n },\n {\n name: \"Android\",\n regex: /Android/,\n transform: (s) => s.split(\" \")[1],\n index: 0,\n },\n {\n name: \"iOS\",\n regex: /iPhone/,\n transform: (s) => s.split(\" \")[1].replace(\"_\", \".\"),\n index: 0,\n },\n ];\n\n for (const os of osInfo) {\n if (os.regex.test(osDetails[0])) {\n osName = os.name;\n console.log(`osDetails: ${osDetails}`);\n osVersion = os.transform\n ? os.transform(osDetails[1])\n : os.versionMap[osDetails[1].split(\" \")[os.index]];\n break;\n }\n }\n }\n } catch (error) {\n console.error(\"Could not retrieve user agent data\", error);\n }\n return {\n browserName: browserName,\n browserVersion: browserVersion,\n osName: osName,\n osVersion: osVersion,\n wasm: typeof WebAssembly === \"object\",\n relaxedSimd: await relaxedSimd(),\n simd: await simd(),\n };\n}\n\n// Export the function\nexport default checkBrowserCapabilities;\n","\nvar KissFFTModule = (() => {\n var _scriptDir = import.meta.url;\n \n return (\nfunction(moduleArg = {}) {\n\nvar Module=moduleArg;var readyPromiseResolve,readyPromiseReject;Module[\"ready\"]=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject});var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram=\"./this.program\";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=true;var ENVIRONMENT_IS_WORKER=false;var scriptDirectory=\"\";function locateFile(path){if(Module[\"locateFile\"]){return Module[\"locateFile\"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!=\"undefined\"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf(\"blob:\")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,\"\").lastIndexOf(\"/\")+1)}else{scriptDirectory=\"\"}{read_=url=>{var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.responseType=\"arraybuffer\";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,true);xhr.responseType=\"arraybuffer\";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=title=>document.title=title}else{}var out=Module[\"print\"]||console.log.bind(console);var err=Module[\"printErr\"]||console.error.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module[\"arguments\"])arguments_=Module[\"arguments\"];if(Module[\"thisProgram\"])thisProgram=Module[\"thisProgram\"];if(Module[\"quit\"])quit_=Module[\"quit\"];var wasmBinary;if(Module[\"wasmBinary\"])wasmBinary=Module[\"wasmBinary\"];var noExitRuntime=Module[\"noExitRuntime\"]||true;if(typeof WebAssembly!=\"object\"){abort(\"no native wasm support detected\")}var wasmMemory;var wasmExports;var ABORT=false;var EXITSTATUS;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;Module[\"HEAP8\"]=HEAP8=new Int8Array(b);Module[\"HEAP16\"]=HEAP16=new Int16Array(b);Module[\"HEAP32\"]=HEAP32=new Int32Array(b);Module[\"HEAPU8\"]=HEAPU8=new Uint8Array(b);Module[\"HEAPU16\"]=HEAPU16=new Uint16Array(b);Module[\"HEAPU32\"]=HEAPU32=new Uint32Array(b);Module[\"HEAPF32\"]=HEAPF32=new Float32Array(b);Module[\"HEAPF64\"]=HEAPF64=new Float64Array(b)}var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function preRun(){if(Module[\"preRun\"]){if(typeof Module[\"preRun\"]==\"function\")Module[\"preRun\"]=[Module[\"preRun\"]];while(Module[\"preRun\"].length){addOnPreRun(Module[\"preRun\"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function postRun(){if(Module[\"postRun\"]){if(typeof Module[\"postRun\"]==\"function\")Module[\"postRun\"]=[Module[\"postRun\"]];while(Module[\"postRun\"].length){addOnPostRun(Module[\"postRun\"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){if(Module[\"onAbort\"]){Module[\"onAbort\"](what)}what=\"Aborted(\"+what+\")\";err(what);ABORT=true;EXITSTATUS=1;what+=\". Build with -sASSERTIONS for more info.\";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix=\"data:application/octet-stream;base64,\";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}var wasmBinaryFile;wasmBinaryFile=\"data:application/octet-stream;base64,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\";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}var binary=tryParseAsDataURI(file);if(binary){return binary}if(readBinary){return readBinary(file)}throw\"sync fetching of the wasm failed: you can preload it to Module['wasmBinary'] manually, or emcc.py will do that for you when generating HTML (but not JS)\"}function instantiateSync(file,info){var module;var binary=getBinarySync(file);module=new WebAssembly.Module(binary);var instance=new WebAssembly.Instance(module,info);return[instance,module]}function createWasm(){var info={\"a\":wasmImports};function receiveInstance(instance,module){var exports=instance.exports;wasmExports=exports;wasmMemory=wasmExports[\"b\"];updateMemoryViews();wasmTable=wasmExports[\"i\"];addOnInit(wasmExports[\"c\"]);removeRunDependency(\"wasm-instantiate\");return exports}addRunDependency(\"wasm-instantiate\");if(Module[\"instantiateWasm\"]){try{return Module[\"instantiateWasm\"](info,receiveInstance)}catch(e){err(\"Module.instantiateWasm callback failed with error: \"+e);readyPromiseReject(e)}}var result=instantiateSync(wasmBinaryFile,info);return receiveInstance(result[0])}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var abortOnCannotGrowMemory=requestedSize=>{abort(\"OOM\")};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;abortOnCannotGrowMemory(requestedSize)};function getCFunc(ident){var func=Module[\"_\"+ident];return func}var writeArrayToMemory=(array,buffer)=>{HEAP8.set(array,buffer)};var lengthBytesUTF8=str=>{var len=0;for(var i=0;i<str.length;++i){var c=str.charCodeAt(i);if(c<=127){len++}else if(c<=2047){len+=2}else if(c>=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx};var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);var stringToUTF8OnStack=str=>{var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8(str,ret,size);return ret};var UTF8Decoder=typeof TextDecoder!=\"undefined\"?new TextDecoder(\"utf8\"):undefined;var UTF8ArrayToString=(heapOrArray,idx,maxBytesToRead)=>{var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str=\"\";while(idx<endPtr){var u0=heapOrArray[idx++];if(!(u0&128)){str+=String.fromCharCode(u0);continue}var u1=heapOrArray[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}var u2=heapOrArray[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u0=(u0&7)<<18|u1<<12|u2<<6|heapOrArray[idx++]&63}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}return str};var UTF8ToString=(ptr,maxBytesToRead)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):\"\";var ccall=function(ident,returnType,argTypes,args,opts){var toC={\"string\":str=>{var ret=0;if(str!==null&&str!==undefined&&str!==0){ret=stringToUTF8OnStack(str)}return ret},\"array\":arr=>{var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType===\"string\"){return UTF8ToString(ret)}if(returnType===\"boolean\")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);function onDone(ret){if(stack!==0)stackRestore(stack);return convertReturnValue(ret)}ret=onDone(ret);return ret};var cwrap=function(ident,returnType,argTypes,opts){var numericArgs=!argTypes||argTypes.every(type=>type===\"number\"||type===\"boolean\");var numericRet=returnType!==\"string\";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return function(){return ccall(ident,returnType,argTypes,arguments,opts)}};var wasmImports={a:_emscripten_resize_heap};var asm=createWasm();var ___wasm_call_ctors=asm[\"c\"];var _kiss_fft_free=Module[\"_kiss_fft_free\"]=asm[\"d\"];var _free=Module[\"_free\"]=asm[\"e\"];var _kiss_fft_alloc=Module[\"_kiss_fft_alloc\"]=asm[\"f\"];var _malloc=Module[\"_malloc\"]=asm[\"g\"];var _kiss_fft=Module[\"_kiss_fft\"]=asm[\"h\"];var ___errno_location=asm[\"__errno_location\"];var stackSave=asm[\"j\"];var stackRestore=asm[\"k\"];var stackAlloc=asm[\"l\"];function intArrayFromBase64(s){try{var decoded=atob(s);var bytes=new Uint8Array(decoded.length);for(var i=0;i<decoded.length;++i){bytes[i]=decoded.charCodeAt(i)}return bytes}catch(_){throw new Error(\"Converting base64 string to bytes failed.\")}}function tryParseAsDataURI(filename){if(!isDataURI(filename)){return}return intArrayFromBase64(filename.slice(dataURIPrefix.length))}Module[\"ccall\"]=ccall;Module[\"cwrap\"]=cwrap;var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(){if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module[\"calledRun\"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);if(Module[\"onRuntimeInitialized\"])Module[\"onRuntimeInitialized\"]();postRun()}if(Module[\"setStatus\"]){Module[\"setStatus\"](\"Running...\");setTimeout(function(){setTimeout(function(){Module[\"setStatus\"](\"\")},1);doRun()},1)}else{doRun()}}if(Module[\"preInit\"]){if(typeof Module[\"preInit\"]==\"function\")Module[\"preInit\"]=[Module[\"preInit\"]];while(Module[\"preInit\"].length>0){Module[\"preInit\"].pop()()}}run();\n\n\n return moduleArg\n}\n\n);\n})();\nexport default KissFFTModule;","import KissFFTModule from \"./KissFFT.mjs\";\n\n(\"use strict\");\n\nvar kissFFTModule = KissFFTModule({});\n\nvar kiss_fft_alloc = kissFFTModule.cwrap(\"kiss_fft_alloc\", \"number\", [\n \"number\",\n \"number\",\n \"number\",\n \"number\",\n]);\n\nvar kiss_fft = kissFFTModule.cwrap(\"kiss_fft\", \"void\", [\n \"number\",\n \"number\",\n \"number\",\n]);\n\nvar kiss_fft_free = kissFFTModule.cwrap(\"kiss_fft_free\", \"void\", [\"number\"]);\n\nclass KissFftModifiedWrapperWasm {\n constructor(size) {\n this.size = size;\n this.fcfg = kiss_fft_alloc(size, false);\n this.icfg = kiss_fft_alloc(size, true);\n\n this.inptr = kissFFTModule._malloc(size * 8 + size * 8);\n\n this.cin = new Float32Array(\n kissFFTModule.HEAPU8.buffer,\n this.inptr,\n size * 2,\n );\n }\n\n fft = function (inputArray) {\n // TODO: figure out how to move this into the constructor without breaking things (unit tests will catch it)\n const outptr = kissFFTModule._malloc(this.size * 8);\n\n const cout = new Float32Array(\n kissFFTModule.HEAPU8.buffer,\n outptr,\n this.size * 2,\n );\n\n this.cin.set(inputArray);\n\n kiss_fft(this.fcfg, this.inptr, outptr);\n\n // we need to free the memory of outptr before we return, so we need this too\n let outputArray = new Float32Array(this.size * 2);\n outputArray.set(cout);\n\n kissFFTModule._free(outptr);\n\n return outputArray;\n };\n\n dispose() {\n kiss_fft_free(this.fcfg);\n kiss_fft_free(this.icfg);\n kissFFTModule._free(this.inptr);\n }\n}\n\nexport default KissFftModifiedWrapperWasm;\n","\"use strict\";\n\n/* Modification Notes\n- Removing the inv part increased it by 3% or so\n- Simplifying transform hurt because i was repeating the same math\n- getting rid of the wrapper imrpoved it by like 1%\n*/\n\nfunction IndutnyModifiedFftWrapperJavascript(size) {\n this.size = size;\n\n this._csize = size << 1;\n\n var table = new Array(this.size * 2);\n for (var i = 0; i < table.length; i += 2) {\n const angle = (Math.PI * i) / this.size;\n table[i] = Math.cos(angle);\n table[i + 1] = -Math.sin(angle);\n }\n this.table = table;\n\n // Find size's power of two\n var power = 0;\n for (var t = 1; this.size > t; t <<= 1) power++;\n\n // Calculate initial step's width, either 4 or 8 depending on the fftsize\n this._width = power % 2 === 0 ? power - 1 : power;\n\n // Pre-compute bit-reversal patterns\n this._bitrev = new Array(1 << this._width);\n for (var j = 0; j < this._bitrev.length; j++) {\n this._bitrev[j] = 0;\n for (var shift = 0; shift < this._width; shift += 2) {\n var revShift = this._width - shift - 2;\n this._bitrev[j] |= ((j >>> shift) & 3) << revShift;\n }\n }\n\n this._data = null;\n}\n\n// FFT\nIndutnyModifiedFftWrapperJavascript.prototype.fft = function fft(data) {\n this._data = data;\n this._out = new Float32Array(2 * this.size);\n var size = this._csize;\n\n // Initial step (permute and transform)\n var step = 1 << this._width;\n var len = (size / step) << 1;\n\n var outOff;\n var t;\n var bitrev = this._bitrev;\n // len is either 4 or 8, and both are used for the common fft sizes\n if (len === 4) {\n for (outOff = 0, t = 0; outOff < size; outOff += len, t++) {\n const off = bitrev[t];\n this._singleTransform2(outOff, off, step);\n }\n } else {\n for (outOff = 0, t = 0; outOff < size; outOff += len, t++) {\n const off = bitrev[t];\n this._singleTransform4(outOff, off, step);\n }\n }\n\n // Loop through steps in decreasing order\n for (step >>= 2; step >= 2; step >>= 2) {\n len = (size / step) << 1;\n var quarterLen = len >>> 2;\n\n // Loop through offsets in the data\n for (outOff = 0; outOff < size; outOff += len) {\n // Full case\n var limit = outOff + quarterLen;\n for (var i = outOff, k = 0; i < limit; i += 2, k += step) {\n const A = i;\n const B = A + quarterLen;\n const C = B + quarterLen;\n const D = C + quarterLen;\n\n // Original values\n const Ar = this._out[A];\n const Ai = this._out[A + 1];\n const Br = this._out[B];\n const Bi = this._out[B + 1];\n const Cr = this._out[C];\n const Ci = this._out[C + 1];\n const Dr = this._out[D];\n const Di = this._out[D + 1];\n\n // Middle values\n const MAr = Ar;\n const MAi = Ai;\n\n const tableBr = this.table[k];\n const tableBi = this.table[k + 1];\n const MBr = Br * tableBr - Bi * tableBi;\n const MBi = Br * tableBi + Bi * tableBr;\n\n const tableCr = this.table[2 * k];\n const tableCi = this.table[2 * k + 1];\n const MCr = Cr * tableCr - Ci * tableCi;\n const MCi = Cr * tableCi + Ci * tableCr;\n\n const tableDr = this.table[3 * k];\n const tableDi = this.table[3 * k + 1];\n const MDr = Dr * tableDr - Di * tableDi;\n const MDi = Dr * tableDi + Di * tableDr;\n\n // Pre-Final values\n const T0r = MAr + MCr;\n const T0i = MAi + MCi;\n const T1r = MAr - MCr;\n const T1i = MAi - MCi;\n const T2r = MBr + MDr;\n const T2i = MBi + MDi;\n const T3r = MBr - MDr;\n const T3i = MBi - MDi;\n\n this._out[A] = T0r + T2r;\n this._out[A + 1] = T0i + T2i;\n this._out[B] = T1r + T3i;\n this._out[B + 1] = T1i - T3r;\n this._out[C] = T0r - T2r;\n this._out[C + 1] = T0i - T2i;\n this._out[D] = T1r - T3i;\n this._out[D + 1] = T1i + T3r;\n }\n }\n }\n\n return this._out;\n};\n\n// radix-2 (called for len=4)\nIndutnyModifiedFftWrapperJavascript.prototype._singleTransform2 =\n function _singleTransform2(outOff, off, step) {\n const evenR = this._data[off];\n const evenI = this._data[off + 1];\n const oddR = this._data[off + step];\n const oddI = this._data[off + step + 1];\n\n this._out[outOff] = evenR + oddR;\n this._out[outOff + 1] = evenI + oddI;\n this._out[outOff + 2] = evenR - oddR;\n this._out[outOff + 3] = evenI - oddI;\n };\n\n// radix-4 (called for len=8)\nIndutnyModifiedFftWrapperJavascript.prototype._singleTransform4 =\n function _singleTransform4(outOff, off, step) {\n const step2 = step * 2;\n const step3 = step * 3;\n\n const Ar = this._data[off];\n const Ai = this._data[off + 1];\n const Br = this._data[off + step];\n const Bi = this._data[off + step + 1];\n const Cr = this._data[off + step2];\n const Ci = this._data[off + step2 + 1];\n const Dr = this._data[off + step3];\n const Di = this._data[off + step3 + 1];\n\n const T0r = Ar + Cr;\n const T0i = Ai + Ci;\n const T1r = Ar - Cr;\n const T1i = Ai - Ci;\n const T2r = Br + Dr;\n const T2i = Bi + Di;\n const T3r = Br - Dr;\n const T3i = Bi - Di;\n\n this._out[outOff] = T0r + T2r;\n this._out[outOff + 1] = T0i + T2i;\n this._out[outOff + 2] = T1r + T3i;\n this._out[outOff + 3] = T1i - T3r;\n this._out[outOff + 4] = T0r - T2r;\n this._out[outOff + 5] = T0i - T2i;\n this._out[outOff + 6] = T1r - T3i;\n this._out[outOff + 7] = T1i + T3r;\n };\n\nexport default IndutnyModifiedFftWrapperJavascript;\n","import KissFftWrapperWasm from \"./kissfft/webfftWrapper.js\";\nimport IndutnyFftWrapperJavascript from \"./indutny/webfftWrapper.js\";\n//import DntjWebFftWrapperJavascript from \"./dntj/webfftWrapper.js\";\nimport CrossFftWrapperWasm from \"./cross/webfftWrapper.js\";\nimport NayukiFftWrapperJavascript from \"./nayuki/webfftWrapper.js\";\nimport NayukiWasmFftWrapperWasm from \"./nayukic/webfftWrapper.js\";\nimport NockertFftWrapperJavascript from \"./nockert/webfftWrapper.js\";\nimport MljsWebFftWrapperJavascript from \"./mljs/webfftWrapper.js\";\n//import ViljaFftWrapperWasm from \"./kissfftviljaNOTFINISHED/webfftWrapper.js\";\nimport checkBrowserCapabilities from \"./utils/checkCapabilities.js\";\nimport KissFftModifiedWrapperWasm from \"./kissfftmodified/webfftWrapper.js\";\nimport IndutnyModifiedFftWrapperJavascript from \"./indutnymodified/fft.js\";\n\nconst validSizes = [\n 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 16384,\n 32768, 65536, 131072,\n];\n\nclass webfft {\n constructor(size = 128, subLibrary = \"indutnyJavascript\", useProfile = true) {\n if (!validSizes.includes(size)) {\n throw new Error(\"Size must be a power of 2 between 4 and 131072\");\n }\n this.size = size;\n this.outputArr = new Float32Array(2 * size);\n this.subLibrary = subLibrary;\n this.fftLibrary = undefined;\n const profile = this.getCurrentProfile();\n if (profile && useProfile) {\n this.setSubLibrary(profile.fastestSubLibrary);\n } else {\n this.setSubLibrary(subLibrary);\n }\n }\n\n availableSubLibraries() {\n return [\n \"kissWasm\",\n \"indutnyModifiedJavascript\",\n \"indutnyJavascript\",\n \"crossWasm\",\n \"mljsJavascript\",\n \"nockertJavascript\",\n \"nayuki3Wasm\",\n \"nayukiJavascript\",\n //\"dntjJavascript\", // need to figure out the precise scale factor before we can use this one, mainly due to unit tests\n \"kissfftmodifiedWasm\", // currently doesnt perform any better\n //\"viljaWasm\"\n ];\n }\n\n // A subset of the libraries known to be quickest, and removing ones that are too similar to others\n availableSubLibrariesQuick() {\n return [\"kissWasm\", \"indutnyModifiedJavascript\"];\n }\n\n getCurrentProfile() {\n // check if local storage is available\n if (typeof localStorage === \"undefined\") {\n return undefined;\n }\n if (!localStorage.getItem(\"webfftProfile\")) {\n return undefined; // No profile\n }\n return JSON.parse(localStorage.getItem(\"webfftProfile\"));\n }\n\n setSubLibrary(subLibrary) {\n switch (subLibrary) {\n case \"nayukiJavascript\":\n this.fftLibrary = new NayukiFftWrapperJavascript(this.size);\n break;\n case \"nayuki3Wasm\":\n this.fftLibrary = new NayukiWasmFftWrapperWasm(this.size);\n break;\n case \"kissWasm\":\n this.fftLibrary = new KissFftWrapperWasm(this.size);\n break;\n case \"crossWasm\":\n this.fftLibrary = new CrossFftWrapperWasm(this.size);\n if (this.size > 16384)\n this.fftLibrary = new IndutnyFftWrapperJavascript(this.size); // Cross throws \"memory access out of bounds\" for large sizes\\\n break;\n case \"nockertJavascript\":\n this.fftLibrary = new NockertFftWrapperJavascript(this.size);\n break;\n //case \"dntjJavascript\":\n // this.fftLibrary = new DntjWebFftWrapperJavascript(this.size);\n // break;\n case \"indutnyJavascript\":\n this.fftLibrary = new IndutnyFftWrapperJavascript(this.size);\n break;\n case \"mljsJavascript\":\n this.fftLibrary = new MljsWebFftWrapperJavascript(this.size);\n break;\n case \"kissfftmodifiedWasm\":\n this.fftLibrary = new KissFftModifiedWrapperWasm(this.size);\n break;\n //case \"viljaWasm\":\n // this.fftLibrary = new ViljaFftWrapperWasm(this.size);\n case \"indutnyModifiedJavascript\":\n this.fftLibrary = new IndutnyModifiedFftWrapperJavascript(this.size);\n break;\n default:\n //this.fftLibrary = new IndutnyFftWrapperJavascript(this.size);\n throw new Error(\"Invalid sublibrary\");\n }\n }\n\n fft(inputArr) {\n if (inputArr.length !== 2 * this.size) {\n throw new Error(\"Input array length must be == 2 * size\");\n }\n this.outputArr = this.fftLibrary.fft(inputArr);\n return this.outputArr;\n }\n\n // convinience function for people who want to use real-valued input.\n // note that you still have to give it a size that is 2x your real-valued input length!!\n // it doesn't actually speed it up by 2x\n // output is complex but the lenght of inputArr because the negative freqs are removed\n fftr(inputArr) {\n var { outputArr, fftLibrary, size } = this;\n if (inputArr.length !== size) {\n throw new Error(\"Input array length must be == size\");\n }\n const inputArrComplex = new Float32Array(2 * size);\n inputArrComplex.fill(0);\n for (let i = 0; i < size; i++) {\n inputArrComplex[2 * i] = inputArr[i];\n }\n outputArr = fftLibrary.fft(inputArrComplex);\n return outputArr.slice(size, size * 2);\n }\n\n // takes in an array of arrays each of length 2*size. the outter array length must also be a power of two. only supports complex\n fft2d(inputArray) {\n const innerLen = inputArray[0].length / 2;\n const outterLen = inputArray.length;\n\n if (innerLen !== this.size) {\n throw new Error(\"Inner array length must be == 2 * size\");\n }\n if (!validSizes.includes(outterLen)) {\n throw new Error(\n \"Outter array length must be a power of 2 between 4 and 131072\",\n );\n }\n\n let intermediateArray = [];\n for (let i = 0; i < outterLen; i++) {\n this.outputArr = this.fft(inputArray[i]);\n intermediateArray.push(this.outputArr);\n }\n\n // change the sublibs fftsize to the outter\n this.dispose();\n this.size = outterLen;\n this.setSubLibrary(this.subLibrary); // this should reinitialize the sublib with the new size\n\n // normally at these point we would transpose the 2d array, but with javascript its easier to just incorporate it into the next step when we pull elements\n let finalArray = [];\n for (let i = 0; i < innerLen; i++) {\n const newArray = new Float32Array(2 * outterLen);\n newArray.fill(0);\n for (let j = 0; j < outterLen; j++) {\n newArray[2 * j] = intermediateArray[j][2 * i];\n newArray[2 * j + 1] = intermediateArray[j][2 * i + 1];\n }\n let temparray = new Float32Array(2 * outterLen);\n temparray = this.fft(newArray);\n finalArray.push(temparray);\n }\n\n // Now do a final transpose\n let outputArray = [];\n for (let i = 0; i < outterLen; i++) {\n let newArray = new Float32Array(2 * innerLen);\n for (let j = 0; j < innerLen; j++) {\n newArray[2 * j] = finalArray[j][2 * i];\n newArray[2 * j + 1] = finalArray[j][2 * i + 1];\n }\n outputArray.push(newArray);\n }\n\n // change back to original size\n this.dispose();\n this.size = innerLen;\n this.setSubLibrary(this.subLibrary); // this should reinitialize the sublib to the original size\n\n return outputArray;\n }\n\n profile(duration = 1, refresh = true, quick = false) {\n if (!refresh && this.getCurrentProfile()) {\n return this.getCurrentProfile();\n }\n const totalStart = performance.now();\n let subLibraries;\n if (quick) {\n subLibraries = this.availableSubLibrariesQuick();\n } else {\n subLibraries = this.availableSubLibraries();\n }\n let ffsPerSecond = [];\n const secondsPerRun = duration / subLibraries.length / 2; // split in half because of warmup\n for (let i = 0; i < subLibraries.length; i++) {\n this.setSubLibrary(subLibraries[i]);\n\n // Create input array\n const ci = new Float32Array(2 * this.size);\n for (let j = 0; j < this.size; j++) {\n ci[2 * j] = Math.random() - 0.5;\n ci[2 * j + 1] = Math.random() - 0.5;\n }\n\n // Warmup\n let start = performance.now();\n while ((performance.now() - start) / 1e3 < secondsPerRun) {\n const co = this.fft(ci);\n }\n\n // Benchmark\n start = performance.now();\n let numFfts = 0;\n while ((performance.now() - start) / 1e3 < secondsPerRun) {\n const co = this.fft(ci);\n numFfts++;\n }\n ffsPerSecond.push((1e3 * numFfts) / (performance.now() - start));\n\n this.dispose();\n }\n const totalElapsed = (performance.now() - totalStart) / 1e3;\n\n // Update current FFT method\n let argmax = ffsPerSecond.indexOf(Math.max(...ffsPerSecond));\n\n const profileObj = {\n fftsPerSecond: ffsPerSecond,\n subLibraries: subLibraries,\n totalElapsed: totalElapsed,\n fastestSubLibrary: subLibraries[argmax],\n };\n\n console.log(\"Setting sublibrary to\", profileObj.fastestSubLibrary);\n this.setSubLibrary(profileObj.fastestSubLibrary);\n if (typeof localStorage !== \"undefined\") {\n localStorage.setItem(\"webfftProfile\", JSON.stringify(profileObj));\n }\n return profileObj;\n }\n\n async checkBrowserCapabilities() {\n return await checkBrowserCapabilities();\n }\n\n dispose() {\n if (this.fftLibrary && this.fftLibrary.dispose !== undefined) {\n this.fftLibrary.dispose();\n }\n }\n}\n\nexport default webfft;\n","import WebFFT from 'webfft';\n\nexport class FFTExecutor {\n private readonly EPS = 1e-20;\n private readonly INV_LN10 = 1 / Math.LN10;\n\n private readonly fftSize: number;\n private readonly fft: WebFFT;\n\n private readonly complexIn: Float32Array;\n private readonly spectrum: Float32Array;\n\n constructor(fftSize: number) {\n if ((fftSize & (fftSize - 1)) !== 0) {\n throw new Error('FFT size must be power of two');\n }\n\n this.fftSize = fftSize;\n this.fft = new WebFFT(fftSize);\n const benchmark = this.fft.profile(0.5);\n const backend = benchmark.fastestSubLibrary;\n this.fft.setSubLibrary(backend);\n\n this.complexIn = new Float32Array(fftSize * 2);\n this.spectrum = new Float32Array(fftSize / 2 + 1);\n }\n\n size(): number {\n return this.fftSize;\n }\n\n compute(input: Float32Array, minDb: number, maxDb: number): Float32Array {\n const N = this.fftSize;\n const cin = this.complexIn;\n\n for (let i = 0; i < N; i++) {\n const j = i << 1;\n cin[j] = input[i];\n cin[j + 1] = 0;\n }\n\n const out = this.fft.fft(cin);\n const spec = this.spectrum;\n\n const n = spec.length;\n const invRange = 1 / (maxDb - minDb);\n const eps = this.EPS;\n const invLn10 = this.INV_LN10;\n\n for (let i = 0; i < n; i++) {\n const j = i << 1;\n const re = out[j];\n const im = out[j + 1];\n const p = re * re + im * im + eps;\n\n const v = (10 * Math.log(p) * invLn10 - minDb) * invRange;\n spec[i] = v < 0 ? 0 : v > 1 ? 1 : v;\n }\n\n return spec;\n }\n\n dispose() {\n // noop\n }\n}\n","import { FFTExecutor } from '../dsp/fft';\nimport { WindowFunctionType } from '../dsp/window';\n\nexport interface SpectrogramConfig {\n // Sample rate of the input data in Hz\n sampleRate: number;\n // Size of the analysis window in samples\n windowSize: number;\n // Number of samples to overlap (e.g., 512).\n overlap: number;\n // Optional, defaults to next power of 2 >= windowSize\n fftSize?: number;\n // Type of window function to apply\n windowType: WindowFunctionType;\n\n minDb: number;\n maxDb: number;\n\n // Optional, speccify a FFT executor instance for reuse\n fftExecutor?: FFTExecutor;\n}\n\nexport type SpectrogramData = Float32Array | Float64Array;\nexport type TimestampedData = Array<[number, number]>; // [timestamp, value]\n\nexport class SpectrogramModel {\n config: SpectrogramConfig;\n data: SpectrogramData | null = null;\n\n showRealTimeScale: boolean = false;\n startTime: number = 0;\n\n constructor(config: SpectrogramConfig) {\n this.config = config;\n }\n\n setData(data: SpectrogramData | TimestampedData) {\n const isTimestamped = this.isTimestamped(data);\n this.showRealTimeScale = isTimestamped;\n\n if (isTimestamped) {\n if (data.length === 0) {\n this.data = new Float32Array(0);\n return;\n }\n this.startTime = data[0][0];\n const buffer = new Float32Array(data.length);\n for (let i = 0; i < data.length; i++) {\n buffer[i] = data[i][1];\n }\n this.data = buffer;\n } else {\n this.data = data;\n this.startTime = 0;\n }\n }\n\n private isTimestamped(data: unknown): data is TimestampedData {\n return Array.isArray(data) && data.length > 0 && Array.isArray(data[0]);\n }\n\n updateConfig(newConfig: Partial<SpectrogramConfig>) {\n this.config = { ...this.config, ...newConfig };\n }\n\n getDuration(): number {\n return this.data ? this.data.length / this.config.sampleRate : 0;\n }\n}\n","export type WindowFunctionType = 'hann' | 'hamming' | 'blackman' | 'rectangular';\n\nexport const createWindow = (size: number, type: WindowFunctionType): Float32Array => {\n const window = new Float32Array(size);\n\n if (type === 'rectangular') {\n return window.fill(1);\n }\n\n const TWO_PI = 2 * Math.PI;\n const denom = size - 1;\n\n switch (type) {\n case 'hann':\n for (let i = 0; i < size; i++) {\n window[i] = 0.5 * (1 - Math.cos((TWO_PI * i) / denom));\n }\n break;\n case 'hamming':\n for (let i = 0; i < size; i++) {\n window[i] = 0.54 - 0.46 * Math.cos((TWO_PI * i) / denom);\n }\n break;\n case 'blackman':\n for (let i = 0; i < size; i++) {\n const angle = (TWO_PI * i) / denom;\n window[i] = 0.42 - 0.5 * Math.cos(angle) + 0.08 * Math.cos(2 * angle);\n }\n break;\n }\n\n return window;\n};\n","import { FFTExecutor } from '../dsp/fft';\nimport { createWindow } from '../dsp/window';\nimport { SpectrogramConfig, SpectrogramData } from './SpectrogramModel';\n\nexport class DataChunk {\n public id: string;\n public startTime: number;\n public endTime: number;\n public startIndex: number;\n public endIndex: number;\n\n public image: ImageBitmap | null = null;\n public isProcessing: boolean = false;\n\n constructor(id: string, startIdx: number, endIdx: number, sampleRate: number) {\n this.id = id;\n this.startIndex = startIdx;\n this.endIndex = endIdx;\n this.startTime = startIdx / sampleRate;\n this.endTime = endIdx / sampleRate;\n }\n}\n\nexport class ChunkProcessor {\n private fft: FFTExecutor;\n private windowBuffer: Float32Array;\n private inputBuf: Float32Array;\n\n constructor(config: SpectrogramConfig) {\n let fftSize;\n if (!config.fftExecutor) {\n fftSize = config.fftSize ?? 1024;\n this.fft = new FFTExecutor(fftSize);\n } else {\n fftSize = config.fftExecutor.size();\n this.fft = config.fftExecutor;\n }\n this.windowBuffer = createWindow(config.windowSize, config.windowType);\n this.inputBuf = new Float32Array(fftSize);\n }\n\n process(\n data: SpectrogramData,\n startIdx: number,\n endIdx: number,\n config: SpectrogramConfig,\n colormapToRgb: (normalizedVal: number) => [number, number, number]\n ): ImageData {\n const { windowSize, minDb, maxDb, overlap } = config;\n const hopSize = Math.max(1, windowSize - overlap);\n const fftSize = this.fft.size();\n\n const numHops = Math.ceil((endIdx - startIdx) / hopSize);\n const width = numHops;\n const height = (fftSize >> 1) + 1;\n\n if (width <= 0) {\n return new ImageData(1, 1);\n }\n\n const imgData = new ImageData(width, height);\n const pixels = imgData.data;\n const inputBuf = this.inputBuf;\n const windowBuf = this.windowBuffer;\n\n let dcSum = 0;\n let validCount = 0;\n for (let i = 0; i < windowSize; i++) {\n const idx = startIdx + i;\n if (idx < data.length) {\n dcSum += data[idx];\n validCount++;\n }\n }\n\n for (let x = 0; x < width; x++) {\n const signalStart = startIdx + x * hopSize;\n const mean = validCount > 0 ? dcSum / validCount : 0;\n\n const end = Math.min(windowSize, data.length - signalStart);\n let i = 0;\n for (; i < end; i++) {\n inputBuf[i] = (data[signalStart + i] - mean) * windowBuf[i];\n }\n for (; i < fftSize; i++) {\n inputBuf[i] = 0;\n }\n\n const mags = this.fft.compute(inputBuf, minDb, maxDb);\n\n for (let y = 0; y < height; y++) {\n const val = mags[y];\n const rgb = colormapToRgb(val);\n const row = height - 1 - y;\n const idx = (row * width + x) * 4;\n pixels[idx] = rgb[0];\n pixels[idx + 1] = rgb[1];\n pixels[idx + 2] = rgb[2];\n pixels[idx + 3] = 255;\n }\n\n if (x + 1 < width) {\n for (let k = 0; k < hopSize; k++) {\n const outIdx = signalStart + k;\n if (outIdx < data.length) {\n dcSum -= data[outIdx];\n validCount--;\n }\n }\n\n const nextStart = signalStart + windowSize;\n for (let k = 0; k < hopSize; k++) {\n const inIdx = nextStart + k;\n if (inIdx < data.length) {\n dcSum += data[inIdx];\n validCount++;\n }\n }\n }\n }\n\n return imgData;\n }\n\n dispose() {\n this.fft.dispose();\n }\n}\n","import { SpectrogramModel } from '../core/SpectrogramModel';\n\nexport class AxisRenderer {\n private model: SpectrogramModel;\n\n constructor(model: SpectrogramModel) {\n this.model = model;\n }\n\n draw(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n timeRange: [number, number],\n freqRange: [number, number],\n margins: { left: number; bottom: number; top: number; right: number }\n ) {\n // Save context state\n ctx.save();\n\n // Style settings\n ctx.strokeStyle = '#464646';\n ctx.fillStyle = '#252525';\n ctx.font = '11px monospace';\n ctx.textBaseline = 'top';\n ctx.lineWidth = 1;\n\n const [tStart, tEnd] = timeRange;\n const [fMin, fMax] = freqRange;\n const duration = tEnd - tStart;\n const { left, bottom, top, right } = margins;\n\n const plotX = left;\n const plotY = top;\n const plotW = width - left - right;\n const plotH = height - bottom - top;\n\n if (duration <= 0) {\n ctx.restore();\n return;\n }\n\n // Draw Axis Lines\n // X-Axis line (at bottom of plot)\n ctx.beginPath();\n const bottomY = plotY + plotH;\n ctx.moveTo(left, bottomY);\n ctx.lineTo(left + plotW, bottomY);\n ctx.stroke();\n\n // Y-Axis line (at left of plot)\n ctx.beginPath();\n ctx.moveTo(left, plotY);\n ctx.lineTo(left, bottomY);\n ctx.stroke();\n\n // Time Axis (X): draw 5-10 ticks\n const numTicksX = Math.max(3, Math.floor(plotW / 100));\n const stepX = duration / numTicksX;\n\n const startTimeStamp = this.model.startTime;\n\n for (let i = 0; i <= numTicksX; i++) {\n const timeRel = tStart + i * stepX;\n // Project relative to Plot Area\n const x = plotX + ((timeRel - tStart) / duration) * plotW;\n\n if (x < plotX || x > plotX + plotW) {\n continue;\n }\n\n // Draw Tick (extending down from axis line)\n ctx.beginPath();\n ctx.moveTo(x, bottomY);\n ctx.lineTo(x, bottomY + 5);\n ctx.stroke();\n\n // Draw Label\n const totalSeconds = startTimeStamp + timeRel * 1000;\n let label = '';\n if (this.model.showRealTimeScale) {\n const date = new Date(totalSeconds);\n const hh = date.getHours().toString().padStart(2, '0');\n const mm = date.getMinutes().toString().padStart(2, '0');\n const ss = date.getSeconds().toString().padStart(2, '0');\n label = `${hh}:${mm}:${ss}`;\n } else if (totalSeconds >= 0) {\n label = `${Math.floor(tEnd - totalSeconds / 1000)}s`;\n }\n\n // Adjust label position\n ctx.textAlign = 'center';\n ctx.fillText(label, x, bottomY + 8);\n }\n\n // Frequency Axis (Y): calculate nice steps (1, 2, 5, 10)\n const freqSpan = fMax - fMin;\n const targetTicksY = Math.max(3, Math.floor(plotH / 40));\n\n let niceStep = 1;\n\n if (freqSpan > 0 && targetTicksY > 0) {\n const rawStep = freqSpan / targetTicksY;\n const magnitude = Math.pow(10, Math.floor(Math.log10(rawStep)));\n const residual = rawStep / magnitude;\n\n if (residual > 5) {\n niceStep = 10 * magnitude;\n } else if (residual > 2) {\n niceStep = 5 * magnitude;\n } else if (residual > 1) {\n niceStep = 2 * magnitude;\n } else {\n niceStep = 1 * magnitude;\n }\n }\n\n // Align start/end to nice steps\n // We draw starting from fMax downwards, but aligned to grid\n const startTick = Math.floor(fMax / niceStep) * niceStep;\n const endTick = Math.floor(fMin / niceStep) * niceStep;\n\n ctx.textAlign = 'right';\n ctx.textBaseline = 'middle';\n\n // Prevent infinite loop if niceStep is 0 (shouldn't happen)\n const safeStep = niceStep || 1;\n\n for (let freq = startTick; freq >= endTick; freq -= safeStep) {\n // Handle epsilon to allow ticks exactly at boundaries\n const epsilon = safeStep / 1000;\n if (freq > fMax + epsilon) {\n continue;\n }\n if (freq < fMin - epsilon) {\n continue;\n }\n\n // Compute Y position\n // y = 0 at fMax (Top), y = plotH at fMin (Bottom)\n // normalizedY = (fMax - freq) / span\n const normalizedY = (fMax - freq) / freqSpan;\n const y = plotY + normalizedY * plotH;\n\n // Extra clip check just in case\n if (y < plotY - 1 || y > plotY + plotH + 1) {\n continue;\n }\n\n // Draw Tick\n ctx.beginPath();\n ctx.moveTo(left, y);\n ctx.lineTo(left - 5, y);\n ctx.stroke();\n\n // Draw Label\n // Use nice formatting for floats if needed, but request asked for 1,2,5 etc.\n // If magnitude < 1, might need decimals.\n // Default to string, maybe toFixed if fraction?\n let label = freq.toString();\n // If it has many decimals, trim\n if (freq % 1 !== 0) {\n label = freq.toFixed(1).replace(/\\.0$/, '');\n }\n\n ctx.fillText(label, left - 8, y);\n }\n\n // Axis Title\n ctx.save();\n ctx.translate(10, plotH / 2.8);\n ctx.rotate(-Math.PI / 2);\n ctx.textAlign = 'right';\n ctx.fillText('Frequency (Hz)', 0, 0);\n\n ctx.restore();\n }\n}\n","export type ColorMapName =\n | 'viridis'\n | 'inferno'\n | 'grayscale'\n | 'jet'\n | 'hot'\n | 'cool'\n | 'spring'\n | 'summer'\n | 'autumn'\n | 'winter'\n | 'bone';\n\ntype RGB = [number, number, number];\n\nfunction interpolateColorMap(t: number, map: number[][]): RGB {\n if (t <= 0) {\n return map[0] as RGB;\n }\n if (t >= 1) {\n return map[map.length - 1] as RGB;\n }\n\n const step = 1 / (map.length - 1);\n const idx = (t / step) | 0;\n const localT = (t - idx * step) / step;\n\n const c1 = map[idx];\n const c2 = map[idx + 1];\n\n return [\n (c1[0] + (c2[0] - c1[0]) * localT) | 0,\n (c1[1] + (c2[1] - c1[1]) * localT) | 0,\n (c1[2] + (c2[2] - c1[2]) * localT) | 0\n ];\n}\n\nconst VIRIDIS_MAP = [\n [68, 1, 84],\n [59, 82, 139],\n [33, 145, 140],\n [94, 201, 98],\n [253, 231, 37]\n];\nconst INFERNO_MAP = [\n [0, 0, 4],\n [87, 16, 110],\n [187, 55, 84],\n [249, 142, 9],\n [252, 255, 164]\n];\n\nfunction viridis(t: number): RGB {\n return interpolateColorMap(t, VIRIDIS_MAP);\n}\n\nfunction inferno(t: number): RGB {\n return interpolateColorMap(t, INFERNO_MAP);\n}\n\nfunction grayscale(t: number): RGB {\n const v = Math.floor(t * 255);\n return [v, v, v];\n}\n\nfunction jet(t: number): RGB {\n // Jet: Blue -> Cyan -> Yellow -> Orange -> Red\n // t: 0..1\n const v = Math.max(0, Math.min(1, t));\n // R: 0 at 0.35, 1 at 0.66\n // G: 0 at 0.12, 1 at 0.37, 1 at 0.64, 0 at 0.89\n // B: 1 at 0.11, 0 at 0.34\n\n // Simple 4-segment interpolation\n const r = Math.min(4 * v - 1.5, -4 * v + 4.5);\n const g = Math.min(4 * v - 0.5, -4 * v + 3.5);\n const b = Math.min(4 * v + 0.5, -4 * v + 2.5);\n\n return [\n Math.floor(Math.max(0, Math.min(1, r)) * 255),\n Math.floor(Math.max(0, Math.min(1, g)) * 255),\n Math.floor(Math.max(0, Math.min(1, b)) * 255)\n ];\n}\n\nfunction hot(t: number): RGB {\n // Black -> Red -> Yellow -> White\n // R: 0->1 linear (0-0.33)\n // G: 0 (0-0.33) -> 1 (0.66-1)\n // B: 0 (0-0.66) -> 1 (1)\n\n // Easier with keypoints:\n // 0.0: 0,0,0\n // 0.33: 255,0,0\n // 0.66: 255,255,0\n // 1.0: 255,255,255\n\n let r = 0,\n g = 0,\n b = 0;\n\n if (t < 0.33) {\n r = t / 0.33;\n } else if (t < 0.66) {\n r = 1;\n g = (t - 0.33) / 0.33;\n } else {\n r = 1;\n g = 1;\n b = (t - 0.66) / 0.34;\n }\n\n return [Math.floor(r * 255), Math.floor(g * 255), Math.floor(b * 255)];\n}\n\nfunction cool(t: number): RGB {\n // Cyan -> Magenta\n // R: 0 -> 1\n // G: 1 -> 0\n // B: 1\n const r = t;\n const g = 1 - t;\n const b = 1;\n return [Math.floor(r * 255), Math.floor(g * 255), Math.floor(b * 255)];\n}\n\nfunction spring(t: number): RGB {\n // Magenta -> Yellow\n // R: 1\n // G: t\n // B: 1 - t\n return [255, Math.floor(t * 255), Math.floor((1 - t) * 255)];\n}\n\nfunction summer(t: number): RGB {\n // Green -> Yellow\n // R: t\n // G: 0.5 + 0.5*t\n // B: 0.4\n // Standard matplotlib 'summer' is simpler\n // 0.0: (0.0, 0.5, 0.4)\n // 1.0: (1.0, 1.0, 0.4)\n return [Math.floor(t * 255), Math.floor((0.5 + 0.5 * t) * 255), Math.floor(0.4 * 255)];\n}\n\nfunction autumn(t: number): RGB {\n // Red -> Orange -> Yellow\n // R: 1\n // G: t\n // B: 0\n return [255, Math.floor(t * 255), 0];\n}\n\nfunction winter(t: number): RGB {\n // Blue -> Green\n // 0.0: (0, 0, 1)\n // 1.0: (0, 1, 0.5)\n // R: 0\n // G: t\n // B: 1.0 - 0.5*t\n return [0, Math.floor(t * 255), Math.floor((1.0 - 0.5 * t) * 255)];\n}\n\nfunction bone(t: number): RGB {\n const r = t;\n const sin = 0.1 * Math.sin(t * Math.PI * 2);\n const g = t < 0.5 ? t + sin : t;\n const b = t < 0.75 ? t + sin : t;\n\n return [\n Math.floor(Math.min(1, r) * 255),\n Math.floor(Math.min(1, g) * 255),\n Math.floor(Math.min(1, b) * 255)\n ];\n}\n\nconst COLOR_MAP_FNS: Record<ColorMapName, (t: number) => RGB> = {\n viridis,\n inferno,\n grayscale,\n jet,\n hot,\n cool,\n spring,\n summer,\n autumn,\n winter,\n bone\n};\n\nexport class ColorMap {\n private type: ColorMapName;\n private lut: Uint8Array; // [R, G, B, R, G, B...] for 0..255\n\n constructor(type: ColorMapName = 'jet') {\n this.type = type;\n this.lut = new Uint8Array(256 * 3);\n this.generateLut();\n }\n\n private generateLut() {\n const fn = COLOR_MAP_FNS[this.type];\n for (let i = 0; i < 256; i++) {\n const rgb = fn(i / 255);\n const j = i * 3;\n this.lut[j] = rgb[0];\n this.lut[j + 1] = rgb[1];\n this.lut[j + 2] = rgb[2];\n }\n }\n\n getRGB(t: number): RGB {\n const idx = (t <= 0 ? 0 : t >= 1 ? 255 : (t * 255) | 0) * 3;\n return [this.lut[idx], this.lut[idx + 1], this.lut[idx + 2]];\n }\n\n setMap(type: ColorMapName) {\n this.type = type;\n this.generateLut();\n }\n}\n","import { ChunkProcessor, DataChunk } from '../core/DataChunk';\nimport { SpectrogramModel } from '../core/SpectrogramModel';\nimport { AxisRenderer } from './AxisRenderer';\nimport { ColorMap, ColorMapName } from './ColorMap';\n\nexport interface RenderOptions {\n canvas: HTMLCanvasElement;\n width: number;\n height: number;\n timeRange: [number, number]; // [startTime, endTime]\n freqRange: [number, number]; // [minFreq, maxFreq]\n}\n\nexport class CanvasRenderer {\n private model: SpectrogramModel;\n private processor: ChunkProcessor;\n private colormap: ColorMap;\n private axisRenderer: AxisRenderer;\n\n private chunks: Map<string, DataChunk> = new Map();\n private offscreenCanvas: HTMLCanvasElement | null = null;\n private offscreenCtx: CanvasRenderingContext2D | null = null;\n private offscreenHelpers: Map<string, ImageBitmap> = new Map();\n\n private ctx: CanvasRenderingContext2D | null = null;\n private lastW = 0;\n private lastH = 0;\n private lastDPR = 0;\n\n constructor(model: SpectrogramModel) {\n this.model = model;\n this.processor = new ChunkProcessor(model.config);\n this.colormap = new ColorMap();\n this.axisRenderer = new AxisRenderer(model);\n }\n\n setColormap(name: ColorMapName) {\n this.colormap.setMap(name);\n this.clearCache();\n }\n\n clearCache() {\n this.chunks.clear();\n this.offscreenHelpers.clear();\n }\n\n dispose() {\n this.clearCache();\n\n this.offscreenCanvas = null;\n this.offscreenCtx = null;\n this.ctx = null;\n\n this.processor.dispose();\n }\n\n setupHiDPICanvas(canvas: HTMLCanvasElement, cssWidth: number, cssHeight: number) {\n const dpr = window.devicePixelRatio || 1;\n\n canvas.style.width = `${cssWidth}px`;\n canvas.style.height = `${cssHeight}px`;\n\n canvas.width = Math.round(cssWidth * dpr);\n canvas.height = Math.round(cssHeight * dpr);\n\n const ctx = canvas.getContext('2d', { alpha: true })!;\n ctx.resetTransform();\n ctx.scale(dpr, dpr);\n ctx.imageSmoothingEnabled = false;\n\n if (!this.offscreenCanvas) {\n this.offscreenCanvas = document.createElement('canvas');\n }\n this.offscreenCanvas.width = canvas.width;\n this.offscreenCanvas.height = canvas.height;\n this.offscreenCtx = this.offscreenCanvas.getContext('2d', { alpha: true })!;\n this.offscreenCtx.resetTransform();\n this.offscreenCtx.scale(dpr, dpr);\n this.offscreenCtx.imageSmoothingEnabled = false;\n\n return ctx;\n }\n\n private calibrateCanvas(canvas: HTMLCanvasElement, cssW: number, cssH: number) {\n const dpr = window.devicePixelRatio || 1;\n\n if (this.ctx && this.lastW === cssW && this.lastH === cssH && this.lastDPR === dpr) {\n return this.ctx;\n }\n\n this.lastW = cssW;\n this.lastH = cssH;\n this.lastDPR = dpr;\n\n this.ctx = this.setupHiDPICanvas(canvas, cssW, cssH);\n return this.ctx;\n }\n\n render(options: RenderOptions) {\n const { canvas, timeRange, freqRange } = options;\n const ctx = this.calibrateCanvas(canvas, options.width, options.height);\n\n const width = canvas.width / (window.devicePixelRatio || 1);\n const height = canvas.height / (window.devicePixelRatio || 1);\n const [tStart, tEnd] = timeRange;\n const [fMin, fMax] = freqRange;\n\n const MARGIN_LEFT = 50;\n const MARGIN_BOTTOM = 30;\n const MARGIN_TOP = 12;\n const MARGIN_RIGHT = 32;\n\n const plotX = MARGIN_LEFT;\n const plotY = MARGIN_TOP;\n const plotW = width - MARGIN_LEFT - MARGIN_RIGHT;\n const plotH = height - MARGIN_BOTTOM - MARGIN_TOP;\n\n ctx.clearRect(0, 0, width, height);\n\n if (!this.model.data) {\n return;\n }\n\n const sampleRate = this.model.config.sampleRate;\n const config = this.model.config;\n const hopSize = Math.max(1, config.windowSize - config.overlap);\n\n // Chunk size in time (~10s)\n const targetChunkTime = 10.0;\n const targetSamples = targetChunkTime * sampleRate;\n const hopsPerChunk = Math.ceil(targetSamples / hopSize);\n const chunkSamples = hopsPerChunk * hopSize;\n\n const viewStartIdx = Math.floor(Math.max(0, tStart * sampleRate));\n const viewEndIdx = Math.floor(Math.min(this.model.data.length, tEnd * sampleRate));\n if (viewEndIdx <= viewStartIdx) {\n return;\n }\n\n const startChunkId = Math.floor(viewStartIdx / chunkSamples);\n const endChunkId = Math.floor(viewEndIdx / chunkSamples);\n\n for (let i = startChunkId; i <= endChunkId; i++) {\n const chunkStart = i * chunkSamples;\n const chunkEnd = Math.min((i + 1) * chunkSamples, this.model.data.length);\n const chunkId = `chunk_${i}`;\n\n let chunk = this.chunks.get(chunkId);\n\n if (!chunk) {\n chunk = new DataChunk(chunkId, chunkStart, chunkEnd, sampleRate);\n this.chunks.set(chunkId, chunk);\n\n const imgData = this.processor.process(\n this.model.data,\n chunkStart,\n chunkEnd,\n config,\n (val) => this.colormap.getRGB(val)\n );\n\n createImageBitmap(imgData).then((bmp) => {\n if (chunk) {\n chunk.image = bmp;\n this.offscreenCtx!.save();\n this.offscreenCtx!.beginPath();\n this.offscreenCtx!.rect(plotX, plotY, plotW, plotH);\n this.offscreenCtx!.clip();\n this.drawChunk(\n this.offscreenCtx!,\n chunk,\n tStart,\n tEnd,\n fMin,\n fMax,\n plotX,\n plotY,\n plotW,\n plotH\n );\n this.offscreenCtx!.restore();\n }\n });\n }\n\n if (chunk.image) {\n this.offscreenCtx!.save();\n this.offscreenCtx!.beginPath();\n this.offscreenCtx!.rect(plotX, plotY, plotW, plotH);\n this.offscreenCtx!.clip();\n this.drawChunk(\n this.offscreenCtx!,\n chunk,\n tStart,\n tEnd,\n fMin,\n fMax,\n plotX,\n plotY,\n plotW,\n plotH\n );\n this.offscreenCtx!.restore();\n }\n }\n\n ctx.drawImage(this.offscreenCanvas!, 0, 0, width, height);\n\n this.axisRenderer.draw(ctx, width, height, timeRange, freqRange, {\n left: MARGIN_LEFT,\n bottom: MARGIN_BOTTOM,\n top: MARGIN_TOP,\n right: MARGIN_RIGHT\n });\n }\n\n private drawChunk(\n ctx: CanvasRenderingContext2D,\n chunk: DataChunk,\n viewTStart: number,\n viewTEnd: number,\n fMin: number, // Hz\n fMax: number, // Hz\n plotX: number,\n plotY: number,\n plotW: number,\n plotH: number\n ) {\n if (!chunk.image) {\n return;\n }\n\n const viewDuration = viewTEnd - viewTStart;\n const sampleRate = this.model.config.sampleRate;\n const nyquist = sampleRate / 2;\n\n const chunkStartTime = chunk.startIndex / sampleRate;\n const chunkEndTime = chunk.endIndex / sampleRate;\n\n const x1 = plotX + ((chunkStartTime - viewTStart) / viewDuration) * plotW;\n const x2 = plotX + ((chunkEndTime - viewTStart) / viewDuration) * plotW;\n\n if (x2 <= plotX || x1 >= plotX + plotW) {\n return;\n }\n\n const dx = Math.max(plotX, x1);\n const dw = Math.min(plotX + plotW, x2) - dx;\n\n const texW = chunk.image.width;\n const sx = ((dx - x1) / (x2 - x1)) * texW;\n const sw = (dw / (x2 - x1)) * texW;\n\n const safeFMax = Math.min(fMax, nyquist);\n const safeFMin = Math.max(fMin, 0);\n\n const texH = chunk.image.height;\n const sy_top = (1 - safeFMax / nyquist) * texH;\n const sy_bottom = (1 - safeFMin / nyquist) * texH;\n const sy_h = sy_bottom - sy_top;\n\n if (sy_h > 0) {\n const dy = plotY;\n const dh = plotH;\n\n ctx.drawImage(chunk.image, sx, sy_top, sw, sy_h, dx, dy, dw, dh);\n }\n }\n}\n","import {\n SpectrogramConfig,\n SpectrogramData,\n SpectrogramModel,\n TimestampedData\n} from './core/SpectrogramModel';\nimport { CanvasRenderer, RenderOptions } from './render/CanvasRenderer';\nimport { ColorMapName } from './render/ColorMap';\n\nexport type { SpectrogramConfig, SpectrogramData } from './core/SpectrogramModel';\nexport type { ColorMapName } from './render/ColorMap';\n\nexport class Spectrogram {\n private model: SpectrogramModel;\n private renderer: CanvasRenderer;\n\n constructor(config: SpectrogramConfig) {\n this.model = new SpectrogramModel(config);\n this.renderer = new CanvasRenderer(this.model);\n }\n\n setData(data: SpectrogramData | TimestampedData) {\n this.model.setData(data);\n this.renderer.clearCache();\n }\n\n destroy() {\n this.renderer.dispose();\n }\n\n render(options: Omit<RenderOptions, 'freqRange'> & { freqRange?: [number, number] }) {\n // Default freq range to [0, Nyquist] if not provided\n const nyquist = this.model.config.sampleRate / 2;\n const freqRange = options.freqRange || [0, nyquist];\n\n this.renderer.render({\n ...options,\n freqRange\n });\n }\n\n updateConfig(config: Partial<SpectrogramConfig>) {\n this.model.updateConfig(config);\n if (\n config.windowSize ||\n config.windowType ||\n config.minDb ||\n config.maxDb ||\n config.fftSize ||\n config.overlap\n ) {\n this.renderer.clearCache();\n }\n }\n\n setColormap(name: ColorMapName) {\n this.renderer.setColormap(name);\n }\n\n getDuration(): number {\n return this.model.getDuration();\n }\n}\n"],"names":["KissFFTModule","_scriptDir","moduleArg","Module","readyPromiseResolve","readyPromiseReject","resolve","reject","moduleOverrides","scriptDirectory","locateFile","path","err","wasmBinary","abort","wasmMemory","wasmExports","ABORT","HEAP8","HEAPU8","updateMemoryViews","b","__ATPRERUN__","__ATINIT__","__ATPOSTRUN__","preRun","addOnPreRun","callRuntimeCallbacks","initRuntime","postRun","addOnPostRun","cb","addOnInit","runDependencies","dependenciesFulfilled","addRunDependency","id","removeRunDependency","callback","what","e","dataURIPrefix","isDataURI","filename","wasmBinaryFile","getBinarySync","file","binary","tryParseAsDataURI","instantiateSync","info","module","instance","createWasm","wasmImports","receiveInstance","exports","result","callbacks","_emscripten_memcpy_big","dest","src","num","abortOnCannotGrowMemory","requestedSize","_emscripten_resize_heap","getCFunc","ident","func","writeArrayToMemory","array","buffer","lengthBytesUTF8","str","len","i","c","stringToUTF8Array","heap","outIdx","maxBytesToWrite","startIdx","endIdx","u","u1","stringToUTF8","outPtr","stringToUTF8OnStack","size","ret","stackAlloc","UTF8Decoder","UTF8ArrayToString","heapOrArray","idx","maxBytesToRead","endPtr","u0","u2","ch","UTF8ToString","ptr","ccall","returnType","argTypes","args","opts","toC","arr","convertReturnValue","cArgs","stack","converter","stackSave","onDone","stackRestore","cwrap","numericArgs","type","numericRet","asm","intArrayFromBase64","s","decoded","bytes","calledRun","runCaller","run","doRun","kissFFTModule","kiss_fft_alloc","kiss_fft","kiss_fft_free","KissFftWrapperWasm","inputArray","outptr","cout","outputArray","FFT_indutny","table","angle","power","t","j","shift","revShift","complex","storage","res","input","spectrum","half","out","data","width","step","outOff","bitrev","off","inv","quarterLen","limit","k","A","B","C","D","Ar","Ai","Br","Bi","Cr","Ci","Dr","Di","MAr","MAi","tableBr","tableBi","MBr","MBi","tableCr","tableCi","MCr","MCi","tableDr","tableDi","MDr","MDi","T0r","T0i","T1r","T1i","T2r","T2i","T3r","T3i","FAr","FAi","FCr","FCi","FBr","FBi","FDr","FDi","evenR","evenI","oddR","oddI","leftR","leftI","rightR","rightI","step2","step3","halfLen","hquarterLen","ST0r","ST0i","ST1r","ST1i","ST2r","ST2i","ST3r","ST3i","SFAr","SFAi","SFBr","SFBi","SA","SB","IndutnyFftWrapperJavascript","inputArr","outputArr","CrossModule","crossModule","fftCross","FFTCross","real","imag","inverse","n","ro","io","CrossFftWrapperWasm","FFTNayuki","reverseBits","temp","halfsize","tablestep","tpre","tpim","x","bits","y","NayukiFftWrapperJavascript","NayukiCModule","nayukiCModule","nc_precalc_f","nc_dispose_f","nc_transform_radix2_precalc_f","FFTNayukiC","NayukiWasmFftWrapperWasm","FFT","namespace","butterfly2","output","outputOffset","outputStride","fStride","state","m","s0_r","s0_i","s1_r","s1_i","t1_r","t1_i","v1_r","v1_i","r0_r","r0_i","r1_r","r1_i","butterfly3","m1","m2","fStride1","fStride2","s2_r","s2_i","t2_r","t2_i","v2_r","v2_i","i0_r","i0_i","i1_r","i1_i","i2_r","i2_i","r2_r","r2_i","butterfly4","m3","fStride3","s3_r","s3_i","t3_r","t3_i","v3_r","v3_i","i3_r","i3_i","r3_r","r3_i","butterfly","p","scratch","q1","x0_r","x0_i","tOffset","q","work","f","fOffset","inputStride","factors","theta","phase","v","inputOffset","FFT$2","NockertFftWrapperJavascript","_n","_bitrev","_cstb","init","_initArray","_makeBitReversalTable","_makeCosSinTable","fft1d","re","im","fastFourierTransform","ifft1d","bt1d","fft2d","tre","tim","x1","x2","y1","y2","ifft2d","d","h","ik","tmp","wr","wi","xr","xi","n4","l","n2","n8","n2p4","dc","ds","MljsWebFftWrapperJavascript","input_real","input_imag","relaxedSimd","simd","checkBrowserCapabilities","browserName","browserVersion","osName","osVersion","uad","ua","values","brandInfo","brand","uaArr","uaBrowser","isFirefox","isSafari","isChrome","isEdge","isOpera","browsers","browser","versionMatch","osMatch","osDetails","windowsVersionMap","osInfo","os","error","KissFftModifiedWrapperWasm","IndutnyModifiedFftWrapperJavascript","validSizes","webfft","subLibrary","useProfile","profile","fftLibrary","inputArrComplex","innerLen","outterLen","intermediateArray","finalArray","newArray","temparray","duration","refresh","quick","totalStart","subLibraries","ffsPerSecond","secondsPerRun","ci","start","numFfts","totalElapsed","argmax","profileObj","FFTExecutor","fftSize","WebFFT","backend","minDb","maxDb","N","cin","spec","invRange","eps","invLn10","SpectrogramModel","config","isTimestamped","newConfig","createWindow","window","TWO_PI","denom","DataChunk","sampleRate","ChunkProcessor","colormapToRgb","windowSize","overlap","hopSize","height","imgData","pixels","inputBuf","windowBuf","dcSum","validCount","signalStart","mean","end","mags","val","rgb","nextStart","inIdx","AxisRenderer","model","ctx","timeRange","freqRange","margins","tStart","tEnd","fMin","fMax","left","bottom","top","right","plotX","plotY","plotW","plotH","bottomY","numTicksX","stepX","startTimeStamp","timeRel","totalSeconds","label","date","hh","mm","ss","freqSpan","targetTicksY","niceStep","rawStep","magnitude","residual","startTick","endTick","safeStep","freq","epsilon","normalizedY","interpolateColorMap","map","localT","c1","c2","VIRIDIS_MAP","INFERNO_MAP","viridis","inferno","grayscale","jet","r","g","hot","cool","spring","summer","autumn","winter","bone","sin","COLOR_MAP_FNS","ColorMap","fn","CanvasRenderer","name","canvas","cssWidth","cssHeight","dpr","cssW","cssH","options","MARGIN_LEFT","MARGIN_BOTTOM","MARGIN_TOP","MARGIN_RIGHT","targetSamples","chunkSamples","viewStartIdx","viewEndIdx","startChunkId","endChunkId","chunkStart","chunkEnd","chunkId","chunk","bmp","viewTStart","viewTEnd","viewDuration","nyquist","chunkStartTime","chunkEndTime","dx","dw","texW","sx","sw","safeFMax","safeFMin","texH","sy_top","sy_h","dy","dh","Spectrogram"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]}