getMask and getStd were changed

develop
aleksey_k 2024-06-19 20:35:28 +09:00
parent 70d05e8726
commit f2cc08fe32
2 changed files with 151 additions and 44 deletions

View File

@ -33,19 +33,19 @@ export function specModel(spec, tol, color, visible) {
return result;
}; //построение упрощенной модели спектра
export function getMask(obj) {
export function getMask(options) {
let result = {}; //результат
let data = obj.src1.data; //массив точек спектра для сравнения с портретом
let mask = obj.src2.base; //массив точек базовой линии для построения портрета дефекта
let harms = obj.harms; //кол-во гармоник портрета
if (obj.freq * harms > obj.src2.frequency) { harms = Math.trunc(obj.src2.frequency / obj.freq) }; //проверяем максимальное кол-во гармоник в портрете
let data = options.src1.data; //массив точек спектра для сравнения с портретом
let mask = options.src2.base; //массив точек базовой линии для построения портрета дефекта
let harms = options.harms; //кол-во гармоник портрета
if (options.freq * harms > options.src2.frequency) { harms = Math.trunc(options.src2.frequency / options.freq) }; //проверяем максимальное кол-во гармоник в портрете
let df = 0; //отношение ширины фильтра частотному разрешению спектра
let dl = obj.lvl; //разность уровней гармонической и случайной составляющей вибрации
if (obj.filter != 0) {
df = obj.src2.frequency / obj.filter.width;
dl = 10 * Math.log10((obj.lvl ** 2) / df + 1);
let dl = options.lvl; //разность уровней гармонической и случайной составляющей вибрации
if (options.filter != 0) {
df = options.src2.frequency / options.filter.width;
dl = 10 * Math.log10((options.lvl ** 2) / df + 1);
};
let k = obj.coef; //коэффициент затухания
let k = options.coef; //коэффициент затухания
let x = 0; //индекс элемента массива для гармоники
let dx = 0; //коридор индексов
let xmin = 0; //левая граница коридора
@ -74,16 +74,16 @@ export function getMask(obj) {
let arr1 = [];
let arr2 = [];
switch (obj.type) {
switch (options.type) {
case 0: //обычный ряд
for (let i = 1; i <= harms; i++) {
x = Math.trunc(i * obj.freq / obj.src2.resolution); //определяем инднекс элемента массива для гармоники
dx = Math.trunc(i * (obj.freq * obj.tol / 100) / obj.src2.resolution); //коридор индексов массива для гармоники
x = Math.trunc(i * options.freq / options.src2.resolution); //определяем инднекс элемента массива для гармоники
dx = Math.trunc(i * (options.freq * options.tol / 100) / options.src2.resolution); //коридор индексов массива для гармоники
xmin = x - Math.round(dx / 2); //определяем индекс левой границы коридора
xmax = x + Math.round(dx / 2); //определяем индекс правой границы коридора
if (xmax > obj.src2.base.length) { xmax = obj.src2.base.length - 2 }; //проверяем выход границы за размер массива
for (let j = xmin; j <= xmax; j++) { mask[j] = obj.src2.base[j] + dl }; //записываем значение глубины модуляции для коридора
if (xmax > options.src2.base.length) { xmax = options.src2.base.length - 2 }; //проверяем выход границы за размер массива
for (let j = xmin; j <= xmax; j++) { mask[j] = options.src2.base[j] + dl }; //записываем значение глубины модуляции для коридора
dl = dl - (k * dl); //снижаем глубину модуляции с коэффициентом затухания
for (let j = xmin - 2; j <= xmax + 2; j++) {
@ -95,16 +95,16 @@ export function getMask(obj) {
break;
case 1: //четные составляющие
for (let i = 1; i <= harms; i++) {
x = Math.trunc(i * obj.freq / obj.src2.resolution); //инднекс элемента массива для гармоники
dx = Math.trunc(i * (obj.freq * obj.tol / 100) / obj.src2.resolution); //коридор индексов массива для гармоники
x = Math.trunc(i * options.freq / options.src2.resolution); //инднекс элемента массива для гармоники
dx = Math.trunc(i * (options.freq * options.tol / 100) / options.src2.resolution); //коридор индексов массива для гармоники
xmin = x - Math.round(dx / 2); //определяем индекс левой границы коридора
xmax = x + Math.round(dx / 2); //определяем индекс правой границы коридора
if (xmax > obj.src2.base.length) { xmax = obj.src2.base.length - 2 }; //проверяем выход границы за размер массива
if (xmax > options.src2.base.length) { xmax = options.src2.base.length - 2 }; //проверяем выход границы за размер массива
if (i % 2 > 0) {
for (let j = xmin; j <= xmax; j++) { mask[j] = obj.src2.base[j] + k * dl }; //записываем значение глубины модуляции для коридора (нечетная гармоника)
for (let j = xmin; j <= xmax; j++) { mask[j] = options.src2.base[j] + k * dl }; //записываем значение глубины модуляции для коридора (нечетная гармоника)
} else {
for (let j = xmin; j <= xmax; j++) { mask[j] = obj.src2.base[j] + dl }; //записываем значение глубины модуляции для коридора (четная гармоника)
for (let j = xmin; j <= xmax; j++) { mask[j] = options.src2.base[j] + dl }; //записываем значение глубины модуляции для коридора (четная гармоника)
dl = dl - (k * dl); //снижаем глубину модуляции с коэффициентом затухания
};
@ -120,17 +120,17 @@ export function getMask(obj) {
};
//формируем результат
result["name"] = obj.name; //имя маски дефекта
result["name"] = options.name; //имя маски дефекта
result["corr"] = correlation / harms; //средняя корреляция
result["data"] = mask; //массив данных портрета
//отрисовка графика на plot
if (obj.visible == true) {
if (options.visible == true) {
gtl.plot.add(
{
color: obj.color,
name: obj.name,
x: obj.src2.resolution,
color: options.color,
name: options.name + " (" + result.corr.toFixed(2) + ")",
x: options.src2.resolution,
y: mask
}
);

View File

@ -1,27 +1,134 @@
export function getStdMeasures(options) {
let __source = options.src;
let __time = 0.1;
let __avg = 5;
export function getStdMeasure(src) {
let __result = {}; //результат
if (options.time != undefined) { __time = options.time };
if (options.avg != undefined) { __avg = options.avg };
//фильтрация диапазона в сигнале для определения СКЗ вибрации
var __filter = gtl.add_filter_iir(src);
__filter.kind = gtl.filter_iir.butterworth;
__filter.type = gtl.filter_iir.lowpass;
__filter.order = 8;
__filter.frequency = 1000;
function getFilter(L, R) {
let __filter = gtl.add_filter_iir(__source);
__filter.kind = gtl.filter_iir.butterworth;
__filter.order = 10;
//определение среднего квадратического значения в диапазоне фильтра до 1000 Гц
var __rms = gtl.add_value_rms(__filter);
__rms.time = 0.1;
__rms.avg_cnt = 4;
switch (L) {
case "lowpass":
__filter.type = gtl.filter_iir.lowpass;
__filter.frequency = R;
break;
//определение амплитудного значения в диапазоне фильтра до 1000 Гц
var __ampl = gtl.add_value_ampl(__filter);
__ampl.time = 0.1;
__ampl.avg_cnt = 4;
case "highpass":
__filter.type = gtl.filter_iir.highpass;
__filter.frequency = R;
break;
__result = {
rms1000: __rms,
ampl1000: __ampl
default:
__filter.type = gtl.filter_iir.bandpass;
__filter.frequency = (R - L) / 2 + L;
__filter.width = R - L;
break;
};
return __filter;
}; //формирование фильтра
function getIntg(src, taps, scale) {
let __intg = gtl.add_intg(src);
__intg.taps = taps;
__intg.scale = scale;
return __intg;
}; //интегрирование сигнала
function getRMS(src) {
let __rms = gtl.add_value_rms(src);
__rms.time = __time;
__rms.avg_cnt = __avg;
return __rms;
}; //получение СКЗ
function getAmpl(src) {
let __ampl = gtl.add_value_ampl(src);
__ampl.time = __time;
__ampl.avg_cnt = __avg;
return __ampl;
}; //получение амплитуды
function getKurt(src) {
let __kurt = gtl.add_value_kurt(src);
__kurt.time = __time;
__kurt.avg_cnt = __avg;
return __kurt;
}; //получение эксцесса
//[Набор фильтров]
let __filter_2_200 = getFilter(2, 200);
let __filter_2_1000 = getFilter(2, 1000);
let __filter_10_1000 = getFilter(10, 1000);
let __filter_2_3000 = getFilter(2, 3000);
let __filter_2_10000 = getFilter(2, 10000);
let __filter_100_10000 = getFilter(100, 10000);
let __filter_2_5k = getFilter(2500, 5000);
let __filter_5_10k = getFilter(5000, 10000);
let __filter_10_20k = getFilter(10000, 20000);
let __filter_30_40k = getFilter(30000, 40000);
let __filter_40_80k = getFilter(40000, 80000);
//[Набор интеграторов]
let __pre_int1 = getIntg(__filter_2_1000, 1, 1000);
let __pre_int2 = getIntg(__filter_10_1000, 1, 1000);
let __pre_int3 = getIntg(__filter_2_200, 2, 1);
/*let __int1 = gtl.add_filter_iir(__pre_int1);
__int1.kind = gtl.filter_iir.butterworth;
__int1.type = gtl.filter_iir.highpass;
__int1.order = 10;
__int1.frequency = 2;*/
/*let __int2 = gtl.add_filter_iir(__pre_int2);
__int2.kind = gtl.filter_iir.butterworth;
__int2.type = gtl.filter_iir.highpass;
__int2.order = 10;
__int2.frequency = 2;*/
//[Расчет набора параметров]
let __rms_A2_3000 = getRMS(__filter_2_3000); //СКЗ виброускорения в диапазоне 2-3000 Гц
let __rms_A2_10000 = getRMS(__filter_2_10000); //СКЗ виброускорения в диапазоне 2-10000 Гц
let __rms_A100_10000 = getRMS(__filter_100_10000); //СКЗ виброускорения в диапазоне 100-10000 Гц
let __ampl_A100_10000 = getAmpl(__filter_100_10000); //амплитуда виброускорения в диапазоне 100-10000 Гц
let __ampl_full = getAmpl(__source); //амплитуда виброускорения во всем диапазоне измерения
let __rms_V2_1000 = getRMS(__pre_int1); //СКЗ виброскорости в диапазоне 2-1000 Гц
let __rms_V10_1000 = getRMS(__pre_int2); //СКЗ виброскорости в диапазоне 10-1000 Гц
let __rms_S2_200 = getRMS(__pre_int3); //СКЗ виброперемещения в диапазоне 2-200 Гц
let __kurt_full = getKurt(__source); //эксцесс во всем диапазоне измерения
let __kurt_2_5k = getKurt(__filter_2_5k); //эксцесс в полосе 2.5-5 кГц
let __kurt_5_10k = getKurt(__filter_5_10k); //эксцесс в полосе 5-10 кГц
let __kurt_10_20k = getKurt(__filter_10_20k); //эксцесс в полосе 10-20 кГц
let __kurt_30_40k = getKurt(__filter_30_40k); //эксцесс в полосе 30-40 кГц
let __kurt_40_80k = getKurt(__filter_40_80k); //эксцесс в полосе 40-80 кГц
let __result = {
rms_A2_3000: __rms_A2_3000,
rms_A2_10000: __rms_A2_10000,
rms_A100_10000: __rms_A100_10000,
ampl_A100_10000: __ampl_A100_10000,
ampl_full: __ampl_full,
rms_V2_1000: __rms_V2_1000,
rms_V10_1000: __rms_V10_1000,
rms_S2_200: __rms_S2_200,
kurt_full: __kurt_full,
kurt_2_5k: __kurt_2_5k,
kurt_5_10k: __kurt_5_10k,
kurt_10_20k: __kurt_10_20k,
kurt_30_40k: __kurt_30_40k,
kurt_40_80k: __kurt_40_80k
};
return __result;