UNPKG

dct

Version:

Node.js implementation of the Discrete Cosine Transform (version 2 for now).

43 lines (34 loc) 1.25 kB
/*===========================================================================*\ * Discrete Cosine Transform * * (c) Vail Systems. Joshua Jung and Ben Bryan. 2015 * * This code is not designed to be highly optimized but as an educational * tool to understand the Mel-scale and its related coefficients used in * human speech analysis. \*===========================================================================*/ var cosMap = null; // Builds a cosine map for the given input size. This allows multiple input sizes to be memoized automagically // if you want to run the DCT over and over. var memoizeCosines = function(N) { cosMap = cosMap || {}; cosMap[N] = new Array(N*N); var PI_N = Math.PI / N; for (var k = 0; k < N; k++) { for (var n = 0; n < N; n++) { cosMap[N][n + (k * N)] = Math.cos(PI_N * (n + 0.5) * k); } } }; function dct(signal, scale) { var L = signal.length; scale = scale || 2; if (!cosMap || !cosMap[L]) memoizeCosines(L); var coefficients = signal.map(function () {return 0;}); return coefficients.map(function (__, ix) { return scale * signal.reduce(function (prev, cur, ix_, arr) { return prev + (cur * cosMap[L][ix_ + (ix * L)]); }, 0); }); }; module.exports = dct;