-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFFT.js
44 lines (39 loc) · 1.41 KB
/
FFT.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
/*
FFT implementation of Cooley-Tukey algorithm by https://github.com/lvillasen
adapted from https://rosettacode.org/wiki/Fast_Fourier_transform#JavaScript
*/
function FFT(signal) {
if (signal.length == 1)
return signal;
var halfLength = signal.length / 2;
var even = [];
var odd = [];
even.length = halfLength;
odd.length = halfLength;
for (var i = 0; i < halfLength; ++i) {
even[i] = signal[i * 2];
odd[i] = signal[i * 2 + 1];
}
even = FFT(even);
odd = FFT(odd);
for (var k = 0; k < halfLength; ++k) {
if (!(even[k] instanceof Complex))
even[k] = new Complex(even[k], 0);
if (!(odd[k] instanceof Complex))
odd[k] = new Complex(odd[k], 0);
var a = Math.cos(2 * Math.PI * k / signal.length);
var b = Math.sin(-2 * Math.PI * k / signal.length);
//var sigma_k = new Complex(Math.cos(2 * Math.PI * k / signal.length), Math.sin(-2 * Math.PI * k / signal.length));
var temp_k_real = odd[k].re * a - odd[k].im * b;
var temp_k_imag = odd[k].re * b + odd[k].im * a;
var A_k = new Complex(even[k].re + temp_k_real, even[k].im + temp_k_imag);
var B_k = new Complex(even[k].re - temp_k_real, even[k].im - temp_k_imag);
signal[k] = A_k;
signal[k + halfLength] = B_k;
}
return signal;
}
function Complex(re, im) {
this.re = re;
this.im = im || 0.0;
}