-
-
Save anonymous/129d477ddb1c8025c9ac to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Fourier.Transform = function(data) { | |
var N = data.length; | |
var frequencies = []; | |
// for every frequency... | |
for (var freq = 0; freq < N; freq++) { | |
var re = 0; | |
var im = 0; | |
// for every point in time... | |
for (var t = 0; t < N; t++) { | |
// Spin the signal _backwards_ at each frequency (as radians/s, not Hertz) | |
var rate = -1 * (2 * Math.PI) * freq; | |
// How far around the circle have we gone at time=t? | |
var time = t / N; | |
var distance = rate * time; | |
// datapoint * e^(-i*2*pi*f) is complex, store each part | |
var re_part = data[t] * Math.cos(distance); | |
var im_part = data[t] * Math.sin(distance); | |
// add this data point's contribution | |
re += re_part; | |
im += im_part; | |
} | |
// Close to zero? You're zero. | |
if (Math.abs(re) < 1e-10) { re = 0; } | |
if (Math.abs(im) < 1e-10) { im = 0; } | |
// Average contribution at this frequency | |
re = re / N; | |
im = im / N; | |
frequencies[freq] = { | |
re: re, | |
im: im, | |
freq: freq, | |
amp: Math.sqrt(re*re + im*im), | |
phase: Math.atan2(im, re) * 180 / Math.PI // in degrees | |
}; | |
} | |
return frequencies; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment