Рисуем диаграммы Вольперта-Смита на Python

8 апреля 2020

Круговая диаграмма полных сопротивлений, она же диаграмма Вольперта-Смита или диаграмма Смита — это круговая диаграмма, часто используемая для отображения комплексного сопротивления чего бы то ни было. Одно из интересных свойств данной диаграммы заключается в том, что с ее помощью легко производить некоторые вычисления прямо на бумаге. Например, зная входное сопротивление антенны и рабочую частоту, нетрудно определить, как с помощью LC-схемы привести сопротивление к значению 50 Ом. Этим активно пользовались до появления персональных компьютеров, благодаря чему диаграмма Смита и обрела популярность. Давайте же попробуем порисовать диаграммы Смита на языке Python.

Для этого воспользуемся библиотекой pySmithPlot. Она в свою очередь зависит от Matplotlib и NumPy, про которые ранее уже рассказывалось в этом блоге. Чтобы не засорять систему кучей пакетов, воспользуемся virtualenv.

Итак, установка:

pip3 install numpy==1.16 pysmithplot-fork

Здесь указана конкретная версия NumPy. На момент написания статьи у pySmithPlot была небольшая проблема с совместимостью с более поздними версиями. Имеется патч, но он еще не принят в апстрим. Вы можете использовать pySmithPlot с последней версией NumPy, но библиотеку придется скопировать в репозиторий вашего проекта и вручную применить патч.

Давайте сразу рассмотрим небольшую задачку. В рамках статьи Фильтры из коаксиального кабеля, часть 2 мы выяснили, как зависит входное сопротивление, которое мы видим на конце кабеля с волновым сопротивлением Z0, соединенного на втором конце с нагрузкой с сопротивлением ZL, от длины кабеля L:

Формула входного сопротивления лини

Здесь L измеряется в длинах волны λ. Естественно, в общем случае необходимо учитывать коэффициент укорочения кабеля. Так вот, допустим, мы используем кабель RG-6U+CU c Z0 = 75 Ом, и он соединен с антенной delta loop, имеющей ZL = 106 Ом. Требуется изобразить на диаграмме Смита, как будет меняться Zin на интервале L ∈ [0; λ/4].

Решение:

#!/usr/bin/env python3

import numpy as np
from math import pi, tan
from matplotlib import pyplot as pp
from smithplot import SmithAxes

def zf(x):
    z0 = 75
    zl = 106
    return z0*(zl+1j*z0*tan(x))/(z0+1j*zl*tan(x))

pp.figure(figsize=(6, 6))
ax = pp.subplot(1, 1, 1, projection='smith')
ax.update_scParams(axes_impedance = 50)
lam = np.linspace(0.0, 0.25, 8)
imp = np.vectorize(zf)(2*pi*lam)
pp.plot(imp, datatype="Z")
pp.savefig('./smith.png')

А вот так выглядит картинка на выходе:

Рисуем диаграмму Смита на Python

Видим, что при длине λ/4 кабель согласует 106 Ом антенны в почти идеальные 50 Ом, как и положенно четвертьволновому трансформатору.

Fun fact! Приведенная картинка наглядно иллюстрирует, почему балуны, использующие бифилярную обмотку, превосходно работают. Хотя, казалось бы, при использовании в балуне двухпроводной линии с волновым сопротивлением 150-300 Ом ничего хорошего ожидать не приходится. Если нагрузить такой балун на эквивалент нагрузки 50 Ом, то на условных 14 МГц мы действительно увидем КСВ 2. Однако ничто не мешает слегка подогнать размеры антенны, сделав ее входное сопротивление чуть-чуть реактивным. Отрезок двухпроводной линии в балуне преобразует это сопротивление в чисто активное, и антенна будет работать как надо. Заинтересованным читателям предлагается построить соответствующую диаграмму самостоятельно.

Это все, о чем я хотел сегодня рассказать. Больше примеров использования pySmithPlot вы найдете в репозитории проекта. Для желающих узнать больше о диаграммах Смита могу порекомендовать видео Basics of the Smith Chart, которое снял Alan Wolke, W2AEW.

Дополнение: Анализ антенного тюнера при помощи Python

Метки: , , .