Нелинейность радиочастотного усилителя
Нелинейность радиочастотного усилителя
В примере сравниваются три модели нелинейности блока Amplifier (IB) из библиотеки радиочастотных блоков Engee: кубический полином, модифицированная модель Рэппа и модель Салеха. Модель Engee подаёт на три усилителя одну и ту же огибающую с плавно растущей мощностью. Скрипт строит амплитудные характеристики AM/AM, кривые сжатия усиления и фазовые характеристики AM/PM, а затем находит точку сжатия на 1 дБ. Пример полезен разработчикам радиотрактов, которым нужно выбрать модель усилителя и понять, какими параметрами она задаётся.
Блоки библиотеки Idealized Baseband работают с комплексной огибающей , а не с самим радиосигналом. Мощность огибающей блоки отсчитывают на сопротивлении Ом:
Нелинейный усилитель без памяти описывается двумя зависимостями от амплитуды входа :
- AM/AM — амплитуда выхода ;
- AM/PM — дополнительный сдвиг фазы .
Тогда .
Точка сжатия на 1 дБ () — входная мощность, при которой усиление падает на дБ относительно линейного.
Кубический полином задаётся линейным усилением и точкой пересечения третьего порядка :
Коэффициент блок вычисляет из . Для такой модели точка сжатия связана с входной точкой пересечения: дБ, где . Кубическая модель не даёт сдвига фазы.
Модифицированная модель Рэппа описывает плавное насыщение твердотельного усилителя:
Здесь — уровень насыщения, — гладкость перехода, , , , — параметры AM/PM.
Модель Салеха описывает лампу бегущей волны:
Амплитуда выхода у этой модели достигает максимума при , а затем снижается.

