gtld2-diag-scripts/getCorr.js

64 lines
3.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

export function getCorr(src1, src2) {
let arr1 = src1.data;
let arr2 = src2.data;
let X = 0; //аргумент 1
let Y = 0; //аргумент 2
let Z = 0; //аргумент 3
let arr1_avg = arr1.reduce((acc, item) => (acc + item)) / arr1.length; //среднее значение массива 1
let arr2_avg = arr2.reduce((acc, item) => (acc + item)) / arr2.length; //среднее значение массива 2
for (let i = 0; i < arr1.length; i++) {
X += (arr1[i] - arr1_avg) * (arr2[i] - arr2_avg);
Y += (arr1[i] - arr1_avg) ** 2;
Z += (arr2[i] - arr2_avg) ** 2;
};
return X / (Math.sqrt(Y) * Math.sqrt(Z));
}; //рассчет корреляции
export function getAutoCorr(options) {
let result = {}; //результат
let plot = []; //массив значений корреляции для графика
let arr = options.src.data;
let lag = 0.5;
let X = 0; //аргумент 1
let Y = 0; //аргумент 2
if (options.lag <= 0.5) { lag = options.lag } else { lag = 0.5 };
let T = Math.floor(arr.length * lag); //определяем количество индексов (шагов) для смещения массива
let avg = arr.reduce((acc, item) => (acc + item)) / arr.length; //среднее значение массива
Y = arr.reduce((acc, item) => (acc + (item - avg) ** 2)); //рассчитываем знаменатель функции
for (let i = 0; i < T; i++) {
let Rh = arr.slice(- i); //отделяем "хвост" массива
let Lt = arr.slice(0, - i); //отделяем "тело" массива
let arr2 = [].concat(Rh, Lt); //соединяем части массива
for (let j = 0; j < arr.length; j++) { X += (arr[j] - avg) * (arr2[j] - avg); };
plot.push(X / Y); //записываем значение в массив коэффициентов
X = 0;
}; //смещение массива
let plot0 = plot.slice(Math.floor(0.03 * plot.length)); //убираем из массива первые 3% значений коэффициента (т.к. в нуле всегда значение 1.0)
let akf_avg = plot0.reduce((acc, item) => (acc + item)) / plot0.length; //среднее значение коэффициента
let akf_sqr = plot0.reduce((acc, item) => (acc + item ** 2)); //сумма квадратов значений
let akf_rms = Math.sqrt(akf_sqr / plot0.length); //СКЗ коэффициента
let akf_max = Math.max(...plot0); //определяем максимальное значение коэффициента
result["avg"] = akf_avg;
result["rms"] = akf_rms;
result["ampl"] = akf_max;
result["data"] = plot;
//отрисовка графика на plot
if (options.canvas != undefined) {
options.canvas.add(
{
color: options.color,
name: options.name,
x: options.src.resolution,
y: plot
}
);
};
return result;
}; //рассчет автокорреляции