Gtl.ranges var

Материал из GTL-wiki
Перейти к навигации Перейти к поиску

"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 на диск
   let res = gtl.io.to_csv({
     path: "D:/variables2.csv", //путь для сохранения файла
     values: arrays, //данные для записи в файл
     sep: "\t" //разделитель данных
   });
 }
 gtl.diagnostic.interval = time_impulse; //задаем время запуска функции диагностики, равное длине импульса
 if (tries == 0) { gtl.log.info("Установленный интервал запуска диагностики", time_impulse) }
 else {
   gtl.log.info('diagnostic', `Цикл диагностики ${tries} - ${true}`)
   /*
     Математика обработки сигнала
   */
 }
 tries++;

}