Gtld getFrequencyResponse
Перейти к навигации
Перейти к поиску
Краткое описание
Функция предназначена для расчета частотного отклика. Функция возвращает объект с параметрами частотного отклика (амплитуда, амплитуда в дБ, фаза).
Cодержание функции может дополняться!
Синтаксис
Стандартная конструкция выглядит таким образом:
let __response = getFrequencyResponse(reX, imX, reY, imY);
Аргументы
reX- действительная часть спектра вибрации;imX- мнимая часть спектра вибрации;reY- действительная часть спектра силы;imY- мнимая часть спектра силы;
Результат
__response.magnitude- амплитуда частотного отклика;__response.magnitudeDB- амплитуда частотного отклика в дБ;__response.phase- фазовая часть частотного отклика;
Содержание функции
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 };
}