From 8c4ba49af596785b9b46f9e2c47fca74e3c857fb Mon Sep 17 00:00:00 2001 From: Corban Brook Date: Tue, 1 Mar 2011 10:22:46 -0500 Subject: [PATCH] Added benchmark for deinterleaving. --- Makefile | 1 + bench/deinterleave.js | 40 ++++++++++++++++++++++++++++++++++++++++ dsp.js | 31 +++++++++++-------------------- 3 files changed, 52 insertions(+), 20 deletions(-) create mode 100644 bench/deinterleave.js diff --git a/Makefile b/Makefile index 6bc0cfb..1ac12e9 100644 --- a/Makefile +++ b/Makefile @@ -10,6 +10,7 @@ benchmark: ${JSSHELL} -m -j -p -e 'var FREQUENCY=${FREQUENCY};' -f dsp.js -f ./bench/bench.js -f ./bench/dft.js ${JSSHELL} -m -j -p -e 'var FREQUENCY=${FREQUENCY};' -f dsp.js -f ./bench/bench.js -f ./bench/fft.js ${JSSHELL} -m -j -p -e 'var FREQUENCY=${FREQUENCY};' -f dsp.js -f ./bench/bench.js -f ./bench/rfft.js + ${JSSHELL} -m -j -p -f dsp.js -f ./bench/bench.js -f ./bench/deinterleave.js clean: rm -fr ./release diff --git a/bench/deinterleave.js b/bench/deinterleave.js new file mode 100644 index 0000000..930d399 --- /dev/null +++ b/bench/deinterleave.js @@ -0,0 +1,40 @@ +var bufferSize = 2048; +var sampleRate = 44100; + +var buffer1 = new Float32Array(bufferSize); +var buffer2 = new Float32Array(bufferSize); +var buffer3 = new Float32Array(bufferSize); +var buffer4 = new Float32Array(bufferSize); + +for (var i = 0; i < bufferSize; i++) { + buffer1[i] = (i % 2 === 0) ? -Math.random() : Math.random(); +} + +for (var i = 0; i < bufferSize; i++) { + buffer2[i] = (i % 2 === 0) ? -Math.random() : Math.random(); +} + +for (var i = 0; i < bufferSize; i++) { + buffer3[i] = (i % 2 === 0) ? -Math.random() : Math.random(); +} + +for (var i = 0; i < bufferSize; i++) { + buffer4[i] = (i % 2 === 0) ? -Math.random() : Math.random(); +} + +var channel; +var temp; + +var duration = benchmark(function() { + channel = DSP.deinterleave(DSP.MIX, buffer1); + + // cycle buffers + temp = buffer1; + buffer1 = buffer2; + buffer2 = buffer3; + buffer3 = buffer4; + buffer4 = temp; +}, 100000); + +print("Channel length: " + channel.length); +print("100000 iterations: " + (duration) + " ms (" + ((duration) / 100000) + "ms per iter)\n"); diff --git a/dsp.js b/dsp.js index 4573a3c..bfee29d 100644 --- a/dsp.js +++ b/dsp.js @@ -164,14 +164,6 @@ DSP.deinterleave = (function() { mix = new Float32Array(buffer.length/2); } - /* - for (var i = 0, len = buffer.length/2; i < len; i++) { - left[i] = buffer[2*i]; - right[i] = buffer[2*i+1]; - mix[i] = (left[i] + right[i]) / 2; - } - */ - return deinterleaveChannel[channel](buffer); }; }()); @@ -361,7 +353,7 @@ DFT.prototype.forward = function(buffer) { function FFT(bufferSize, sampleRate) { FourierTransform.call(this, bufferSize, sampleRate); - this.reverseTable = new Uint32Array(bufferSize); + this.reverseTable = new Uint32Array(bufferSize); var limit = 1; var bit = bufferSize >> 1; @@ -377,7 +369,6 @@ function FFT(bufferSize, sampleRate) { bit = bit >> 1; } - /* this.sinTable = new Float32Array(bufferSize); this.cosTable = new Float32Array(bufferSize); @@ -385,7 +376,6 @@ function FFT(bufferSize, sampleRate) { this.sinTable[i] = Math.sin(-Math.PI/i); this.cosTable[i] = Math.cos(-Math.PI/i); } - */ } /** @@ -399,16 +389,17 @@ function FFT(bufferSize, sampleRate) { FFT.prototype.forward = function(buffer) { // Locally scope variables for speed up var bufferSize = this.bufferSize, - //cosTable = this.cosTable, - //sinTable = this.sinTable, + cosTable = this.cosTable, + sinTable = this.sinTable, reverseTable = this.reverseTable, real = this.real, imag = this.imag, spectrum = this.spectrum; var k = Math.floor(Math.log(bufferSize) / Math.LN2); + if (Math.pow(2, k) !== bufferSize) { throw "Invalid buffer size, must be a power of 2."; } - if (bufferSize !== buffer.length) { throw "Supplied buffer is not the same size as defined FFT. FFT Size: " + bufferSize + " Buffer Size: " + buffer.length; } + if (bufferSize !== buffer.length) { throw "Supplied buffer is not the same size as defined FFT. FFT Size: " + bufferSize + " Buffer Size: " + buffer.length; } var halfSize = 1, phaseShiftStepReal, @@ -427,11 +418,10 @@ FFT.prototype.forward = function(buffer) { } while (halfSize < bufferSize) { - //phaseShiftStepReal = cosTable[halfSize]; - //phaseShiftStepImag = sinTable[halfSize]; - - phaseShiftStepReal = Math.cos(-Math.PI/halfSize); - phaseShiftStepImag = Math.sin(-Math.PI/halfSize); + //phaseShiftStepReal = Math.cos(-Math.PI/halfSize); + //phaseShiftStepImag = Math.sin(-Math.PI/halfSize); + phaseShiftStepReal = cosTable[halfSize]; + phaseShiftStepImag = sinTable[halfSize]; currentPhaseShiftReal = 1; currentPhaseShiftImag = 0; @@ -665,6 +655,7 @@ RFFT.prototype.forward = function(buffer) { rval, ival, mag; this.reverseBinPermute(x, buffer); + /* var reverseTable = this.reverseTable; @@ -811,7 +802,7 @@ RFFT.prototype.forward = function(buffer) { x[i5] -= t4; } - ix = id << 1 - n2; + ix = (id << 1) - n2; id = id << 2; } while (ix < n);