Оценка передаточных функций спектральными методами
Под оценкой частотной области понимается оценка линейных систем с использованием данных частотной области. Различаются непараметрические и параметрические модели: у параметрических фиксированное количество параметров (например, сюда относятся передаточные функции с многочленами или модели в пространстве состояний), а непараметрические обычно задаются в виде векторов значений частотной характеристики на сетке частот, то есть количество их параметров нефиксированно и растет вместо с количеством точек данных.
Непараметрическая оценка
Под непараметрической оценкой понимается оценка модели с нефиксированным количеством параметров. Количество оцениваемых параметров обычно увеличивается одновременно с размером данных. Такая форма оценки может быть полезна для получения первоначального представления о системе перед выбором порядков и других особенностей для более стандартной параметрической модели. Мы предоставляем возможность непараметрической оценки передаточных функций посредством спектральной оценки. Для наглядности мы снова смоделируем некоторые данные:
using ControlSystemIdentification, ControlSystemsBase, Plots
T = 100000
h = 1
sim(sys,u) = lsim(sys, u, 1:T)[1][:]
σy = 0.5
sys = tf(1,[1,2*0.1,0.1])
ωn = sqrt(0.3)
sysn = tf(σy*ωn,[1,2*0.1*ωn,ωn^2])
u = randn(1, T)
y = sim(sys, u)
yn = y + sim(sysn, randn(size(u))) # Добавляем шум, отфильтрованный через sysn
d = iddata(y,u,h)
dn = iddata(yn,u,h)
InputOutput data of length 100000, 1 outputs, 1 inputs, Ts = 1
Теперь можно оценить функцию когерентности, чтобы понять, похожи ли наши данные на сгенерированные линейной системой:
k = coherence(d) # Должно быть близко к 1, если система линейная и лишена шума
k = coherence(dn) # Если в системе присутствует шум измерения, получаются немного более низкие значения
Передаточную функцию можно также оценить спектральными методами. Главной отправной точкой здесь является функция tfest, которая возвращает оценку передаточной функции и оценку энергетической спектральной плотности шума (имейте в виду, что единица измерения PSD возводится в квадрат относительно передаточной функции, поэтому в приведенном ниже коде при построении графика берется √N):
G,N = tfest(dn)
bodeplot([sys,sysn], exp10.(range(-3, stop=log10(pi), length=200)), layout=(1,3), plotphase=false, subplot=[1,2,2], ylims=(0.1,300), linecolor=:blue)
coherenceplot!(dn, subplot=3)
plot!(G, subplot=1, lab="G Est", alpha=0.3, title="Process model")
plot!(√N, subplot=2, lab="N Est", alpha=0.3, title="Noise model")
На рисунке слева показана величина ЛАЧХ истинной системы вместе с оценкой (зашумленной), а на рисунке в центре — оцененная модель шума. На рисунке справа представлена функция когерентности (coherenceplot), значение которой близко к 1 везде, кроме резонансного пика шума log10(sqrt(0.3)) = -0.26.
Дополнительные сведения см. в интерактивных скриптах с примерами.
Параметрическая оценка
Передаточные функции
Для оценки параметрической рациональной передаточной функции на основе данных частотной области вызовите tfest с объектом FRD и начальным предположением для модели системы. Начальное предположение определяет количество коэффициентов в числителе и знаменателе оцениваемой модели.
G0 = tf(1.0, [1,1,1]) # Начальное предположение
G = tfest(d::FRD, G0)
На внутреннем уровне Optim использует градиентный оптимизатор для нахождения оптимального соответствия кривой Боде системы. Используемый по умолчанию оптимизатор BFGS можно изменить; см. docstring функции ?tfest.
Сравнение оценки во временной и частотной областях см. в этом интерактивном скрипте.
Если приведенную выше задачу трудно решить, можно параметризовать модель, например путем расширения базиса Лагерра:
basis = laguerre_oo(1, 50) # Используем функции с базисом 50; итоговый порядок модели можно понизить с помощью baltrunc
Gest,p = tfest(d::FRD, basis)
|
Большинство методов для оценки передаточных функций в частотной области работает только с системами SISO и SIMO. Для оценки систем MIMO можно прибегнуть к методам на основе пространства состояний и при необходимости преобразовать результат в передаточную функцию после оценки с помощью |
Пространство состояний
Функция subspaceid работает с данными частотной области (а также с данными временной области). При передаче объекта InputOutputFreqData (который можно создать с помощью функции iddata) автоматически применяется метод для частотной области. Кроме того, можно передать объект частотной характеристики FRD, который автоматически преобразуется в InputOutputFreqData. Если данные частотной характеристики получены в результате анализа частотной характеристики, может потребоваться произвести билинейное преобразование по оси частот объекта данных, чтобы преобразовать непрерывную ось частот в дискретную. Пример:
Ts = 0.01 # Интервал выборки
frd_d = c2d(frd_c::FRD, Ts) # Выполняем билинейное преобразование в дискретный вектор частот
Ph, _ = subspaceid(frd_d, Ts, nx)
Это можно сделать автоматически, передав аргумент bilinear_transform = true в функцию subspaceid.
В следующем примере моделируются данные частотной характеристики frd из случайной системы, которые на практике могли бы быть получены в результате анализа частотной характеристики. Затем эти данные используются для подгонки модели путем идентификации на основе подпространства в частотной области с помощью функции subspaceid.
using ControlSystemIdentification, ControlSystemsBase, Plots
ny,nu,nx = 2,3,5 # Количество выходов, входов и состояний
Ts = 1 # Интервал выборки
G = ssrand(ny,nu,nx; Ts, proper=true) # Создаем случайную систему
N = 200 # Количество частотных точек
w = freqvec(Ts, N)
frd = FRD(w, G) # Создаем объект с данными частотной характеристики (на практике он должен получаться в результате эксперимента)
Gh, x0 = subspaceid(frd, G.Ts, nx; zeroD=true) # Подгоняем частотную характеристику
sigmaplot([G, Gh], w[2:end], lab=["True system" "Estimated model"])
Спектральная оценка на основе модели
Процедуры оценки моделей можно использовать для оценки спектрограмм. В данном пакете некоторые методы из пакета DSP.jl расширяются так, чтобы вторым аргументом они могли принимать функцию оценки. Для создания такой функции предоставляется функция model_spectrum. Ее использование проиллюстрировано ниже.
using ControlSystemIdentification, DSP
T = 1000
fs = 1
s = sin.((1:1/fs:T) .* 2pi/10) + 0.5randn(T)
S1 = spectrogram(s,window=hanning, fs=fs) # Стандартная спектрограмма
estimator = model_spectrum(ar,1/fs,6)
S2 = spectrogram(s,estimator,window=rect, fs=fs) # Спектрограмма на основе модели
plot(plot(S1,title="Standard Spectrogram"),plot(S2,title="AR Spectrogram")) # Требуется пакет LPVSpectral.jl
#
ControlSystemIdentification.tfest — Function
H, N = tfest(data, σ = 0.05, method = :corr)
Оценивает модель передаточной функции с помощью коррелограммы (задано умолчанию), используя модель сигнала y = H(iω)u + n.
И H, и N имеют тип FRD (данные частотной характеристики).
-
σопределяет ширину гауссова окна, применяемого к оцененным корреляционным функциям перед БПФ. Большее значениеσподразумевает меньшее сглаживание. -
H= Syu/Suu Передаточная функция процесса -
N= Sy - |Syu|²/Suu Оцениваемая PSD шума (также оценка дисперсииH). Обратите внимание, PSD связана с моделью шумаN*m, используемой в литературе по идентификации систем, какN*{psd}} = N*m\^* N*m. Кривая величины модели шума может быть визуализирована путем построения графика√(N). -
method::welchили:corr.:welchиспользует метод Велча для оценки спектральной плотности мощности, а:corr(по умолчанию) — метод коррелограммы. Еслиmethod = :welch, дополнительные именованные аргументыn,noverlapиwindowопределяют количество образцов на сегмент (по умолчанию 10 % данных), количество образцов, перекрываемых между сегментами (по умолчанию 50 %), и используемую функцию окна (по умолчаниюhamming) соответственно.
Расширенная справка
Этот метод оценки является несмещенным, если входной сигнал u нескоррелирован с шумом n, но в противном случае является смещенным (например, при идентификации в замкнутом контуре).
tfest(
data::FRD,
p0,
link = log ∘ abs;
freq_weight = sqrt(data.w[1]*data.w[end]),
refine = true,
opt = BFGS(),
opts = Optim.Options(
store_trace = true,
show_trace = true,
show_every = 1,
iterations = 100,
allow_f_increases = false,
time_limit = 100,
x_tol = 0,
f_tol = 0,
g_tol = 1e-8,
f_calls_limit = 0,
g_calls_limit = 0,
),
)
Выполняет подгонку параметрической передаточной функции к данным в частотной области.
На начальном этапе оптимизации решается следующее:
а на втором этапе (если refine=true) решается следующее:
(abs2(link(B/A) - link(l)))
Аргументы
-
data: ОбъектFRDс данными частотной области. -
p0: начальное предположение параметров. Может бытьNamedTupleилиComponentVectorс полямиb,a, задающими числитель и знаменатель в том виде, в каком они появляются при вызовеtf, т. е.(b = [1.0], a = [1.0,1.0,1.0]). Также может быть экземпляромTransferFunction. -
link: по умолчанию информация об этапе отбрасывается при подгонке. Чтобы включить этап, измените наlink = log. -
freq_weight: применяет взвешивание с обратной частотой. Это значение определяет частоту среза, до которой вес постоянен и после которой вес линейно уменьшается. По умолчанию используется среднее геометрическое значение наименьшей и наибольшей частоты. -
refine: указывает, выполняется ли второй этап оптимизации для уточнения результатов первого. -
opt: используемый оптимизатор Optim. -
opts:Optim.Options— управление параметрами решателя.
См. также описание minimum_phase для преобразования возможно неминимально фазовой системы в минимально фазовую.
tfest(data::FRD, basis::AbstractStateSpace;
freq_weight = 1 ./ (data.w .+ data.w[2]),
opt = BFGS(),
metric::M = abs2,
opts = Optim.Options(
store_trace = true,
show_trace = true,
show_every = 50,
iterations = 1000000,
allow_f_increases = false,
time_limit = 100,
x_tol = 1e-5,
f_tol = 0,
g_tol = 1e-8,
f_calls_limit = 0,
g_calls_limit = 0,
)
Выполняет подгонку параметрической передаточной функции к данным в частотной области использованием заранее заданного базиса.
Аргументы
-
data: ОбъектFRDс данными частотной области.
функция kautz(a::AbstractVector)
-
basis: базис для оценки. См., например, описаниеlaguerre, laguerre_oo, kautz. -
freq_weight: вектор весов на частоту. По умолчанию это значение равно примерно1/f. -
opt: используемый оптимизатор Optim. -
opts:Optim.Options— управление параметрами решателя.
#
ControlSystemIdentification.coherence — Function
κ² = coherence(d; n = length(d)÷10, noverlap = n÷2, window=hamming, method=:welch)
Вычисляет и строит график функции когерентности с квадратом величины. κ² с величиной, близкой к 1, указывает на хорошую объяснимость энергии в выходном сигнале энергией входного сигнала. κ² << 1 указывает на то, что либо система нелинейна, либо сильный шум занимает значительную часть в выходной энергии.
-
κ: Квадратичная функция когерентности в виде
FRD. -
method::welchили:corr.:welchиспользует метод Велча для оценки спектральной плотности мощности, а:corrиспользует метод коррелограммы. Дляmethod = :corrдополнительный именованный аргументσопределяет ширину гауссова окна, применяемого к оцененным корреляционным функциям перед БПФ. Большее значениеσподразумевает меньшее сглаживание.
См. также описание coherenceplot.
Расширенная справка
Для модели сигнала y = Gu + v κ² определяется следующим образом
откуда следует, что 0 ≤ κ² ≤ 1 и что κ² близка к 1, если энергия шума S*{vv} мала по сравнению с выходной энергией, обусловленной входными данными S*{uu}\|G(iω)\|\^2.
#
ControlSystemIdentification.laguerre_oo — Function
laguerre_oo(a::Number, Nq)
Создает выходной ортогонализированный базис Лагерра длиной Nq с полюсами в точке -a.
#
ControlSystemIdentification.model_spectrum — Function
model_spectrum(f, h, args...; kwargs...)
Аргументы
-
f: функция оценки модели, напримерar,arma -
h: интервал выборки -
args: аргументы дляf -
kwargs: именованные аргументы дляf
Пример:
using ControlSystemIdentification, DSP T = 1000 s = sin.((1:T) .* 2pi/10) S1 = spectrogram(s,window=hanning) estimator = model_spectrum(ar,1,2) S2 = spectrogram(s,estimator,window=rect) plot(plot(S1),plot(S2)) # Требуется пакет LPVSpectral.jl