From f2cc08fe323a0e3d8f8d03b4ddcce3f81cd827ed Mon Sep 17 00:00:00 2001 From: aleksey_k Date: Wed, 19 Jun 2024 20:35:28 +0900 Subject: [PATCH] getMask and getStd were changed --- getMask.js | 50 ++++++++-------- getStdMeasures.js | 145 ++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 151 insertions(+), 44 deletions(-) diff --git a/getMask.js b/getMask.js index 04824bb..e71915d 100644 --- a/getMask.js +++ b/getMask.js @@ -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 } ); diff --git a/getStdMeasures.js b/getStdMeasures.js index daf1bdc..600a65a 100644 --- a/getStdMeasures.js +++ b/getStdMeasures.js @@ -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;