UNPKG

@sebastbake/music-tempo

Version:

Finding out tempo of the music

1,496 lines (1,491 loc) 88.7 kB
/* * _______ _____ _____ _____ * |__ __| | __ \ / ____| __ \ * | | __ _ _ __ ___ ___ ___| | | | (___ | |__) | * | |/ _` | '__/ __|/ _ \/ __| | | |\___ \| ___/ * | | (_| | | \__ \ (_) \__ \ |__| |____) | | * |_|\__,_|_| |___/\___/|___/_____/|_____/|_| * * ------------------------------------------------------------- * * TarsosDSP is developed by Joren Six at IPEM, University Ghent * * ------------------------------------------------------------- * * Info: http://0110.be/tag/TarsosDSP * Github: https://github.com/JorenSix/TarsosDSP * Releases: http://0110.be/releases/TarsosDSP/ * * TarsosDSP includes modified source code by various authors, * for credits and info, see README. * */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is JTransforms. * * The Initial Developer of the Original Code is * Piotr Wendykier, Emory University. * Portions created by the Initial Developer are Copyright (C) 2007-2009 * the Initial Developer. All Rights Reserved. * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ /* Generated from Java with JSweet 1.2.0 - http://www.jsweet.org */ var ConcurrencyUtils = (function () { function ConcurrencyUtils() { } /** * Returns the closest power-of-two number greater than or equal to x. * * @param x * @return the closest power-of-two number greater than or equal to x */ ConcurrencyUtils.nextPow2 = function (x) { if (x < 1) throw new java.lang.IllegalArgumentException("x must be greater or equal 1"); if ((x & (x - 1)) === 0) { return x; } x |= (x >>> 1); x |= (x >>> 2); x |= (x >>> 4); x |= (x >>> 8); x |= (x >>> 16); x |= (x >>> 32); return x + 1; }; /** * Checks if x is a power-of-two number. * * @param x * @return true if x is a power-of-two number */ ConcurrencyUtils.isPowerOf2 = function (x) { if (x <= 0) return false; else return (x & (x - 1)) === 0; }; return ConcurrencyUtils; }()); ConcurrencyUtils["__class"] = "ConcurrencyUtils"; var FloatFFT = (function () { /** * Creates new instance of FloatFFT. * * @param n * size of data */ function FloatFFT(n) { this.n = 0; this.nBluestein = 0; this.nw = 0; this.nc = 0; if (!ConcurrencyUtils.isPowerOf2(n)) { throw new java.lang.IllegalArgumentException("n must be power of 2"); } this.n = n; this.plan = FloatFFT.Plans.SPLIT_RADIX; this.ip = new Array(2 + (Math.ceil(2 + (1 << (((Math.log(n + 0.5) / Math.log(2)) | 0) / 2 | 0))) | 0)); this.w = new Array(n); var twon = 2 * n; this.nw = this.ip[0]; if (twon > (this.nw << 2)) { this.nw = twon >> 2; this.makewt(this.nw); } this.nc = this.ip[1]; if (n > (this.nc << 2)) { this.nc = n >> 2; this.makect(this.nc, this.w, this.nw); } } FloatFFT.factors_$LI$ = function () { if (FloatFFT.factors == null) FloatFFT.factors = [4, 2, 3, 5]; return FloatFFT.factors; }; ; /** * Computes 1D forward DFT of complex data leaving the result in * <code>a</code>. Complex number is stored as two float values in * sequence: the real and imaginary part, i.e. the size of the input array * must be greater or equal 2*n. The physical layout of the input data has * to be as follows:<br> * * <pre> * a[offa+2*k] = Re[k], * a[offa+2*k+1] = Im[k], 0&lt;=k&lt;n * </pre> * * @param a * data to transform * @param offa * index of the first element in array <code>a</code> */ FloatFFT.prototype.complexForward = function (a, offa) { if (this.n === 1) return; switch ((this.plan)) { case FloatFFT.Plans.SPLIT_RADIX: this.cftbsub(2 * this.n, a, offa, this.ip, this.nw, this.w); break; } }; FloatFFT.prototype.realForward = function (a, offa) { if (this.n === 1) return; switch ((this.plan)) { case FloatFFT.Plans.SPLIT_RADIX: var xi = void 0; if (this.n > 4) { this.cftfsub(this.n, a, offa, this.ip, this.nw, this.w); this.rftfsub(this.n, a, offa, this.nc, this.w, this.nw); } else if (this.n === 4) { } xi = a[offa] - a[offa + 1]; a[offa] += a[offa + 1]; a[offa + 1] = xi; break; } }; FloatFFT.prototype.cftfsub = function (n, a, offa, ip, nw, w) { if (n > 8) { if (n > 32) { this.cftf1st(n, a, offa, w, nw - (n >> 2)); if (false) { } else if (n > 512) { this.cftrec4(n, a, offa, nw, w); } else if (n > 128) { } else { } this.bitrv2(n, ip, a, offa); } else if (n === 32) { } else { } } else if (n === 8) { } else if (n === 4) { } }; FloatFFT.prototype.cftbsub = function (n, a, offa, ip, nw, w) { if (n > 8) { if (n > 32) { this.cftb1st(n, a, offa, w, nw - (n >> 2)); if (false) { } else if (n > 512) { this.cftrec4(n, a, offa, nw, w); } else if (n > 128) { } else { } this.bitrv2conj(n, ip, a, offa); } else if (n === 32) { } else { } } else if (n === 8) { } else if (n === 4) { } }; FloatFFT.prototype.rftfsub = function (n, a, offa, nc, c, startc) { var k; var kk; var ks; var m; var wkr; var wki; var xr; var xi; var yr; var yi; var idx1; var idx2; m = n >> 1; ks = (2 * nc / m | 0); kk = 0; for (var j = 2; j < m; j += 2) { k = n - j; kk += ks; wkr = (0.5 - c[startc + nc - kk]); wki = c[startc + kk]; idx1 = offa + j; idx2 = offa + k; xr = a[idx1] - a[idx2]; xi = a[idx1 + 1] + a[idx2 + 1]; yr = wkr * xr - wki * xi; yi = wkr * xi + wki * xr; a[idx1] -= yr; a[idx1 + 1] = yi - a[idx1 + 1]; a[idx2] += yr; a[idx2 + 1] = yi - a[idx2 + 1]; } a[offa + m + 1] = -a[offa + m + 1]; }; FloatFFT.prototype.cftrec4 = function (n, a, offa, nw, w) { var isplt; var j; var k; var m; m = n; var idx1 = offa + n; while ((m > 512)) { m >>= 2; this.cftmdl1(m, a, idx1 - m, w, nw - (m >> 1)); } ; this.cftleaf(m, 1, a, idx1 - m, nw, w); k = 0; var idx2 = offa - m; for (j = n - m; j > 0; j -= m) { k++; isplt = this.cfttree(m, j, k, a, offa, nw, w); this.cftleaf(m, isplt, a, idx2 + j, nw, w); } }; FloatFFT.prototype.cftf1st = function (n, a, offa, w, startw) { var j0; var j1; var j2; var j3; var k; var m; var mh; var wn4r; var csc1; var csc3; var wk1r; var wk1i; var wk3r; var wk3i; var wd1r; var wd1i; var wd3r; var wd3i; var x0r; var x0i; var x1r; var x1i; var x2r; var x2i; var x3r; var x3i; var y0r; var y0i; var y1r; var y1i; var y2r; var y2i; var y3r; var y3i; var idx0; var idx1; var idx2; var idx3; var idx4; var idx5; mh = n >> 3; m = 2 * mh; j1 = m; j2 = j1 + m; j3 = j2 + m; idx1 = offa + j1; idx2 = offa + j2; idx3 = offa + j3; x0r = a[offa] + a[idx2]; x0i = a[offa + 1] + a[idx2 + 1]; x1r = a[offa] - a[idx2]; x1i = a[offa + 1] - a[idx2 + 1]; x2r = a[idx1] + a[idx3]; x2i = a[idx1 + 1] + a[idx3 + 1]; x3r = a[idx1] - a[idx3]; x3i = a[idx1 + 1] - a[idx3 + 1]; a[offa] = x0r + x2r; a[offa + 1] = x0i + x2i; a[idx1] = x0r - x2r; a[idx1 + 1] = x0i - x2i; a[idx2] = x1r - x3i; a[idx2 + 1] = x1i + x3r; a[idx3] = x1r + x3i; a[idx3 + 1] = x1i - x3r; wn4r = w[startw + 1]; csc1 = w[startw + 2]; csc3 = w[startw + 3]; wd1r = 1; wd1i = 0; wd3r = 1; wd3i = 0; k = 0; for (var j = 2; j < mh - 2; j += 4) { k += 4; idx4 = startw + k; wk1r = csc1 * (wd1r + w[idx4]); wk1i = csc1 * (wd1i + w[idx4 + 1]); wk3r = csc3 * (wd3r + w[idx4 + 2]); wk3i = csc3 * (wd3i + w[idx4 + 3]); wd1r = w[idx4]; wd1i = w[idx4 + 1]; wd3r = w[idx4 + 2]; wd3i = w[idx4 + 3]; j1 = j + m; j2 = j1 + m; j3 = j2 + m; idx1 = offa + j1; idx2 = offa + j2; idx3 = offa + j3; idx5 = offa + j; x0r = a[idx5] + a[idx2]; x0i = a[idx5 + 1] + a[idx2 + 1]; x1r = a[idx5] - a[idx2]; x1i = a[idx5 + 1] - a[idx2 + 1]; y0r = a[idx5 + 2] + a[idx2 + 2]; y0i = a[idx5 + 3] + a[idx2 + 3]; y1r = a[idx5 + 2] - a[idx2 + 2]; y1i = a[idx5 + 3] - a[idx2 + 3]; x2r = a[idx1] + a[idx3]; x2i = a[idx1 + 1] + a[idx3 + 1]; x3r = a[idx1] - a[idx3]; x3i = a[idx1 + 1] - a[idx3 + 1]; y2r = a[idx1 + 2] + a[idx3 + 2]; y2i = a[idx1 + 3] + a[idx3 + 3]; y3r = a[idx1 + 2] - a[idx3 + 2]; y3i = a[idx1 + 3] - a[idx3 + 3]; a[idx5] = x0r + x2r; a[idx5 + 1] = x0i + x2i; a[idx5 + 2] = y0r + y2r; a[idx5 + 3] = y0i + y2i; a[idx1] = x0r - x2r; a[idx1 + 1] = x0i - x2i; a[idx1 + 2] = y0r - y2r; a[idx1 + 3] = y0i - y2i; x0r = x1r - x3i; x0i = x1i + x3r; a[idx2] = wk1r * x0r - wk1i * x0i; a[idx2 + 1] = wk1r * x0i + wk1i * x0r; x0r = y1r - y3i; x0i = y1i + y3r; a[idx2 + 2] = wd1r * x0r - wd1i * x0i; a[idx2 + 3] = wd1r * x0i + wd1i * x0r; x0r = x1r + x3i; x0i = x1i - x3r; a[idx3] = wk3r * x0r + wk3i * x0i; a[idx3 + 1] = wk3r * x0i - wk3i * x0r; x0r = y1r + y3i; x0i = y1i - y3r; a[idx3 + 2] = wd3r * x0r + wd3i * x0i; a[idx3 + 3] = wd3r * x0i - wd3i * x0r; j0 = m - j; j1 = j0 + m; j2 = j1 + m; j3 = j2 + m; idx0 = offa + j0; idx1 = offa + j1; idx2 = offa + j2; idx3 = offa + j3; x0r = a[idx0] + a[idx2]; x0i = a[idx0 + 1] + a[idx2 + 1]; x1r = a[idx0] - a[idx2]; x1i = a[idx0 + 1] - a[idx2 + 1]; y0r = a[idx0 - 2] + a[idx2 - 2]; y0i = a[idx0 - 1] + a[idx2 - 1]; y1r = a[idx0 - 2] - a[idx2 - 2]; y1i = a[idx0 - 1] - a[idx2 - 1]; x2r = a[idx1] + a[idx3]; x2i = a[idx1 + 1] + a[idx3 + 1]; x3r = a[idx1] - a[idx3]; x3i = a[idx1 + 1] - a[idx3 + 1]; y2r = a[idx1 - 2] + a[idx3 - 2]; y2i = a[idx1 - 1] + a[idx3 - 1]; y3r = a[idx1 - 2] - a[idx3 - 2]; y3i = a[idx1 - 1] - a[idx3 - 1]; a[idx0] = x0r + x2r; a[idx0 + 1] = x0i + x2i; a[idx0 - 2] = y0r + y2r; a[idx0 - 1] = y0i + y2i; a[idx1] = x0r - x2r; a[idx1 + 1] = x0i - x2i; a[idx1 - 2] = y0r - y2r; a[idx1 - 1] = y0i - y2i; x0r = x1r - x3i; x0i = x1i + x3r; a[idx2] = wk1i * x0r - wk1r * x0i; a[idx2 + 1] = wk1i * x0i + wk1r * x0r; x0r = y1r - y3i; x0i = y1i + y3r; a[idx2 - 2] = wd1i * x0r - wd1r * x0i; a[idx2 - 1] = wd1i * x0i + wd1r * x0r; x0r = x1r + x3i; x0i = x1i - x3r; a[idx3] = wk3i * x0r + wk3r * x0i; a[idx3 + 1] = wk3i * x0i - wk3r * x0r; x0r = y1r + y3i; x0i = y1i - y3r; a[offa + j3 - 2] = wd3i * x0r + wd3r * x0i; a[offa + j3 - 1] = wd3i * x0i - wd3r * x0r; } wk1r = csc1 * (wd1r + wn4r); wk1i = csc1 * (wd1i + wn4r); wk3r = csc3 * (wd3r - wn4r); wk3i = csc3 * (wd3i - wn4r); j0 = mh; j1 = j0 + m; j2 = j1 + m; j3 = j2 + m; idx0 = offa + j0; idx1 = offa + j1; idx2 = offa + j2; idx3 = offa + j3; x0r = a[idx0 - 2] + a[idx2 - 2]; x0i = a[idx0 - 1] + a[idx2 - 1]; x1r = a[idx0 - 2] - a[idx2 - 2]; x1i = a[idx0 - 1] - a[idx2 - 1]; x2r = a[idx1 - 2] + a[idx3 - 2]; x2i = a[idx1 - 1] + a[idx3 - 1]; x3r = a[idx1 - 2] - a[idx3 - 2]; x3i = a[idx1 - 1] - a[idx3 - 1]; a[idx0 - 2] = x0r + x2r; a[idx0 - 1] = x0i + x2i; a[idx1 - 2] = x0r - x2r; a[idx1 - 1] = x0i - x2i; x0r = x1r - x3i; x0i = x1i + x3r; a[idx2 - 2] = wk1r * x0r - wk1i * x0i; a[idx2 - 1] = wk1r * x0i + wk1i * x0r; x0r = x1r + x3i; x0i = x1i - x3r; a[idx3 - 2] = wk3r * x0r + wk3i * x0i; a[idx3 - 1] = wk3r * x0i - wk3i * x0r; x0r = a[idx0] + a[idx2]; x0i = a[idx0 + 1] + a[idx2 + 1]; x1r = a[idx0] - a[idx2]; x1i = a[idx0 + 1] - a[idx2 + 1]; x2r = a[idx1] + a[idx3]; x2i = a[idx1 + 1] + a[idx3 + 1]; x3r = a[idx1] - a[idx3]; x3i = a[idx1 + 1] - a[idx3 + 1]; a[idx0] = x0r + x2r; a[idx0 + 1] = x0i + x2i; a[idx1] = x0r - x2r; a[idx1 + 1] = x0i - x2i; x0r = x1r - x3i; x0i = x1i + x3r; a[idx2] = wn4r * (x0r - x0i); a[idx2 + 1] = wn4r * (x0i + x0r); x0r = x1r + x3i; x0i = x1i - x3r; a[idx3] = -wn4r * (x0r + x0i); a[idx3 + 1] = -wn4r * (x0i - x0r); x0r = a[idx0 + 2] + a[idx2 + 2]; x0i = a[idx0 + 3] + a[idx2 + 3]; x1r = a[idx0 + 2] - a[idx2 + 2]; x1i = a[idx0 + 3] - a[idx2 + 3]; x2r = a[idx1 + 2] + a[idx3 + 2]; x2i = a[idx1 + 3] + a[idx3 + 3]; x3r = a[idx1 + 2] - a[idx3 + 2]; x3i = a[idx1 + 3] - a[idx3 + 3]; a[idx0 + 2] = x0r + x2r; a[idx0 + 3] = x0i + x2i; a[idx1 + 2] = x0r - x2r; a[idx1 + 3] = x0i - x2i; x0r = x1r - x3i; x0i = x1i + x3r; a[idx2 + 2] = wk1i * x0r - wk1r * x0i; a[idx2 + 3] = wk1i * x0i + wk1r * x0r; x0r = x1r + x3i; x0i = x1i - x3r; a[idx3 + 2] = wk3i * x0r + wk3r * x0i; a[idx3 + 3] = wk3i * x0i - wk3r * x0r; }; FloatFFT.prototype.bitrv2 = function (n, ip, a, offa) { var j1; var k1; var l; var m; var nh; var nm; var xr; var xi; var yr; var yi; var idx0; var idx1; var idx2; m = 1; for (l = n >> 2; l > 8; l >>= 2) { m <<= 1; } nh = n >> 1; nm = 4 * m; if (l === 8) { for (var k = 0; k < m; k++) { idx0 = 4 * k; for (var j = 0; j < k; j++) { j1 = 4 * j + 2 * ip[m + k]; k1 = idx0 + 2 * ip[m + j]; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = a[idx1 + 1]; yr = a[idx2]; yi = a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 += nm; k1 += 2 * nm; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = a[idx1 + 1]; yr = a[idx2]; yi = a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 += nm; k1 -= nm; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = a[idx1 + 1]; yr = a[idx2]; yi = a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 += nm; k1 += 2 * nm; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = a[idx1 + 1]; yr = a[idx2]; yi = a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 += nh; k1 += 2; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = a[idx1 + 1]; yr = a[idx2]; yi = a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 -= nm; k1 -= 2 * nm; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = a[idx1 + 1]; yr = a[idx2]; yi = a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 -= nm; k1 += nm; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = a[idx1 + 1]; yr = a[idx2]; yi = a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 -= nm; k1 -= 2 * nm; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = a[idx1 + 1]; yr = a[idx2]; yi = a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 += 2; k1 += nh; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = a[idx1 + 1]; yr = a[idx2]; yi = a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 += nm; k1 += 2 * nm; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = a[idx1 + 1]; yr = a[idx2]; yi = a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 += nm; k1 -= nm; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = a[idx1 + 1]; yr = a[idx2]; yi = a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 += nm; k1 += 2 * nm; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = a[idx1 + 1]; yr = a[idx2]; yi = a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 -= nh; k1 -= 2; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = a[idx1 + 1]; yr = a[idx2]; yi = a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 -= nm; k1 -= 2 * nm; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = a[idx1 + 1]; yr = a[idx2]; yi = a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 -= nm; k1 += nm; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = a[idx1 + 1]; yr = a[idx2]; yi = a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 -= nm; k1 -= 2 * nm; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = a[idx1 + 1]; yr = a[idx2]; yi = a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; } k1 = idx0 + 2 * ip[m + k]; j1 = k1 + 2; k1 += nh; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = a[idx1 + 1]; yr = a[idx2]; yi = a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 += nm; k1 += 2 * nm; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = a[idx1 + 1]; yr = a[idx2]; yi = a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 += nm; k1 -= nm; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = a[idx1 + 1]; yr = a[idx2]; yi = a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 -= 2; k1 -= nh; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = a[idx1 + 1]; yr = a[idx2]; yi = a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 += nh + 2; k1 += nh + 2; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = a[idx1 + 1]; yr = a[idx2]; yi = a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 -= nh - nm; k1 += 2 * nm - 2; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = a[idx1 + 1]; yr = a[idx2]; yi = a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; } } else { for (var k = 0; k < m; k++) { idx0 = 4 * k; for (var j = 0; j < k; j++) { j1 = 4 * j + ip[m + k]; k1 = idx0 + ip[m + j]; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = a[idx1 + 1]; yr = a[idx2]; yi = a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 += nm; k1 += nm; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = a[idx1 + 1]; yr = a[idx2]; yi = a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 += nh; k1 += 2; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = a[idx1 + 1]; yr = a[idx2]; yi = a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 -= nm; k1 -= nm; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = a[idx1 + 1]; yr = a[idx2]; yi = a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 += 2; k1 += nh; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = a[idx1 + 1]; yr = a[idx2]; yi = a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 += nm; k1 += nm; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = a[idx1 + 1]; yr = a[idx2]; yi = a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 -= nh; k1 -= 2; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = a[idx1 + 1]; yr = a[idx2]; yi = a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 -= nm; k1 -= nm; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = a[idx1 + 1]; yr = a[idx2]; yi = a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; } k1 = idx0 + ip[m + k]; j1 = k1 + 2; k1 += nh; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = a[idx1 + 1]; yr = a[idx2]; yi = a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 += nm; k1 += nm; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = a[idx1 + 1]; yr = a[idx2]; yi = a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; } } }; FloatFFT.prototype.bitrv2conj = function (n, ip, a, offa) { var j1; var k1; var l; var m; var nh; var nm; var xr; var xi; var yr; var yi; var idx0; var idx1; var idx2; m = 1; for (l = n >> 2; l > 8; l >>= 2) { m <<= 1; } nh = n >> 1; nm = 4 * m; if (l === 8) { for (var k = 0; k < m; k++) { idx0 = 4 * k; for (var j = 0; j < k; j++) { j1 = 4 * j + 2 * ip[m + k]; k1 = idx0 + 2 * ip[m + j]; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = -a[idx1 + 1]; yr = a[idx2]; yi = -a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 += nm; k1 += 2 * nm; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = -a[idx1 + 1]; yr = a[idx2]; yi = -a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 += nm; k1 -= nm; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = -a[idx1 + 1]; yr = a[idx2]; yi = -a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 += nm; k1 += 2 * nm; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = -a[idx1 + 1]; yr = a[idx2]; yi = -a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 += nh; k1 += 2; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = -a[idx1 + 1]; yr = a[idx2]; yi = -a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 -= nm; k1 -= 2 * nm; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = -a[idx1 + 1]; yr = a[idx2]; yi = -a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 -= nm; k1 += nm; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = -a[idx1 + 1]; yr = a[idx2]; yi = -a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 -= nm; k1 -= 2 * nm; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = -a[idx1 + 1]; yr = a[idx2]; yi = -a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 += 2; k1 += nh; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = -a[idx1 + 1]; yr = a[idx2]; yi = -a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 += nm; k1 += 2 * nm; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = -a[idx1 + 1]; yr = a[idx2]; yi = -a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 += nm; k1 -= nm; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = -a[idx1 + 1]; yr = a[idx2]; yi = -a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 += nm; k1 += 2 * nm; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = -a[idx1 + 1]; yr = a[idx2]; yi = -a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 -= nh; k1 -= 2; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = -a[idx1 + 1]; yr = a[idx2]; yi = -a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 -= nm; k1 -= 2 * nm; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = -a[idx1 + 1]; yr = a[idx2]; yi = -a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 -= nm; k1 += nm; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = -a[idx1 + 1]; yr = a[idx2]; yi = -a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 -= nm; k1 -= 2 * nm; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = -a[idx1 + 1]; yr = a[idx2]; yi = -a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; } k1 = idx0 + 2 * ip[m + k]; j1 = k1 + 2; k1 += nh; idx1 = offa + j1; idx2 = offa + k1; a[idx1 - 1] = -a[idx1 - 1]; xr = a[idx1]; xi = -a[idx1 + 1]; yr = a[idx2]; yi = -a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; a[idx2 + 3] = -a[idx2 + 3]; j1 += nm; k1 += 2 * nm; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = -a[idx1 + 1]; yr = a[idx2]; yi = -a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 += nm; k1 -= nm; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = -a[idx1 + 1]; yr = a[idx2]; yi = -a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 -= 2; k1 -= nh; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = -a[idx1 + 1]; yr = a[idx2]; yi = -a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 += nh + 2; k1 += nh + 2; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = -a[idx1 + 1]; yr = a[idx2]; yi = -a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 -= nh - nm; k1 += 2 * nm - 2; idx1 = offa + j1; idx2 = offa + k1; a[idx1 - 1] = -a[idx1 - 1]; xr = a[idx1]; xi = -a[idx1 + 1]; yr = a[idx2]; yi = -a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; a[idx2 + 3] = -a[idx2 + 3]; } } else { for (var k = 0; k < m; k++) { idx0 = 4 * k; for (var j = 0; j < k; j++) { j1 = 4 * j + ip[m + k]; k1 = idx0 + ip[m + j]; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = -a[idx1 + 1]; yr = a[idx2]; yi = -a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 += nm; k1 += nm; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = -a[idx1 + 1]; yr = a[idx2]; yi = -a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 += nh; k1 += 2; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = -a[idx1 + 1]; yr = a[idx2]; yi = -a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 -= nm; k1 -= nm; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = -a[idx1 + 1]; yr = a[idx2]; yi = -a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 += 2; k1 += nh; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = -a[idx1 + 1]; yr = a[idx2]; yi = -a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 += nm; k1 += nm; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = -a[idx1 + 1]; yr = a[idx2]; yi = -a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 -= nh; k1 -= 2; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = -a[idx1 + 1]; yr = a[idx2]; yi = -a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; j1 -= nm; k1 -= nm; idx1 = offa + j1; idx2 = offa + k1; xr = a[idx1]; xi = -a[idx1 + 1]; yr = a[idx2]; yi = -a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; } k1 = idx0 + ip[m + k]; j1 = k1 + 2; k1 += nh; idx1 = offa + j1; idx2 = offa + k1; a[idx1 - 1] = -a[idx1 - 1]; xr = a[idx1]; xi = -a[idx1 + 1]; yr = a[idx2]; yi = -a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; a[idx2 + 3] = -a[idx2 + 3]; j1 += nm; k1 += nm; idx1 = offa + j1; idx2 = offa + k1; a[idx1 - 1] = -a[idx1 - 1]; xr = a[idx1]; xi = -a[idx1 + 1]; yr = a[idx2]; yi = -a[idx2 + 1]; a[idx1] = yr; a[idx1 + 1] = yi; a[idx2] = xr; a[idx2 + 1] = xi; a[idx2 + 3] = -a[idx2 + 3]; } } }; FloatFFT.prototype.cfttree = function (n, j, k, a, offa, nw, w) { var i; var isplt; var m; var idx1 = offa - n; if ((k & 3) !== 0) { isplt = k & 1; if (isplt !== 0) { this.cftmdl1(n, a, idx1 + j, w, nw - (n >> 1)); } else { this.cftmdl2(n, a, idx1 + j, w, nw - n); } } else { m = n; for (i = k; (i & 3) === 0; i >>= 2) { m <<= 2; } isplt = i & 1; var idx2 = offa + j; if (isplt !== 0) { while ((m > 128)) { this.cftmdl1(m, a, idx2 - m, w, nw - (m >> 1)); m >>= 2; } ; } else { while ((m > 128)) { this.cftmdl2(m, a, idx2 - m, w, nw - m); m >>= 2; } ; } } return isplt; }; FloatFFT.prototype.cftleaf = function (n, isplt, a, offa, nw, w) { if (n === 512) { this.cftmdl1(128, a, offa, w, nw - 64); this.cftf161(a, offa, w, nw - 8); this.cftf162(a, offa + 32, w, nw - 32); this.cftf161(a, offa + 64, w, nw - 8); this.cftf161(a, offa + 96, w, nw - 8); this.cftmdl2(128, a, offa + 128, w, nw - 128); this.cftf161(a, offa + 128, w, nw - 8); this.cftf162(a, offa + 160, w, nw - 32); this.cftf161(a, offa + 192, w, nw - 8); this.cftf162(a, offa + 224, w, nw - 32); this.cftmdl1(128, a, offa + 256, w, nw - 64); this.cftf161(a, offa + 256, w, nw - 8); this.cftf162(a, offa + 288, w, nw - 32); this.cftf161(a, offa + 320, w, nw - 8); this.cftf161(a, offa + 352, w, nw - 8); if (isplt !== 0) { this.cftmdl1(128, a, offa + 384, w, nw - 64); this.cftf161(a, offa + 480, w, nw - 8); } else { this.cftmdl2(128, a, offa + 384, w, nw - 128); this.cftf162(a, offa + 480, w, nw - 32); } this.cftf161(a, offa + 384, w, nw - 8); this.cftf162(a, offa + 416, w, nw - 32); this.cftf161(a, offa + 448, w, nw - 8); } else { this.cftmdl1(64, a, offa, w, nw - 32); this.cftf081(a, offa, w, nw - 8); this.cftf082(a, offa + 16, w, nw - 8); this.cftf081(a, offa + 32, w, nw - 8); this.cftf081(a, offa + 48, w, nw - 8); this.cftmdl2(64, a, offa + 64, w, nw - 64); this.cftf081(a, offa + 64, w, nw - 8); this.cftf082(a, offa + 80, w, nw - 8); this.cftf081(a, offa + 96, w, nw - 8); this.cftf082(a, offa + 112, w, nw - 8); this.cftmdl1(64, a, offa + 128, w, nw - 32); this.cftf081(a, offa + 128, w, nw - 8); this.cftf082(a, offa + 144, w, nw - 8); this.cftf081(a, offa + 160, w, nw - 8); this.cftf081(a, offa + 176, w, nw - 8); if (isplt !== 0) { this.cftmdl1(64, a, offa + 192, w, nw - 32); this.cftf081(a, offa + 240, w, nw - 8); } else { this.cftmdl2(64, a, offa + 192, w, nw - 64); this.cftf082(a, offa + 240, w, nw - 8); } this.cftf081(a, offa + 192, w, nw - 8); this.cftf082(a, offa + 208, w, nw - 8); this.cftf081(a, offa + 224, w, nw - 8); } }; FloatFFT.prototype.cftf161 = function (a, offa, w, startw) { var wn4r; var wk1r; var wk1i; var x0r; var x0i; var x1r; var x1i; var x2r; var x2i; var x3r; var x3i; var y0r; var y0i; var y1r;