dsp-collection
Version:
A collection of JavaScript modules for digital signal processing (written in TypeScript)
54 lines • 2.01 kB
JavaScript
import * as WindowFunctions from "./WindowFunctions.js";
import * as ArrayUtils from "../utils/ArrayUtils.js";
function autocorrelationKernel(x, distance, n) {
let sum = 0;
for (let i = 0; i < n; i++) {
sum += x[i] * x[i + distance];
}
return sum;
}
export function nonPeriodicAutocorrelationSingle(x, distance, compensate) {
const n = x.length - distance;
let sum = autocorrelationKernel(x, distance, n);
if (compensate && n > 0) {
sum *= x.length / n;
}
return sum;
}
export function findNonPeriodicAutocorrelationMaximum(x, minDistance, maxDistance, fixedOverlapWidth) {
let maxVal = -Infinity;
let maxPos = minDistance;
for (let distance = minDistance; distance < maxDistance; distance++) {
const val = fixedOverlapWidth ?
autocorrelationKernel(x, distance, x.length - maxDistance) :
nonPeriodicAutocorrelationSingle(x, distance, true);
if (val > maxVal) {
maxVal = val;
maxPos = distance;
}
}
return maxPos;
}
export function nonPeriodicAutocorrelation(x, normalize) {
const n = x.length;
const r = new Float64Array(n);
for (let distance = 0; distance < n; distance++) {
r[distance] = nonPeriodicAutocorrelationSingle(x, distance, true);
}
if (normalize && n > 0 && r[0] != 0) {
const max = r[0];
for (let distance = 0; distance < n; distance++) {
r[distance] /= max;
}
}
return r;
}
export function windowedNonPeriodicAutocorrelation(x, windowFunction, normalize) {
const windowed = WindowFunctions.applyWindow(x, windowFunction);
const autoCorr = nonPeriodicAutocorrelation(windowed, normalize);
const window = WindowFunctions.getWindowTable(windowFunction, x.length);
const windowAutoCorr = nonPeriodicAutocorrelation(window, true);
const compensated = ArrayUtils.divide(autoCorr, windowAutoCorr);
return compensated;
}
//# sourceMappingURL=Autocorrelation.js.map