Документация Engee
Notebook

Спектр Прони

Спектр Прони — это метод оценки спектра мощности случайного процесса, основанный на авторегрессионной модели (AR). Метод был предложен в 1969 году французским инженером-электриком Рене Прони. Основная идея состоит в том, чтобы аппроксимировать временной ряд как сумму синусоидальных компонент и шума, используя параметры авторегрессии. Спектральный анализ методом Прони особенно полезен для выделения частотных компонентов в зашумленных сигналах и активно применяется в обработке сигналов и радиолокационных системах.

В Engee нет встроенных функций для построения спектров с использованием преобразования Прони, однако в Julia можно реализовать алгоритм самостоятельно или использовать доступные библиотеки для решения подобных задач.

Цель данной демонстрации заключается в реализации такого алгоритма. Ниже приведен пример реализации алгоритма оценки спектра мощности методом Прони.

In [ ]:
# Установите необходимые пакеты
Pkg.add("LinearAlgebra")
using LinearAlgebra

Далее реализуем функцию prony_spectrum. Данная функция выполняет преобразование Прони для заданного сигнала. Она принимает три аргумента: сам сигнал (signal), порядок модели (order) и частоту дискретизации (fs). Функция возвращает две величины: частоты и соответствующие им амплитуды, которые представляют собой компоненты спектра сигнала. Процесс включает формирование матрицы автокорреляции, решение системы линейных уравнений для получения коэффициентов авторегрессионной модели, нахождение корней характеристического уравнения и расчет частот и амплитуд.

In [ ]:
# Функция для преобразования Прони
function prony_spectrum(signal::Vector{Float64}, order::Int, fs::Float64)
    N = length(signal)
    if order >= N
        error("Порядок модели должен быть меньше длины сигнала.")
    end

    # Формирование вектора автокорреляции
    X = zeros(Float64, N - order, order)
    for i in 1:(N - order)
        X[i, :] = signal[i:(i + order - 1)]
    end
    y = signal[(order + 1):N]

    a = X \ y # Решение задачи линейной регрессии для коэффициентов AR-модели
    a = vcat(1.0, -a)  # Коэффициенты AR модели
    roots_a = roots(a) # Нахождение корней характеристического уравнения
    roots_a = roots_a[abs.(roots_a) .< 1.0] # Оставляем только корни внутри единичной окружности

    # Рассчитываем частоты и амплитуды
    frequencies = angle.(roots_a) * fs / (2 * π)
    amplitudes = abs.(roots_a)

    return frequencies, amplitudes
end
Out[0]:
prony_spectrum (generic function with 1 method)

Далее зададим входной зашумлённый сигнал.

In [ ]:
fs = 1000.0  # Частота дискретизации
t = 0:1/fs:1-1/fs  # Временная шкала
# Сигнал из нескольких синусоид
signal = sin.(2π * 50 * t) + 0.5 * sin.(2π * 120 * t)
# Добавление шума
noisy_signal = signal + 0.05 * randn(length(signal))

plot(t, noisy_signal)
Out[0]:

Теперь выполним расчёт и построение спектра Прони.

In [ ]:
order = 10  # Порядок модели
frequencies, amplitudes = prony_spectrum(noisy_signal, order, fs)

# Визуализация
plot(frequencies, amplitudes, seriestype=:stem, yaxis=:log, xlabel="Частота (Гц)", ylabel="Амплитуда",
     title="Спектр Прони", marker=:circle)
Out[0]:

Вывод

В данном примере мы продемонстрировали, как построить спектр Прони в Engee при помощи пользовательской функции расчёта спектра.