Gtl.ranges var: различия между версиями
Перейти к навигации
Перейти к поиску
| Строка 2: | Строка 2: | ||
<pre> | <pre> | ||
"use strict"; | "use strict"; | ||
let options = gtl.options; | |||
let point = gtl.options.point; | |||
let record = gtl.options.record; | |||
let signals = gtl.options.record.signalsModel; | |||
let src = gtl.analog_inputs[0]; //источник сигнала | let src = gtl.analog_inputs[0]; //источник сигнала | ||
let time = | let time = 2; //время записи для анализа | ||
let time_window = 0.02 //временное окно наблюдения | let time_window = 0.02 //временное окно наблюдения | ||
let time_impulse = | let time_impulse = 0.5 //временное окно для анализа импульса (не менее времени построения спектра) | ||
let time_pre = time_window / 2; //время предыстории | |||
let ranges = []; //массив диапазонов для импульсов | let ranges = []; //массив диапазонов для импульсов | ||
let tries = 0; //циклы диагностки | let tries = 0; //циклы диагностки | ||
let is_ranges = false; //состояние готовности диапазонов | let is_ranges = false; //состояние готовности диапазонов | ||
let | let __max = gtl.create_moving_max({ | ||
src: src, | src: src, | ||
name: "max", | |||
time: time_window | |||
}); //скользящая амплитуда для создания "огибающей" импульса | |||
__max.history = time; | |||
let __thresh = gtl.create_moving_thresh({ | |||
src: __max, | |||
name: "thresh", | name: "thresh", | ||
time: time_window, | time: time_window, | ||
level: | level: 315 | ||
}); //порог | }); //порог | ||
__thresh.history = time; | |||
gtl.diagnostic.interval = time; //интервал запуска диагностики | |||
__thresh.triggered.connect(thresh_triggered_event); //подключаем функцию | |||
function thresh_triggered_event(flag, sample) { | function thresh_triggered_event(flag, sample) { | ||
if (is_ranges) return; | if (is_ranges) return; | ||
if (flag) { | if (flag) { | ||
let start = sample / | let start = (sample / __thresh.rate) - time_pre; //время срабатывания триггера | ||
gtl.log.info("trigger on time", start); | gtl.log.info("trigger on time", start); | ||
| Строка 31: | Строка 44: | ||
}; | }; | ||
ranges.push(range); //добавляем диапазон в массив | ranges.push(range); //добавляем диапазон в массив | ||
}; | }; | ||
}; | }; | ||
// Функция диагностики. | |||
/* | |||
Первый запуск функции диагностики происходит после проигрывания всего сигнала и определения массива диапазонов по срабатыванию триггера | |||
После этого происходит добавление массива пользовательских диапазонов в плеер, отрисовка (при необходимости) сигнала триггера | |||
Затем устанавливается интервал запуска функции диагностики, равный временному окну для анализа импульса и запускается отсчет циклов (попыток) диагностики | |||
Как только количество циклов (попыток) сравнивается с количеством установленных пользовательских диапазонов, диагностика останавливается | |||
*/ | |||
let plot = gtl.plots.add("Impulses"); //создаем координатную плоскость | let plot = gtl.plots.add("Impulses"); //создаем координатную плоскость | ||
function diagnose() { | function diagnose() { | ||
if (tries >= | if (tries >= ranges.length) gtl.diagnostic.stop(); | ||
if (!is_ranges) { | if (!is_ranges) { | ||
gtl.player.custom_ranges = ranges; //добавляем пользовательские диапазоны в плеер | gtl.player.custom_ranges = ranges; //добавляем пользовательские диапазоны в плеер | ||
| Строка 45: | Строка 64: | ||
gtl.log.info('ranges', JSON.stringify(ranges)); | gtl.log.info('ranges', JSON.stringify(ranges)); | ||
is_ranges = true; //пользовательские диапазоны готовы | is_ranges = true; //пользовательские диапазоны готовы | ||
plot.add({ | |||
color: 0x0000ff, //цвет графика | |||
name: "max", //наименование графика | |||
x: 1 / __max.rate, //частотное разрешение | |||
y: __max.getHistoryArray() //значения амплитуд | |||
}); //рисуем сигнал для контроля | |||
plot.add({ | |||
color: 0xff00ff, //цвет графика | |||
name: "thresh", //наименование графика | |||
x: 1 / __thresh.rate, //частотное разрешение | |||
y: __thresh.getHistoryArray() //значения амплитуд | |||
}); //рисуем сигнал для контроля | |||
} | } | ||
gtl.diagnostic.interval = time_impulse; //задаем время запуска функции диагностики, равное длине импульса | |||
gtl.log.info('diagnostic', `attempt ${tries} - ${true}`); | gtl.log.info('diagnostic', `attempt ${tries} - ${true}`); | ||
/* | |||
Математика обработки сигнала | |||
*/ | |||
tries++; | tries++; | ||
} | } | ||
</pre> | </pre> | ||
Версия от 01:14, 25 марта 2026
Уствновка пользовательских диапазонов воспроизведения сигнала по триггеру
"use strict";
let options = gtl.options;
let point = gtl.options.point;
let record = gtl.options.record;
let signals = gtl.options.record.signalsModel;
let src = gtl.analog_inputs[0]; //источник сигнала
let time = 2; //время записи для анализа
let time_window = 0.02 //временное окно наблюдения
let time_impulse = 0.5 //временное окно для анализа импульса (не менее времени построения спектра)
let time_pre = time_window / 2; //время предыстории
let ranges = []; //массив диапазонов для импульсов
let tries = 0; //циклы диагностки
let is_ranges = false; //состояние готовности диапазонов
let __max = gtl.create_moving_max({
src: src,
name: "max",
time: time_window
}); //скользящая амплитуда для создания "огибающей" импульса
__max.history = time;
let __thresh = gtl.create_moving_thresh({
src: __max,
name: "thresh",
time: time_window,
level: 315
}); //порог
__thresh.history = time;
gtl.diagnostic.interval = time; //интервал запуска диагностики
__thresh.triggered.connect(thresh_triggered_event); //подключаем функцию
function thresh_triggered_event(flag, sample) {
if (is_ranges) return;
if (flag) {
let start = (sample / __thresh.rate) - time_pre; //время срабатывания триггера
gtl.log.info("trigger on time", start);
let range = {
min: start,
max: start + time_impulse
};
ranges.push(range); //добавляем диапазон в массив
};
};
// Функция диагностики.
/*
Первый запуск функции диагностики происходит после проигрывания всего сигнала и определения массива диапазонов по срабатыванию триггера
После этого происходит добавление массива пользовательских диапазонов в плеер, отрисовка (при необходимости) сигнала триггера
Затем устанавливается интервал запуска функции диагностики, равный временному окну для анализа импульса и запускается отсчет циклов (попыток) диагностики
Как только количество циклов (попыток) сравнивается с количеством установленных пользовательских диапазонов, диагностика останавливается
*/
let plot = gtl.plots.add("Impulses"); //создаем координатную плоскость
function diagnose() {
if (tries >= ranges.length) gtl.diagnostic.stop();
if (!is_ranges) {
gtl.player.custom_ranges = ranges; //добавляем пользовательские диапазоны в плеер
gtl.results = { ranges: ranges }; //добавляем диапазоны в результат
gtl.log.info('creating ranges', true);
gtl.log.info('ranges', JSON.stringify(ranges));
is_ranges = true; //пользовательские диапазоны готовы
plot.add({
color: 0x0000ff, //цвет графика
name: "max", //наименование графика
x: 1 / __max.rate, //частотное разрешение
y: __max.getHistoryArray() //значения амплитуд
}); //рисуем сигнал для контроля
plot.add({
color: 0xff00ff, //цвет графика
name: "thresh", //наименование графика
x: 1 / __thresh.rate, //частотное разрешение
y: __thresh.getHistoryArray() //значения амплитуд
}); //рисуем сигнал для контроля
}
gtl.diagnostic.interval = time_impulse; //задаем время запуска функции диагностики, равное длине импульса
gtl.log.info('diagnostic', `attempt ${tries} - ${true}`);
/*
Математика обработки сигнала
*/
tries++;
}