{
var gpu = new GPU();
function mag(a,b){
return Math.sqrt(a*a + b*b);
}
function DFT(signal,len,freq){
var real = 0;
var imag = 0;
for(var i = 0; i<len; i++){
var shared = 6.28318530718*freq*i/len;
real = real+signal[i]*Math.cos(shared);
imag = imag-signal[i]*Math.sin(shared);
}
return [real,imag];
}
gpu.addFunction(mag);
gpu.addFunction(DFT);
var dft = gpu.createKernel(function (signal,len){
var result = DFT(signal,len,this.thread.x);
return mag(result[0],result[1]);
})
.setDynamicOutput(true)
.setDynamicArguments(true)
.setOutput([1])
var listdft = gpu.createKernel(function (signals,len){
var result = DFT(signals[this.thread.y],len,this.thread.x);
return mag(result[0],result[1]);
})
.setDynamicOutput(true)
.setDynamicArguments(true);
var sineWave = [];
var t = [];
var fs = 512;
var freq = 30;
var increment = 1/fs;
var sec = 1;
const result = freq + " Hz with 150Hz interference, at "+fs+" samples per sec";
for (var ti = 0; ti < sec-increment; ti+=increment){
var amplitude = Math.sin(2*Math.PI*freq*ti);
amplitude += Math.sin(2*Math.PI*150*ti);
sineWave.push(amplitude);
t.push(ti);
}
console.time("gpuDFT");
dft.setOutput([sineWave.length]);
dft.setLoopMaxIterations(sineWave.length);
var gpuresult = dft(sineWave,sineWave.length);
console.timeEnd("gpuDFT");
console.log("GPU.js performance can vary");
var sigList = [sineWave,sineWave,sineWave];
console.time("gpuListDFT");
listdft.setOutput([sineWave.length,3])
listdft.setLoopMaxIterations(sineWave.length);
var gpuresult2 = listdft(sigList,sineWave.length);
console.timeEnd("gpuListDFT");
return result;
}