Модель AmplifierNonlinearity.engee содержит:
- Блоки From Workspace
In_IиIn_Q— читают из рабочей области синфазную и квадратурную составляющие огибающей. - Блок Real-Imag to Complex
IQ— собирает комплексную огибающую. - Три блока Amplifier (IB):
Amp_Cubic— модельcubic, дБ, дБм;Amp_Rapp— модельmodified-rapp, дБ, В, , параметры AM/PM по умолчанию;Amp_Saleh— модельsalehс параметрами по умолчанию , .
Модель работает с фиксированным шагом. Все три усилителя не имеют памяти, поэтому каждый отсчёт входа даёт одну точку характеристики. Сигналы IQ, Amp_Cubic, Amp_Rapp и Amp_Saleh записываются в результаты симуляции.
Подключим пакеты и определите вспомогательные функции. Функция run_model загружает модель, задаёт шаг и время моделирования, запускает симуляцию, собирает записанные сигналы и закрывает модель.
using Plots, Printf, Statistics
gr()
name = "AmplifierNonlinearity"
model_path = joinpath(@__DIR__, name * ".engee")
@assert isfile(model_path) "Не найден файл модели: $model_path"
Ts = 1 / 1.024e6 # шаг модели, с
dbm(x) = 10 .* log10.(abs2.(x) ./ 1e-3) # мощность огибающей на 1 Ом, дБм
signal(df) = ComplexF64[v isa AbstractArray ? v[1] : v for v in df.value]
sample_times(N) = max.(0.0, (collect(0:N-1) .- 0.5) .* Ts)
function run_model(name, path; nsamples, settings = Pair{String, Vector{Pair{String, String}}}[])
try engee.close(name; force = true) catch end
model = engee.load(path; force = true)
engee.open(name)
for (block, params) in settings
engee.set_param!("$name/$block", params...)
end
engee.set_param!(name, "StopTime" => string((nsamples - 1) * Ts), "FixedStep" => string(Ts))
results = engee.run(model)
signals = Dict(string(k) => signal(collect(results[k])) for k in keys(results))
engee.close(name; force = true)
signals
end
Сформируем входной сигнал: мощность огибающей растёт от до дБм за отсчёт. Амплитуда вещественна, , поэтому фаза входа равна нулю, и фаза выхода сразу показывает AM/PM. Переменные I и Q содержат столбец времени и столбец значений.
N = 1001
pin_dbm = collect(range(-40, 30; length = N))
x = complex.(sqrt.(1e-3 .* 10 .^ (pin_dbm ./ 10)))
t = sample_times(N)
I = hcat(t, real.(x))
Q = hcat(t, imag.(x))
@printf("Отсчётов: %d, амплитуда огибающей от %.2e до %.3f В\n", N, abs(x[1]), abs(x[end]))
Запустим модель и получите сигналы.
res = run_model(name, model_path; nsamples = N)
x_in = res["IQ.u"]
amps = ["Amp_Cubic.1" => "cubic", "Amp_Rapp.1" => "modified Rapp", "Amp_Saleh.1" => "Saleh"]
println("Записанные сигналы: ", join(sort(collect(keys(res))), ", "))
@assert all(length(res[k]) == N for (k, _) in amps)
Рассчитаем для каждой модели мощность выхода, усиление, фазовый сдвиг и точку сжатия на 1 дБ. Для кубической модели сравните найденную точку с теоретической оценкой дБ.
function characterize(y, x, pin)
pout = dbm(y)
gain = pout .- pin
phase = rad2deg.(angle.(y ./ x))
g0 = gain[1]
i1 = findfirst(<(g0 - 1), gain)
(; pout, gain, phase, g0, p1_in = isnothing(i1) ? NaN : pin[i1],
p1_out = isnothing(i1) ? NaN : pout[i1], psat = maximum(pout))
end
chars = Dict(label => characterize(res[key], x_in, pin_dbm) for (key, label) in amps)
println(rpad("Модель", 16), rpad("G, дБ", 9), rpad("P1дБ вх, дБм", 15), rpad("P1дБ вых, дБм", 16), "Pmax, дБм")
for (_, label) in amps
c = chars[label]
println(rpad(label, 16), rpad(@sprintf("%.2f", c.g0), 9), rpad(@sprintf("%.2f", c.p1_in), 15),
rpad(@sprintf("%.2f", c.p1_out), 16), @sprintf("%.2f", c.psat))
end
iip3 = 30 - 15
@printf("\nКубическая модель: теория P1дБ,вх = IIP3 - 9.6 = %.2f дБм\n", iip3 - 9.64)
Построим характеристики AM/AM и кривые сжатия усиления. Пунктиром показано продолжение линейного усиления каждой модели, маркеры отмечают точки сжатия на 1 дБ.
colors = Dict("cubic" => :royalblue, "modified Rapp" => :darkorange, "Saleh" => :seagreen)
p1 = plot(xlabel = "Входная мощность, дБм", ylabel = "Выходная мощность, дБм",
title = "AM/AM", legend = :bottomright, ylims = (-40, 40))
p2 = plot(xlabel = "Входная мощность, дБм", ylabel = "Усиление, дБ",
title = "Сжатие усиления", legend = :bottomleft, ylims = (-5, 17))
for (_, label) in amps
c = chars[label]
plot!(p1, pin_dbm, c.pout; lw = 2.5, color = colors[label], label = label)
plot!(p1, pin_dbm, pin_dbm .+ c.g0; ls = :dash, lw = 1, color = colors[label], label = "")
scatter!(p1, [c.p1_in], [c.p1_out]; color = colors[label], ms = 6, label = "")
plot!(p2, pin_dbm, c.gain; lw = 2.5, color = colors[label], label = label)
scatter!(p2, [c.p1_in], [c.g0 - 1]; color = colors[label], ms = 6, label = "")
end
plot(p1, p2; layout = (1, 2), size = (1000, 420), left_margin = 5Plots.mm, bottom_margin = 5Plots.mm)
При малом входе все три кривые AM/AM идут с наклоном дБ/дБ: усиление постоянно. Отличия начинаются при приближении к насыщению.
- Кубическая модель сжимается раньше остальных. Точка по входу равна дБм, теоретическая оценка дБм. Расхождение дБ определяется шагом сетки входной мощности. После вершины полинома блок удерживает выход на уровне дБм, поэтому кривая становится горизонтальной.
- Модель Рэппа при том же усилении дБ остаётся линейной дольше и резко переходит в насыщение: по входу дБм, выход ограничен уровнем Вт, то есть дБм.
- Модель Салеха с параметрами по умолчанию имеет меньшее усиление дБ, сжимается плавно и достигает максимума дБм у правого края диапазона.
Построим фазовые характеристики AM/PM.
p3 = plot(xlabel = "Входная мощность, дБм", ylabel = "Сдвиг фазы, град", title = "AM/PM",
legend = :topleft, size = (1000, 380), left_margin = 5Plots.mm, bottom_margin = 5Plots.mm)
for (_, label) in amps
plot!(p3, pin_dbm, chars[label].phase; lw = 2.5, color = colors[label], label = label)
end
for (_, label) in amps
c = chars[label]
@printf("%-14s сдвиг фазы в точке P1дБ: %6.2f град, на максимальном входе: %6.2f град\n",
label, c.phase[findfirst(==(c.p1_in), pin_dbm)], c.phase[end])
end
p3
Кубическая модель фазу не меняет. Модель Рэппа с параметрами AM/PM по умолчанию даёт малый сдвиг, около на максимальном входе. У модели Салеха AM/PM выражен сильно: уже в точке сжатия и при входной мощности дБм.
Для сигналов с переменной огибающей, например QAM или OFDM, такой сдвиг поворачивает точки созвездия с большой амплитудой. Модуль вектора ошибки EVM (Error Vector Magnitude) растёт, даже когда амплитуда сжата ещё незначительно.
c = chars["cubic"]
string("cubic P1dB_in=", round(c.p1_in, digits = 2), " dBm")
Вывод
Пример показал, как три модели нелинейности блока Amplifier (IB) описывают один и тот же физический эффект — насыщение усилителя — с разной формой характеристик.
Кубическую модель удобно использовать, когда известны паспортные и : её точка сжатия дБм совпала с теоретической оценкой дБ. Модель Рэппа подходит для твердотельных усилителей с резким переходом в насыщение и слабым AM/PM. Модель Салеха описывает усилители на лампах бегущей волны с плавным сжатием и сильным AM/PM.
Модель выбирают по тому, какие данные о реальном усилителе известны: паспортные точки и , уровень насыщения или измеренные кривые AM/AM и AM/PM.

