UNPKG

@sebastbake/music-tempo

Version:

Finding out tempo of the music

149 lines (134 loc) 5.75 kB
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <base data-ice="baseUrl" href="../../"> <title data-ice="title">src/FFT.js | API Document</title> <link type="text/css" rel="stylesheet" href="css/style.css"> <link type="text/css" rel="stylesheet" href="css/prettify-tomorrow.css"> <script src="script/prettify/prettify.js"></script> <script src="script/manual.js"></script> </head> <body class="layout-container" data-ice="rootContainer"> <header> <a href="./">Home</a> <a href="identifiers.html">Reference</a> <a href="source.html">Source</a> <a data-ice="repoURL" href="https://github.com/killercrush/music-tempo" class="repo-url-github">Repository</a> <div class="search-box"> <span> <img src="./image/search.png"> <span class="search-input-edge"></span><input class="search-input"><span class="search-input-edge"></span> </span> <ul class="search-result"></ul> </div> </header> <nav class="navigation" data-ice="nav"><div> <ul> <li data-ice="doc"><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/Agent.js~Agent.html">Agent</a></span></span></li> <li data-ice="doc"><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/BeatTracking.js~BeatTracking.html">BeatTracking</a></span></span></li> <li data-ice="doc"><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/FFT.js~FFT.html">FFT</a></span></span></li> <li data-ice="doc"><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/MusicTempo.js~MusicTempo.html">MusicTempo</a></span></span></li> <li data-ice="doc"><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/OnsetDetection.js~OnsetDetection.html">OnsetDetection</a></span></span></li> <li data-ice="doc"><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/TempoInduction.js~TempoInduction.html">TempoInduction</a></span></span></li> </ul> </div> </nav> <div class="content" data-ice="content"><h1 data-ice="title">src/FFT.js</h1> <pre class="source-code line-number raw-source-code"><code class="prettyprint linenums" data-ice="content">/** * Class containing methods for Fast Fourier Transform * @class */ export default class FFT { /** * Get Hamming window * @param {Number} bufferSize - windows size * @return {Array} wnd - Hamming window */ static getHammingWindow(bufferSize) { const a = 25 / 46; const b = 21 / 46; const scale = 1 / bufferSize / 0.54; const sqrtBufferSize = Math.sqrt(bufferSize); const factor = (Math.PI * 2) / bufferSize; let wnd = []; for (let i = 0; i &lt; bufferSize; i++) { wnd[i] = sqrtBufferSize * (scale * (a - b * Math.cos(factor * i))) ; } return wnd; } /** * Computes FFT and converts the results to magnitude representation * @param {Array} re - the real part of the input data and the magnitude of the output data * @param {Array} im - the imaginary part of the input data */ static getSpectrum(re, im) { const direction = -1; const n = re.length; const bits = Math.round(Math.log(n) / Math.log(2)); const twoPI = Math.PI * 2; if (n != (1 &lt;&lt; bits)) throw new Error(&quot;FFT data must be power of 2&quot;); let localN; let j = 0; for (let i = 0; i &lt; n-1; i++) { if (i &lt; j) { let temp = re[j]; re[j] = re[i]; re[i] = temp; temp = im[j]; im[j] = im[i]; im[i] = temp; } let k = n / 2; while ((k &gt;= 1) &amp;&amp; (k - 1 &lt; j)) { j = j - k; k = k / 2; } j = j + k; } for(let m = 1; m &lt;= bits; m++) { localN = 1 &lt;&lt; m; let Wjk_r = 1; let Wjk_i = 0; let theta = twoPI / localN; let Wj_r = Math.cos(theta); let Wj_i = direction * Math.sin(theta); let nby2 = localN / 2; for (j = 0; j &lt; nby2; j++) { for (let k = j; k &lt; n; k += localN) { let id = k + nby2; let tempr = Wjk_r * re[id] - Wjk_i * im[id]; let tempi = Wjk_r * im[id] + Wjk_i * re[id]; re[id] = re[k] - tempr; im[id] = im[k] - tempi; re[k] += tempr; im[k] += tempi; } let wtemp = Wjk_r; Wjk_r = Wj_r * Wjk_r - Wj_i * Wjk_i; Wjk_i = Wj_r * Wjk_i + Wj_i * wtemp; } } for (let i = 0; i &lt; re.length; i++) { let pow = re[i] * re[i] + im[i] * im[i]; //im[i] = Math.atan2(im[i], re[i]); re[i] = pow; } for (let i = 0; i &lt; re.length; i++) re[i] = Math.sqrt(re[i]); } }</code></pre> </div> <footer class="footer"> Generated by <a href="https://esdoc.org">ESDoc<span data-ice="esdocVersion">(0.5.2)</span><img src="./image/esdoc-logo-mini-black.png"></a> </footer> <script src="script/search_index.js"></script> <script src="script/search.js"></script> <script src="script/pretty-print.js"></script> <script src="script/inherited-summary.js"></script> <script src="script/test-summary.js"></script> <script src="script/inner-link.js"></script> <script src="script/patch-for-local.js"></script> </body> </html>