freq_responce/scripts/freq_response 3.js

252 lines
12 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"use strict";
let signals = gtl.options.record.signalsModel;
let options = gtl.options;
let record = gtl.options.record;
let point = gtl.options.point;
let getResponse = gtl.import("getResponse.js").getResponse;
let getAvgArray = gtl.import("getResponse.js").getAvgArray;
let plot_ausp = gtl.plots.add("Спектры по каналам"); // спектры по каналам вибрации
let plot_resp_ampl = gtl.plots.add("Частотный отклик по каналам (амплитуда)"); // амплитудные спектры по каналам вибрации
let plot_resp_phase = gtl.plots.add("Частотный отклик по каналам (фаза)"); // фазовые спектры по каналам вибрации
let plot_avg_resp = gtl.plots.add("Средний частотный отклик"); // средний частотный отклик
// Цвета
// #ff0000 - красный
// #00ff00 - зелёный
// #0000ff - синий
// #00ddff - голубой
// #ff3dcc - фиолетовый
// #ffff00 - жёлтый
// Настройки для спектров и АФЧХ
let frequency = gtl.options.customOptions.frequency; // граничная частота
let resolution = gtl.options.customOptions.resolution; // частотное разрешение
let lines = 1 / resolution; // количество линий
let average = gtl.options.customOptions.average; // количество усреднений
let overlap = gtl.options.customOptions.overlap; // наложение
let view_ = gtl.options.customOptions.view; // отображение амплитуды спектра unit/dB (0/1)
let view = gtl.spec.unit; // значение view по умолчанию
let view_freq_resp = gtl.options.customOptions.view_freq_resp; // отображение амплитуды спектра частотного отклика db / unit (1 / 0)
let variant_freq_resp = gtl.options.customOptions.variant_freq_resp; // вариант вычисления: 0 - через кросс, 1 - через автоспектр
let thresh_level = gtl.options.customOptions.thresh_level; // уровень удара для засчитывания импульса
let time_impulse_ = gtl.options.customOptions.time_impulse; // задание длины импульса из опций
let remove_resp_arr = gtl.options.customOptions.remove_resp_arr;
gtl.log.info("remove_resp_arr", remove_resp_arr);
// Задание диапазона сигнала для анализа
// let ranges = gtl.player.stored_ranges;
let ranges = gtl.options.customOptions.ranges;
gtl.player.custom_ranges = ranges; // задание диапазонов плеера
// Спектры каналов ускорения (каналы датчиков вибрации)
gtl.log.info("Количество сигналов", signals.length);
gtl.log.info("Граничная частота спектров", frequency);
gtl.log.info("Частотное разрешение спектров", resolution);
let spec_view = view_ == 0 ? gtl.spec.unit : gtl.spec.db; // условие отображения спектров в дБ или линейном виде
let src_force; // источник сигнала силы
let channel = 1; // номер первого канала вибрации
let window_spec_force = gtl.options.customOptions.window_spec_force; // окно спектра силы
let window_spec_vibr = gtl.options.customOptions.window_spec_vibr; // окно спектра вибрации
let signal_source = gtl.options.customOptions.signal_source; // выбор источника сигнала: 0 - сырой / 1 - фильтр
let left_bord_filt = gtl.options.customOptions.left_bord_filt; // левая граница фильтра
let right_bord_filt = gtl.options.customOptions.right_bord_filt; // правая граница фильтра
let order_filt = gtl.options.customOptions.order_filt; // порядок фильтра
let kind_filt = gtl.options.customOptions.kind_filt; // тип окна фильтра gtl.filter_iir.butterworth
let width_filt; // полоса пропускания фильтра
width_filt = right_bord_filt - left_bord_filt;
let freq_filt; // центральная частота фильтра
freq_filt = right_bord_filt - width_filt/2;
// СИГНАЛ СИЛЫ (молоток)
// Фильтрация
let filter_force = gtl.add_filter_iir(gtl.analog_inputs[signals[0].portNumber]);
filter_force.kind = kind_filt;
filter_force.type = gtl.filter_iir.bandpass;
filter_force.order = order_filt;
filter_force.frequency = freq_filt; // центральная частота полосового фильтра
filter_force.width = width_filt; // ширина полосы фильтра
// Выбор источника сигнала силы: фильтр / сырой сигнал
if (signal_source == 1)
{
src_force = filter_force; // источник фильтр
}
else if (signal_source == 0)
{
src_force = gtl.analog_inputs[signals[0].portNumber]; // источник cырой сигнал
}
let force = gtl.create_ausp({
src: src_force,
frequency: frequency,
resolution: resolution,
average: average,
overlap: overlap,
window: window_spec_force,
view: view
});
// СИГНАЛЫ ВИБРАЦИИ (отклик)
// Спектр амплитудный для цикла по всем каналам вибрации
let srs_vibr; // источник сигнала вибрации
let ausps = []; //массив объектов спектров вибрации по каналам
let ausp_arr = [];
let phases = []; //массив объектов ФЧХ по каналам
let phase_arr
let ausps_data = []; //массив данных спектров после каждого удара
let resps_data = []; //массив данных откликов после каждого удара
// Цикл по каналам
for (let j = channel; j < signals.length; j++) {
// Фильтрация
let filter_vibr = gtl.add_filter_iir(gtl.analog_inputs[signals[j].portNumber]);
filter_vibr.kind = kind_filt;
filter_vibr.type = gtl.filter_iir.bandpass;
filter_vibr.order = order_filt;
filter_vibr.frequency = freq_filt; // центральная частота полосового фильтра
filter_vibr.width = width_filt; // ширина полосы фильтра
// Выбор источника сигнала вибрации: фильтр / сырой сигнал
if (signal_source == 1)
{
src_vibr = filter_vibr; // источник фильтр
}
else if (signal_source == 0)
{
src_vibr = gtl.analog_inputs[signals[j].portNumber]; // источник cырой сигнал
}
let ausp = gtl.create_ausp({
src: src_vibr, // сырой сигнал вибрации
frequency: frequency,
resolution: resolution,
average: average,
overlap: overlap,
window: window_spec_vibr,
view: spec_view
});
let phase_delta = gtl.create_pfc({
src0: src_force, // сигнал силы, относительно него вычисляем дельту фазы
src1: src_vibr, // сигнал вибрации
frequency: frequency,
resolution: resolution,
average: average,
overlap: overlap,
window: gtl.spec.rectangular,
view: gtl.phase.deg,
range: gtl.phase.positive,
is_single: false
});
};
// Запись массивовм спектров вибрации
ausp_arr.push(ausp);
phase_arr.push(phase_delta);
let time_window = 0.0001 // временное окно наблюдения
let time_impulse = time_impulse_ == 0 ? gtl.acq_time + 0.01 : time_impulse_; // условие выбора длительности импульса
// let time_pre = time_window / 2; // время предыстории
// let ranges = []; // массив диапазонов для импульсов
let tries = 0; // циклы диагностки
let is_ranges = false; // состояние готовности диапазонов
/* Функция диагностики.
Первый запуск функции диагностики происходит после проигрывания всего сигнала и определения массива диапазонов по срабатыванию триггера
После этого происходит добавление массива пользовательских диапазонов в плеер, отрисовка (при необходимости) сигнала триггера
Затем устанавливается интервал запуска функции диагностики, равный временному окну диапазона и запускается отсчет циклов (попыток) диагностики
Как только количество циклов (попыток) сравнивается с количеством установленных пользовательских диапазонов, диагностика останавливается
*/
gtl.diagnostic.interval = time_impulse; // первичный интервал запуска функции диагностики
gtl.log.info('Время импульса', time_impulse);
function diagnose() {
if (!is_ranges) {
is_ranges = true; // пользовательские диапазоны готовы
gtl.log.info('creating ranges', true);
gtl.log.info('ranges', JSON.stringify(gtl.player.custom_ranges));
gtl.log.info("Количество диапазонов в плеере", ranges.length);
gtl.log.info("Установленный интервал запуска диагностики", time_impulse);
gtl.log.info("acq_time", gtl.acq_time);
}
if (tries > 0) {
gtl.log.info("Количество элементов массива force", force.data.length);
gtl.log.info("Количество спектров вибрации ausp_arr", ausp_arr.data.length);
gtl.log.info('diagnostic', `Цикл диагностики ${tries} - ${true}`);
gtl.log.info('Диапазон плеера', JSON.stringify(gtl.player.custom_ranges));
// Отображаем спектр силы
plot_ausp.add({
color: 0xff00f7,
name: `Спектр силы - удар №${tries}, N`,
x: force.resolution,
y: force.data,
tags: [`Спектр силы, N`]
});
// Отображаем автоспектр вибрации
// по всем каналам
for (let j = 0; j < ausp_arr.length; j++) {
plot_ausp.add({
color: 0x34C924,
name: `Спектр канала ${j+1} - удар №${tries}, g`,
x: ausp_arr[j].resolution,
y: ausp_arr[j].data,
tags: ["Cпектр вибрации, g"]
});
// Вычисляем спектр отклика
let rsp = getResponse({
spec_force: force, //спектр силы
spec_vibro: ausp_arr[j], //спектр вибрации
type: variant_freq_resp, //способ вычисления отклика
view: 0 //способ отображения спектра в линейных единицах или дБ
});
// Отображаем спектр отклика
plot_resp_ampl.add({
color: 0x3b30b6,
name: `Амплитуда частотного отклика канала ${j+1} - удар №${tries}, g/N`,
x: resolution,
y: rsp.data,
tags: ["Амплитуда частотного отклика, g/N"]
});
ausps_data.push(ausp.data);
resps_data.push(rsp.data);
}
tries++;
if (tries > ranges.length) {
gtl.log.info('Вычисление среднего отклика', `processing...`);
const avgResponse = getAvgArray(resps_data, remove_resp_arr); //вычисляем средний отклик
// Отображаем средний спектр отклика
plot_avg_resp.add({
color: 0xff3dcc,
name: `Амплитуда среднего частотного отклика, g/N`,
x: resolution,
y: avgResponse,
tags: ["Амплитуда среднего частотного отклика, g/N"]
});
gtl.log.info('Вычисление среднего отклика', `done!`);
gtl.diagnostic.stop();
}; // останавливаем диагностику после окончания диапазонов
}