Спектр Прони
Спектр Прони — это метод оценки спектра мощности случайного процесса, основанный на авторегрессионной модели (AR). Метод был предложен в 1969 году французским инженером-электриком Рене Прони. Основная идея состоит в том, чтобы аппроксимировать временной ряд как сумму синусоидальных компонент и шума, используя параметры авторегрессии. Спектральный анализ методом Прони особенно полезен для выделения частотных компонентов в зашумленных сигналах и активно применяется в обработке сигналов и радиолокационных системах.
В Engee нет встроенных функций для построения спектров с использованием преобразования Прони, однако в Julia можно реализовать алгоритм самостоятельно или использовать доступные библиотеки для решения подобных задач.
Цель данной демонстрации заключается в реализации такого алгоритма. Ниже приведен пример реализации алгоритма оценки спектра мощности методом Прони.
# Установите необходимые пакеты
Pkg.add("LinearAlgebra")
using LinearAlgebra
Далее реализуем функцию prony_spectrum. Данная функция выполняет преобразование Прони для заданного сигнала. Она принимает три аргумента: сам сигнал (signal), порядок модели (order) и частоту дискретизации (fs). Функция возвращает две величины: частоты и соответствующие им амплитуды, которые представляют собой компоненты спектра сигнала. Процесс включает формирование матрицы автокорреляции, решение системы линейных уравнений для получения коэффициентов авторегрессионной модели, нахождение корней характеристического уравнения и расчет частот и амплитуд.
# Функция для преобразования Прони
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
Далее зададим входной зашумлённый сигнал.
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)
Теперь выполним расчёт и построение спектра Прони.
order = 10 # Порядок модели
frequencies, amplitudes = prony_spectrum(noisy_signal, order, fs)
# Визуализация
plot(frequencies, amplitudes, seriestype=:stem, yaxis=:log, xlabel="Частота (Гц)", ylabel="Амплитуда",
title="Спектр Прони", marker=:circle)
Вывод
В данном примере мы продемонстрировали, как построить спектр Прони в Engee при помощи пользовательской функции расчёта спектра.