UNPKG

@thi.ng/dsp

Version:

Composable signal generators, oscillators, filters, FFT, spectrum, windowing & related DSP utils

84 lines (83 loc) 2.07 kB
import { isNumber } from "@thi.ng/checks/is-number"; import { PI, TAU } from "@thi.ng/math/api"; const PI4 = 4 * PI; const PI6 = 6 * PI; const sin = Math.sin; const cos = Math.cos; const window = (fn, lenOfBuf) => { const buf = isNumber(lenOfBuf) ? new Float64Array(lenOfBuf) : lenOfBuf; const n = buf.length - 1; for (let i = 0; i <= n; i++) { buf[i] = fn(i, n); } return buf; }; const applyWindow = (signal, window2, out = signal) => { for (let i = signal.length; i-- > 0; ) { out[i] = signal[i] * window2[i]; } return out; }; const windowRect = () => 1; const windowBartlett = (i, n) => 1 - Math.abs((i - n / 2) / (n / 2)); const windowWelch = (i, n) => 1 - ((i - n / 2) / (n / 2)) ** 2; const windowSin = (i, n) => sin(PI * i / n); const windowSinPow = (k) => (i, n) => sin(PI * i / n) ** k; const windowLanczos = (i, n) => { i = PI * (2 * i / n - 1); return sin(i) / i; }; const __windowCosSum = (k) => { let ik = 1 - k; return (i, n) => k - ik * cos(TAU * i / n); }; const __windowCosSum3 = (k1, k2, k3) => (i, n) => { i /= n; return k1 + k2 * cos(TAU * i) + k3 * cos(PI4 * i); }; const __windowCosSum4 = (k1, k2, k3, k4) => (i, n) => { i /= n; return k1 + k2 * cos(TAU * i) + k3 * cos(PI4 * i) + k4 * cos(PI6 * i); }; const windowHann = __windowCosSum(0.5); const windowHamming = __windowCosSum(0.53836); const windowBlackman = __windowCosSum3(0.42, -0.5, 0.08); const windowBlackmanHarris = __windowCosSum4( 0.35875, -0.48829, 0.14128, 0.01168 ); const windowNuttall = __windowCosSum4( 0.355768, -0.487396, 0.144232, -0.012604 ); const windowBlackmanNuttall = __windowCosSum4( 0.3635819, -0.4891775, 0.1365995, -0.0106411 ); const windowGauss = (a = 0.4) => (i, n) => { n /= 2; return Math.exp(-0.5 * ((i - n) / (a * n)) ** 2); }; export { applyWindow, window, windowBartlett, windowBlackman, windowBlackmanHarris, windowBlackmanNuttall, windowGauss, windowHamming, windowHann, windowLanczos, windowNuttall, windowRect, windowSin, windowSinPow, windowWelch };