Mercurial > hg > js-dsp-test
view fft/test.js @ 5:b4ab69bdb4c8
Beginnings of an emscripten example
author | Chris Cannam |
---|---|
date | Mon, 05 Oct 2015 11:30:40 +0100 |
parents | fcb64e4b8393 |
children | 47f08ebded06 |
line wrap: on
line source
/* for a phase vocoder, we probably want 2048-point real-to-complex * FFTs (if available) */ function inputReals(size) { var result = new Array(size); for (var i = 0; i < result.length; i++) result[i] = (i % 20) / 10.0 - 1.0; return result; } function zeroReals(size) { var result = new Array(size); for (var i = 0; i < result.length; i++) result[i] = 0.0; return result; } function inputReal64s(size) { var result = new Float64Array(size); for (var i = 0; i < result.length; i++) result[i] = (i % 20) / 10.0 - 1.0; return result; } function inputComplexArray(size) { var result = new complex_array.ComplexArray(size); for (var i = 0; i < size; i++) { result.real[i] = (i % 20) / 10.0 - 1.0; result.imag[i] = 0.0; } return result; } var iterations = 2150; var size = 2048; function report(name, start, middle, end, total) { document.getElementById(name + "-result").innerHTML = total; document.getElementById(name + "-1").innerHTML = Math.round(middle - start) + " ms"; document.getElementById(name + "-2").innerHTML = Math.round(end - middle) + " ms"; document.getElementById(name + "-itr").innerHTML = Math.round((1000.0 / ((end - middle) / iterations))) + " itr/sec"; } function testNayuki() { var start = performance.now(); var middle = start; var end = start; var total = 0.0; for (var i = 0; i < 2*iterations; ++i) { if (i == iterations) { middle = performance.now(); } var real = inputReals(size); var imag = zeroReals(size); transform(real, imag); for (var j = 0; j < size; ++j) { total += Math.sqrt(real[j] * real[j] + imag[j] * imag[j]); } } var end = performance.now(); report("nayuki", start, middle, end, total); } function testNockert() { var fft = new FFT.complex(size, false); var start = performance.now(); var middle = start; var end = start; total = 0.0; for (var i = 0; i < 2*iterations; ++i) { if (i == iterations) { middle = performance.now(); } var ri = inputReal64s(size); var co = new Float64Array(2 * size); fft.simple(co, ri, 'real'); for (var j = 0; j < size; ++j) { total += Math.sqrt(co[j*2] * co[j*2] + co[j*2+1] * co[j*2+1]); } } var end = performance.now(); report("nockert", start, middle, end, total); } function testDntj() { var start = performance.now(); var middle = start; var end = start; total = 0.0; var scale = Math.sqrt(size); for (var i = 0; i < 2*iterations; ++i) { if (i == iterations) { middle = performance.now(); } var ci = inputComplexArray(size); var co = ci.FFT(); for (var j = 0; j < size; ++j) { total += scale * Math.sqrt(co.real[j] * co.real[j] + co.imag[j] * co.imag[j]); } } var end = performance.now(); report("dntj", start, middle, end, total); } function test() { document.getElementById("test-description").innerHTML = "For " + iterations + " iterations per half (" + 2*iterations + " total) of size " + size; testNayuki(); testNockert(); testDntj(); } window.onload = test;