Gtl.ranges var: различия между версиями
Перейти к навигации
Перейти к поиску
Нет описания правки |
|||
| (не показано 11 промежуточных версий этого же участника) | |||
| Строка 1: | Строка 1: | ||
== | == Выбор диапазонов воспроизведения сигнала по триггеру == | ||
<pre> | <pre> | ||
"use strict"; | "use strict"; | ||
let src = gtl.analog_inputs[0]; //источник сигнала | let src = gtl.analog_inputs[0]; //источник сигнала | ||
let time = | let time = 20; //полное время записи для анализа: gtl.options.record.playerTime | ||
let time_window = 0.02 //временное окно наблюдения | let time_window = 0.02 //временное окно наблюдения | ||
let time_impulse = 0.5 //временное окно для анализа импульса (не менее времени построения спектра) | let time_impulse = 0.5 //временное окно для анализа импульса (например не менее времени построения его спектра) | ||
let time_pre = time_window / 2; //время предыстории | let time_pre = time_window / 2; //время предыстории для анализа импульса | ||
let ranges = []; //массив диапазонов для импульсов | let ranges = []; //массив диапазонов для импульсов (массив объектов) | ||
let arrays = []; //двумерный массив для записи в .csv | |||
let tries = 0; //циклы диагностки | let tries = 0; //циклы диагностки | ||
let is_ranges = false; //состояние готовности диапазонов | let is_ranges = false; //состояние готовности диапазонов | ||
// Скользящая амплитуда для создания "огибающей" импульса | |||
let __max = gtl.create_moving_max({ | let __max = gtl.create_moving_max({ | ||
src: src, | src: src, //источник сигнала | ||
name: "max", | name: "max", //наименование | ||
time: time_window | time: time_window //рассчетное окно | ||
}); | }); | ||
__max.history = | __max.history = 2; //история сохраненных данных сигнала | ||
// Триггера | |||
let __thresh = gtl.create_moving_thresh({ | let __thresh = gtl.create_moving_thresh({ | ||
src: __max, | src: __max, //источник сигнала | ||
name: "thresh", | name: "thresh", //наименование | ||
time: time_window, | time: time_window, //временное окно наблюдения | ||
level: 315 | level: 315 //уровень срабатывания триггера | ||
}); | }); | ||
__thresh.history = | __thresh.history = 2; //история сохраненных данных сигнала | ||
__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 / __thresh.rate) - time_pre; //время срабатывания триггера | let start = (sample / __thresh.rate) - time_pre; //время срабатывания триггера, сек | ||
gtl.log.info("trigger on time", start); | gtl.log.info("trigger on time", start); //выводим информацию в лог | ||
// Формируем объект с результатом работы триггера | |||
let range = { | let range = { | ||
min: start, | min: start, | ||
max: start + time_impulse | max: start + time_impulse | ||
}; | }; | ||
let array = [start, start + time_impulse]; //массив начало-конец | |||
ranges.push(range); //добавляем диапазон в массив | ranges.push(range); //добавляем диапазон в массив | ||
arrays.push(array); //добавляем массив с общий массив | |||
}; | }; | ||
}; | }; | ||
| Строка 55: | Строка 58: | ||
*/ | */ | ||
gtl.diagnostic.interval = time; //интервал запуска функции диагностики | |||
let plot = gtl.plots.add("Impulses"); //создаем координатную плоскость | let plot = gtl.plots.add("Impulses"); //создаем координатную плоскость | ||
// Основная функция диагностики | |||
function diagnose() { | function diagnose() { | ||
if (tries >= ranges.length) gtl.diagnostic.stop(); | if (tries >= ranges.length) gtl.diagnostic.stop(); | ||
if (!is_ranges) { | if (!is_ranges) { | ||
gtl.player.custom_ranges = ranges; //добавляем пользовательские диапазоны в плеер | gtl.player.custom_ranges = ranges; //добавляем пользовательские диапазоны в плеер | ||
gtl.results = { ranges: ranges }; // | gtl.results = { ranges: ranges }; //выводим диапазоны в результат | ||
gtl.log.info('creating ranges', true); | gtl.log.info('creating ranges', true); | ||
gtl.log.info('ranges', JSON.stringify(ranges)); | gtl.log.info('ranges', JSON.stringify(ranges)); | ||
is_ranges = true; //пользовательские диапазоны готовы | is_ranges = true; //пользовательские диапазоны готовы | ||
// Рисуем "огибающую" на координатной плоскости | |||
plot.add({ | plot.add({ | ||
color: 0x0000ff, //цвет графика | color: 0x0000ff, //цвет графика | ||
| Строка 70: | Строка 78: | ||
x: 1 / __max.rate, //частотное разрешение | x: 1 / __max.rate, //частотное разрешение | ||
y: __max.getHistoryArray() //значения амплитуд | y: __max.getHistoryArray() //значения амплитуд | ||
}); | }); | ||
// Рисуем сигнал триггера на координатной плоскости | |||
plot.add({ | plot.add({ | ||
color: 0xff00ff, //цвет графика | color: 0xff00ff, //цвет графика | ||
| Строка 77: | Строка 86: | ||
x: 1 / __thresh.rate, //частотное разрешение | x: 1 / __thresh.rate, //частотное разрешение | ||
y: __thresh.getHistoryArray() //значения амплитуд | y: __thresh.getHistoryArray() //значения амплитуд | ||
}); // | }); | ||
// Записываем данные в формате .csv на диск | |||
const __path = "D:/trigger.csv"; | |||
let res = gtl.io.to_csv({ | |||
path: __path, //путь для сохранения файла | |||
values: arrays, //данные для записи в файл | |||
sep: "\t" //разделитель данных | |||
}); | |||
gtl.log.info('saving file', __path); | |||
} | } | ||
gtl.diagnostic.interval = time_impulse; //задаем время запуска функции диагностики, равное длине импульса | gtl.diagnostic.interval = time_impulse; //задаем время запуска функции диагностики, равное длине импульса | ||
gtl.log.info('diagnostic', ` | if (tries == 0) { gtl.log.info("Установленный интервал запуска диагностики", time_impulse) } | ||
else { | |||
gtl.log.info('diagnostic', `Цикл диагностики ${tries} - ${true}`) | |||
/* | |||
Математика обработки сигнала | |||
*/ | |||
} | |||
tries++; | tries++; | ||
} | } | ||
</pre> | </pre> | ||
Текущая версия от 07:04, 18 сентября 2026
Выбор диапазонов воспроизведения сигнала по триггеру
"use strict";
let src = gtl.analog_inputs[0]; //источник сигнала
let time = 20; //полное время записи для анализа: gtl.options.record.playerTime
let time_window = 0.02 //временное окно наблюдения
let time_impulse = 0.5 //временное окно для анализа импульса (например не менее времени построения его спектра)
let time_pre = time_window / 2; //время предыстории для анализа импульса
let ranges = []; //массив диапазонов для импульсов (массив объектов)
let arrays = []; //двумерный массив для записи в .csv
let tries = 0; //циклы диагностки
let is_ranges = false; //состояние готовности диапазонов
// Скользящая амплитуда для создания "огибающей" импульса
let __max = gtl.create_moving_max({
src: src, //источник сигнала
name: "max", //наименование
time: time_window //рассчетное окно
});
__max.history = 2; //история сохраненных данных сигнала
// Триггера
let __thresh = gtl.create_moving_thresh({
src: __max, //источник сигнала
name: "thresh", //наименование
time: time_window, //временное окно наблюдения
level: 315 //уровень срабатывания триггера
});
__thresh.history = 2; //история сохраненных данных сигнала
__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
};
let array = [start, start + time_impulse]; //массив начало-конец
ranges.push(range); //добавляем диапазон в массив
arrays.push(array); //добавляем массив с общий массив
};
};
// Функция диагностики.
/*
Первый запуск функции диагностики происходит после проигрывания всего сигнала и определения массива диапазонов по срабатыванию триггера
После этого происходит добавление массива пользовательских диапазонов в плеер, отрисовка (при необходимости) сигнала триггера
Затем устанавливается интервал запуска функции диагностики, равный временному окну для анализа импульса и запускается отсчет циклов (попыток) диагностики
Как только количество циклов (попыток) сравнивается с количеством установленных пользовательских диапазонов, диагностика останавливается
*/
gtl.diagnostic.interval = time; //интервал запуска функции диагностики
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() //значения амплитуд
});
// Записываем данные в формате .csv на диск
const __path = "D:/trigger.csv";
let res = gtl.io.to_csv({
path: __path, //путь для сохранения файла
values: arrays, //данные для записи в файл
sep: "\t" //разделитель данных
});
gtl.log.info('saving file', __path);
}
gtl.diagnostic.interval = time_impulse; //задаем время запуска функции диагностики, равное длине импульса
if (tries == 0) { gtl.log.info("Установленный интервал запуска диагностики", time_impulse) }
else {
gtl.log.info('diagnostic', `Цикл диагностики ${tries} - ${true}`)
/*
Математика обработки сигнала
*/
}
tries++;
}