diff --git a/Frequency_responce.gtld b/Frequency_responce.gtld index f8b183a..489f7b7 100644 --- a/Frequency_responce.gtld +++ b/Frequency_responce.gtld @@ -1,7 +1,7 @@ { "autoStartRecorder": false, "expendTreeOnStart": true, - "lastTag": "частотный отклик freq-1000 resol-10 (искл 4,7,8)", + "lastTag": "4096Гц_разр1[4]", "projectTitle": "Частотный отклик", "projectUUID": "{91ae6936-d7c1-41f2-ac73-1fb5692a4011}", "reportOptions": { diff --git a/Frequency_responce_local_storage.sqlite b/Frequency_responce_local_storage.sqlite index 2d051e1..b540de4 100644 Binary files a/Frequency_responce_local_storage.sqlite and b/Frequency_responce_local_storage.sqlite differ diff --git a/Frequency_responce_model.json b/Frequency_responce_model.json index 0f014a6..048f144 100644 --- a/Frequency_responce_model.json +++ b/Frequency_responce_model.json @@ -43,277 +43,7 @@ "cbdZ1": 0, "cbdZ2": 0, "cbdZ3": 0, - "customOptionsString": "{\n\"ranges\": [\n{\n\"max\": 13.766053515625,\n\"min\": 13.355623828125\n},\n{\n\"max\": 17.592342578125,\n\"min\": 17.181912892625\n},\n{\n\"max\": 21.179315234374997,\n\"min\": 20.768885546874998\n},\n{\n\"max\": 24.162000781249997,\n\"min\": 23.751571093749998\n},\n{\n\"max\": 27.704744921874997,\n\"min\": 27.294315234375\n},\n{\n\"max\": 32.293602343749995,\n\"min\": 31.883172656249997\n},\n{\n\"max\": 37.146190234375,\n\"min\": 36.735760546875\n},\n{\n\"max\": 40.513612109374996,\n\"min\": 40.103182421875\n},\n{\n\"max\": 44.100897265624994,\n\"min\": 43.690467578124995\n}\n],\n\n\"frequency_comment\": \"граничная частота спектра\",\n\"frequency\": 1000,\n\n\"view_comment\": \"отображение амплитуды спектра в дБ или линейных единицах: 1 - db, 0 - unit\",\n\"view\": 0,\n\n\"view_freq_resp_comment\": \"отображение амплитуды частотного отклика в дБ или линейных единицах: 1 - db, 0 - unit\",\n\"view_freq_resp\": 0,\n\n\"average_comment\": \"усреднение спектра\",\n\"average\": 1,\n\n\"overlap_comment\": \"наложение сигнала для спектра\",\n\"overlap\": 0,\n\n\"variant_freq_resp_comment\": \"вариант вычисления частотного отклика: 0 - через кросс, 1 - через автоспектр\",\n\"variant_freq_resp\": 0,\n\n\"thresh_level_comment\": \"уровень удара для засчитывания импульса\",\n\"thresh_level\": 500,\n\n\"time_impulse_comment\": \"длина импульса, если не задано вручную, то вычисляется в скрипте\",\n\"time_impulse\": 0,\n\n\"resolution_comment\": \"разрешение спектра\",\n\"resolution\": 10\n}", - "dpt_K": 0, - "dpt_M": 0, - "dpt_N": 0, - "dpt_freq": 50, - "elType": 0, - "groupType": 0, - "gtZ1": 0, - "gtZ2": 0, - "isQMLViewActive": false, - "isRouteStarter": false, - "items": [ - { - "U_freq": 50, - "async_N_rotor": 0, - "bdD1": 0, - "bdD2": 0, - "bdL": 0, - "bsAngle": 0, - "bsInnerD": 0, - "bsModelName": "", - "bsOuterD": 0, - "bsRollerCount": 0, - "bsRollerD": 0, - "bsVendor": "", - "cbdZ1": 0, - "cbdZ2": 0, - "cbdZ3": 0, - "customOptionsString": "{}", - "dpt_K": 0, - "dpt_M": 0, - "dpt_N": 0, - "dpt_freq": 50, - "elType": 0, - "groupType": 0, - "gtZ1": 0, - "gtZ2": 0, - "isQMLViewActive": false, - "isRouteStarter": false, - "items": [ - ], - "masterScriptName": "", - "name": "СТ верх горизонталь", - "nodeType": 2, - "objectType": 0, - "pgN": 0, - "pgZ1": 0, - "pgZ2": 0, - "pgZ3": 0, - "pmBlades": 0, - "pointComment": "", - "qmlScriptName": "default_point.qml", - "rbAngle": 0, - "rbInnerD": 0, - "rbModelName": "", - "rbOuterD": 0, - "rbRollerCount": 0, - "rbRollerD": 0, - "rbVendor": "", - "scriptName": "Частотный_отклик v12.js", - "sync_M_rotor": 0, - "sync_M_stator": 0, - "tachoRatio": 1, - "trBlades": 0, - "uuid": "{1ee51458-2b67-4738-8832-24a883abe26a}" - }, - { - "U_freq": 50, - "async_N_rotor": 0, - "bdD1": 0, - "bdD2": 0, - "bdL": 0, - "bsAngle": 0, - "bsInnerD": 0, - "bsModelName": "", - "bsOuterD": 0, - "bsRollerCount": 0, - "bsRollerD": 0, - "bsVendor": "", - "cbdZ1": 0, - "cbdZ2": 0, - "cbdZ3": 0, - "customOptionsString": "{}", - "dpt_K": 0, - "dpt_M": 0, - "dpt_N": 0, - "dpt_freq": 50, - "elType": 0, - "groupType": 0, - "gtZ1": 0, - "gtZ2": 0, - "isQMLViewActive": false, - "isRouteStarter": false, - "items": [ - ], - "masterScriptName": "", - "name": "СТ верх вертикаль", - "nodeType": 2, - "objectType": 0, - "pgN": 0, - "pgZ1": 0, - "pgZ2": 0, - "pgZ3": 0, - "pmBlades": 0, - "pointComment": "", - "qmlScriptName": "default_point.qml", - "rbAngle": 0, - "rbInnerD": 0, - "rbModelName": "", - "rbOuterD": 0, - "rbRollerCount": 0, - "rbRollerD": 0, - "rbVendor": "", - "scriptName": "freq_response 2.js", - "sync_M_rotor": 0, - "sync_M_stator": 0, - "tachoRatio": 1, - "trBlades": 0, - "uuid": "{d5f70fb9-1e58-4e23-b3e8-5270c02d0904}" - }, - { - "U_freq": 50, - "async_N_rotor": 0, - "bdD1": 0, - "bdD2": 0, - "bdL": 0, - "bsAngle": 0, - "bsInnerD": 0, - "bsModelName": "", - "bsOuterD": 0, - "bsRollerCount": 0, - "bsRollerD": 0, - "bsVendor": "", - "cbdZ1": 0, - "cbdZ2": 0, - "cbdZ3": 0, - "customOptionsString": "{}", - "dpt_K": 0, - "dpt_M": 0, - "dpt_N": 0, - "dpt_freq": 50, - "elType": 0, - "groupType": 0, - "gtZ1": 0, - "gtZ2": 0, - "isQMLViewActive": false, - "isRouteStarter": false, - "items": [ - ], - "masterScriptName": "", - "name": "СТ низ горизонталь", - "nodeType": 2, - "objectType": 0, - "pgN": 0, - "pgZ1": 0, - "pgZ2": 0, - "pgZ3": 0, - "pmBlades": 0, - "pointComment": "", - "qmlScriptName": "default_point.qml", - "rbAngle": 0, - "rbInnerD": 0, - "rbModelName": "", - "rbOuterD": 0, - "rbRollerCount": 0, - "rbRollerD": 0, - "rbVendor": "", - "scriptName": "freq_response 2.js", - "sync_M_rotor": 0, - "sync_M_stator": 0, - "tachoRatio": 1, - "trBlades": 0, - "uuid": "{da645bbe-04b5-4d5e-86de-3b5ba633addc}" - }, - { - "U_freq": 50, - "async_N_rotor": 0, - "bdD1": 0, - "bdD2": 0, - "bdL": 0, - "bsAngle": 0, - "bsInnerD": 0, - "bsModelName": "", - "bsOuterD": 0, - "bsRollerCount": 0, - "bsRollerD": 0, - "bsVendor": "", - "cbdZ1": 0, - "cbdZ2": 0, - "cbdZ3": 0, - "customOptionsString": "{}", - "dpt_K": 0, - "dpt_M": 0, - "dpt_N": 0, - "dpt_freq": 50, - "elType": 0, - "groupType": 0, - "gtZ1": 0, - "gtZ2": 0, - "isQMLViewActive": false, - "isRouteStarter": false, - "items": [ - ], - "masterScriptName": "", - "name": "СТ низ вертикаль", - "nodeType": 2, - "objectType": 0, - "pgN": 0, - "pgZ1": 0, - "pgZ2": 0, - "pgZ3": 0, - "pmBlades": 0, - "pointComment": "", - "qmlScriptName": "default_point.qml", - "rbAngle": 0, - "rbInnerD": 0, - "rbModelName": "", - "rbOuterD": 0, - "rbRollerCount": 0, - "rbRollerD": 0, - "rbVendor": "", - "scriptName": "freq_response.js", - "sync_M_rotor": 0, - "sync_M_stator": 0, - "tachoRatio": 1, - "trBlades": 0, - "uuid": "{5aba8185-bd6d-4469-a877-366899f020e9}" - } - ], - "masterScriptName": "", - "name": "Частотный отклик по размеченным сигналам", - "nodeType": 1, - "objectType": 0, - "pgN": 0, - "pgZ1": 0, - "pgZ2": 0, - "pgZ3": 0, - "pmBlades": 0, - "pointComment": "", - "qmlScriptName": "", - "rbAngle": 0, - "rbInnerD": 0, - "rbModelName": "", - "rbOuterD": 0, - "rbRollerCount": 0, - "rbRollerD": 0, - "rbVendor": "", - "scriptName": "", - "sync_M_rotor": 0, - "sync_M_stator": 0, - "tachoRatio": 1, - "trBlades": 0, - "uuid": "{4309f187-2cb5-463c-a4cd-520050c00401}" - }, - { - "U_freq": 50, - "async_N_rotor": 0, - "bdD1": 0, - "bdD2": 0, - "bdL": 0, - "bsAngle": 0, - "bsInnerD": 0, - "bsModelName": "", - "bsOuterD": 0, - "bsRollerCount": 0, - "bsRollerD": 0, - "bsVendor": "", - "cbdZ1": 0, - "cbdZ2": 0, - "cbdZ3": 0, - "customOptionsString": "{\n\"frequency_comment\": \"граничная частота спектра\",\n\"frequency\": 40000,\n\n\"view_comment\": \"отображение амплитуды спектра в дБ или линейных единицах: 1 - db, 0 - unit\",\n\"view\": 0,\n\n\"view_freq_resp_comment\": \"отображение амплитуды частотного отклика в дБ или линейных единицах: 1 - db, 0 - unit\",\n\"view_freq_resp\": 0,\n\n\"average_comment\": \"усреднение спектра\",\n\"average\": 1,\n\n\"overlap_comment\": \"наложение сигнала для спектра\",\n\"overlap\": 0,\n\n\"variant_freq_resp_comment\": \"вариант вычисления частотного отклика: 0 - через кросс, 1 - через автоспектр\",\n\"variant_freq_resp\": 0,\n\n\"thresh_level_comment\": \"уровень удара для засчитывания импульса\",\n\"thresh_level\": 500,\n\n\"time_impulse_comment\": \"длина импульса, если не задано вручную, то вычисляется в скрипте\",\n\"time_impulse\": 0,\n\n\"resolution_comment\": \"разрешение спектра\",\n\"resolution\": 100\n}", + "customOptionsString": "{\n\"frequency_comment\": \"граничная частота спектра\",\n\"frequency\": 4096,\n\n\"view_comment\": \"отображение амплитуды спектра в дБ или линейных единицах: 1 - db, 0 - unit\",\n\"view\": 0,\n\n\"view_freq_resp_comment\": \"отображение амплитуды частотного отклика в дБ или линейных единицах: 1 - db, 0 - unit\",\n\"view_freq_resp\": 0,\n\n\"average_comment\": \"усреднение спектра\",\n\"average\": 1,\n\n\"overlap_comment\": \"наложение сигнала для спектра\",\n\"overlap\": 0,\n\n\"variant_freq_resp_comment\": \"вариант вычисления частотного отклика: 0 - через кросс, 1 - через автоспектр\",\n\"variant_freq_resp\": 0,\n\n\"thresh_level_comment\": \"уровень удара для засчитывания импульса\",\n\"thresh_level\": 500,\n\n\"time_impulse_comment\": \"длина импульса, если не задано вручную, то вычисляется в скрипте\",\n\"time_impulse\": 0,\n\n\"resolution_comment\": \"разрешение спектра\",\n\"resolution\": 1\n}", "dpt_K": 0, "dpt_M": 0, "dpt_N": 0, @@ -583,7 +313,7 @@ "cbdZ1": 0, "cbdZ2": 0, "cbdZ3": 0, - "customOptionsString": "{\n \"ranges\": [\n {\n \"max\": 13.4652234375,\n \"min\": 13.3556140625\n },\n {\n \"max\": 17.291522265625,\n \"min\": 17.181912890625\n },\n {\n \"max\": 20.87848515625,\n \"min\": 20.76887578125\n },\n {\n \"max\": 23.86118046875,\n \"min\": 23.751571093749998\n },\n {\n \"max\": 27.403924609375,\n \"min\": 27.294315234375\n },\n {\n \"max\": 31.992782031249998,\n \"min\": 31.883172656249997\n },\n {\n \"max\": 36.845369921875,\n \"min\": 36.735760546875\n },\n {\n \"max\": 40.212791796874995,\n \"min\": 40.103182421875\n },\n {\n \"max\": 43.80007695312499,\n \"min\": 43.690467578124995\n }\n ],\n\n\"remove_resp_arr\": [4,7,8],\n\n\"frequency_comment\": \"граничная частота спектра\",\n\"frequency\": 1000,\n\n\"view_comment\": \"отображение амплитуды спектра в дБ или линейных единицах: 1 - db, 0 - unit\",\n\"view\": 0,\n\n\"view_freq_resp_comment\": \"отображение амплитуды частотного отклика в дБ или линейных единицах: 1 - db, 0 - unit\",\n\"view_freq_resp\": 0,\n\n\"average_comment\": \"усреднение спектра\",\n\"average\": 1,\n\n\"overlap_comment\": \"наложение сигнала для спектра\",\n\"overlap\": 0,\n\n\"variant_freq_resp_comment\": \"вариант вычисления частотного отклика: 0 - через кросс, 1 - через автоспектр\",\n\"variant_freq_resp\": 0,\n\n\"thresh_level_comment\": \"уровень удара для засчитывания импульса\",\n\"thresh_level\": 500,\n\n\"time_impulse_comment\": \"длина импульса, если не задано вручную, то вычисляется в скрипте\",\n\"time_impulse\": 0,\n\n\"resolution_comment\": \"разрешение спектра\",\n\"resolution\": 10\n}", + "customOptionsString": "{\n \"ranges\": [\n {\n \"max\": 15.3656140625,\n \"min\": 13.3556140625\n },\n {\n \"max\": 19.191912890624998,\n \"min\": 17.181912890625\n },\n {\n \"max\": 22.77887578125,\n \"min\": 20.76887578125\n },\n {\n \"max\": 25.76157109375,\n \"min\": 23.751571093749998\n },\n {\n \"max\": 29.30431534374997,\n \"min\": 27.294315234375\n },\n {\n \"max\": 32.893172656249995,\n \"min\": 31.883172656249997\n },\n {\n \"max\": 38.745760546875,\n \"min\": 36.735760546875\n },\n {\n \"max\": 42.113182421874995,\n \"min\": 40.103182421875\n },\n {\n \"max\": 45.70046757812499,\n \"min\": 43.690467578124995\n }\n ],\n\n\"window_spec_force_comment\": \"окно спектра силы\",\n\"window_spec_force\": \"gtl.spec.rectangular\",\n\n\"window_spec_vibr_comment\": \"окно спектра вибрации\",\n\"window_spec_vibr\": \"gtl.spec.rectangular\",\n\n\"remove_resp_arr_comment\": \"удары, которые нужно исключить из усреднения\",\n\"remove_resp_arr\": [4,6],\n\n\"frequency_comment\": \"граничная частота спектра\",\n\"frequency\": 4096,\n\n\"view_comment\": \"отображение амплитуды спектра в дБ или линейных единицах: 1 - db, 0 - unit\",\n\"view\": 0,\n\n\"view_freq_resp_comment\": \"отображение амплитуды частотного отклика в дБ или линейных единицах: 1 - db, 0 - unit\",\n\"view_freq_resp\": 0,\n\n\"average_comment\": \"усреднение спектра\",\n\"average\": 1,\n\n\"overlap_comment\": \"наложение сигнала для спектра\",\n\"overlap\": 0,\n\n\"variant_freq_resp_comment\": \"вариант вычисления частотного отклика: 0 - через кросс, 1 - через автоспектр\",\n\"variant_freq_resp\": 0,\n\n\"thresh_level_comment\": \"уровень удара для засчитывания импульса\",\n\"thresh_level\": 500,\n\n\"time_impulse_comment\": \"длина импульса, если не задано вручную, то вычисляется в скрипте\",\n\"time_impulse\": 0,\n\n\"resolution_comment\": \"разрешение спектра\",\n\"resolution\": 0.5\n}", "dpt_K": 0, "dpt_M": 0, "dpt_N": 0, @@ -1015,7 +745,7 @@ "cbdZ1": 0, "cbdZ2": 0, "cbdZ3": 0, - "customOptionsString": "{\n\"ranges\": [\n{\n\"max\": 13.766053515625,\n\"min\": 13.355623828125\n},\n{\n\"max\": 17.592342578125,\n\"min\": 17.181912892625\n},\n{\n\"max\": 21.179315234374997,\n\"min\": 20.768885546874998\n},\n{\n\"max\": 24.162000781249997,\n\"min\": 23.751571093749998\n},\n{\n\"max\": 27.704744921874997,\n\"min\": 27.294315234375\n},\n{\n\"max\": 32.293602343749995,\n\"min\": 31.883172656249997\n},\n{\n\"max\": 37.146190234375,\n\"min\": 36.735760546875\n},\n{\n\"max\": 40.513612109374996,\n\"min\": 40.103182421875\n},\n{\n\"max\": 44.100897265624994,\n\"min\": 43.690467578124995\n}\n],\n\n\"frequency_comment\": \"граничная частота спектра\",\n\"frequency\": 10000,\n\n\"view_comment\": \"отображение амплитуды спектра в дБ или линейных единицах: 1 - db, 0 - unit\",\n\"view\": 0,\n\n\"view_freq_resp_comment\": \"отображение амплитуды частотного отклика в дБ или линейных единицах: 1 - db, 0 - unit\",\n\"view_freq_resp\": 0,\n\n\"average_comment\": \"усреднение спектра\",\n\"average\": 1,\n\n\"overlap_comment\": \"наложение сигнала для спектра\",\n\"overlap\": 0,\n\n\"variant_freq_resp_comment\": \"вариант вычисления частотного отклика: 0 - через кросс, 1 - через автоспектр\",\n\"variant_freq_resp\": 0,\n\n\"thresh_level_comment\": \"уровень удара для засчитывания импульса\",\n\"thresh_level\": 500,\n\n\"time_impulse_comment\": \"длина импульса, если не задано вручную, то вычисляется в скрипте\",\n\"time_impulse\": 0,\n\n\"resolution_comment\": \"разрешение спектра\",\n\"resolution\": 10\n}", + "customOptionsString": "{\n \"ranges\": [\n {\n \"max\": 14.3656140625,\n \"min\": 13.3556140625\n },\n {\n \"max\": 18.191912890625,\n \"min\": 17.181912890625\n },\n {\n \"max\": 21.77887578125,\n \"min\": 20.76887578125\n },\n {\n \"max\": 24.76157109375,\n \"min\": 23.751571093749998\n },\n {\n \"max\": 28.304315234375,\n \"min\": 27.294315234375\n },\n {\n \"max\": 32.893172656249995,\n \"min\": 31.883172656249997\n },\n {\n \"max\": 37.745760546875,\n \"min\": 36.735760546875\n },\n {\n \"max\": 41.113182421874995,\n \"min\": 40.103182421875\n },\n {\n \"max\": 44.70046757812499,\n \"min\": 43.690467578124995\n }\n ],\n\n\"window_spec_force_comment\": \"окно спектра силы\",\n\"window_spec_force\": \"gtl.spec.rectangular\",\n\n\"window_spec_vibr_comment\": \"окно спектра вибрации\",\n\"window_spec_vibr\": \"gtl.spec.rectangular\",\n\n\"remove_resp_arr_comment\": \"удары, которые нужно исключить из усреднения\",\n\"remove_resp_arr\": [3,4],\n\n\"frequency_comment\": \"граничная частота спектра\",\n\"frequency\": 4096,\n\n\"view_comment\": \"отображение амплитуды спектра в дБ или линейных единицах: 1 - db, 0 - unit\",\n\"view\": 0,\n\n\"view_freq_resp_comment\": \"отображение амплитуды частотного отклика в дБ или линейных единицах: 1 - db, 0 - unit\",\n\"view_freq_resp\": 0,\n\n\"average_comment\": \"усреднение спектра\",\n\"average\": 1,\n\n\"overlap_comment\": \"наложение сигнала для спектра\",\n\"overlap\": 0,\n\n\"variant_freq_resp_comment\": \"вариант вычисления частотного отклика: 0 - через кросс, 1 - через автоспектр\",\n\"variant_freq_resp\": 0,\n\n\"thresh_level_comment\": \"уровень удара для засчитывания импульса\",\n\"thresh_level\": 500,\n\n\"time_impulse_comment\": \"длина импульса, если не задано вручную, то вычисляется в скрипте\",\n\"time_impulse\": 0,\n\n\"resolution_comment\": \"разрешение спектра\",\n\"resolution\": 1\n}", "dpt_K": 0, "dpt_M": 0, "dpt_N": 0, @@ -1074,7 +804,7 @@ "rbRollerCount": 0, "rbRollerD": 0, "rbVendor": "", - "scriptName": "freq_response 2.js", + "scriptName": "freq_response_multichannel_new.js", "sync_M_rotor": 0, "sync_M_stator": 0, "tachoRatio": 1, @@ -1083,7 +813,7 @@ } ], "masterScriptName": "", - "name": "Новый объект", + "name": "Частотный отклик \"верх горизонталь\" все каналы", "nodeType": 1, "objectType": 0, "pgN": 0, @@ -1106,6 +836,330 @@ "tachoRatio": 1, "trBlades": 0, "uuid": "{a5e1df73-9f23-451b-83f1-719a5ec4bb7e}" + }, + { + "U_freq": 50, + "async_N_rotor": 0, + "bdD1": 0, + "bdD2": 0, + "bdL": 0, + "bsAngle": 0, + "bsInnerD": 0, + "bsModelName": "", + "bsOuterD": 0, + "bsRollerCount": 0, + "bsRollerD": 0, + "bsVendor": "", + "cbdZ1": 0, + "cbdZ2": 0, + "cbdZ3": 0, + "customOptionsString": "{\n \"ranges\": [\n {\n \"max\": 3.9452332031250004,\n \"min\": 2.935233203125\n },\n {\n \"max\": 12.82114140625,\n \"min\": 11.81114140625\n },\n {\n \"max\": 15.887362109375,\n \"min\": 14.877362109375\n },\n {\n \"max\": 18.64137578125,\n \"min\": 17.63137578125\n },\n {\n \"max\": 21.4958875,\n \"min\": 20.485887499999997\n },\n {\n \"max\": 24.302557421875,\n \"min\": 23.292557421875\n },\n {\n \"max\": 27.007244921875,\n \"min\": 25.997244921874998\n },\n {\n \"max\": 39.888377734375,\n \"min\": 28.878377734374997\n },\n {\n \"max\": 33.000780078125,\n \"min\": 31.990780078125\n },\n {\n \"max\": 36.1985828125,\n \"min\": 35.1885828125\n }\n ],\n\n\"window_spec_force_comment\": \"окно спектра силы\",\n\"window_spec_force\": \"gtl.spec.rectangular\",\n\n\"window_spec_vibr_comment\": \"окно спектра вибрации\",\n\"window_spec_vibr\": \"gtl.spec.rectangular\",\n\n\"remove_resp_arr_comment\": \"удары, которые нужно исключить из усреднения\",\n\"remove_resp_arr\": [1,3,4,9],\n\n\"frequency_comment\": \"граничная частота спектра\",\n\"frequency\": 4096,\n\n\"view_comment\": \"отображение амплитуды спектра в дБ или линейных единицах: 1 - db, 0 - unit\",\n\"view\": 0,\n\n\"view_freq_resp_comment\": \"отображение амплитуды частотного отклика в дБ или линейных единицах: 1 - db, 0 - unit\",\n\"view_freq_resp\": 0,\n\n\"average_comment\": \"усреднение спектра\",\n\"average\": 1,\n\n\"overlap_comment\": \"наложение сигнала для спектра\",\n\"overlap\": 0,\n\n\"variant_freq_resp_comment\": \"вариант вычисления частотного отклика: 0 - через кросс, 1 - через автоспектр\",\n\"variant_freq_resp\": 0,\n\n\"thresh_level_comment\": \"уровень удара для засчитывания импульса\",\n\"thresh_level\": 500,\n\n\"time_impulse_comment\": \"длина импульса, если не задано вручную, то вычисляется в скрипте\",\n\"time_impulse\": 0,\n\n\"resolution_comment\": \"разрешение спектра\",\n\"resolution\": 1\n}", + "dpt_K": 0, + "dpt_M": 0, + "dpt_N": 0, + "dpt_freq": 50, + "elType": 0, + "groupType": 0, + "gtZ1": 0, + "gtZ2": 0, + "isQMLViewActive": false, + "isRouteStarter": false, + "items": [ + { + "U_freq": 50, + "async_N_rotor": 0, + "bdD1": 0, + "bdD2": 0, + "bdL": 0, + "bsAngle": 0, + "bsInnerD": 0, + "bsModelName": "", + "bsOuterD": 0, + "bsRollerCount": 0, + "bsRollerD": 0, + "bsVendor": "", + "cbdZ1": 0, + "cbdZ2": 0, + "cbdZ3": 0, + "customOptionsString": "{}", + "dpt_K": 0, + "dpt_M": 0, + "dpt_N": 0, + "dpt_freq": 50, + "elType": 0, + "groupType": 0, + "gtZ1": 0, + "gtZ2": 0, + "isQMLViewActive": false, + "isRouteStarter": false, + "items": [ + ], + "masterScriptName": "", + "name": "СТ верх вертикаль", + "nodeType": 2, + "objectType": 0, + "pgN": 0, + "pgZ1": 0, + "pgZ2": 0, + "pgZ3": 0, + "pmBlades": 0, + "pointComment": "", + "qmlScriptName": "default_point.qml", + "rbAngle": 0, + "rbInnerD": 0, + "rbModelName": "", + "rbOuterD": 0, + "rbRollerCount": 0, + "rbRollerD": 0, + "rbVendor": "", + "scriptName": "freq_response_multichannel_new.js", + "sync_M_rotor": 0, + "sync_M_stator": 0, + "tachoRatio": 1, + "trBlades": 0, + "uuid": "{d5f70fb9-1e58-4e23-b3e8-5270c02d0904}" + } + ], + "masterScriptName": "", + "name": "Частотный отклик \"верх вертикаль\" все каналы", + "nodeType": 1, + "objectType": 0, + "pgN": 0, + "pgZ1": 0, + "pgZ2": 0, + "pgZ3": 0, + "pmBlades": 0, + "pointComment": "", + "qmlScriptName": "", + "rbAngle": 0, + "rbInnerD": 0, + "rbModelName": "", + "rbOuterD": 0, + "rbRollerCount": 0, + "rbRollerD": 0, + "rbVendor": "", + "scriptName": "", + "sync_M_rotor": 0, + "sync_M_stator": 0, + "tachoRatio": 1, + "trBlades": 0, + "uuid": "{e5d691d4-86bb-443f-888c-a1e6d84baab3}" + }, + { + "U_freq": 50, + "async_N_rotor": 0, + "bdD1": 0, + "bdD2": 0, + "bdL": 0, + "bsAngle": 0, + "bsInnerD": 0, + "bsModelName": "", + "bsOuterD": 0, + "bsRollerCount": 0, + "bsRollerD": 0, + "bsVendor": "", + "cbdZ1": 0, + "cbdZ2": 0, + "cbdZ3": 0, + "customOptionsString": "{\n \"ranges\": [\n {\n \"max\": 3.610701953125,\n \"min\": 2.600701953125\n },\n {\n \"max\": 5.802049609375,\n \"min\": 4.792049609375\n },\n {\n \"max\": 8.326619921875,\n \"min\": 7.3166199218750005\n },\n {\n \"max\": 10.77871953125,\n \"min\": 9.76871953125\n },\n {\n \"max\": 13.341903125,\n \"min\": 12.331903125\n },\n {\n \"max\": 16.122684375000002,\n \"min\": 15.112684375\n },\n {\n \"max\": 18.762537890625,\n \"min\": 17.752537890625\n },\n {\n \"max\": 21.7115515625,\n \"min\": 20.701551562499997\n },\n {\n \"max\": 24.54731328125,\n \"min\": 23.537313281249997\n }\n ],\n\n\"window_spec_force_comment\": \"окно спектра силы\",\n\"window_spec_force\": \"gtl.spec.rectangular\",\n\n\"window_spec_vibr_comment\": \"окно спектра вибрации\",\n\"window_spec_vibr\": \"gtl.spec.rectangular\",\n\n\"remove_resp_arr_comment\": \"удары, которые нужно исключить из усреднения\",\n\"remove_resp_arr\": [0,2,3,4,5,6,7,8],\n\n\"frequency_comment\": \"граничная частота спектра\",\n\"frequency\": 1024,\n\n\"view_comment\": \"отображение амплитуды спектра в дБ или линейных единицах: 1 - db, 0 - unit\",\n\"view\": 0,\n\n\"view_freq_resp_comment\": \"отображение амплитуды частотного отклика в дБ или линейных единицах: 1 - db, 0 - unit\",\n\"view_freq_resp\": 0,\n\n\"average_comment\": \"усреднение спектра\",\n\"average\": 1,\n\n\"overlap_comment\": \"наложение сигнала для спектра\",\n\"overlap\": 0,\n\n\"variant_freq_resp_comment\": \"вариант вычисления частотного отклика: 0 - через кросс, 1 - через автоспектр\",\n\"variant_freq_resp\": 0,\n\n\"thresh_level_comment\": \"уровень удара для засчитывания импульса\",\n\"thresh_level\": 500,\n\n\"time_impulse_comment\": \"длина импульса, если не задано вручную, то вычисляется в скрипте\",\n\"time_impulse\": 0,\n\n\"resolution_comment\": \"разрешение спектра\",\n\"resolution\": 1\n}", + "dpt_K": 0, + "dpt_M": 0, + "dpt_N": 0, + "dpt_freq": 50, + "elType": 0, + "groupType": 0, + "gtZ1": 0, + "gtZ2": 0, + "isQMLViewActive": false, + "isRouteStarter": false, + "items": [ + { + "U_freq": 50, + "async_N_rotor": 0, + "bdD1": 0, + "bdD2": 0, + "bdL": 0, + "bsAngle": 0, + "bsInnerD": 0, + "bsModelName": "", + "bsOuterD": 0, + "bsRollerCount": 0, + "bsRollerD": 0, + "bsVendor": "", + "cbdZ1": 0, + "cbdZ2": 0, + "cbdZ3": 0, + "customOptionsString": "{}", + "dpt_K": 0, + "dpt_M": 0, + "dpt_N": 0, + "dpt_freq": 50, + "elType": 0, + "groupType": 0, + "gtZ1": 0, + "gtZ2": 0, + "isQMLViewActive": false, + "isRouteStarter": false, + "items": [ + ], + "masterScriptName": "", + "name": "СТ низ горизонталь", + "nodeType": 2, + "objectType": 0, + "pgN": 0, + "pgZ1": 0, + "pgZ2": 0, + "pgZ3": 0, + "pmBlades": 0, + "pointComment": "", + "qmlScriptName": "default_point.qml", + "rbAngle": 0, + "rbInnerD": 0, + "rbModelName": "", + "rbOuterD": 0, + "rbRollerCount": 0, + "rbRollerD": 0, + "rbVendor": "", + "scriptName": "freq_response_multichannel_new.js", + "sync_M_rotor": 0, + "sync_M_stator": 0, + "tachoRatio": 1, + "trBlades": 0, + "uuid": "{da645bbe-04b5-4d5e-86de-3b5ba633addc}" + } + ], + "masterScriptName": "", + "name": "Частотный отклик \"низ горизонталь\" все каналы", + "nodeType": 1, + "objectType": 0, + "pgN": 0, + "pgZ1": 0, + "pgZ2": 0, + "pgZ3": 0, + "pmBlades": 0, + "pointComment": "", + "qmlScriptName": "", + "rbAngle": 0, + "rbInnerD": 0, + "rbModelName": "", + "rbOuterD": 0, + "rbRollerCount": 0, + "rbRollerD": 0, + "rbVendor": "", + "scriptName": "", + "sync_M_rotor": 0, + "sync_M_stator": 0, + "tachoRatio": 1, + "trBlades": 0, + "uuid": "{66c77abc-0e7f-4323-8948-b64e1699cfad}" + }, + { + "U_freq": 50, + "async_N_rotor": 0, + "bdD1": 0, + "bdD2": 0, + "bdL": 0, + "bsAngle": 0, + "bsInnerD": 0, + "bsModelName": "", + "bsOuterD": 0, + "bsRollerCount": 0, + "bsRollerD": 0, + "bsVendor": "", + "cbdZ1": 0, + "cbdZ2": 0, + "cbdZ3": 0, + "customOptionsString": "{\n \"ranges\": [\n {\n \"max\": 3.365506640625,\n \"min\": 2.3555066406250003\n },\n {\n \"max\": 5.5229744921875,\n \"min\": 4.5197449218750005\n },\n {\n \"max\": 7.533407031125,\n \"min\": 6.5234090312500005\n },\n {\n \"max\": 9.59793828125,\n \"min\": 8.58793828125\n },\n {\n \"max\": 11.86055546875,\n \"min\": 10.85055546875\n },\n {\n \"max\": 14.112264453125,\n \"min\": 13.102264453125\n },\n {\n \"max\": 16.379608203125002,\n \"min\": 15.369608203125\n },\n {\n \"max\": 18.68203984375,\n \"min\": 17.67203984375\n },\n {\n \"max\": 20.864783984375,\n \"min\": 19.8547839984374997\n }\n ],\n\n\"window_spec_force_comment\": \"окно спектра силы\",\n\"window_spec_force\": \"gtl.spec.rectangular\",\n\n\"window_spec_vibr_comment\": \"окно спектра вибрации\",\n\"window_spec_vibr\": \"gtl.spec.rectangular\",\n\n\"remove_resp_arr_comment\": \"удары, которые нужно исключить из усреднения\",\n\"remove_resp_arr\": [4],\n\n\"frequency_comment\": \"граничная частота спектра\",\n\"frequency\": 1024,\n\n\"view_comment\": \"отображение амплитуды спектра в дБ или линейных единицах: 1 - db, 0 - unit\",\n\"view\": 0,\n\n\"view_freq_resp_comment\": \"отображение амплитуды частотного отклика в дБ или линейных единицах: 1 - db, 0 - unit\",\n\"view_freq_resp\": 0,\n\n\"average_comment\": \"усреднение спектра\",\n\"average\": 1,\n\n\"overlap_comment\": \"наложение сигнала для спектра\",\n\"overlap\": 0,\n\n\"variant_freq_resp_comment\": \"вариант вычисления частотного отклика: 0 - через кросс, 1 - через автоспектр\",\n\"variant_freq_resp\": 0,\n\n\"thresh_level_comment\": \"уровень удара для засчитывания импульса\",\n\"thresh_level\": 500,\n\n\"time_impulse_comment\": \"длина импульса, если не задано вручную, то вычисляется в скрипте\",\n\"time_impulse\": 0,\n\n\"resolution_comment\": \"разрешение спектра\",\n\"resolution\": 1\n}", + "dpt_K": 0, + "dpt_M": 0, + "dpt_N": 0, + "dpt_freq": 50, + "elType": 0, + "groupType": 0, + "gtZ1": 0, + "gtZ2": 0, + "isQMLViewActive": false, + "isRouteStarter": false, + "items": [ + { + "U_freq": 50, + "async_N_rotor": 0, + "bdD1": 0, + "bdD2": 0, + "bdL": 0, + "bsAngle": 0, + "bsInnerD": 0, + "bsModelName": "", + "bsOuterD": 0, + "bsRollerCount": 0, + "bsRollerD": 0, + "bsVendor": "", + "cbdZ1": 0, + "cbdZ2": 0, + "cbdZ3": 0, + "customOptionsString": "{}", + "dpt_K": 0, + "dpt_M": 0, + "dpt_N": 0, + "dpt_freq": 50, + "elType": 0, + "groupType": 0, + "gtZ1": 0, + "gtZ2": 0, + "isQMLViewActive": false, + "isRouteStarter": false, + "items": [ + ], + "masterScriptName": "", + "name": "СТ низ вертикаль", + "nodeType": 2, + "objectType": 0, + "pgN": 0, + "pgZ1": 0, + "pgZ2": 0, + "pgZ3": 0, + "pmBlades": 0, + "pointComment": "", + "qmlScriptName": "default_point.qml", + "rbAngle": 0, + "rbInnerD": 0, + "rbModelName": "", + "rbOuterD": 0, + "rbRollerCount": 0, + "rbRollerD": 0, + "rbVendor": "", + "scriptName": "freq_response_multichannel_new.js", + "sync_M_rotor": 0, + "sync_M_stator": 0, + "tachoRatio": 1, + "trBlades": 0, + "uuid": "{5aba8185-bd6d-4469-a877-366899f020e9}" + } + ], + "masterScriptName": "", + "name": "Частотный отклик \"низ вертикаль\" все каналы", + "nodeType": 1, + "objectType": 0, + "pgN": 0, + "pgZ1": 0, + "pgZ2": 0, + "pgZ3": 0, + "pmBlades": 0, + "pointComment": "", + "qmlScriptName": "", + "rbAngle": 0, + "rbInnerD": 0, + "rbModelName": "", + "rbOuterD": 0, + "rbRollerCount": 0, + "rbRollerD": 0, + "rbVendor": "", + "scriptName": "", + "sync_M_rotor": 0, + "sync_M_stator": 0, + "tachoRatio": 1, + "trBlades": 0, + "uuid": "{0a32cd83-1f67-4edd-8af6-47cd5c5b12a7}" } ], "masterScriptName": "master_script.js", diff --git a/modules/getResponse.js b/modules/getResponse.js deleted file mode 100644 index f80ade6..0000000 --- a/modules/getResponse.js +++ /dev/null @@ -1,213 +0,0 @@ -export function getResponse(args) { - let force = args.spec_force; //спектр силы - let vibro = args.spec_vibro; //спектр вибрации - let type = args.type; //способ вычисления отклика - let view = args.view; //способ отображения спектра в линейных единицах или дБ - - /* Алгоритм - 1. Получить спектры ускорения и силы в комплексном виде (вибропреобразователь и молоток). - 2. Преобразовать спектр силы (молотка) в комплексно-сопряжённый вид. - 3. Получить кросс-спектр (перекрёстный) между ускорением и силой. - 4. Вычислить деление кросс-спектра на спектр силы. - */ - - /* Кросс-спектры - Сигнал силы в комплексно-сопряжённом виде - сигнал вибрации умножается на сигнал силы, а НЕ наоборот - умножение комплексных чисел по формуле: - (a1+b1i)*(a2+b2i)=(a1*a2-b1*b2)*(a1*b2+b1*a2)i - (a1*a2-b1*b2) - действительная часть - (a1*b2+b1*a2)i - мнимая часть - */ - - let n = force.data.length; // длина массива спектра - let cross_real = new Float64Array(n); // типизированный массив для действительной части - let cross_imag = new Float64Array(n); // типизированный массив для мнимой части - - for (let i = 0; i < n; i++) { - const vReal = vibro.real[i]; // действительная часть спектра вибрации - const vImag = vibro.imag[i]; // мнимая часть спектра вибрации - const fReal = force.real[i]; // действительная часть спектра силы - const fImag = -force.imag[i]; // мнимая часть спектра силы сразу берём с обратным знаком - - cross_real[i] = vReal * fReal - vImag * fImag; - cross_imag[i] = vReal * fImag + vImag * fReal; - } - - // let cross_real2 = getCrossSpectrum(vibro.real, vibro.imag, force.real, force.imag).reXY; - // gtl.log.info('Амплитуда кросс', cross_real) - // gtl.log.info('Амплитуда кросс 2', cross_real2) - - /* Вычисление частотного отклика - деление комплексных чисел по формуле: - (a+bi)/(c+di)=(a*c-b*d)*(a*d+b*c)i - (a*c-b*d) - действительная часть - (a*d+b*c)i - мнимая часть - */ - let resp_real = new Float64Array(n); // типизированный массив для действительной части - let resp_imag = new Float64Array(n); // типизированный массив для мнимой части - if (type == 0) { - // Вариант 1: Частотный отклик как деление кросс-спектра вибрации и силы на автоспектр силы - // ОШИБКА в моей формуле вычисления частотного отклика - // ИПРАВИЛ на: - // деление комплексных чисел по формуле: - // (a+bi)/(c+di)=(a*c + b*d)/(c^2 + d^2) + (c*b - a*d)/(c^2 + d^2)i - // (a*c + b*d)/(c^2 + d^2) - действительная часть - // (c*b - a*d)/(c^2 + d^2)i - мнимая часть - for (let i = 0; i < n; i++) { - const cReal = cross_real[i]; // действительная часть кросс спектра - const cImag = cross_imag[i]; // мнимая часть кросс спектра - const fReal = force.real[i]; // действительная часть спектра силы - const fImag = force.imag[i]; // мнимая часть спектра силы - - const denominator = fReal * fReal + fImag * fImag; - resp_real[i] = (cReal * fReal + cImag * fImag) / denominator; - resp_imag[i] = (fReal * cImag - cReal * fImag) / denominator; - } - } else { - // Вариант 2: Частотный отклик как деление автоспектра вибрации на автоспектр силы - // Канал[j] / Канал[0] - for (let i = 0; i < n; i++) { - const vReal = vibro.real[i]; // действительная часть спектра вибрации - const vImag = vibro.imag[i]; // мнимая часть спектра вибрации - const fReal = force.real[i]; // действительная часть спектра силы - const fImag = force.imag[i]; // мнимая часть спектра силы - - const denominator = fReal * fReal + fImag * fImag; - resp_real[i] = (vReal * fReal + vImag * fImag) / denominator; - resp_imag[i] = (fReal * vImag - vReal * fImag) / denominator; - } - } - - // запись массива амплитуды и фазы - let resp_ampl = new Float64Array(n); // типизированный массив для амплитуды - let resp_phase = new Float64Array(n); // типизированный массив для фазы - const RAD_TO_DEG = 180 / Math.PI; //перевод радиан в градусы - - for (let i = 0; i < n; i++) { - const rReal = resp_real[i]; // действительная часть спектра отклика - const rImag = resp_imag[i]; // мнимая часто спектра отклика - - resp_ampl[i] = Math.sqrt(rReal * rReal + rImag * rImag); - if (view > 0) { resp_ampl = resp_ampl.map((item) => (item = 20 * Math.log10(item / 1e-6))) }; //переводим в дБ - resp_phase[i] = Math.atan2(rImag, rReal) * RAD_TO_DEG; - } - - // Приводим фазу к диапазону [0°, 360°] - for (let i = 0; i < n; i++) { - resp_phase[i] = resp_phase[i] % 360; - if (resp_phase[i] < 0) { resp_phase[i] += 360 } - } - - let resp2 = getFrequencyResponse(vibro.real, vibro.imag, force.real, force.imag); - let resp_ampl2 = resp2.magnitude; - let resp_phase2 = resp2.phase; - - // gtl.log.info('Амплитуда отклика', resp_ampl[0]); - // gtl.log.info('Амплитуда отклика 2', resp_ampl2[0]); - // gtl.log.info('Фаза отклика', resp_phase[0]); - // gtl.log.info('Фаза отклика 2', resp_phase2[0]); - - return { - data: resp_ampl2, - phase: resp_phase2, - resolution: force.resolution - } -}; //рассчет перекрестного спектра - -export function getAvgArray(arrays) { - const length = arrays[0].length; //длина вложенного массива - const result = new Array(length); //новый массив фиксированной длины, чтобы не пушить - const numArrays = arrays.length; //количество вложенных массивов - - for (let i = 0; i < length; i++) { - let sum = 0; - for (let j = 0; j < numArrays; j++) { sum += arrays[j][i] } - result[i] = sum / numArrays; - } - - return result; -}; //вычисление среднего массива - - - - - - - - - - - - - - - -function getCrossSpectrum(reX, imX, reY, imY) { - const n = reX.length; - const reXY = new Array(n); // действительная часть - const imXY = new Array(n); // мнимая часть - const power = new Array(n); // мощность кросс-спектра - let phase = new Array(n); // фаза (радианы) - - for (let i = 0; i < n; i++) { - // Комплексное сопряжение спектра imY* (мнимая часть спектра силы сразу берём с обратным знаком) - const a = reX[i], b = imX[i]; // X(f) = a + ib - const c = reY[i], d = -imY[i]; // Y(f) = c + id - - // Почастотное умножение - reXY[i] = a * c - b * d; // действительная часть - imXY[i] = b * c + a * d; // мнимания часть - - // Мощность кросс-спектра - power[i] = reXY[i] * reXY[i] + imXY[i] * imXY[i]; - - // Фаза = arctan(Im/Re) - phase[i] = Math.atan2(imXY[i], reXY[i]); - } - - return { reXY, imXY, power, phase }; -} - - -function getFrequencyResponse(reX, imX, reY, imY) { - const n = reX.length; - const magnitude = new Array(n); // амплитуда (линейная) - const magnitudeDB = new Array(n); // амплитуда (дБ) - let phase = new Array(n); // фаза (радианы) - const RAD_TO_DEG = 180 / Math.PI; //перевод радиан в градусы - - for (let i = 0; i < n; i++) { - const a = reX[i], b = imX[i]; // X(f) = a + ib - const c = reY[i], d = imY[i]; // Y(f) = c + id - - // Знаменатель - const denominator = c * c + d * d; // знаменатель исходный вариант - // const denominator = a * a + b * b; // знаменатель вариант 2 - - // Избегаем деления на ноль - if (Math.abs(denominator) < 1e-10) { - magnitude[i] = 0; - magnitudeDB[i] = -Infinity; - phase[i] = 0; - continue; - } - - // Почастотное умножение - const reH = (a * c + b * d) / denominator; // действительная часть - const imH = (c * b - a * d) / denominator; // мнимая часть исходный вариант - // const imH = (a * d - b * c) / denominator; // мнимая часть вариант 2 (поменял местами вычитаемые) - - // Амплитуда - magnitude[i] = Math.sqrt(reH * reH + imH * imH); - - // Амплитуда в дБ - magnitudeDB[i] = 20 * Math.log10(magnitude[i] / 1e-6); - - // Приводим фазу сразу к диапазону [0°, 360°] - phase[i] = Math.atan2(imH, reH) * RAD_TO_DEG % 360; - if (phase[i] < 0) { phase[i] += 360 }; - } - - return { magnitude, magnitudeDB, phase }; -} diff --git a/modules/getResponse_old.js b/modules/getResponse_old.js deleted file mode 100644 index 4b3cce5..0000000 --- a/modules/getResponse_old.js +++ /dev/null @@ -1,110 +0,0 @@ -export function getResponse(args) { - let force = args.spec_force; //спектр силы - let vibro = args.spec_vibro; //спектр вибрации - let type = args.type; //способ вычисления отклика - let view = args.view; //способ отображения спектра в линейных единицах или дБ - - /* Алгоритм - 1. Получить спектры ускорения и силы в комплексном виде (вибропреобразователь и молоток). - 2. Преобразовать спектр силы (молотка) в комплексно-сопряжённый вид. - 3. Получить кросс-спектр (перекрёстный) между ускорением и силой. - 4. Вычислить деление кросс-спектра на спектр силы. - */ - - /* Кросс-спектры - Сигнал силы в комплексно-сопряжённом виде - сигнал вибрации умножается на сигнал силы, а НЕ наоборот - умножение комплексных чисел по формуле: - (a1+b1i)*(a2+b2i)=(a1*a2-b1*b2)*(a1*b2+b1*a2)i - (a1*a2-b1*b2) - действительная часть - (a1*b2+b1*a2)i - мнимая часть - */ - - let n = force.data.length; // длина массива спектра - let cross_real = new Float64Array(n); // типизированный массив для действительной части - let cross_imag = new Float64Array(n); // типизированный массив для мнимой части - - for (let i = 0; i < n; i++) { - const vReal = vibro.real[i]; // действительная часть спектра вибрации - const vImag = vibro.imag[i]; // мнимая часть спектра вибрации - const fReal = force.real[i]; // действительная часть спектра силы - const fImag = -force.imag[i]; // мнимая часть спектра силы сразу берём с обратным знаком - - cross_real[i] = vReal * fReal - vImag * fImag; - cross_imag[i] = vReal * fImag + vImag * fReal; - } - - /* Вычисление частотного отклика - деление комплексных чисел по формуле: - (a+bi)/(c+di)=(a*c-b*d)*(a*d+b*c)i - (a*c-b*d) - действительная часть - (a*d+b*c)i - мнимая часть - */ - let resp_real = new Float64Array(n); // типизированный массив для действительной части - let resp_imag = new Float64Array(n); // типизированный массив для мнимой части - -// ОШИБКА в моей формуле вычисления частотного отклика -// ИПРАВИЛ на: -// деление комплексных чисел по формуле: -// (a+bi)/(c+di)=(a*c + b*d)/(c^2 + d^2) + (c*b - a*d)/(c^2 + d^2)i -// (a*c + b*d)/(c^2 + d^2) - действительная часть -// (c*b - a*d)/(c^2 + d^2)i - мнимая часть -// ПЕРЕВОД формулы в используемые переменные: - // const CF = fReal * fReal + fImag * fImag; - // resp_real[i] = (cReal * fReal + cImag * fImag) / CF; - // resp_imag[i] = (fReal * cImag - cReal * fImag) / CF; - - if (type == 0) { - // Вариант 1: Частотный отклик как деление кросс-спектра вибрации и силы на автоспектр силы - // (Канал[0] & Канал[j]) / Канал[0] - for (let i = 0; i < n; i++) { - const cReal = cross_real[i]; // действительная часть кросс спектра - const cImag = cross_imag[i]; // мнимая часть кросс спектра - const fReal = force.real[i]; // действительная часть спектра силы - const fImag = force.imag[i]; // мнимая часть спектра силы - - const CF = fReal * fReal + fImag * fImag; - resp_real[i] = (cReal * fReal + cImag * fImag) / CF; - resp_imag[i] = (fReal * cImag - cReal * fImag) / CF; - } - } else { - // Вариант 2: Частотный отклик как деление автоспектра вибрации на автоспектр силы - // Канал[j] / Канал[0] - for (let i = 0; i < n; i++) { - const vReal = vibro.real[i]; // действительная часть спектра вибрации - const vImag = vibro.imag[i]; // мнимая часть спектра вибрации - const fReal = force.real[i]; // действительная часть спектра силы - const fImag = force.imag[i]; // мнимая часть спектра силы - - const VF = vReal * vReal + fImag * fImag; - resp_real[i] = (vReal * fReal - vImag * fImag) / VF; - resp_imag[i] = (fReal * vImag + vReal * fImag) / VF; - } - } - - // запись массива амплитуды и фазы - let resp_ampl = new Float64Array(n); // типизированный массив для амплитуды - let resp_phase = new Float64Array(n); // типизированный массив для фазы - const RAD_TO_DEG = 180 / Math.PI; //перевод радиан в градусы - - for (let i = 0; i < n; i++) { - const rReal = resp_real[i]; // действительная часть спектра отклика - const rImag = resp_imag[i]; // мнимая часто спектра отклика - - resp_ampl[i] = Math.sqrt(rReal * rReal + rImag * rImag); - if (view > 0) { resp_ampl = resp_ampl.map((item) => (item = 20 * Math.log10(item / 1e-6))) }; //переводим в дБ - resp_phase[i] = Math.atan2(rImag, rReal) * RAD_TO_DEG; - } - - // Приводим фазу к диапазону [0°, 360°] - for (let i = 0; i < n; i++) { - resp_phase[i] = resp_phase[i] % 360; - if (resp_phase[i] < 0) { resp_phase[i] += 360 } - } - - return { - data: resp_ampl, - phase: resp_phase, - resolution: force.resolution - } -}; //рассчет перекрестного спектра \ No newline at end of file diff --git a/scripts/freq_response 2 multi.js b/scripts/freq_response 2 multi.js new file mode 100644 index 0000000..718217a --- /dev/null +++ b/scripts/freq_response 2 multi.js @@ -0,0 +1,188 @@ +"use strict"; +let signals = gtl.options.record.signalsModel; +let options = gtl.options; +let record = gtl.options.record; +let point = gtl.options.point; +let getResponse = gtl.import("getResponse.js").getResponse; +let getAvgArray = gtl.import("getResponse.js").getAvgArray; + +let plot_ausp = gtl.plots.add("Спектры по каналам"); // спектры по каналам вибрации +let plot_resp_ampl = gtl.plots.add("Частотный отклик по каналам (амплитуда)"); // амплитудные спектры по каналам вибрации +let plot_resp_phase = gtl.plots.add("Частотный отклик по каналам (фаза)"); // фазовые спектры по каналам вибрации +let plot_avg_resp = gtl.plots.add("Средний частотный отклик"); // средний частотный отклик + +// Цвета +// #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; // отображение амплитуды спектра unit/dB (0/1) +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 thresh_level = gtl.options.customOptions.thresh_level; // уровень удара для засчитывания импульса +let time_impulse_ = gtl.options.customOptions.time_impulse; // задание длины импульса из опций +let remove_resp_arr = gtl.options.customOptions.remove_resp_arr; +gtl.log.info("remove_resp_arr", remove_resp_arr); + +// Задание диапазона сигнала для анализа +// let ranges = gtl.player.stored_ranges; +let ranges = gtl.options.customOptions.ranges; +gtl.player.custom_ranges = ranges; // задание диапазонов плеера + +// Спектры каналов ускорения (каналы датчиков вибрации) +gtl.log.info("Количество сигналов", signals.length); +gtl.log.info("Граничная частота спектров", frequency); +gtl.log.info("Частотное разрешение спектров", resolution); + +let spec_view = view_ == 0 ? gtl.spec.unit : gtl.spec.db; // условие отображения спектров в дБ или линейном виде +let src_force = gtl.analog_inputs[signals[0].portNumber]; // источник сигнала силы +let channel = 1; //номер первого канала вибрации +let window_spec_force = gtl.options.customOptions.window_spec_force; // окно спектра силы +let window_spec_vibr = gtl.options.customOptions.window_spec_vibr; // окно спектра вибрации + + +let force = gtl.create_ausp({ + src: src_force, // сигнал силы + frequency: frequency, + resolution: resolution, + average: average, + overlap: overlap, + window: window_spec_force, + view: view +}); + +// Спектр амплитудный для цикла по всем каналам вибрации +let ausps = []; //массив объектов спектров вибрации по каналам +let phases = []; //массив объектов ФЧХ по каналам +let ausps_data = []; //массив данных спектров после каздого удара +let resps_data = []; //массив данных откликов после каждого удара + +for (let i = channel; i < signals.length; i++) { }; //цикл по каналам + +let ausp = gtl.create_ausp({ + src: gtl.analog_inputs[signals[channel].portNumber], // сырой сигнал вибрации + frequency: frequency, + resolution: resolution, + average: average, + overlap: overlap, + window: window_spec_vibr, + view: spec_view +}); + +let phase_delta = gtl.create_pfc({ + src0: src_force, // сигнал силы, относительно него вычисляем дельту фазы + src1: gtl.analog_inputs[signals[channel].portNumber], // сигнал вибрации + frequency: frequency, + resolution: resolution, + average: average, + overlap: overlap, + window: gtl.spec.rectangular, + view: gtl.phase.deg, + range: gtl.phase.positive, + is_single: false +}); + +let time_window = 0.0001 // временное окно наблюдения +let time_impulse = time_impulse_ == 0 ? gtl.acq_time + 0.01 : time_impulse_; // условие выбора длительности импульса +// let time_impulse = time_impulse_ == 0 ? 1/resolution : time_impulse_; // условие выбора длительности импульса +// let time_pre = time_window / 2; // время предыстории +// let ranges = []; // массив диапазонов для импульсов +let tries = 0; // циклы диагностки +let is_ranges = false; // состояние готовности диапазонов + +/* Функция диагностики. +Первый запуск функции диагностики происходит после проигрывания всего сигнала и определения массива диапазонов по срабатыванию триггера +После этого происходит добавление массива пользовательских диапазонов в плеер, отрисовка (при необходимости) сигнала триггера +Затем устанавливается интервал запуска функции диагностики, равный временному окну диапазона и запускается отсчет циклов (попыток) диагностики +Как только количество циклов (попыток) сравнивается с количеством установленных пользовательских диапазонов, диагностика останавливается +*/ + +gtl.diagnostic.interval = time_impulse; // первичный интервал запуска функции диагностики +gtl.log.info('Время импульса', time_impulse); + +function diagnose() { + + if (!is_ranges) { + is_ranges = true; // пользовательские диапазоны готовы + gtl.log.info('creating ranges', true); + gtl.log.info('ranges', JSON.stringify(gtl.player.custom_ranges)); + gtl.log.info("Количество диапазонов в плеере", ranges.length); + gtl.log.info("Установленный интервал запуска диагностики", time_impulse); + gtl.log.info("acq_time", gtl.acq_time); + } + + if (tries > 0) { + gtl.log.info("Количество элементов массива force", force.data.length); + gtl.log.info("Количество элементов массива ausp", ausp.data.length); + gtl.log.info('diagnostic', `Цикл диагностики ${tries} - ${true}`); + gtl.log.info('Диапазон плеера', JSON.stringify(gtl.player.custom_ranges)); + + // Отображаем спектр силы + plot_ausp.add({ + color: 0xff00f7, + name: `Спектр силы - удар №${tries}, N`, + x: force.resolution, + y: force.data, + tags: [`Спектр силы, N`] + }); + + // Отображаем автоспектр вибрации + plot_ausp.add({ + color: 0x34C924, + name: `Спектр канала 1 - удар №${tries}, g`, + x: ausp.resolution, + y: ausp.data, + tags: ["Cпектр вибрации, g"] + }); + + // Вычисляем спектр отклика + let rsp = getResponse({ + spec_force: force, //спектр силы + spec_vibro: ausp, //спектр вибрации + type: variant_freq_resp, //способ вычисления отклика + view: 0 //способ отображения спектра в линейных единицах или дБ + }); + + // Отображаем спектр отклика + plot_resp_ampl.add({ + color: 0x3b30b6, + name: `Амплитуда частотного отклика канала 1 - удар №${tries}, g/N`, + x: resolution, + y: rsp.data, + tags: ["Амплитуда частотного отклика, g/N"] + }); + + ausps_data.push(ausp.data); + resps_data.push(rsp.data); + } + + tries++; + if (tries > ranges.length) { + gtl.log.info('Вычисление среднего отклика', `processing...`); + + const avgResponse = getAvgArray(resps_data, remove_resp_arr); //вычисляем средний отклик + + // Отображаем средний спектр отклика + plot_avg_resp.add({ + color: 0xff3dcc, + name: `Амплитуда среднего частотного отклика, g/N`, + x: resolution, + y: avgResponse, + tags: ["Амплитуда среднего частотного отклика, g/N"] + }); + + gtl.log.info('Вычисление среднего отклика', `done!`); + gtl.diagnostic.stop(); + + }; // останавливаем диагностику после окончания диапазонов +} diff --git a/scripts/freq_response 2.js b/scripts/freq_response 2.js index f595f0d..718217a 100644 --- a/scripts/freq_response 2.js +++ b/scripts/freq_response 2.js @@ -47,6 +47,9 @@ gtl.log.info("Частотное разрешение спектров", resolut let spec_view = view_ == 0 ? gtl.spec.unit : gtl.spec.db; // условие отображения спектров в дБ или линейном виде let src_force = gtl.analog_inputs[signals[0].portNumber]; // источник сигнала силы let channel = 1; //номер первого канала вибрации +let window_spec_force = gtl.options.customOptions.window_spec_force; // окно спектра силы +let window_spec_vibr = gtl.options.customOptions.window_spec_vibr; // окно спектра вибрации + let force = gtl.create_ausp({ src: src_force, // сигнал силы @@ -54,7 +57,7 @@ let force = gtl.create_ausp({ resolution: resolution, average: average, overlap: overlap, - window: gtl.spec.rectangular, + window: window_spec_force, view: view }); @@ -72,7 +75,7 @@ let ausp = gtl.create_ausp({ resolution: resolution, average: average, overlap: overlap, - window: gtl.spec.rectangular, + window: window_spec_vibr, view: spec_view }); @@ -91,6 +94,7 @@ let phase_delta = gtl.create_pfc({ let time_window = 0.0001 // временное окно наблюдения let time_impulse = time_impulse_ == 0 ? gtl.acq_time + 0.01 : time_impulse_; // условие выбора длительности импульса +// let time_impulse = time_impulse_ == 0 ? 1/resolution : time_impulse_; // условие выбора длительности импульса // let time_pre = time_window / 2; // время предыстории // let ranges = []; // массив диапазонов для импульсов let tries = 0; // циклы диагностки diff --git a/scripts/freq_response 2_________.js b/scripts/freq_response 2_________.js new file mode 100644 index 0000000..8e5ea25 --- /dev/null +++ b/scripts/freq_response 2_________.js @@ -0,0 +1,191 @@ +"use strict"; +let signals = gtl.options.record.signalsModel; +let options = gtl.options; +let record = gtl.options.record; +let point = gtl.options.point; +let getResponse = gtl.import("getResponse.js").getResponse; +let getAvgArray = gtl.import("getResponse.js").getAvgArray; + +let plot_ausp = gtl.plots.add("Спектры по каналам"); // спектры по каналам вибрации +let plot_resp_ampl = gtl.plots.add("Частотный отклик по каналам (амплитуда)"); // амплитудные спектры по каналам вибрации +let plot_resp_phase = gtl.plots.add("Частотный отклик по каналам (фаза)"); // фазовые спектры по каналам вибрации +let plot_avg_resp = gtl.plots.add("Средний частотный отклик"); // средний частотный отклик + +// Цвета +// #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; // отображение амплитуды спектра unit/dB (0/1) +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 thresh_level = gtl.options.customOptions.thresh_level; // уровень удара для засчитывания импульса +let time_impulse_ = gtl.options.customOptions.time_impulse; // задание длины импульса из опций + +// Задание диапазона сигнала для анализа +// let ranges = gtl.player.stored_ranges; +let ranges = gtl.options.customOptions.ranges; +gtl.player.custom_ranges = ranges; // задание диапазонов плеера + +// Спектры каналов ускорения (каналы датчиков вибрации) +gtl.log.info("Количество сигналов", signals.length); +gtl.log.info("Граничная частота спектров", frequency); +gtl.log.info("Частотное разрешение спектров", resolution); + +let spec_view = view_ == 0 ? gtl.spec.unit : gtl.spec.db; // условие отображения спектров в дБ или линейном виде +let src_force = gtl.analog_inputs[signals[0].portNumber]; // источник сигнала силы +let channel = 1; //номер первого канала вибрации + +let force = gtl.create_ausp({ + src: src_force, // сигнал силы + frequency: frequency, + resolution: resolution, + average: average, + overlap: overlap, + window: gtl.spec.rectangular, + view: view +}); + +// Спектр амплитудный для цикла по всем каналам вибрации +let ausps = []; //массив объектов спектров вибрации по каналам +let phases = []; //массив объектов ФЧХ по каналам +let ausps_data = []; //массив данных спектров после каздого удара +let resps_data = []; //массив данных откликов после каждого удара + +for (let i = channel; i < signals.length; i++) { }; //цикл по каналам + +let ausp = gtl.create_ausp({ + src: gtl.analog_inputs[signals[channel].portNumber], // сырой сигнал вибрации + frequency: frequency, + resolution: resolution, + average: average, + overlap: overlap, + window: gtl.spec.rectangular, + view: spec_view +}); + +let phase_delta = gtl.create_pfc({ + src0: src_force, // сигнал силы, относительно него вычисляем дельту фазы + src1: gtl.analog_inputs[signals[channel].portNumber], // сигнал вибрации + frequency: frequency, + resolution: resolution, + average: average, + overlap: overlap, + window: gtl.spec.rectangular, + view: gtl.phase.deg, + range: gtl.phase.positive, + is_single: false +}); + +let time_window = 0.0001 // временное окно наблюдения +let time_impulse = time_impulse_ == 0 ? gtl.acq_time + 0.01 : time_impulse_; // условие выбора длительности импульса +// let time_pre = time_window / 2; // время предыстории +// let ranges = []; // массив диапазонов для импульсов +let tries = 0; // циклы диагностки +let is_ranges = false; // состояние готовности диапазонов + +/* Функция диагностики. +Первый запуск функции диагностики происходит после проигрывания всего сигнала и определения массива диапазонов по срабатыванию триггера +После этого происходит добавление массива пользовательских диапазонов в плеер, отрисовка (при необходимости) сигнала триггера +Затем устанавливается интервал запуска функции диагностики, равный временному окну диапазона и запускается отсчет циклов (попыток) диагностики +Как только количество циклов (попыток) сравнивается с количеством установленных пользовательских диапазонов, диагностика останавливается +*/ + +gtl.diagnostic.interval = time_impulse; // первичный интервал запуска функции диагностики +gtl.log.info('Время импульса', time_impulse); + +function diagnose() { + + if (!is_ranges) { + is_ranges = true; // пользовательские диапазоны готовы + gtl.log.info('creating ranges', true); + gtl.log.info('ranges', JSON.stringify(gtl.player.custom_ranges)); + gtl.log.info("Количество диапазонов в плеере", ranges.length); + gtl.log.info("Установленный интервал запуска диагностики", time_impulse); + gtl.log.info("acq_time", gtl.acq_time); + } + + if (tries > 0) { + gtl.log.info("Количество элементов массива force", force.data.length); + gtl.log.info("Количество элементов массива ausp", ausp.data.length); + gtl.log.info('diagnostic', `Цикл диагностики ${tries} - ${true}`); + gtl.log.info('Диапазон плеера', JSON.stringify(gtl.player.custom_ranges)); + + // Отображаем спектр силы + plot_ausp.add({ + color: 0xff00f7, + name: `Спектр силы - удар №${tries}, N`, + x: force.resolution, + y: force.data, + tags: [`Спектр силы, N`] + }); + + // Отображаем автоспектр вибрации + plot_ausp.add({ + color: 0x34C924, + name: `Спектр канала 1 - удар №${tries}, g`, + x: ausp.resolution, + y: ausp.data, + tags: ["Cпектр вибрации, g"] + }); + + // Вычисляем спектр отклика + let rsp = getResponse({ + spec_force: force, //спектр силы + spec_vibro: ausp, //спектр вибрации + type: variant_freq_resp, //способ вычисления отклика + view: 0 //способ отображения спектра в линейных единицах или дБ + }); + + // Отображаем спектр отклика + plot_resp_ampl.add({ + color: 0x3b30b6, + name: `Амплитуда частотного отклика канала 1 - удар №${tries}, g/N`, + x: resolution, + y: rsp.data, + tags: ["Амплитуда частотного отклика, g/N"] + }); + + ausps_data.push(ausp.data); + resps_data.push(rsp.data); + } + + tries++; + if (tries > ranges.length) { + gtl.log.info('Вычисление среднего отклика', `processing...`); + + const avgResponse = getAvgArray(resps_data,[4,7,8]); //вычисляем средний отклик + const avgResponse_2 = getAvgArray(resps_data,[]); //вычисляем средний отклик + + // Отображаем средний спектр отклика + plot_avg_resp.add({ + color: 0xff3dcc, + name: `Амплитуда среднего частотного отклика, g/N`, + x: resolution, + y: avgResponse, + tags: ["Амплитуда среднего частотного отклика, g/N"] + }); + + plot_avg_resp.add({ + color: 0x0000ff, + name: `Амплитуда среднего частотного отклика, g/N`, + x: resolution, + y: avgResponse_2, + tags: ["Амплитуда среднего частотного отклика, g/N"] + }); + + gtl.log.info('Вычисление среднего отклика', `done!`); + gtl.diagnostic.stop(); + + }; // останавливаем диагностику после окончания диапазонов +} diff --git a/scripts/freq_response 3.js b/scripts/freq_response 3.js new file mode 100644 index 0000000..8b5a6f9 --- /dev/null +++ b/scripts/freq_response 3.js @@ -0,0 +1,251 @@ +"use strict"; +let signals = gtl.options.record.signalsModel; +let options = gtl.options; +let record = gtl.options.record; +let point = gtl.options.point; +let getResponse = gtl.import("getResponse.js").getResponse; +let getAvgArray = gtl.import("getResponse.js").getAvgArray; + +let plot_ausp = gtl.plots.add("Спектры по каналам"); // спектры по каналам вибрации +let plot_resp_ampl = gtl.plots.add("Частотный отклик по каналам (амплитуда)"); // амплитудные спектры по каналам вибрации +let plot_resp_phase = gtl.plots.add("Частотный отклик по каналам (фаза)"); // фазовые спектры по каналам вибрации +let plot_avg_resp = gtl.plots.add("Средний частотный отклик"); // средний частотный отклик + +// Цвета +// #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; // отображение амплитуды спектра unit/dB (0/1) +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 thresh_level = gtl.options.customOptions.thresh_level; // уровень удара для засчитывания импульса +let time_impulse_ = gtl.options.customOptions.time_impulse; // задание длины импульса из опций +let remove_resp_arr = gtl.options.customOptions.remove_resp_arr; +gtl.log.info("remove_resp_arr", remove_resp_arr); + +// Задание диапазона сигнала для анализа +// let ranges = gtl.player.stored_ranges; +let ranges = gtl.options.customOptions.ranges; +gtl.player.custom_ranges = ranges; // задание диапазонов плеера + +// Спектры каналов ускорения (каналы датчиков вибрации) +gtl.log.info("Количество сигналов", signals.length); +gtl.log.info("Граничная частота спектров", frequency); +gtl.log.info("Частотное разрешение спектров", resolution); + +let spec_view = view_ == 0 ? gtl.spec.unit : gtl.spec.db; // условие отображения спектров в дБ или линейном виде +let src_force; // источник сигнала силы +let channel = 1; // номер первого канала вибрации +let window_spec_force = gtl.options.customOptions.window_spec_force; // окно спектра силы +let window_spec_vibr = gtl.options.customOptions.window_spec_vibr; // окно спектра вибрации + +let signal_source = gtl.options.customOptions.signal_source; // выбор источника сигнала: 0 - сырой / 1 - фильтр +let left_bord_filt = gtl.options.customOptions.left_bord_filt; // левая граница фильтра +let right_bord_filt = gtl.options.customOptions.right_bord_filt; // правая граница фильтра +let order_filt = gtl.options.customOptions.order_filt; // порядок фильтра +let kind_filt = gtl.options.customOptions.kind_filt; // тип окна фильтра gtl.filter_iir.butterworth +let width_filt; // полоса пропускания фильтра +width_filt = right_bord_filt - left_bord_filt; +let freq_filt; // центральная частота фильтра +freq_filt = right_bord_filt - width_filt/2; + +// СИГНАЛ СИЛЫ (молоток) + + // Фильтрация + let filter_force = gtl.add_filter_iir(gtl.analog_inputs[signals[0].portNumber]); + filter_force.kind = kind_filt; + filter_force.type = gtl.filter_iir.bandpass; + filter_force.order = order_filt; + filter_force.frequency = freq_filt; // центральная частота полосового фильтра + filter_force.width = width_filt; // ширина полосы фильтра + + // Выбор источника сигнала силы: фильтр / сырой сигнал + if (signal_source == 1) + { + src_force = filter_force; // источник фильтр + } + else if (signal_source == 0) + { + src_force = gtl.analog_inputs[signals[0].portNumber]; // источник cырой сигнал + } + + let force = gtl.create_ausp({ + src: src_force, + frequency: frequency, + resolution: resolution, + average: average, + overlap: overlap, + window: window_spec_force, + view: view + }); + + + +// СИГНАЛЫ ВИБРАЦИИ (отклик) + + // Спектр амплитудный для цикла по всем каналам вибрации + let srs_vibr; // источник сигнала вибрации + let ausps = []; //массив объектов спектров вибрации по каналам + let ausp_arr = []; + let phases = []; //массив объектов ФЧХ по каналам + let phase_arr + let ausps_data = []; //массив данных спектров после каждого удара + let resps_data = []; //массив данных откликов после каждого удара + +// Цикл по каналам +for (let j = channel; j < signals.length; j++) { + + // Фильтрация + let filter_vibr = gtl.add_filter_iir(gtl.analog_inputs[signals[j].portNumber]); + filter_vibr.kind = kind_filt; + filter_vibr.type = gtl.filter_iir.bandpass; + filter_vibr.order = order_filt; + filter_vibr.frequency = freq_filt; // центральная частота полосового фильтра + filter_vibr.width = width_filt; // ширина полосы фильтра + + // Выбор источника сигнала вибрации: фильтр / сырой сигнал + if (signal_source == 1) + { + src_vibr = filter_vibr; // источник фильтр + } + else if (signal_source == 0) + { + src_vibr = gtl.analog_inputs[signals[j].portNumber]; // источник cырой сигнал + } + + let ausp = gtl.create_ausp({ + src: src_vibr, // сырой сигнал вибрации + frequency: frequency, + resolution: resolution, + average: average, + overlap: overlap, + window: window_spec_vibr, + view: spec_view + }); + + let phase_delta = gtl.create_pfc({ + src0: src_force, // сигнал силы, относительно него вычисляем дельту фазы + src1: src_vibr, // сигнал вибрации + frequency: frequency, + resolution: resolution, + average: average, + overlap: overlap, + window: gtl.spec.rectangular, + view: gtl.phase.deg, + range: gtl.phase.positive, + is_single: false + }); + +}; +// Запись массивовм спектров вибрации +ausp_arr.push(ausp); +phase_arr.push(phase_delta); + + +let time_window = 0.0001 // временное окно наблюдения +let time_impulse = time_impulse_ == 0 ? gtl.acq_time + 0.01 : time_impulse_; // условие выбора длительности импульса +// let time_pre = time_window / 2; // время предыстории +// let ranges = []; // массив диапазонов для импульсов +let tries = 0; // циклы диагностки +let is_ranges = false; // состояние готовности диапазонов + +/* Функция диагностики. +Первый запуск функции диагностики происходит после проигрывания всего сигнала и определения массива диапазонов по срабатыванию триггера +После этого происходит добавление массива пользовательских диапазонов в плеер, отрисовка (при необходимости) сигнала триггера +Затем устанавливается интервал запуска функции диагностики, равный временному окну диапазона и запускается отсчет циклов (попыток) диагностики +Как только количество циклов (попыток) сравнивается с количеством установленных пользовательских диапазонов, диагностика останавливается +*/ + +gtl.diagnostic.interval = time_impulse; // первичный интервал запуска функции диагностики +gtl.log.info('Время импульса', time_impulse); + +function diagnose() { + + if (!is_ranges) { + is_ranges = true; // пользовательские диапазоны готовы + gtl.log.info('creating ranges', true); + gtl.log.info('ranges', JSON.stringify(gtl.player.custom_ranges)); + gtl.log.info("Количество диапазонов в плеере", ranges.length); + gtl.log.info("Установленный интервал запуска диагностики", time_impulse); + gtl.log.info("acq_time", gtl.acq_time); + } + + if (tries > 0) { + gtl.log.info("Количество элементов массива force", force.data.length); + gtl.log.info("Количество спектров вибрации ausp_arr", ausp_arr.data.length); + gtl.log.info('diagnostic', `Цикл диагностики ${tries} - ${true}`); + gtl.log.info('Диапазон плеера', JSON.stringify(gtl.player.custom_ranges)); + + // Отображаем спектр силы + plot_ausp.add({ + color: 0xff00f7, + name: `Спектр силы - удар №${tries}, N`, + x: force.resolution, + y: force.data, + tags: [`Спектр силы, N`] + }); + + // Отображаем автоспектр вибрации + // по всем каналам + for (let j = 0; j < ausp_arr.length; j++) { + + plot_ausp.add({ + color: 0x34C924, + name: `Спектр канала ${j+1} - удар №${tries}, g`, + x: ausp_arr[j].resolution, + y: ausp_arr[j].data, + tags: ["Cпектр вибрации, g"] + }); + + // Вычисляем спектр отклика + let rsp = getResponse({ + spec_force: force, //спектр силы + spec_vibro: ausp_arr[j], //спектр вибрации + type: variant_freq_resp, //способ вычисления отклика + view: 0 //способ отображения спектра в линейных единицах или дБ + }); + + // Отображаем спектр отклика + plot_resp_ampl.add({ + color: 0x3b30b6, + name: `Амплитуда частотного отклика канала ${j+1} - удар №${tries}, g/N`, + x: resolution, + y: rsp.data, + tags: ["Амплитуда частотного отклика, g/N"] + }); + + ausps_data.push(ausp.data); + resps_data.push(rsp.data); + } + + tries++; + if (tries > ranges.length) { + gtl.log.info('Вычисление среднего отклика', `processing...`); + + const avgResponse = getAvgArray(resps_data, remove_resp_arr); //вычисляем средний отклик + + // Отображаем средний спектр отклика + plot_avg_resp.add({ + color: 0xff3dcc, + name: `Амплитуда среднего частотного отклика, g/N`, + x: resolution, + y: avgResponse, + tags: ["Амплитуда среднего частотного отклика, g/N"] + }); + + gtl.log.info('Вычисление среднего отклика', `done!`); + gtl.diagnostic.stop(); + + }; // останавливаем диагностику после окончания диапазонов +} diff --git a/scripts/freq_response_multichannel.js b/scripts/freq_response_multichannel.js index 75ceb3a..2c11723 100644 --- a/scripts/freq_response_multichannel.js +++ b/scripts/freq_response_multichannel.js @@ -4,10 +4,12 @@ let options = gtl.options; let record = gtl.options.record; let point = gtl.options.point; let getResponse = gtl.import("getResponse.js").getResponse; +let getAvgArray = gtl.import("getResponse.js").getAvgArray; let plot_ausp = gtl.plots.add("Спектры по каналам"); // спектры по каналам вибрации let plot_resp_ampl = gtl.plots.add("Частотный отклик по каналам (амплитуда)"); // амплитудные спектры по каналам вибрации let plot_resp_phase = gtl.plots.add("Частотный отклик по каналам (фаза)"); // фазовые спектры по каналам вибрации +let plot_avg_resp = gtl.plots.add("Средний частотный отклик"); // средний частотный отклик // Цвета // #ff0000 - красный @@ -29,9 +31,13 @@ let view_freq_resp = gtl.options.customOptions.view_freq_resp; // отображ let variant_freq_resp = gtl.options.customOptions.variant_freq_resp; // вариант вычисления: 0 - через кросс, 1 - через автоспектр let thresh_level = gtl.options.customOptions.thresh_level; // уровень удара для засчитывания импульса let time_impulse_ = gtl.options.customOptions.time_impulse; // задание длины импульса из опций +let remove_resp_arr = gtl.options.customOptions.remove_resp_arr; +gtl.log.info("remove_resp_arr", remove_resp_arr); // Задание диапазона сигнала для анализа // let ranges = gtl.player.stored_ranges; +let ranges = gtl.options.customOptions.ranges; +gtl.player.custom_ranges = ranges; // задание диапазонов плеера // Спектры каналов ускорения (каналы датчиков вибрации) gtl.log.info("Количество сигналов", signals.length); @@ -41,76 +47,66 @@ gtl.log.info("Частотное разрешение спектров", resolut let spec_view = view_ == 0 ? gtl.spec.unit : gtl.spec.db; // условие отображения спектров в дБ или линейном виде let src_force = gtl.analog_inputs[signals[0].portNumber]; // источник сигнала силы let channel = 1; //номер первого канала вибрации +let window_spec_force = gtl.options.customOptions.window_spec_force; // окно спектра силы +let window_spec_vibr = gtl.options.customOptions.window_spec_vibr; // окно спектра вибрации +//формируем спектр силы let force = gtl.create_ausp({ src: src_force, // сигнал силы frequency: frequency, resolution: resolution, average: average, overlap: overlap, - window: gtl.spec.rectangular, + window: window_spec_force, view: view }); // Спектр амплитудный для цикла по всем каналам вибрации let ausps = []; //массив объектов спектров вибрации по каналам let phases = []; //массив объектов ФЧХ по каналам -for (let i = 1; i <= signals.length -1; i++) { +let hits_data = {}; //объект результатов по каждому удару + +// let ausps_data = []; //массив данных спектров после каждого удара +// let resps_data = []; //массив данных амплитуды откликов после каждого удара +// let resps_phase = []; //массив данных фазы откликов после каждого удара + + +for (let i = 1; i <= signals.length - 1; i++) { let ausp = gtl.create_ausp({ src: gtl.analog_inputs[signals[i].portNumber], // сырой сигнал вибрации frequency: frequency, resolution: resolution, average: average, overlap: overlap, - window: gtl.spec.rectangular, + window: window_spec_vibr, view: spec_view }); ausps.push(ausp); -}; //цикл по каналам -let phase_delta = gtl.create_pfc({ - src0: src_force, // сигнал силы, относительно него вычисляем дельту фазы - src1: gtl.analog_inputs[signals[channel].portNumber], // сигнал вибрации - frequency: frequency, - resolution: resolution, - average: average, - overlap: overlap, - window: gtl.spec.rectangular, - view: gtl.phase.deg, - range: gtl.phase.positive, - is_single: false -}); + let phase_delta = gtl.create_pfc({ + src0: src_force, // сигнал силы, относительно него вычисляем дельту фазы + src1: gtl.analog_inputs[signals[i].portNumber], // сигнал вибрации + frequency: frequency, + resolution: resolution, + average: average, + overlap: overlap, + window: gtl.spec.rectangular, + view: gtl.phase.deg, + range: gtl.phase.positive, + is_single: false + }); + phases.push(phase_delta); + +}; //цикл по каналам let time_window = 0.0001 // временное окно наблюдения let time_impulse = time_impulse_ == 0 ? gtl.acq_time + 0.01 : time_impulse_; // условие выбора длительности импульса -let time_pre = time_window / 2; // время предыстории -let ranges = []; // массив диапазонов для импульсов -let tries = 0; // циклы диагностки +// let time_pre = time_window / 2; // время предыстории +// let ranges = []; // массив диапазонов для импульсов +let tries = 0; // циклы диагностики let is_ranges = false; // состояние готовности диапазонов -// Порог для отслеживание импульсов -let __thresh = gtl.create_moving_thresh({ - src: src_force, - name: "thresh", - time: time_window, - level: thresh_level -}); -__thresh.triggered.connect(thresh_triggered_event); //подключаем функцию -// Функция получения диапазонов импульсов -function thresh_triggered_event(flag, sample) { - if (is_ranges) return; - if (flag) { - let start = (sample / __thresh.rate) - time_pre; //время срабатывания триггера - gtl.log.info("trigger on time", start); - - let range = { - min: start, - max: start + time_impulse - }; - ranges.push(range); //добавляем диапазон в массив - }; -}; /* Функция диагностики. Первый запуск функции диагностики происходит после проигрывания всего сигнала и определения массива диапазонов по срабатыванию триггера @@ -119,40 +115,37 @@ function thresh_triggered_event(flag, sample) { Как только количество циклов (попыток) сравнивается с количеством установленных пользовательских диапазонов, диагностика останавливается */ + + gtl.diagnostic.interval = gtl.options.record.playerTime; // первичный интервал запуска функции диагностики gtl.log.info('Время импульса', time_impulse); function diagnose() { - if (!is_ranges) { - gtl.player.custom_ranges = ranges; // добавляем пользовательские диапазоны в плеер - gtl.results = { ranges: ranges }; // добавляем диапазоны в результат - gtl.log.info('creating ranges', true); - gtl.log.info('ranges', JSON.stringify(ranges)); - is_ranges = true; // пользовательские диапазоны готовы - gtl.diagnostic.interval = time_impulse; // задаем время запуска функции диагностики, равное длине импульса - gtl.log.info("Количество диапазонов в плеере", ranges.length); - gtl.log.info("Установленный интервал запуска диагностики", time_impulse); - gtl.log.info("acq_time", gtl.acq_time); - } + let resps_data = []; //массив данных амплитуды откликов после каждого удара + let resps_phase = []; //массив данных фазы откликов после каждого удара - if (tries > 0) { - gtl.log.info('diagnostic', `Цикл диагностики ${tries} - ${true}`) - // Отображаем спектр силы - plot_ausp.add({ - color: 0xff00f7, - name: `Спектр силы - удар №${tries}, N`, - x: force.resolution, - y: force.data, - tags: [`Спектр силы, N`] - }); +if (tries > 0) { + + for (let i = 0; i < ausps.length; i++) { - for (let i = 0; i < ausps.length; i++) { + gtl.log.info('diagnostic', `Цикл диагностики ${tries} - ${true}`) + + + // Отображаем спектр силы + plot_ausp.add({ + color: 0xff00f7, + name: `Спектр силы - удар №${tries}, N`, + x: force.resolution, + y: force.data, + tags: [`Спектр силы, N`] + }); + // Отображаем автоспектр вибрации plot_ausp.add({ color: 0x34C924, - name: `Спектр канала ${i+1} - удар №${tries}, g`, + name: `Спектр канала ${i + 1} - удар №${tries}, g`, x: ausps[i].resolution, y: ausps[i].data, tags: ["Cпектр вибрации, g"] @@ -169,7 +162,7 @@ function diagnose() { // Отображаем спектр отклика plot_resp_ampl.add({ color: 0x3b30b6, - name: `Амплитуда частотного отклика канала ${i+1} - удар №${tries}, g/N`, + name: `Амплитуда частотного отклика канала ${i + 1} - удар №${tries}, g/N`, x: resolution, y: rsp.data, tags: ["Амплитуда частотного отклика, g/N"] @@ -178,15 +171,47 @@ function diagnose() { // Отображаем фазовый спектр отклика plot_resp_phase.add({ color: 0xff3dcc, - name: `Фаза частотного отклика канала ${i+1} - удар №${tries}, °`, + name: `Фаза частотного отклика канала ${i + 1} - удар №${tries}, °`, x: resolution, y: rsp.phase, tags: ["Фаза частотного отклика, °"] }); - } + // ausps_data.push(ausps.data); + resps_data.push(rsp.data); + resps_phase.push(rsp.phase); + } - tries++; - if (tries > ranges.length) gtl.diagnostic.stop(); // останавливаем диагностику после окончания диапазонов + tries++; // увеличение счётчика + } + + + + if (tries > ranges.length) { + + gtl.log.info('Вычисление среднего отклика', `processing...`); + + const avgResponse = getAvgArray(resps_data, remove_resp_arr); //вычисляем средний отклик + + // Отображаем средний спектр отклика + plot_avg_resp.add({ + color: 0xff3dcc, + name: `Амплитуда среднего частотного отклика канала ${i + 1}, g/N`, + x: resolution, + y: avgResponse, + tags: ["Амплитуда среднего частотного отклика, g/N"] + }); + + gtl.log.info('Вычисление среднего отклика', `done!`); + + } + + + + + gtl.diagnostic.stop(); // останавливаем диагностику после окончания диапазонов + + +} \ No newline at end of file diff --git a/scripts/freq_response_multichannel_new.js b/scripts/freq_response_multichannel_new.js new file mode 100644 index 0000000..2ec4f1e --- /dev/null +++ b/scripts/freq_response_multichannel_new.js @@ -0,0 +1,206 @@ +"use strict"; +let signals = gtl.options.record.signalsModel; +let options = gtl.options; +let record = gtl.options.record; +let point = gtl.options.point; +let getResponse = gtl.import("getResponse.js").getResponse; +let getAvgArray = gtl.import("getResponse.js").getAvgArray; + +let plot_ausp = gtl.plots.add("Спектры по каналам"); // спектры по каналам вибрации +let plot_resp_ampl = gtl.plots.add("Частотный отклик по каналам (амплитуда)"); // амплитудные спектры по каналам вибрации +let plot_resp_phase = gtl.plots.add("Частотный отклик по каналам (фаза)"); // фазовые спектры по каналам вибрации +let plot_avg_resp = gtl.plots.add("Средний частотный отклик"); // средний частотный отклик + +// Цвета +// #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; // отображение амплитуды спектра unit/dB (0/1) +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 thresh_level = gtl.options.customOptions.thresh_level; // уровень удара для засчитывания импульса +let time_impulse_ = gtl.options.customOptions.time_impulse; // задание длины импульса из опций +let remove_resp_arr = gtl.options.customOptions.remove_resp_arr; +gtl.log.info("remove_resp_arr", remove_resp_arr); + +// Задание диапазона сигнала для анализа +// let ranges = gtl.player.stored_ranges; +let ranges = gtl.options.customOptions.ranges; +gtl.player.custom_ranges = ranges; // задание диапазонов плеера + +// Спектры каналов ускорения (каналы датчиков вибрации) +gtl.log.info("Количество сигналов", signals.length); +gtl.log.info("Граничная частота спектров", frequency); +gtl.log.info("Частотное разрешение спектров", resolution); + +let spec_view = view_ == 0 ? gtl.spec.unit : gtl.spec.db; // условие отображения спектров в дБ или линейном виде +let src_force = gtl.analog_inputs[signals[0].portNumber]; // источник сигнала силы +let channel = 1; //номер первого канала вибрации +let window_spec_force = gtl.options.customOptions.window_spec_force; // окно спектра силы +let window_spec_vibr = gtl.options.customOptions.window_spec_vibr; // окно спектра вибрации + +//формируем спектр силы +let force = gtl.create_ausp({ + src: src_force, // сигнал силы + frequency: frequency, + resolution: resolution, + average: average, + overlap: overlap, + window: window_spec_force, + view: view +}); + +// Спектр амплитудный для цикла по всем каналам вибрации +let ausps = []; //массив объектов спектров вибрации по каналам +let phases = []; //массив объектов ФЧХ по каналам +let hits_data = {}; //объект результатов по каждому удару + +for (let i = 1; i <= signals.length - 1; i++) { + let ausp = gtl.create_ausp({ + src: gtl.analog_inputs[signals[i].portNumber], // сырой сигнал вибрации + frequency: frequency, + resolution: resolution, + average: average, + overlap: overlap, + window: window_spec_vibr, + view: spec_view + }); + ausps.push(ausp); + + let phase_delta = gtl.create_pfc({ + src0: src_force, // сигнал силы, относительно него вычисляем дельту фазы + src1: gtl.analog_inputs[signals[i].portNumber], // сигнал вибрации + frequency: frequency, + resolution: resolution, + average: average, + overlap: overlap, + window: gtl.spec.rectangular, + view: gtl.phase.deg, + range: gtl.phase.positive, + is_single: false + }); + phases.push(phase_delta); + +}; //цикл по каналам + +let time_window = 0.0001 // временное окно наблюдения +let time_impulse = time_impulse_ == 0 ? gtl.acq_time + 0.01 : time_impulse_; // условие выбора длительности импульса +// let time_pre = time_window / 2; // время предыстории +// let ranges = []; // массив диапазонов для импульсов +let tries = 1; // циклы диагностики +let is_ranges = false; // состояние готовности диапазонов + +/* Функция диагностики. +Первый запуск функции диагностики происходит после проигрывания всего сигнала и определения массива диапазонов по срабатыванию триггера +После этого происходит добавление массива пользовательских диапазонов в плеер, отрисовка (при необходимости) сигнала триггера +Затем устанавливается интервал запуска функции диагностики, равный временному окну для анализа импульса и запускается отсчет циклов (попыток) диагностики +Как только количество циклов (попыток) сравнивается с количеством установленных пользовательских диапазонов, диагностика останавливается +*/ + +gtl.diagnostic.interval = gtl.options.record.playerTime; // первичный интервал запуска функции диагностики +gtl.log.info('Время импульса', time_impulse); + +function diagnose() { + let resps_data = []; //массив данных амплитуды откликов после каждого удара + let resps_phase = []; //массив данных фазы откликов после каждого удара + + for (let i = 0; i < ausps.length; i++) { + gtl.log.info('diagnostic', `Удар ${tries} - Канал ${i + 1}`) + + // Отображаем спектр силы + plot_ausp.add({ + color: 0xff00f7, + name: `Удар №${tries}, N - Спектр силы`, + x: force.resolution, + y: force.data, + tags: [`Спектр силы, N`] + }); + + // Отображаем автоспектр вибрации + plot_ausp.add({ + color: 0x34C924, + name: `Удар №${tries}, g - Спектр канала ${i + 1}`, + x: ausps[i].resolution, + y: ausps[i].data, + tags: ["Cпектр вибрации, g"] + }); + + // Вычисляем спектр отклика + let rsp = getResponse({ + spec_force: force, //спектр силы + spec_vibro: ausps[i], //спектр вибрации + type: variant_freq_resp, //способ вычисления отклика + view: 0 //способ отображения спектра в линейных единицах или дБ + }); + + // Отображаем спектр отклика + plot_resp_ampl.add({ + color: 0x3b30b6, + name: `Удар №${tries}, g/N - Отклик канала ${i + 1}`, + x: resolution, + y: rsp.data, + tags: ["Амплитуда частотного отклика, g/N"] + }); + + // // Отображаем фазовый спектр отклика + // plot_resp_phase.add({ + // color: 0xff3dcc, + // name: `Удар №${tries}, ° - Фаза частотного отклика канала ${i + 1}`, + // x: resolution, + // y: rsp.phase, + // tags: ["Фаза частотного отклика, °"] + // }); + + resps_data.push(rsp.data); //добавляем отклики по каждому каналу (амплитуда) + resps_phase.push(rsp.phase); //добавляем отклики по каждому каналу (фаза) + } + + //собираем данные удара по всем каналам + hits_data[`hit${tries}`] = { + resps_data: resps_data, + resps_phase: resps_phase + } + + tries++; // увеличение счётчика + + if (tries > ranges.length) { + gtl.log.info('Вычисление среднего отклика по каналам', `processing...`); + // gtl.results = hits_data; //добавляем результат по всем ударам в ПО + + for (let i = 0; i < ausps.length; i++) { + gtl.log.info(`Формируем данные по Каналу ${i + 1}`, `processing...`); + let channelData = []; + let channelPhase = []; + + for (const hitKey in hits_data) { + let hit = hits_data[hitKey]; + // gtl.log.info(`Канал ${i + 1}, удар ${hitKey}`, JSON.stringify(hit.resps_data[i])); + channelData.push(hit.resps_data[i]); + channelPhase.push(hit.resps_phase[i]); + } + + let avgResponse = getAvgArray(channelData, remove_resp_arr); //вычисляем средний отклик + plot_avg_resp.add({ + color: 0xff3dcc, + name: `Усредн.отклик кан.${i + 1}, g/N`, + x: resolution, + y: avgResponse, + tags: ["Усреднённый отклик, g/N"] + }); + + gtl.log.info(`Вычисление среднего отклика по Каналу ${i + 1}`, `done!`); + } + gtl.diagnostic.stop(); // останавливаем диагностику после окончания диапазонов + } +}