Gtl.ranges var: различия между версиями

Материал из GTL-wiki
Перейти к навигации Перейти к поиску
Строка 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 = 1; //время записи для анализа
let time = 2; //время записи для анализа
let time_window = 0.02 //временное окно наблюдения
let time_window = 0.02 //временное окно наблюдения
let time_impulse = 2 //временное окно для анализа импульса (не менее времени построения спектра)  
let time_impulse = 0.5 //временное окно для анализа импульса (не менее времени построения спектра)  
let time_pre = time_window / 2; //время предыстории
let ranges = []; //массив диапазонов для импульсов
let ranges = []; //массив диапазонов для импульсов
let cnt = 0; //счетчик
let tries = 0; //циклы диагностки
let tries = 0; //циклы диагностки
let is_ranges = false; //состояние готовности диапазонов
let is_ranges = false; //состояние готовности диапазонов
gtl.diagnostic.interval = time; //интервал запуска диагностики


let thresh = gtl.create_moving_thresh({
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: 1
   level: 315
}); //порог
}); //порог
__thresh.history = time;
gtl.diagnostic.interval = time; //интервал запуска диагностики


thresh.triggered.connect(thresh_triggered_event);
__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; //время срабатывания триггера
     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); //добавляем диапазон в массив
    cnt++; //считаем импульсы
   };
   };
};
};


// Функция диагностики.
/*
  Первый запуск функции диагностики происходит после проигрывания всего сигнала и определения массива диапазонов по срабатыванию триггера
  После этого происходит добавление массива пользовательских диапазонов в плеер, отрисовка (при необходимости) сигнала триггера
  Затем устанавливается интервал запуска функции диагностики, равный временному окну для анализа импульса и запускается отсчет циклов (попыток) диагностики
  Как только количество циклов (попыток) сравнивается с количеством установленных пользовательских диапазонов, диагностика останавливается
*/


let plot = gtl.plots.add("Impulses"); //создаем координатную плоскость
let plot = gtl.plots.add("Impulses"); //создаем координатную плоскость
function diagnose() {
function diagnose() {
   if (tries >= cnt) 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; //добавляем пользовательские диапазоны в плеер
Строка 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}`);
   gtl.diagnostic.interval = time_impulse; //задаем время запуска функции диагностики, равное длине импульса
 
   /*
    Математика обработки сигнала
  */
   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++;
}