freq_responce/scripts/Частотный_отклик v8.js

178 lines
8.4 KiB
JavaScript

"use strict";
let signals = gtl.options.record.signalsModel;
let options = gtl.options;
let record = gtl.options.record;
let point = gtl.options.point;
// let fnc = gtl.import("user-functions.js"); // используемые функции
let plot_ausp_vibr = gtl.plots.add("Спектры по каналам"); // спектры по каналам вибрации
let plot_FreqResp_ampl_j = gtl.plots.add("Частотный отклик по каналам (амплитуда)"); // амплитудные спектры по каналам вибрации
let plot_FreqResp_phase_j = gtl.plots.add("Частотный отклик по каналам (фаза)"); // фазовые спектры по каналам вибрации
// Алгоритм
// 1. Получить спектры ускорения и силы в комплексном виде (вибропреобразователь и молоток).
// 2. Преобразовать спектр силы (молотка) в комплексно-сопряжённый вид.
// 3. Получить кросс-спектр (перекрёстный) между ускорением и силой.
// 4. Вычислить деление кросс-спектра на спектр силы.
// ОБРАБОТКА СИГНАЛОВ
// ФИЛЬТРЫ
// Входной сигнал - виброускорение
// Файл импорта функций
// var imp = gtl.import("...");
// ПАРАМЕТРЫ и их ПОРОГОВЫЕ ЗНАЧЕНИЯ (уставки)
// Настройки спектров
// Цвета
// #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; // отображение амплитуды спектра db / unit (1 / 0)
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 ausp_vibr = []; // массив объектов спектров вибрации
let ausp_force = []; // массив объектов спектров силы по диапазонам [k]
let counter = 1; // счётчик для цикла по каналам вибрации
let counter_ranges = 0; // счётчик для цикла по выделенным диапазонам сигналов записи
let ausp_cross_real = []; // массив объектов действительной части кросс-спектров канала силы [0] и канала вибрации [j]
let ausp_cross_imag = []; // массив объектов мнимой части кросс-спектров канала силы [0] и канала вибрации [j]
let freq_resp_real = []; // действительная часть частотного отклика между каналом силы [0] и каналом вибрации [j]
let freq_resp_imag = []; // мнимая часть частотного отклика между каналом силы [0] и каналом вибрации [j]
let freq_resp_ampl = []; // амплитуда частотного отклика между каналом силы [0] и каналом вибрации [j]
let freq_resp_phase = []; // фаза частотного отклика между каналом силы [0] и каналом вибрации [j]
// Задание диапазона сигнала для анализа
// let ranges = gtl.player.custom_ranges;
// ranges.custom_ranges = [{min : 0.0172949, max: 0.4528125}, ranges[0]];
// gtl.player.custom_ranges = [gtl.player.stored_ranges[1,2,3]];
gtl.log.info("Количество выделенных диапазонов", gtl.player.stored_ranges.length);
// Спектры каналов ускорения (каналы датчиков вибрации)
gtl.log.info("Количество каналов кроме силы", signals.length - 1);
// Условие отображения спектров в дБ или линейном виде
if (view_ == 1) {view = gtl.spec.db}
else if (view_ == 0) {view = gtl.spec.unit}
for (let k = 0; k < gtl.player.stored_ranges.length; k++) { // цикл по диапазонам
ausp_vibr[k] = [];
for (let j = 1; j < signals.length; j++) { // цикл по каналам
// Спектр амплитудный для цикла по всем каналам вибрации
ausp_vibr.push(
gtl.create_ausp(
{
"src": gtl.analog_inputs[signals[j].portNumber], // сигнал вибрации
"frequency": frequency,
"resolution": resolution,
"average": average,
"overlap": overlap,
"window": gtl.spec.rectangular,
"view": view
}
)
);
}
}
for (let k = 0; k < gtl.player.stored_ranges.length; k++) { // цикл по диапазонам
// Спектр силы (канал сигнала молотка) канал [0]
ausp_force.push(
gtl.create_ausp(
{
"src": gtl.analog_inputs[signals[0].portNumber], // сигнал силы
"frequency": frequency,
"resolution": resolution,
"average": average,
"overlap": overlap,
"window": gtl.spec.rectangular,
"view": view
}
)
);
}
gtl.log.info("Количество спектров вибрации", ausp_vibr.length);
gtl.log.info("Количество спектров силы", ausp_force.length);
//*******************ДИАГНОСТИКА*********************
//***************************************************
// Задаем период проведения диагностики в секундах
var acq_time = Math.max(ausp_force[0].acq_time) + 0.3;
gtl.diagnostic.interval = acq_time;
gtl.log.info("acq_time", acq_time);
// gtl.diagnostic.interval = 10; // время в секундах (константа)
// примечание: наблюдается зависимость результатов АФЧХ от времени диагностики
function diagnose() {
// gtl.log.info("ranges", JSON.stringify(ranges));
// gtl.log.info("ranges", JSON.stringify(gtl.player.stored_ranges));
// Графики амплитудных спектров вибрации
for (let k = 0; k < gtl.player.stored_ranges.length; k++) {
if (counter_ranges > 0) {
for (let j = 0; j < ausp_vibr.length; j++) {
if (counter > 0) {
// plot_ausp_vibr.add(
// {
// color: 0x34C924,
// name: `Спектр канала ${j+1} диапазона ${k}, g`,
// x: ausp_vibr[k][j].resolution,
// y: ausp_vibr[k][j].data,
// tags: ["Амплитудный спектр вибрации, g"]
// }
// );
}
};
counter += 1;
gtl.log.info("ausp_force[k].length", ausp_force[0].length);
plot_ausp_vibr.add(
{
color: 0xff00f7,
name: "Спектр силы (канал [0]), N",
x: 1/lines,
y: ausp_force[k].data,
tags: ["Спектр силы (канал [0]), N"]
});
}
};
counter_ranges += 1;
gtl.diagnostic.stop();
}