Gtld crosscorr
Краткое описание
Функция предназначена для проведения кросс корреляционного анализа сигнала с фиксированным сдвигом на предмет наличия линейной связи двух массивов (степень похожести). В результате работы функции возвращается объект с параметрами расчетов.
Синтаксис
Стандартная конструкция выглядит таким образом:
var __autocorr = getAutoCorr(
{
name: "Correlation form", //имя графика функции
src: __max, //массив данных пиковой формы сигнала
lag: 0.5, //коэффициент смещения сигнала
color: 0x6A5ACD, //цвет отрисовки графика в формате HEX
time: 0.01, //цена деления оси времени, с
canvas: canvas3 //координатная плоскость для отрисовки графика функции
}
);
Результат
__autocorr.avg- среднее значение модуля коэффициента автокорреляции;__autocorr.rms- СКЗ коэффициента автокорреляции;__autocorr.ampl- максимальное значение коэффициента автокорреляции после 1% формы сигнала;__autocorr.data- массив значений коэффициента автокорреляции (для построения графика);
Содержание функции
class corrClass {
constructor(args) {
this.x = args.x; // массив данных X
this.y = args.y; // массив данных Y
this.lag = args.lag; // величина сдвига (количество индексов)
}
// Вычисление коэффициента корреляции Пирсона
calcCorr(x, y) {
const meanX = x.reduce((sum, val) => sum + val, 0) / x.length; // вычисление среднего значения по массиву X
const meanY = y.reduce((sum, val) => sum + val, 0) / y.length; // вычисление среднего значения по массиву Y
let cov = 0, varX = 0, varY = 0;
for (let i = 0; i < x.length; i++) {
cov += (x[i] - meanX) * (y[i] - meanY); // ковариация
varX += (x[i] - meanX) * (x[i] - meanX); // дисперсия первого массива (отклонение от среднего)
varY += (y[i] - meanY) * (y[i] - meanY); // дисперсия второго массива (отклонение от среднего)
}
if (varX === 0 || varY === 0) return 0; // изменчивости нет — корреляцию посчитать нельзя. Возвращаем 0
return cov / Math.sqrt(varX * varY)
}
// Вычисление кросс-корреляции (коэффициент Пирсона)
calcCross(x, y, lag) {
const n = x.length; // длина массива
const outLen = 2 * lag + 1;
const result = new Float64Array(outLen); // массив результатов расчета корреляции (кросс корреляционная функция)
// Добавляем lag нулей в начало и lag нулей в конец
const zeros = Array(lag).fill(0); // нулевой массив
const xArr = [...zeros, ...x, ...zeros]; // расширяем массив x
for (let i = 0; i < outLen; i++) {
const start = i; // при i=0 берем окно с lag нулей слева
const xWin = xArr.slice(start, start + n); // вырезаем из массива окно, равной длины
result[i] = this.__calcCorr(xWin, y); // вычисляем корреляцию
}
return result
}
}