# HG changeset patch # User Chris Cannam # Date 1444055861 -3600 # Node ID 9619d2da67c2238a1b8c1b8433c746948fe73753 # Parent a8a89f74338baf05b7002d4a4b19ef01b2a4c757 Add object version of Nayuki code diff -r a8a89f74338b -r 9619d2da67c2 fft/nayuki-obj/fft.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fft/nayuki-obj/fft.js Mon Oct 05 15:37:41 2015 +0100 @@ -0,0 +1,92 @@ +/* + * Free FFT and convolution (JavaScript) + * + * Copyright (c) 2014 Project Nayuki + * http://www.nayuki.io/page/free-small-fft-in-multiple-languages + * + * (MIT License) + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * - The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * - The Software is provided "as is", without warranty of any kind, express or + * implied, including but not limited to the warranties of merchantability, + * fitness for a particular purpose and noninfringement. In no event shall the + * authors or copyright holders be liable for any claim, damages or other + * liability, whether in an action of contract, tort or otherwise, arising from, + * out of or in connection with the Software or the use or other dealings in the + * Software. + */ + +"use strict"; + +function FFTNayuki(n) { + this.n = n; + this.levels = -1; + + for (var i = 0; i < 32; i++) { + if (1 << i == n) { + this.levels = i; // Equal to log2(n) + } + } + if (this.levels == -1) { + throw "Length is not a power of 2"; + } + + this.cosTable = new Array(n / 2); + this.sinTable = new Array(n / 2); + for (var i = 0; i < n / 2; i++) { + this.cosTable[i] = Math.cos(2 * Math.PI * i / n); + this.sinTable[i] = Math.sin(2 * Math.PI * i / n); + } + + this.forward = function(real, imag) { + + for (var i = 0; i < n; i++) { + var j = reverseBits(i, this.levels); + if (j > i) { + var temp = real[i]; + real[i] = real[j]; + real[j] = temp; + temp = imag[i]; + imag[i] = imag[j]; + imag[j] = temp; + } + } + + for (var size = 2; size <= n; size *= 2) { + var halfsize = size / 2; + var tablestep = n / size; + for (var i = 0; i < n; i += size) { + for (var j = i, k = 0; j < i + halfsize; j++, k += tablestep) { + var tpre = real[j+halfsize] * this.cosTable[k] + + imag[j+halfsize] * this.sinTable[k]; + var tpim = -real[j+halfsize] * this.sinTable[k] + + imag[j+halfsize] * this.cosTable[k]; + real[j + halfsize] = real[j] - tpre; + imag[j + halfsize] = imag[j] - tpim; + real[j] += tpre; + imag[j] += tpim; + } + } + } + + function reverseBits(x, bits) { + var y = 0; + for (var i = 0; i < bits; i++) { + y = (y << 1) | (x & 1); + x >>>= 1; + } + return y; + } + } + + this.inverse = function(real, imag) { + forward(imag, real); + } +} + diff -r a8a89f74338b -r 9619d2da67c2 fft/test.html --- a/fft/test.html Mon Oct 05 15:06:39 2015 +0100 +++ b/fft/test.html Mon Oct 05 15:37:41 2015 +0100 @@ -10,6 +10,7 @@ + @@ -32,7 +33,9 @@ Nayuki - + + Nayuki (obj) + Nockert Dntj @@ -47,8 +50,9 @@