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

696 lines
32 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 fnc = gtl.import("user-functions.js"); // используемые функции
let plot_ausp = gtl.plots.add("Спектр"); // спектры
let plot_FreqResp = gtl.plots.add("Частотный отклик"); // частотный отклик между каналами 0 и n
let plot_ausp_j = gtl.plots.add("Спектры по каналам"); // спектры по каналам вибрации
let plot_FreqResp_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 ausp_j = []; // массив объектов спектров вибрации
let counter = 1; // счётчик для цикла по каналам вибрации
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.stored_ranges;
// Спектры каналов ускорения (каналы датчиков вибрации)
gtl.log.info("Количество сигналов", signals.length);
// Спектр для цикла по всем каналам вибрации
for (let j = 1; j < signals.length; j++) {
ausp_j.push(
gtl.create_ausp(
{
"src": gtl.analog_inputs[signals[j].portNumber], // сигнал вибрации сырой
"frequency": frequency,
"resolution": resolution,
"average": average,
"overlap": overlap,
"window": gtl.spec.rectangular,
"view": gtl.spec.unit
}
)
);
}
gtl.log.info("Количество спектров", ausp_j.length);
// Спектр силы (канал сигнала молотка)
// Канал_0
let ausp_force_0 = gtl.create_ausp(
{
"src": gtl.analog_inputs[signals[0].portNumber], // сигнал вибрации сырой
"frequency": frequency,
"resolution": resolution,
"average": average,
"overlap": overlap,
"window": gtl.spec.rectangular,
"view": gtl.spec.unit
}
);
// Канал_1
let ausp_acсel_1 = gtl.create_ausp(
{
"src": gtl.analog_inputs[signals[1].portNumber], // сигнал вибрации сырой
"frequency": frequency,
"resolution": resolution,
"average": average,
"overlap": overlap,
"window": gtl.spec.rectangular,
"view": gtl.spec.unit
}
);
// Канал_2
let ausp_acсel_2 = gtl.create_ausp(
{
"src": gtl.analog_inputs[signals[2].portNumber], // сигнал вибрации сырой
"frequency": frequency,
"resolution": resolution,
"average": average,
"overlap": overlap,
"window": gtl.spec.rectangular,
"view": gtl.spec.unit
}
);
// Канал_3
let ausp_acсel_3 = gtl.create_ausp(
{
"src": gtl.analog_inputs[signals[3].portNumber], // сигнал вибрации сырой
"frequency": frequency,
"resolution": resolution,
"average": average,
"overlap": overlap,
"window": gtl.spec.rectangular,
"view": gtl.spec.unit
}
);
// Канал_4
let ausp_acсel_4 = gtl.create_ausp(
{
"src": gtl.analog_inputs[signals[4].portNumber], // сигнал вибрации сырой
"frequency": frequency,
"resolution": resolution,
"average": average,
"overlap": overlap,
"window": gtl.spec.rectangular,
"view": gtl.spec.unit
}
);
// Канал_5
let ausp_acсel_5 = gtl.create_ausp(
{
"src": gtl.analog_inputs[signals[5].portNumber], // сигнал вибрации сырой
"frequency": frequency,
"resolution": resolution,
"average": average,
"overlap": overlap,
"window": gtl.spec.rectangular,
"view": gtl.spec.unit
}
);
// Канал_6
let ausp_acсel_6 = gtl.create_ausp(
{
"src": gtl.analog_inputs[signals[6].portNumber], // сигнал вибрации сырой
"frequency": frequency,
"resolution": resolution,
"average": average,
"overlap": overlap,
"window": gtl.spec.rectangular,
"view": gtl.spec.unit
}
);
// Канал_7
let ausp_acсel_7 = gtl.create_ausp(
{
"src": gtl.analog_inputs[signals[7].portNumber], // сигнал вибрации сырой
"frequency": frequency,
"resolution": resolution,
"average": average,
"overlap": overlap,
"window": gtl.spec.rectangular,
"view": gtl.spec.unit
}
);
// Канал_8
let ausp_acсel_8 = gtl.create_ausp(
{
"src": gtl.analog_inputs[signals[8].portNumber], // сигнал вибрации сырой
"frequency": frequency,
"resolution": resolution,
"average": average,
"overlap": overlap,
"window": gtl.spec.rectangular,
"view": gtl.spec.unit
}
);
// Канал_9
let ausp_acсel_9 = gtl.create_ausp(
{
"src": gtl.analog_inputs[signals[9].portNumber], // сигнал вибрации сырой
"frequency": frequency,
"resolution": resolution,
"average": average,
"overlap": overlap,
"window": gtl.spec.rectangular,
"view": gtl.spec.unit
}
);
// Канал_10
let ausp_acсel_10 = gtl.create_ausp(
{
"src": gtl.analog_inputs[signals[10].portNumber], // сигнал вибрации сырой
"frequency": frequency,
"resolution": resolution,
"average": average,
"overlap": overlap,
"window": gtl.spec.rectangular,
"view": gtl.spec.unit
}
);
// Канал_11
let ausp_acсel_11 = gtl.create_ausp(
{
"src": gtl.analog_inputs[signals[11].portNumber], // сигнал вибрации сырой
"frequency": frequency,
"resolution": resolution,
"average": average,
"overlap": overlap,
"window": gtl.spec.rectangular,
"view": gtl.spec.unit
}
);
// Канал_12
let ausp_acсel_12 = gtl.create_ausp(
{
"src": gtl.analog_inputs[signals[12].portNumber], // сигнал вибрации сырой
"frequency": frequency,
"resolution": resolution,
"average": average,
"overlap": overlap,
"window": gtl.spec.rectangular,
"view": gtl.spec.unit
}
);
//*******************ДИАГНОСТИКА*********************
//***************************************************
// Задаем период проведения диагностики в секундах
var acq_time = Math.max(ausp_acсel_1.acq_time,
ausp_force_0.acq_time) + 0.3;
gtl.diagnostic.interval = acq_time;
// gtl.diagnostic.interval = 10; // время в секундах (константа)
// примечание: наблюдается зависимость результатов АФЧХ от времени диагностики
function diagnose() {
let n = ausp_force_0.data.length; // переменная для цикла по гармоникам спектра
// signals.length - переменная для цикла по каналам
gtl.log.info("n (ausp_data.length)", ausp_force_0.data.length);
gtl.log.info("Минимально необходимая длительность сигнала", gtl.diagnostic.interval);
// Канал_0 (ausp_force_0) - комплексно-сопряжённый вид
// меняется знак мнимой части на противоположный
// действительная часть без изменений
let ausp_force_0_imag_anti = []; // мнимая часть с противоположным знаком
for (let i = 0; i < n; i += 1)
{
ausp_force_0_imag_anti.push(ausp_force_0.imag[i] * (-1));
}
for (let j = 0; j < ausp_j.length; j++) {
if (counter > 0) {
plot_ausp_j.add(
{
color: 0x34C924,
name: `Спектр канала ${j+1}`,
x: ausp_j[j].resolution,
y: ausp_j[j].data
}
);
// Кросс-спектры
// Канал[0] & Канал[j]
ausp_cross_real[j] = [];
ausp_cross_imag[j] = [];
for (let i = 0; i < n; i += 1)
{
ausp_cross_real[j].push(ausp_j[j].real[i] * ausp_force_0.real[i] -
(ausp_j[j].imag[i] * ausp_force_0_imag_anti[i]));
ausp_cross_imag[j].push(ausp_j[j].real[i] * ausp_force_0_imag_anti[i] +
ausp_j[j].imag[i] * ausp_force_0.real[i]);
}
// Частотный отклик (деление кросс-спектра на спектр силы)
// (Канал[0] & Канал[j]) / Канал[0]
freq_resp_real[j] = [];
freq_resp_imag[j] = [];
for (let i = 0; i < n; i += 1)
{
freq_resp_real[j].push((ausp_cross_real[j][i] * ausp_force_0.real[i] +
ausp_cross_imag[j][i] * ausp_force_0.imag[i]) /
(Math.pow(ausp_force_0.real[i], 2) + Math.pow(ausp_force_0.imag[i], 2)));
freq_resp_imag[j].push((ausp_force_0.real[i] * ausp_cross_imag[j][i] -
ausp_cross_real[j][i] * ausp_force_0.imag[i]) /
(Math.pow(ausp_force_0.real[i], 2) + Math.pow(ausp_force_0.imag[i], 2)));
}
// запись массива амплитуды и фазы
freq_resp_ampl[j] = [];
freq_resp_phase[j] = [];
for (let i = 0; i < n; i += 1)
{
freq_resp_ampl[j].push(Math.sqrt(Math.pow(freq_resp_real[j][i],2) + Math.pow(freq_resp_imag[j][i],2)));
if (freq_resp_real[j][i] > 0 & freq_resp_imag[j][i] > 0)
{freq_resp_phase[j].push(Math.atan(freq_resp_imag[j][i] / freq_resp_real[j][i]) * 180 / Math.PI)}
else if (freq_resp_real[j][i] < 0 & freq_resp_imag[j][i] > 0)
{freq_resp_phase[j].push(180 - Math.atan(freq_resp_imag[j][i] / freq_resp_real[j][i]) * 180 / Math.PI)}
else if (freq_resp_real[j][i] < 0 & freq_resp_imag[j][i] < 0)
{freq_resp_phase[j].push(180 + Math.atan(freq_resp_imag[j][i] / freq_resp_real[j][i]) * 180 / Math.PI)}
else if (freq_resp_real[j][i] > 0 & freq_resp_imag[j][i] < 0)
{freq_resp_phase[j].push(360 - Math.atan(freq_resp_imag[j][i] / freq_resp_real[j][i]) * 180 / Math.PI)}
}
// корректировка угла для предотвращения превышения 360 град
for (let i = 0; i < freq_resp_phase[j].length; i += 1)
{
if (freq_resp_phase[j][i] >= 360)
{freq_resp_phase[j][i] = freq_resp_phase[j][i] - 360}
else {freq_resp_phase[j][i] = freq_resp_phase[j][i]}
}
plot_FreqResp_j.add(
{
color: 0x3b30b6,
name: `Амплитуда частотного отклика канала ${j+1}`,
x: 1/lines,
y: freq_resp_ampl[j],
tags: ["Амплитуда частотного отклика"]
});
plot_FreqResp_j.add(
{
color: 0xb6306f,
name: `Фаза частотного отклика канала ${j+1}`,
x: 1/lines,
y: freq_resp_phase[j],
tags: ["Фаза частотного отклика"]
});
}
};
// #b6306f - жёлтый
counter += 1;
// Получение массивов для формулы определения частотного отклика
// Кросс-спектры
// Канал_0 & Канал_1
let ausp_cross_0_1_real = []; // действительная часть кросс-спектра 0 & 1
let ausp_cross_0_1_imag = []; // мнимая часть кросс-спектра 0 & 1
for (let i = 0; i < n; i += 1)
{
ausp_cross_0_1_real.push(ausp_acсel_1.real[i] * ausp_force_0.real[i] -
(ausp_acсel_1.imag[i] * ausp_force_0_imag_anti[i]));
ausp_cross_0_1_imag.push(ausp_acсel_1.real[i] * ausp_force_0_imag_anti[i] +
ausp_acсel_1.imag[i] * ausp_force_0.real[i]);
}
// Канал_0 & Канал_2
let ausp_cross_0_2_real = []; // действительная часть кросс-спектра 0 & 2
let ausp_cross_0_2_imag = []; // мнимая часть кросс-спектра 0 & 2
for (let i = 0; i < n; i += 1)
{
ausp_cross_0_2_real.push(ausp_acсel_2.real[i] * ausp_force_0.real[i] -
(ausp_acсel_2.imag[i] * ausp_force_0_imag_anti[i]));
ausp_cross_0_2_imag.push(ausp_acсel_2.real[i] * ausp_force_0_imag_anti[i] +
ausp_acсel_2.imag[i] * ausp_force_0.real[i]);
}
// Канал_0 & Канал_3
let ausp_cross_0_3_real = []; // действительная часть кросс-спектра 0 & 3
let ausp_cross_0_3_imag = []; // мнимая часть кросс-спектра 0 & 3
for (let i = 0; i < n; i += 1)
{
ausp_cross_0_3_real.push(ausp_acсel_3.real[i] * ausp_force_0.real[i] -
(ausp_acсel_3.imag[i] * ausp_force_0_imag_anti[i]));
ausp_cross_0_3_imag.push(ausp_acсel_3.real[i] * ausp_force_0_imag_anti[i] +
ausp_acсel_3.imag[i] * ausp_force_0.real[i]);
}
// Канал_0 & Канал_4
let ausp_cross_0_4_real = []; // действительная часть кросс-спектра 0 & 4
let ausp_cross_0_4_imag = []; // мнимая часть кросс-спектра 0 & 4
for (let i = 0; i < n; i += 1)
{
ausp_cross_0_4_real.push(ausp_acсel_4.real[i] * ausp_force_0.real[i] -
(ausp_acсel_4.imag[i] * ausp_force_0_imag_anti[i]));
ausp_cross_0_4_imag.push(ausp_acсel_4.real[i] * ausp_force_0_imag_anti[i] +
ausp_acсel_4.imag[i] * ausp_force_0.real[i]);
}
// Канал_0 & Канал_5
let ausp_cross_0_5_real = []; // действительная часть кросс-спектра 0 & 5
let ausp_cross_0_5_imag = []; // мнимая часть кросс-спектра 0 & 5
for (let i = 0; i < n; i += 1)
{
ausp_cross_0_5_real.push(ausp_acсel_5.real[i] * ausp_force_0.real[i] -
(ausp_acсel_5.imag[i] * ausp_force_0_imag_anti[i]));
ausp_cross_0_5_imag.push(ausp_acсel_5.real[i] * ausp_force_0_imag_anti[i] +
ausp_acсel_5.imag[i] * ausp_force_0.real[i]);
}
// Канал_0 & Канал_6
let ausp_cross_0_6_real = []; // действительная часть кросс-спектра 0 & 6
let ausp_cross_0_6_imag = []; // мнимая часть кросс-спектра 0 & 6
for (let i = 0; i < n; i += 1)
{
ausp_cross_0_6_real.push(ausp_acсel_6.real[i] * ausp_force_0.real[i] -
(ausp_acсel_6.imag[i] * ausp_force_0_imag_anti[i]));
ausp_cross_0_6_imag.push(ausp_acсel_6.real[i] * ausp_force_0_imag_anti[i] +
ausp_acсel_6.imag[i] * ausp_force_0.real[i]);
}
// Канал_0 & Канал_7
let ausp_cross_0_7_real = []; // действительная часть кросс-спектра 0 & 7
let ausp_cross_0_7_imag = []; // мнимая часть кросс-спектра 0 & 7
for (let i = 0; i < n; i += 1)
{
ausp_cross_0_7_real.push(ausp_acсel_7.real[i] * ausp_force_0.real[i] -
(ausp_acсel_7.imag[i] * ausp_force_0_imag_anti[i]));
ausp_cross_0_7_imag.push(ausp_acсel_7.real[i] * ausp_force_0_imag_anti[i] +
ausp_acсel_7.imag[i] * ausp_force_0.real[i]);
}
// Канал_0 & Канал_8
let ausp_cross_0_8_real = []; // действительная часть кросс-спектра 0 & 8
let ausp_cross_0_8_imag = []; // мнимая часть кросс-спектра 0 & 8
for (let i = 0; i < n; i += 1)
{
ausp_cross_0_8_real.push(ausp_acсel_8.real[i] * ausp_force_0.real[i] -
(ausp_acсel_8.imag[i] * ausp_force_0_imag_anti[i]));
ausp_cross_0_8_imag.push(ausp_acсel_8.real[i] * ausp_force_0_imag_anti[i] +
ausp_acсel_8.imag[i] * ausp_force_0.real[i]);
}
// Канал_0 & Канал_9
let ausp_cross_0_9_real = []; // действительная часть кросс-спектра 0 & 9
let ausp_cross_0_9_imag = []; // мнимая часть кросс-спектра 0 & 9
for (let i = 0; i < n; i += 1)
{
ausp_cross_0_9_real.push(ausp_acсel_9.real[i] * ausp_force_0.real[i] -
(ausp_acсel_9.imag[i] * ausp_force_0_imag_anti[i]));
ausp_cross_0_9_imag.push(ausp_acсel_9.real[i] * ausp_force_0_imag_anti[i] +
ausp_acсel_9.imag[i] * ausp_force_0.real[i]);
}
// Канал_0 & Канал_10
let ausp_cross_0_10_real = []; // действительная часть кросс-спектра 0 & 10
let ausp_cross_0_10_imag = []; // мнимая часть кросс-спектра 0 & 10
for (let i = 0; i < n; i += 1)
{
ausp_cross_0_10_real.push(ausp_acсel_10.real[i] * ausp_force_0.real[i] -
(ausp_acсel_10.imag[i] * ausp_force_0_imag_anti[i]));
ausp_cross_0_10_imag.push(ausp_acсel_10.real[i] * ausp_force_0_imag_anti[i] +
ausp_acсel_10.imag[i] * ausp_force_0.real[i]);
}
// Канал_0 & Канал_11
let ausp_cross_0_11_real = []; // действительная часть кросс-спектра 0 & 11
let ausp_cross_0_11_imag = []; // мнимая часть кросс-спектра 0 & 11
for (let i = 0; i < n; i += 1)
{
ausp_cross_0_11_real.push(ausp_acсel_11.real[i] * ausp_force_0.real[i] -
(ausp_acсel_11.imag[i] * ausp_force_0_imag_anti[i]));
ausp_cross_0_11_imag.push(ausp_acсel_11.real[i] * ausp_force_0_imag_anti[i] +
ausp_acсel_11.imag[i] * ausp_force_0.real[i]);
}
// Канал_0 & Канал_12
let ausp_cross_0_12_real = []; // действительная часть кросс-спектра 0 & 12
let ausp_cross_0_12_imag = []; // мнимая часть кросс-спектра 0 & 12
for (let i = 0; i < n; i += 1)
{
ausp_cross_0_12_real.push(ausp_acсel_12.real[i] * ausp_force_0.real[i] -
(ausp_acсel_12.imag[i] * ausp_force_0_imag_anti[i]));
ausp_cross_0_12_imag.push(ausp_acсel_12.real[i] * ausp_force_0_imag_anti[i] +
ausp_acсel_12.imag[i] * ausp_force_0.real[i]);
}
// Частотный отклик (деление кросс-спектра на спектр силы)
// (Канал_0 & Канал_1) / Канал_0
let freq_resp_0_1_real = []; // действительная часть частотного отклика между 0 и 1
let freq_resp_0_1_imag = []; // мнимая часть частотного отклика между 0 и 1
let freq_resp_0_1_ampl = []; // амплитуда частотного отклика между 0 и 1
let freq_resp_0_1_phase = []; // фаза частотного отклика между 0 и 1
for (let i = 0; i < n; i += 1)
{
freq_resp_0_1_real.push((ausp_cross_0_1_real[i] * ausp_force_0.real[i] +
ausp_cross_0_1_imag[i] * ausp_force_0.imag[i]) /
(Math.pow(ausp_force_0.real[i], 2) + Math.pow(ausp_force_0.imag[i], 2)));
freq_resp_0_1_imag.push((ausp_force_0.real[i] * ausp_cross_0_1_imag[i] -
ausp_cross_0_1_real[i] * ausp_force_0.imag[i]) /
(Math.pow(ausp_force_0.real[i], 2) + Math.pow(ausp_force_0.imag[i], 2)));
}
// запись массива амплитуды и фазы
for (let i = 0; i < n; i += 1)
{
freq_resp_0_1_ampl.push(Math.sqrt(Math.pow(freq_resp_0_1_real[i],2) + Math.pow(freq_resp_0_1_imag[i],2)));
if (freq_resp_0_1_real[i] > 0 & freq_resp_0_1_imag[i] > 0)
{freq_resp_0_1_phase.push(Math.atan(freq_resp_0_1_imag[i] / freq_resp_0_1_real[i]) * 180 / Math.PI)}
else if (freq_resp_0_1_real[i] < 0 & freq_resp_0_1_imag[i] > 0)
{freq_resp_0_1_phase.push(180 - Math.atan(freq_resp_0_1_imag[i] / freq_resp_0_1_real[i]) * 180 / Math.PI)}
else if (freq_resp_0_1_real[i] < 0 & freq_resp_0_1_imag[i] < 0)
{freq_resp_0_1_phase.push(180 + Math.atan(freq_resp_0_1_imag[i] / freq_resp_0_1_real[i]) * 180 / Math.PI)}
else if (freq_resp_0_1_real[i] > 0 & freq_resp_0_1_imag[i] < 0)
{freq_resp_0_1_phase.push(360 - Math.atan(freq_resp_0_1_imag[i] / freq_resp_0_1_real[i]) * 180 / Math.PI)}
}
// корректировка угла для предотвращения превышения 360 град
for (let i = 0; i < freq_resp_0_1_phase.length; i += 1)
{
if (freq_resp_0_1_phase[i] >= 360)
{freq_resp_0_1_phase[i] = freq_resp_0_1_phase[i] - 360}
else {freq_resp_0_1_phase[i] = freq_resp_0_1_phase[i]}
}
// (Канал_0 & Канал_2) / Канал_0
let freq_resp_0_2_real = []; // действительная часть частотного отклика между 0 и 2
let freq_resp_0_2_imag = []; // мнимая часть частотного отклика между 0 и 2
let freq_resp_0_2_ampl = []; // амплитуда частотного отклика между 0 и 2
let freq_resp_0_2_phase = []; // фаза частотного отклика между 0 и 2
for (let i = 0; i < n; i += 1)
{
freq_resp_0_2_real.push((ausp_cross_0_2_real[i] * ausp_force_0.real[i] +
ausp_cross_0_2_imag[i] * ausp_force_0.imag[i]) /
(Math.pow(ausp_force_0.real[i], 2) + Math.pow(ausp_force_0.imag[i], 2)));
freq_resp_0_2_imag.push((ausp_force_0.real[i] * ausp_cross_0_2_imag[i] -
ausp_cross_0_2_real[i] * ausp_force_0.imag[i]) /
(Math.pow(ausp_force_0.real[i], 2) + Math.pow(ausp_force_0.imag[i], 2)));
}
// запись массива амплитуды и фазы
for (let i = 0; i < n; i += 1)
{
freq_resp_0_2_ampl.push(Math.sqrt(Math.pow(freq_resp_0_2_real[i],2) + Math.pow(freq_resp_0_2_imag[i],2)));
if (freq_resp_0_2_real[i] > 0 & freq_resp_0_2_imag[i] > 0)
{freq_resp_0_2_phase.push(Math.atan(freq_resp_0_2_imag[i] / freq_resp_0_2_real[i]) * 180 / Math.PI)}
else if (freq_resp_0_2_real[i] < 0 & freq_resp_0_2_imag[i] > 0)
{freq_resp_0_2_phase.push(180 - Math.atan(freq_resp_0_2_imag[i] / freq_resp_0_2_real[i]) * 180 / Math.PI)}
else if (freq_resp_0_2_real[i] < 0 & freq_resp_0_2_imag[i] < 0)
{freq_resp_0_2_phase.push(180 + Math.atan(freq_resp_0_2_imag[i] / freq_resp_0_2_real[i]) * 180 / Math.PI)}
else if (freq_resp_0_2_real[i] > 0 & freq_resp_0_2_imag[i] < 0)
{freq_resp_0_2_phase.push(360 - Math.atan(freq_resp_0_2_imag[i] / freq_resp_0_2_real[i]) * 180 / Math.PI)}
}
// корректировка угла для предотвращения превышения 360 град
for (let i = 0; i < freq_resp_0_2_phase.length; i += 1)
{
if (freq_resp_0_2_phase[i] >= 360)
{freq_resp_0_2_phase[i] = freq_resp_0_2_phase[i] - 360}
else {freq_resp_0_2_phase[i] = freq_resp_0_2_phase[i]}
}
// (Канал_0 & Канал_3) / Канал_0
let freq_resp_0_3_real = []; // действительная часть частотного отклика между 0 и 3
let freq_resp_0_3_imag = []; // мнимая часть частотного отклика между 0 и 3
let freq_resp_0_3_ampl = []; // амплитуда частотного отклика между 0 и 3
let 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_0.real[i] +
ausp_cross_0_3_imag[i] * ausp_force_0.imag[i]) /
(Math.pow(ausp_force_0.real[i], 2) + Math.pow(ausp_force_0.imag[i], 2)));
freq_resp_0_3_imag.push((ausp_force_0.real[i] * ausp_cross_0_3_imag[i] -
ausp_cross_0_3_real[i] * ausp_force_0.imag[i]) /
(Math.pow(ausp_force_0.real[i], 2) + Math.pow(ausp_force_0.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)));
if (freq_resp_0_3_real[i] > 0 & freq_resp_0_3_imag[i] > 0)
{freq_resp_0_3_phase.push(Math.atan(freq_resp_0_3_imag[i] / freq_resp_0_3_real[i]) * 180 / Math.PI)}
else if (freq_resp_0_3_real[i] < 0 & freq_resp_0_3_imag[i] > 0)
{freq_resp_0_3_phase.push(180 - Math.atan(freq_resp_0_3_imag[i] / freq_resp_0_3_real[i]) * 180 / Math.PI)}
else if (freq_resp_0_3_real[i] < 0 & freq_resp_0_3_imag[i] < 0)
{freq_resp_0_3_phase.push(180 + Math.atan(freq_resp_0_3_imag[i] / freq_resp_0_3_real[i]) * 180 / Math.PI)}
else if (freq_resp_0_3_real[i] > 0 & freq_resp_0_3_imag[i] < 0)
{freq_resp_0_3_phase.push(360 - Math.atan(freq_resp_0_3_imag[i] / freq_resp_0_3_real[i]) * 180 / Math.PI)}
}
// корректировка угла для предотвращения превышения 360 град
for (let i = 0; i < freq_resp_0_3_phase.length; i += 1)
{
if (freq_resp_0_3_phase[i] >= 360)
{freq_resp_0_3_phase[i] = freq_resp_0_3_phase[i] - 360}
else {freq_resp_0_3_phase[i] = freq_resp_0_3_phase[i]}
}
// Построение пользовательских графиков
// plot_ausp.add(
// {
// color: 0x04ff00,
// name: "Спектр ускорения (канал 1)",
// x: 1/lines,
// y: ausp_acсel_1.data
// });
// plot_ausp.add(
// {
// color: 0xcad714,
// name: "Спектр ускорения (канал 2)",
// x: 1/lines,
// y: ausp_acсel_2.data
// });
// plot_ausp.add(
// {
// color: 0xff8800,
// name: "Спектр ускорения (канал 3)",
// x: 1/lines,
// y: ausp_acсel_2.data
// });
plot_ausp.add(
{
color: 0xff00f7,
name: "Спектр силы (канал 0)",
x: 1/lines,
y: ausp_force_0.data
});
plot_FreqResp.add(
{
color: 0x04ff00,
name: "Амплитуда частотного отклика (каналы 0 и 1)",
x: 1/lines,
y: freq_resp_0_1_ampl
});
plot_FreqResp.add(
{
color: 0x04ff00,
name: "Фаза частотного отклика (каналы 0 и 1)",
x: 1/lines,
y: freq_resp_0_1_phase
});
plot_FreqResp.add(
{
color: 0xcad714,
name: "Амплитуда частотного отклика (каналы 0 и 2)",
x: 1/lines,
y: freq_resp_0_2_ampl
});
plot_FreqResp.add(
{
color: 0xcad714,
name: "Фаза частотного отклика (каналы 0 и 2)",
x: 1/lines,
y: freq_resp_0_2_phase
});
plot_FreqResp.add(
{
color: 0xff8800,
name: "Амплитуда частотного отклика (каналы 0 и 3)",
x: 1/lines,
y: freq_resp_0_3_ampl
});
plot_FreqResp.add(
{
color: 0xff8800,
name: "Фаза частотного отклика (каналы 0 и 3)",
x: 1/lines,
y: freq_resp_0_3_phase
});
gtl.diagnostic.stop();
}