Published
Edited
Aug 24, 2020
Insert cell
md`# GPU.js Issue 633 Research`
Insert cell
{
var gpu = new GPU();
function mag(a,b){ // Returns magnitude
return Math.sqrt(a*a + b*b);
}
function DFT(signal,len,freq){ //Extract a particular frequency
var real = 0;
var imag = 0;
for(var i = 0; i<len; i++){
var shared = 6.28318530718*freq*i/len; //this.thread.x is the target frequency
real = real+signal[i]*Math.cos(shared);
imag = imag-signal[i]*Math.sin(shared);
}

return [real,imag]; //mag(real,imag)
}
gpu.addFunction(mag);

gpu.addFunction(DFT);

//Return frequency domain based on 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]) //Call before running the kernel
//.setOutput([signal.length]) //Call before running the kernel
//.setLoopMaxIterations(signal.length);

var listdft = gpu.createKernel(function (signals,len){
var result = DFT(signals[this.thread.y],len,this.thread.x);
return mag(result[0],result[1]); //mag(real,imag)
})
.setDynamicOutput(true)
.setDynamicArguments(true);

var sineWave = [];
var t = [];
var fs = 512; // Sample rate
var freq = 30; // Generate this frequency
var increment = 1/fs; //x-axis time increment based on sample rate
var sec = 1; //Seconds of data to generate
const result = freq + " Hz with 150Hz interference, at "+fs+" samples per sec";
for (var ti = 0; ti < sec-increment; ti+=increment){ //200 sps, 3 sec
var amplitude = Math.sin(2*Math.PI*freq*ti);
amplitude += Math.sin(2*Math.PI*150*ti); //Add 150Hz interference
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;
}
Insert cell
GPU = (async () => { return (await require('gpu.js')).GPU })();
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more