Gtld getFrequencyResponse

Материал из GTL-wiki
Перейти к навигации Перейти к поиску

Краткое описание

Функция предназначена для расчета частотного отклика. Функция возвращает объект с параметрами частотного отклика (амплитуда, амплитуда в дБ, фаза).

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 };
}