Skip to content

Instantly share code, notes, and snippets.

@notmasteryet
Created August 28, 2010 02:44
Show Gist options
  • Save notmasteryet/554597 to your computer and use it in GitHub Desktop.
Save notmasteryet/554597 to your computer and use it in GitHub Desktop.
// $JSSHELL -j -f dsp.js -f testfft.js
FFT.prototype.compile = function() {
// Locally scope variables for speed up
var bufferSize = this.bufferSize,
cosTable = this.cosTable,
sinTable = this.sinTable,
reverseTable = this.reverseTable;
var forwardCode = "(function(buffer) {\n" +
"if(buffer.length!==" + bufferSize+")throw\"incorrect buffer length\";\n";
var initVars = [];
for(var i=0;i<bufferSize;++i) {
initVars.push("i" + i + "=buffer[" + reverseTable[i] + "]");
initVars.push("r" + i + "=0");
}
forwardCode += "var " + initVars.join(",") + ";\n";
var halfSize = 1,
phaseShiftStepReal,
phaseShiftStepImag,
currentPhaseShiftReal,
currentPhaseShiftImag,
off,
tmpReal,
i;
forwardCode += "var tr, ti; \n";
while ( halfSize < bufferSize ) {
phaseShiftStepReal = cosTable[halfSize];
phaseShiftStepImag = sinTable[halfSize];
currentPhaseShiftReal = 1;
currentPhaseShiftImag = 0;
for ( var fftStep = 0; fftStep < halfSize; fftStep++ ) {
i = fftStep;
while ( i < bufferSize ) {
off = i + halfSize;
forwardCode += "tr=("+currentPhaseShiftReal+"*r"+off+")-("+currentPhaseShiftImag+"*i"+off+");";
forwardCode += "ti=("+currentPhaseShiftReal+"*i"+off+")+("+currentPhaseShiftImag+"*r"+off+");";
forwardCode += "r"+off+"=r"+i+"-tr;i"+off+"=i"+i+"-ti;r"+i+"+=tr;i"+i+"+=ti;\n";
i += halfSize << 1;
}
tmpReal = currentPhaseShiftReal;
currentPhaseShiftReal = (tmpReal * phaseShiftStepReal) - (currentPhaseShiftImag * phaseShiftStepImag);
currentPhaseShiftImag = (tmpReal * phaseShiftStepImag) + (currentPhaseShiftImag * phaseShiftStepReal);
}
halfSize = halfSize << 1;
}
forwardCode += "var real=this.real,imag=this.imag,spectrum=this.spectrum,sqrt=Math.sqrt;\n";
for(i=0;i<bufferSize;++i) {
forwardCode += "real["+i+"]=r"+i+";imag["+i+"]=i"+i+";";
}
forwardCode += "\n";
i = bufferSize/2;
while(i--) {
forwardCode += "spectrum["+i+"]=2*sqrt(r"+i+"*r"+i+"+i"+i+"*i"+i+")/"+bufferSize+";";
}
forwardCode += "\nreturn spectrum;})";
this.forward = eval(forwardCode);
};
// sine signal at 440hz, sample rate=44100
var buffer = new Float32Array(2048);
for(var i=0;i<buffer.length;++i) {
buffer[i] = Math.sin(i * 2 * Math.PI * 440 / 44100);
}
var fft = new FFT(2048, 44100);
fft.compile();
var startTime = new Date().valueOf(), iterations=100;
for(var k=0;k<iterations;++k) {
fft.forward(buffer);
}
var endTime = new Date().valueOf(), duration = endTime - startTime;
print("interations: " + iterations + "; total dur: " + duration + "ms; per item: " + (duration / iterations) + "ms");
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment