@thi.ng/dsp
Version:
Composable signal generators, oscillators, filters, FFT, spectrum, windowing & related DSP utils
84 lines (83 loc) • 2.07 kB
JavaScript
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
};