gtld2-diag-scripts/mask_func.js

85 lines
4.5 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 mask(spec, filter, frq, harms, lvl, tol, state) {
let mask = spec.base; //исходный массив точек для построения портрета дефекта
let df = 0; //отношение ширины фильтра частотному разрешению спектра
let dl = lvl; //разность уровней гармонической и случайной составляющей вибрации
if (filter != 0) {
df = filter.width / spec.resolution;
dl = 10 * Math.log10((lvl ** 2) * df + 1);
};
let k = 0; //коэффициент затухания
let xmin = 0; //левая граница коридора
let xmax = 0; //правая граница коридора
switch (state) {
case 0: //маска износа: коэффициент затухания 30-50%
for (let i = 1; i <= harms; i++) {
k = 0.5;
xmin = Math.round(i * (frq - frq * 0.5 * tol / 100) / spec.resolution); //определяем индекс левой границы коридора
xmax = Math.round(i * (frq + frq * 0.5 * tol / 100) / spec.resolution); //определяем индекс правой границы коридора;
for (let j = xmin; j <= xmax; j++) { mask[j] = spec.base[j] + dl }; //записываем значение глубины модуляции для коридора
dl = dl - (k * dl); //снижаем глубину модуляции с коэффициентом затухания
};
break;
case 1: //маска дефекта: коэффициент затухания 5-10%
for (let i = 1; i <= harms; i++) {
k = 0.1;
xmin = Math.round(i * (frq - frq * 0.5 * tol / 100) / spec.resolution); //определяем индекс левой границы коридора
xmax = Math.round(i * (frq + frq * 0.5 * tol / 100) / spec.resolution); //определяем индекс правой границы коридора;
for (let j = xmin; j <= xmax; j++) { mask[j] = spec.base[j] + dl }; //записываем значение глубины модуляции для коридора
dl = dl - (k * dl); //снижаем глубину модуляции с коэффициентом затухания
};
break;
case 2: //маска перекоса: коэффициент выраженности 0-20%
for (let i = 1; i < harms; i++) {
if (i % 2 > 0) {
k = 0.1;
};
};
break;
default:
break;
};
//отрисовка пользовательского графика
gtl.plot.add(
{
color: 0xff0000,
name: "mask_" + spec.name,
x: spec.resolution,
y: mask
}
);
return mask;
}; //построение портрета дефекта
export function spec_model(spec) {
let model = spec.base; //исходный массив точек для построения упрощенной модели спектра
let imin = 0; //левый соседний индекс
let imax = 0; //правая соседний индекс
let df = 0; //ширина гармоники в модели спектра (количество индексов в массиве)
for (let i = 0; i < spec.peaks.length; i++) {
let freq = spec.peaks[i].freq; //получаем значение частоты гармоники из массива обнаруженных гармоник
let level = spec.peaks[i].level; //получаем значение уровня гармоники из массива обнаруженных гармоник
let idx = Math.round(freq / spec.resolution); //определяем индекс значения частоты с массиве модели
imin = idx - df;
imax = idx + df;
for (let j = imin; j <= imax; j++) { model[j] = spec.base[j] + level };
};
//отрисовка пользовательского графика
gtl.plot.add(
{
color: 0x44944A,
name: "model_" + spec.name,
x: spec.resolution,
y: model
}
);
return model;
}; //построение упрощенной модели спектра