@sebastbake/music-tempo
Version:
Finding out tempo of the music
149 lines (134 loc) • 5.75 kB
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 < 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 << bits))
throw new Error("FFT data must be power of 2");
let localN;
let j = 0;
for (let i = 0; i < n-1; i++) {
if (i < 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 >= 1) && (k - 1 < j)) {
j = j - k;
k = k / 2;
}
j = j + k;
}
for(let m = 1; m <= bits; m++) {
localN = 1 << 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 < nby2; j++) {
for (let k = j; k < 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 < 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 < 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>