Antennendiagramme plotten
Für mein pymininec Projekt (eine Re-Implementierung des Original-Mininec [1] in Python, siehe die Beschreibung dort wie es möglich war, 40 Jahre alten Basic-code zu Reverse-Engineeren) hatte ich eine Möglichkeit gebraucht, die Resultate graphisch darzustellen. Daher hatte ich zuerst ein Visualisierungswerkzeug in pymininec inkludiert.
Nachdem ich dann aber auf die Schnelle einen Parser für die Ausgabe von
nec2c
geschrieben hatte, stellte sich heraus, dass das Programm auch
allein nützlich ist. Daher habe ich es als eigenes Projekt plot-antenna
genannt.
NEC (vielleicht übersetzbar mit numerischer elektromagnetischer Code)
wurde ursprünglich am Lawrence Livermore National Laboratory in Fortran
entwickelt. Bis Version 2 ist das freie Software, spätere Versionen sind
nicht frei (inzwischen ist NEC bei Version 5). Neoklis Kyriazis hat
die Fortran Version von NEC-2 nach C übersetzt und das Resultat
nec2c
genannt. Er hat einige Optimierungen vorgenommen, z.B. das
ursprünglich separate Programm SOMNEC (um ein Sommerfeld/Norton
Erdungsmodell zu berechnen) integriert und einige Limitierungen des
ursprünglichen Fortran-Codes beseitigt. Das Programm nec2c
ist eines
von wenigen Open Source Antennen-Modellierungsprogrammen. Es ist ein
Kommandozeilen-Programm das aus der Beschreibung einer Antenne eine
Ausgabedatei mit vielen Tabellen berechnet. Es gibt andere Programme wie
xnecview die mit dieser Ausgabedatei eine Antennen-Visualisierung
erzeugen können.
An dieser Stelle ist zu bemerken, dass ich keine offizielle Webseite von
nec2c
gefunden habe. Das Programm ist in Debian und Ubuntu
(Ubuntu sucht auch nach der offiziellen Upstream-Version) enthalten und
es scheint die ursprüngliche Version war mal auf Google Code
gehostet. Es gibt eine Version auf Github die auf eine andere
Version auf Github verweist. Die Software scheint heutzutage nicht
gewartet zu werden – kein großes Problem weil auch NEC in Version 2
seit ein paar Dekaden keine Updates mehr bekommt.
Zurück zu plot-antenna: Ursprünglich hatte das Programm nur einen Parser für die Ausgabe von pymininec (und für das Original Mininec [1] Basic-Programm). Später habe ich dann einen Parser für NEC hinzugefügt. Die derzeitigen Parser sind wahrscheinlich nicht sehr robust, funktionieren aber für meine Zwecke.
Die erste Version verwendet Matplotlib für die Grafikausgabe und diese Variante ist immer noch unterstützt. Urprünglich hatte ich Azimuth- und Elevationsdiagramme, sowie eine 3D-Anzeige implementiert.
Kürzlich, nachdem ich einige Zeit vorher Plotly entdeckt hatte, habe ich HTML/Javascript Ausgabe mithilfe von Plotly hinzugefügt. Die 3D Möglichkeiten von Plotly sind deutlich besser als die von Matplotlib – sogar mit 1 Grad Auflösung bei den Antennen-Winkeln (Azimuth/Elevation), also 180 * 360 3D Punkten, funktioniert das Display im Browser (Firefox). Mit der 3D Variante von Matplotlib muss 5 Grad Auflösung verwendet werden (36 * 72 3D Punkte), sonst ist die Anzeige sehr ruckelig. Mit der folgenden Grafik kann selbst damit experimentiert werden (kann auch in einem vollen Browserfenster dargestellt werden):
Nicht zu reden von Zoom: Das funktioniert in Plotly ausgezeichnet (mit dem Scroll-Rad der Maus in obiger Grafik) und scheint in Matplotlib garnicht implementiert zu sein.
In der Plotly Version zeichnen wir die Visualisierung für alle Frequenzen in eine Grafik. Für die 3D-Ansicht sind alle Visualisierungen bis auf die der gerade selektierten Frequenz versteckt. Über die Frequenz-Legende auf der rechten Seite kann die jeweils anzuzeigende Frequenz ausgewählt werden.
Eine Besonderheit der Plotly Version ist die Anzeige der 3D-Koordinaten auf der Oberfläche der 3D-Visualisierung beim Drüberfahren mit der Maus. In der derzeitigen Implementierung werden dabei Azimuth und Elevations-Winkel sowie absoluter und relativer Gewinn für den gerade ausgewählten Punkt angezeigt.
Allerdings habe ich mit Plotly auch einige Workarounds gebraucht:
Es gibt einen Bug im Koordinatendisplay
Plotly unterstützt kein Menü (Legende) bei 3D Oberflächen, Ich musste eine zusätzliche (leere mit einem weissen Pixel) Grafik in die Anzeige aufnehmen um Menü (Legende) anzuzeigen. Das Menü wird verwendet um auf der rechten Seite die Anzeige für eine bestimmte Frequenz auszuwählen.
In Plotly gibt es keine Möglichkeit, nur einen bestimmten Menüeintrag gleichzeitig anzuzeigen. Ich wollte dass sich die Menü-Einträge wie Radio-Knöpfe (Radio-Buttons) verhalten: Beim Klicken auf eine Frequenz sollte die Visualisierung von nur dieser Frequenz erfolgen. Für 3D Grafiken macht es nicht viel Sinn, mehrere 3D Visualisierungen in einer Anzeige zu haben. Dies wird mit ein paar Zeilen individuellem Javascript erreicht.
Das Antennendiagramm in obigem Beispiel ist aus einem Artikel von L.B.
Cebik [2]. Beim Vergleich des Diagramms im Artikel mit obiger
3D-Ansicht fällt auf (auch ein Vergleich der Azimuth/Elevationsdiagramme
in der Beschreibung von plot-antenna ist möglich) dass die Plotly 3D
Ansicht leicht verzerrt ist (die Keule ist zu lang). Ich habe noch nicht
rausgefunden ob das ein Problem von Plotly oder meiner Verwendung davon
ist. Ich versuche das gleiche Bildseitenverhältnis für alle Richtungen
einzustellen indem ich den Wertebereich (range) für xaxis
,
yaxis
und zaxis
einstelle aber es schaut nicht korrekt aus.
Beim Vergleich mit dem Azimuth Diagramm welches mit Plotly erzeugt wurde:
sehen die Größenverhältnisse richtig aus. Auch im 2D-Diagramm wird der Winkel (Azimuth in diesem Fall) beim Überfahren mit der Maus sichtbar. Auch mit Matplotlib ist dies möglich, jedoch rastet der Cursor nicht auf den jeweiligen Punkt auf der Anzeige ein. Damit kann mit Matplotlib nur geraten werden ob sich der Cursor an der korrekten Stelle befindet. Weiters kann wie bei der 3D-Grafik die Frequenz für die Anzeige rechts in der Legende ausgewählt werden. Diesmal ist die gleichzeitige Anzeige von mehreren Frequenzen möglich, was bei einer opaken 3D-Ansicht nicht sehr sinnvoll wäre.