"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(); }