696 lines
32 KiB
JavaScript
696 lines
32 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 = 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();
|
||
} |