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

405 lines
21 KiB
JavaScript
Raw Permalink 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";
var signals = gtl.options.record.signalsModel;
var options = gtl.options;
var record = gtl.options.record;
var point = gtl.options.point;
var fnc = gtl.import("user-functions.js"); // используемые функции
var plot_0 = gtl.plots.add("Спектр ускорения (канал 0)"); // спектр ускорения канала 0
var plot_1 = gtl.plots.add("Спектр ускорения (канал 1)"); // спектр ускорения канала 1
var plot_2 = gtl.plots.add("Спектр ускорения (канал 2)"); // спектр ускорения канала 2
var plot_3 = gtl.plots.add("Спектр силы (канал 3)"); // спектр ускорения канала 3
var plot_FreqResp_ampl_0_3 = gtl.plots.add("Частотный отклик (каналы 0 и 3)"); // частотный отклик между каналами 0 и 3 (действительная часть)
var plot_FreqResp_ampl_1_3 = gtl.plots.add("Частотный отклик (каналы 1 и 3)"); // частотный отклик между каналами 1 и 3 (действительная часть)
var plot_FreqResp_ampl_2_3 = gtl.plots.add("Частотный отклик (каналы 2 и 3)"); // частотный отклик между каналами 2 и 3 (действительная часть)
var plot_FreqResp_phase_0_3 = gtl.plots.add("Фаза частотного отклика (каналы 0 и 3)"); // частотный отклик между каналами 0 и 3 (мнимая часть)
var plot_FreqResp_phase_1_3 = gtl.plots.add("Фаза частотного отклика (каналы 1 и 3)"); // частотный отклик между каналами 1 и 3 (мнимая часть)
var plot_FreqResp_phase_2_3 = gtl.plots.add("Фаза частотного отклика (каналы 2 и 3)");; // частотный отклик между каналами 2 и 3 (мнимая часть)
// ***************************************************************
// ********** ВЫЧИСЛЕНИЕ ЧАСТОТНОГО ОТКЛИКА (ВНИИЖТ) ***********
// ***************************************************************
// Алгоритм
// 1. Получить спектры ускорения и силы в комплексном виде (вибропреобразователь и молоток).
// 2. Преобразовать спектр силы (молотка) в комплексно-сопряжённый вид.
// 3. Получить кросс-спектр (перекрёстный) между ускорением и силой.
// 4. Вычислить деление кросс-спектра на спектр силы.
// ОБРАБОТКА СИГНАЛОВ
// ФИЛЬТРЫ
// Входной сигнал - виброускорение
// Файл импорта функций
// var imp = gtl.import("...");
// ПАРАМЕТРЫ и их ПОРОГОВЫЕ ЗНАЧЕНИЯ (уставки)
// Настройки спектров
// Цвета
// #ff0000 - красный
// #00ff00 - зелёный
// #0000ff - синий
// #00ddff - голубой
// #ff3dcc - фиолетовый
// #ffff00 - жёлтый
// Пороги и прочие изменяемые параметры
var ausp_frequency = 1000; // граничная частота спектра
var ausp_average = 1; // количество усреднений спектра
var ausp_lines = 4; // множитель количества линий спектра (на 1 Гц)
var ausp_smoothing_factor = 100; // усреднение средней линии
var ausp_peak_level = 0.001 // порог обнаружения гармоник РЕДАКТИРОВАТЬ НА РЕАЛЬНЫХ СИГНАЛАХ
var ausp_tolerance = 1; // диапазон поиска гармоники по ширине +/- Гц
var average = 6; // количество усреднений объекта АФЧХ (когерентность и разница фаз)
// var ausp_unit = gtl.spec.db; // отображение амплитуды в дБ
var ausp_unit = gtl.spec.unit; // отображение амплитуды в м/с^2
// *** Формирование спектров сигналов ***
// Спектры каналов ускорения (каналы датчиков вибрации)
// Канал_0
var ausp_acсel_0 = gtl.add_ausp(gtl.analog_inputs[signals[0].portNumber]); // объявление переменной спектра
ausp_acсel_0.color = 0x04ff00; // цвет спектра
ausp_acсel_0.name = "Спектр ускорения (канал 0)"; // имя спектра
ausp_acсel_0.color = 0x000000ff; // синий цвет спектра
ausp_acсel_0.frequency = ausp_frequency;
ausp_acсel_0.lines = ausp_frequency * ausp_lines;
ausp_acсel_0.average = ausp_average;
ausp_acсel_0.unit = ausp_unit; // отображение амплитуды
ausp_acсel_0.smoothing_factor = ausp_smoothing_factor;
ausp_acсel_0.smoothed_line_color = 0xff004dff; // цвет средней линии
ausp_acсel_0.peak_level = ausp_peak_level;
ausp_acсel_0.tolerance = ausp_tolerance; // диапазон поиска гармоник +/-
// Канал_1
var ausp_acсel_1 = gtl.add_ausp(gtl.analog_inputs[signals[1].portNumber]); // объявление переменной спектра
ausp_acсel_1.color = 0xcad714; // цвет спектра
ausp_acсel_1.name = "Спектр ускорения (канал 1)"; // имя спектра
ausp_acсel_1.color = 0x000000ff; // синий цвет спектра
ausp_acсel_1.frequency = ausp_frequency;
ausp_acсel_1.lines = ausp_frequency * ausp_lines;
ausp_acсel_1.average = ausp_average;
ausp_acсel_1.unit = ausp_unit; // отображение амплитуды
ausp_acсel_1.smoothing_factor = ausp_smoothing_factor;
ausp_acсel_1.smoothed_line_color = 0xff004dff; // цвет средней линии
ausp_acсel_1.peak_level = ausp_peak_level;
ausp_acсel_1.tolerance = ausp_tolerance; // диапазон поиска гармоник +/-
// Канал_2
var ausp_acсel_2 = gtl.add_ausp(gtl.analog_inputs[signals[2].portNumber]); // объявление переменной спектра
ausp_acсel_2.color = 0xff8800; // цвет спектра
ausp_acсel_2.name = "Спектр ускорения (канал 2)"; // имя спектра
ausp_acсel_2.color = 0x000000ff; // синий цвет спектра
ausp_acсel_2.frequency = ausp_frequency;
ausp_acсel_2.lines = ausp_frequency * ausp_lines;
ausp_acсel_2.average = ausp_average;
ausp_acсel_2.unit = ausp_unit; // отображение амплитуды
ausp_acсel_2.smoothing_factor = ausp_smoothing_factor;
ausp_acсel_2.smoothed_line_color = 0xff004dff; // цвет средней линии
ausp_acсel_2.peak_level = ausp_peak_level;
ausp_acсel_2.tolerance = ausp_tolerance; // диапазон поиска гармоник +/-
// Спектр силы (канал сигнала молотка)
// Канал_3
var ausp_force_3 = gtl.add_ausp(gtl.analog_inputs[signals[3].portNumber]); // объявление переменной спектра
ausp_force_3.color = 0x000000ff; // цвет спектра
ausp_force_3.name = "Спектр силы (канал 3)"; // имя спектра
ausp_force_3.color = 0x00ff0000; // красный цвет спектра
ausp_force_3.frequency = ausp_frequency;
ausp_force_3.lines = ausp_frequency * ausp_lines;
ausp_force_3.average = ausp_average;
ausp_force_3.unit = ausp_unit; // отображение амплитуды
ausp_force_3.smoothing_factor = ausp_smoothing_factor;
ausp_force_3.smoothed_line_color = 0xff004dff; // цвет средней линии
ausp_force_3.peak_level = ausp_peak_level;
ausp_force_3.tolerance = ausp_tolerance; // диапазон поиска гармоник +/-
// Спектры для комплексного представления
// Канал 0
var ausp_0 = gtl.create_ausp(
{
"src" : gtl.analog_inputs[signals[0].portNumber],
"frequency" : 1000,
"resolution" : 0.25,
"average" : 6,
"overlap" : .5,
"window" : gtl.spec.rectangular
}
);
// Канал 1
var ausp_1 = gtl.create_ausp(
{
"src" : gtl.analog_inputs[signals[1].portNumber],
"frequency" : 1000,
"resolution" : 0.25,
"average" : 6,
"overlap" : .5,
"window" : gtl.spec.rectangular
}
);
// Канал 2
var ausp_2 = gtl.create_ausp(
{
"src" : gtl.analog_inputs[signals[2].portNumber],
"frequency" : 1000,
"resolution" : 0.25,
"average" : 6,
"overlap" : .5,
"window" : gtl.spec.rectangular
}
);
// Канал 3
var ausp_3 = gtl.create_ausp(
{
"src" : gtl.analog_inputs[signals[3].portNumber],
"frequency" : 1000,
"resolution" : 0.25,
"average" : 6,
"overlap" : .5,
"window" : gtl.spec.rectangular
}
);
//*******************ДИАГНОСТИКА*********************
//***************************************************
// Задаем период проведения диагностики в секундах
var acq_time = Math.max(ausp_acсel_0.acq_time, ausp_acсel_1.acq_time, ausp_acсel_2.acq_time,
ausp_force_3.acq_time, ausp_0.acq_time, ausp_1.acq_time, ausp_2.acq_time, ausp_3.acq_time) + 0.3;
gtl.diagnostic.interval = acq_time;
// gtl.diagnostic.interval = 10; // время в секундах (константа)
// примечание: наблюдается зависимость результатов АФЧХ от времени диагностики
function diagnose() {
// Массивы значений
var ausp_accel_0_data = ausp_acсel_0.data; // массив уровней спектра ускорения 0
var ausp_accel_1_data = ausp_acсel_1.data; // массив уровней спектра ускорения 1
var ausp_accel_2_data = ausp_acсel_2.data; // массив уровней спектра ускорения 2
var ausp_force_3_data = ausp_force_3.data; // массив уровней спектра силы 3
// Комплексные числа
var ausp_accel_0_real = ausp_0.real; // действительная часть спектра ускорения 0
var ausp_accel_0_imag = ausp_0.imag; // мнимая часть спектра ускорения 0
var ausp_accel_1_real = ausp_1.real; // действительная часть спектра ускорения 1
var ausp_accel_1_imag = ausp_1.imag; // мнимая часть спектра ускорения 1
var ausp_accel_2_real = ausp_2.real; // действительная часть спектра ускорения 2
var ausp_accel_2_imag = ausp_2.imag; // мнимая часть спектра ускорения 2
var ausp_force_3_real = ausp_3.real; // действительная часть спектра силы 3
var ausp_force_3_imag = ausp_3.imag; // мнимая часть спектра силы 3
var n = ausp_force_3_data.length; // переменная для цикла
gtl.log.info("n (ausp_data.length)", ausp_force_3_data.length);
gtl.log.info("Минимально необходимая длительность сигнала", gtl.diagnostic.interval);
gtl.log.info("ausp_frequency", ausp_frequency);
gtl.log.info("ausp_lines", ausp_lines);
gtl.log.info("Math.PI", Math.PI);
// Получение массивов для формулы определения частотного отклика
// Канал_3 (ausp_force_3) - комплексно-сопряжённый вид
// меняется знак мнимой части на противоположный
// действительная часть без изменений
var ausp_force_3_imag_anti = []; // мнимая часть с противоположным знаком
for (let i = 0; i < n; i += 1)
{
ausp_force_3_imag_anti.push(ausp_force_3_imag[i] * (-1));
}
// Кросс-спектры
// Канал_0 & Канал_3
var ausp_cross_0_3_real = []; // действительная часть кросс-спектра 0 & 3
var ausp_cross_0_3_imag = []; // мнимая часть кросс-спектра 0 & 3
for (let i = 0; i < n; i += 1)
{
ausp_cross_0_3_real.push(ausp_accel_0_real[i] * ausp_force_3_real[i] -
(ausp_accel_0_imag[i] * ausp_force_3_imag_anti[i]));
ausp_cross_0_3_imag.push(ausp_accel_0_real[i] * ausp_force_3_imag_anti[i] +
ausp_accel_0_imag[i] * ausp_force_3_real[i]);
}
// Канал_1 & Канал_3
var ausp_cross_1_3_real = []; // действительная часть кросс-спектра 1 & 3
var ausp_cross_1_3_imag = []; // мнимая часть кросс-спектра 1 & 3
for (let i = 0; i < n; i += 1)
{
ausp_cross_1_3_real.push(ausp_accel_1_real[i] * ausp_force_3_real[i] -
(ausp_accel_1_imag[i] * ausp_force_3_imag_anti[i]));
ausp_cross_1_3_imag.push(ausp_accel_1_real[i] * ausp_force_3_imag_anti[i] +
ausp_accel_1_imag[i] * ausp_force_3_real[i]);
}
// Канал_2 & Канал_3
var ausp_cross_2_3_real = []; // действительная часть кросс-спектра 2 & 3
var ausp_cross_2_3_imag = []; // мнимая часть кросс-спектра 2 & 3
for (let i = 0; i < n; i += 1)
{
ausp_cross_2_3_real.push(ausp_accel_2_real[i] * ausp_force_3_real[i] -
(ausp_accel_2_imag[i] * ausp_force_3_imag_anti[i]));
ausp_cross_2_3_imag.push(ausp_accel_2_real[i] * ausp_force_3_imag_anti[i] +
ausp_accel_2_imag[i] * ausp_force_3_real[i]);
}
// Частотный отклик (деление кросс-спектра на спектр силы)
// (Канал_0 & Канал_3) / Канал_3
var freq_resp_0_3_real = []; // действительная часть частотного отклика между 0 и 3
var freq_resp_0_3_imag = []; // мнимая часть частотного отклика между 0 и 3
var freq_resp_0_3_ampl = []; // амплитуда частотного отклика между 0 и 3
var freq_resp_0_3_phase = []; // фаза частотного отклика между 0 и 3
for (let i = 0; i < n; i += 1)
{
freq_resp_0_3_real.push((ausp_cross_0_3_real[i] * ausp_force_3_real[i] +
ausp_cross_0_3_imag[i] * ausp_force_3_imag[i]) /
(Math.pow(ausp_force_3_real[i], 2) + Math.pow(ausp_force_3_imag[i], 2)));
freq_resp_0_3_imag.push((ausp_force_3_real[i] * ausp_cross_0_3_imag[i] -
ausp_cross_0_3_real[i] * ausp_force_3_imag[i]) /
(Math.pow(ausp_force_3_real[i], 2) + Math.pow(ausp_force_3_imag[i], 2)));
}
// запись массива амплитуды и фазы
for (let i = 0; i < n; i += 1)
{
freq_resp_0_3_ampl.push(Math.sqrt(Math.pow(freq_resp_0_3_real[i],2) + Math.pow(freq_resp_0_3_imag[i],2)));
freq_resp_0_3_phase.push(Math.atan(freq_resp_0_3_imag[i] / freq_resp_0_3_real[i]) * 180 / Math.PI);
}
// (Канал_1 & Канал_3) / Канал_3
var freq_resp_1_3_real = []; // действительная часть частотного отклика между 0 и 3
var freq_resp_1_3_imag = []; // мнимая часть частотного отклика между 0 и 3
var freq_resp_1_3_ampl = []; // амплитуда частотного отклика между 0 и 3
var freq_resp_1_3_phase = []; // фаза частотного отклика между 0 и 3
for (let i = 0; i < n; i += 1)
{
freq_resp_1_3_real.push((ausp_cross_1_3_real[i] * ausp_force_3_real[i] +
ausp_cross_1_3_imag[i] * ausp_force_3_imag[i]) /
(Math.pow(ausp_force_3_real[i], 2) + Math.pow(ausp_force_3_imag[i], 2)));
freq_resp_1_3_imag.push((ausp_force_3_real[i] * ausp_cross_1_3_imag[i] -
ausp_cross_1_3_real[i] * ausp_force_3_imag[i]) /
(Math.pow(ausp_force_3_real[i], 2) + Math.pow(ausp_force_3_imag[i], 2)));
}
// запись массива амплитуды и фазы
for (let i = 0; i < n; i += 1)
{
freq_resp_1_3_ampl.push(Math.sqrt(Math.pow(freq_resp_1_3_real[i],2) + Math.pow(freq_resp_1_3_imag[i],2)));
freq_resp_1_3_phase.push(Math.atan(freq_resp_1_3_imag[i] / freq_resp_1_3_real[i]) * 180 / Math.PI);
}
// (Канал_2 & Канал_3) / Канал_3
var freq_resp_2_3_real = []; // действительная часть частотного отклика между 2 и 3
var freq_resp_2_3_imag = []; // мнимая часть частотного отклика между 2 и 3
var freq_resp_2_3_ampl = []; // амплитуда частотного отклика между 2 и 3
var freq_resp_2_3_phase = []; // фаза частотного отклика между 2 и 3
for (let i = 0; i < n; i += 1)
{
freq_resp_2_3_real.push((ausp_cross_2_3_real[i] * ausp_force_3_real[i] +
ausp_cross_2_3_imag[i] * ausp_force_3_imag[i]) /
(Math.pow(ausp_force_3_real[i], 2) + Math.pow(ausp_force_3_imag[i], 2)));
freq_resp_2_3_imag.push((ausp_force_3_real[i] * ausp_cross_2_3_imag[i] -
ausp_cross_2_3_real[i] * ausp_force_3_imag[i]) /
(Math.pow(ausp_force_3_real[i], 2) + Math.pow(ausp_force_3_imag[i], 2)));
}
// запись массива амплитуды и фазы
for (let i = 0; i < n; i += 1)
{
freq_resp_2_3_ampl.push(Math.sqrt(Math.pow(freq_resp_2_3_real[i],2) + Math.pow(freq_resp_2_3_imag[i],2)));
freq_resp_2_3_phase.push(Math.atan(freq_resp_2_3_imag[i] / freq_resp_2_3_real[i]) * 180 / Math.PI);
}
// Построение пользовательских графиков
plot_0.add(
{
color: 0x04ff00,
name: "Спектр ускорения (канал 0)",
x: 1/ausp_lines,
y: ausp_acсel_0.data
});
plot_1.add(
{
color: 0xcad714,
name: "Спектр ускорения (канал 1)",
x: 1/ausp_lines,
y: ausp_accel_1_data
});
plot_2.add(
{
color: 0xff8800,
name: "Спектр ускорения (канал 2)",
x: 1/ausp_lines,
y: ausp_accel_2_data
});
plot_3.add(
{
color: 0xff00f7,
name: "Спектр силы (канал 3)",
x: 1/ausp_lines,
y: ausp_force_3_data
});
plot_FreqResp_ampl_0_3.add(
{
color: 0xedc887,
name: "Частотный отклик (каналы 0 и 3)",
x: 1/ausp_lines,
y: freq_resp_0_3_real
});
plot_FreqResp_phase_0_3.add(
{
color: 0xedc887,
name: "Фаза частотного отклика (каналы 0 и 3)",
x: 1/ausp_lines,
y: freq_resp_0_3_phase
});
plot_FreqResp_ampl_1_3.add(
{
color: 0xedc887,
name: "Частотный отклик (каналы 1 и 3)",
x: 1/ausp_lines,
y: freq_resp_1_3_real
});
plot_FreqResp_phase_1_3.add(
{
color: 0xedc887,
name: "Фаза частотного отклика (каналы 1 и 3)",
x: 1/ausp_lines,
y: freq_resp_1_3_phase
});
plot_FreqResp_ampl_2_3.add(
{
color: 0xedc887,
name: "Частотный отклик (каналы 2 и 3)",
x: 1/ausp_lines,
y: freq_resp_2_3_real
});
plot_FreqResp_phase_2_3.add(
{
color: 0xedc887,
name: "Фаза частотного отклика (каналы 2 и 3)",
x: 1/ausp_lines,
y: freq_resp_2_3_phase
});
gtl.diagnostic.stop();
}