diff --git a/mask_func.js b/mask_func.js index 773fb1e..12794e4 100644 --- a/mask_func.js +++ b/mask_func.js @@ -1,71 +1,13 @@ -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) { +export function spec_model(spec, tol) { 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; + let level = spec.peaks[i].level; //получаем значение уровня гармоники из массива обнаруженных гармоник + imin = Math.round((freq - freq * 0.5 * tol / 100) / spec.resolution); + imax = Math.round((freq + freq * 0.5 * tol / 100) / spec.resolution); for (let j = imin; j <= imax; j++) { model[j] = spec.base[j] + level }; }; @@ -82,3 +24,61 @@ export function spec_model(spec) { return model; }; //построение упрощенной модели спектра +export function mask(obj) { + let mask = obj.spec.base; //исходный массив точек для построения портрета дефекта + let df = 0; //отношение ширины фильтра частотному разрешению спектра + let dl = obj.lvl; //разность уровней гармонической и случайной составляющей вибрации + if (obj.filter != 0) { + df = obj.filter.width / obj.spec.resolution; + dl = 10 * Math.log10((obj.lvl ** 2) * df + 1); + }; + let k = 0; //коэффициент затухания + let xmin = 0; //левая граница коридора + let xmax = 0; //правая граница коридора + + switch (obj.type) { + case 0: //маска износа: коэффициент затухания 30-50% + for (let i = 1; i <= obj.harms; i++) { + k = 0.5; + xmin = Math.round(i * (obj.freq - obj.freq * 0.5 * obj.tol / 100) / obj.spec.resolution); //определяем индекс левой границы коридора + xmax = Math.round(i * (obj.freq + obj.freq * 0.5 * obj.tol / 100) / obj.spec.resolution); //определяем индекс правой границы коридора; + for (let j = xmin; j <= xmax; j++) { mask[j] = obj.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 * (obj.freq - obj.freq * 0.5 * obj.tol / 100) / obj.spec.resolution); //определяем индекс левой границы коридора + xmax = Math.round(i * (obj.freq + obj.freq * 0.5 * obj.tol / 100) / obj.spec.resolution); //определяем индекс правой границы коридора; + for (let j = xmin; j <= xmax; j++) { mask[j] = obj.spec.base[j] + dl }; //записываем значение глубины модуляции для коридора + dl = dl - (k * dl); //снижаем глубину модуляции с коэффициентом затухания + }; + break; + case 2: //маска перекоса: коэффициент выраженности 0-20% + for (let i = 1; i < obj.harms; i++) { + if (i % 2 > 0) { + k = 0.1; + + }; + }; + break; + default: + break; + }; + + //отрисовка пользовательского графика + gtl.plot.add( + { + color: 0xff0000, + name: obj.name, + x: obj.spec.resolution, + y: mask + } + ); + + return mask; +}; //построение портрета дефекта + + +