<style> <! /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {msostyleparent:""; margintop:6.0pt; marginright:0in; marginbottom:0in; marginleft:0in; marginbottom:.0001pt; msopagination:widoworphan; fontsize:12.0pt;
msobidifontsize:10.0pt; fontfamily:Arial; msofareastfontfamily:"Times New Roman"; msobidifontfamily:"Times New Roman";} a:link, span.MsoHyperlink {color:blue; textdecoration:underline; textunderline:single;} a:visited, span.MsoHyperlinkFollowed
{color:purple; textdecoration:underline; textunderline:single;} @page Section1 {size:8.5in 11.0in; margin:1.0in 1.25in 1.0in 1.25in; msoheadermargin:.5in; msofootermargin:.5in; msopapersource:0;} div.Section1 {page:Section1;} > </style>
Mikhail:
My Russian is terrible, so if you don't mind I'd like to keep this in English.
A Smith Chart is nothing more than a polar chart with an impedance grid laid down in the background.
In my prior code I plotted the impedance grid first and then my data in standard polar coordinates.
Then center of the Smith chart is (0,0) while the outer radius may exceed 1.0 (data showing gain).
Here some (poorly documented) code in C++ for the impedance grid
========================================================
for (r = 0.1; r <= radius; r +=0.1)
{
cx = 1  r;
cy = 0;
for (aIndex = 0; aIndex < numOfAngles; aIndex++)
{
ang = aIndex*angInc;
x[pIndex] = cx + r * System::Math::Cos(ang);
y[pIndex] = cy + r * System::Math::Sin(ang);
pIndex++;
}
}
double dx, dy, D,t1, t2, rang, tinc;
for (rang = 10; rang < 360; rang +=10)
{
if (rang == 180)
{
x[pIndex] = radius;
y[pIndex] = 0;
pIndex++;
x[pIndex] = radius;
y[pIndex] = 0;
pIndex++;
}
else
{
cx = 1;
dx = System::Math::Cos(System::Math::PI*rang/180)1;
dy = System::Math::Sin(System::Math::PI*rang/180);
D = System::Math::Sqrt(dx*dx + dy*dy);
t2 = (System::Math::PI/2)  System::Math::Asin(dy/D);
r = D/(2*System::Math::Cos(t2));
cy = r;
t1 = System::Math::PI  2*t2;
tinc = t1 / (numOfAngles1);
for (aIndex = 0; aIndex < numOfAngles; aIndex++)
{
ang = (aIndex*tinc + System::Math::PI/2);
x[pIndex] = cx + r * System::Math::Cos(ang);
y[pIndex] = cy + r * System::Math::Sin(ang);
pIndex++;
}
if (rang > 270)
{
t1 = System::Math::Asin(dy/radius);
tinc = t1 / (numOfAngles1);
}
else if (rang > 180)
{
t1 = System::Math::PI  System::Math::Asin(dy/radius);
tinc = t1 / (numOfAngles1);
}
else if (rang > 90)
{
t1 = System::Math::PI  System::Math::Asin(dy/radius);
tinc = t1 / (numOfAngles1);
}
else
{
t1 = System::Math::Asin(dy/radius);
tinc = t1 / (numOfAngles1);
}
tinc = t1 / (numOfAngles1);
for (aIndex = 0; aIndex < numOfAngles; aIndex++)
{
ang = t1 aIndex*tinc;
x[pIndex] = radius * System::Math::Cos(ang);
y[pIndex] = radius * System::Math::Sin(ang);
pIndex++;
}
I also use polar charts for Antenna data. Antenna charts have a polar grid: angularradial and the center of the chart may not be zero. A typical Antenna chart may have 40 at the center
and +5 at the outermost radius. It is useful to be able to rotate the angular 0 degree reference to any position (or at least the top, left, right or bottom of the chart).
Here's a reference on Smith Charts:
http://www.sssmag.com/smith.html
Here's some open source code for Antenna polar plots:
http://sourceforge.net/projects/ardp/
Spasiba!
Keith Smith
