PPS Smart Antenna

Schlussbericht Juni 2001

Thomas Helbling

Beat Kessler

Thomas Vontobel

Word Dokument

Zip File mit Programm zum Erstellen von NEC Input Dateien

1. Einführung *

2. Aufgabenstellung *

3. (Numerical Electromagnetics Code) NEC *

3.1. Der Output Interpreter *

3.2. Der Input Generator *

4. Simulation mit NEC *

4.1. Annahmen: Simulation vs. Wirklichkeit *

4.2. Input File *

4.3. Output der NEC-Simulation *

4.4. Simulationsbeispiele und -analysen *

4.4.1 Variation der Segmentanzahl pro Antenne *

4.4.2. Simulation von Fertigungsungenauigkeiten *

5. Messungen an der realen Antenne *

5.1. Grundbegriffe der Antennentheorie *

5.1.1. Halbwertsbreite oder 3-dB-Breite *

5.1.2. Das Vor- Rückverhältnis *

5.1.3. Der Antennengewinn oder Gain *

5.2. Auswertung und Analyse der Messresultate *

5.2.1. Reproduzierbarkeit der Messung *

5.2.2. Variationen der Tisch- und Rückabsorber *

5.2.4.Variationen mit Kondensatoren auf den Reflektoren *

6. Conclusion *

7. Literaturverzeichnis *

Anhang A: Programm SmartAnt.exe *

A.1. Quellcode *

B: Simulationsvariationen *

B1: Änderung der Anzahl Antennensegmente *

B2: Änderung der Antennenhöhe *

C Messdaten *

C.1. Variationen von Tisch – und Rückabsorbern *

1. Einführung

Das Forschungsgebiet rund um Smart Antennas gehört zu den jüngeren in der Antennenentwicklung. Das Prinzip einer Smart Antenna ist zugleich verständlich und genial. Ein einfaches Beispiel soll dies erläutern: Gegeben sei eine Mobilfunk Basisantenne mit gegebener Strahlungscharakteristik. Des weiteren ist die Dichte der telephonierenden Leute selten homogen verteilt über die Strahlungscharakteristik der Antenne. Es ist einleuchtend, dass dort wo die grösste Dichte Telephonierender herrscht auch die grösste Strahlungsleistung gewünscht ist. Die Aufgabe einer Smart Antenna ist nun, ihre Hauptkeule je nach Lage der grössten Dichte ausrichten zu können. Dies kann sowohl mechanisch als auch elektronisch gelöst werden.

Das Ziel des PPS war, auf einer leitenden Metallplatte verschiedene metallene Stabantennen (Aktiv- und Passivantennen) so aufzustellen, dass spezielle Strahlcharakteristiken gefunden werden können, um so Erkenntnisse über das Verhalten der Strahlungscharakteristik bei Veränderung der Anordnung der Stabantennen zu erhalten.

Die Aufgabe sollte einerseits mittels Computersimulation und andererseits durch Messen an einer Versuchsanordnung gelöst werden.

2. Aufgabenstellung

Für die Simulation am Computer ist im Internet eine Vielzahl verschiedener Antennensimulationsprogramme zu finden. Eines davon ist das numerical electromagnetics code (NEC) Programm, das wir kennenlernen und für die Simulation benutzen sollten.

Für die praktische Messung war folgende Versuchsanordnung gegeben:

Abbildung 1: Gegebene Versuchsanornung (schematisch)

Generator: Anregungsfrequenz der Antenne 823 MHz

Ausgangsleistung: 10 dbm

Antenne: Plattendurchmesser ~ 38 cm

Abbildung 2: Beispielantenne mit drehbarer Grundplatte

 

3. (Numerical Electromagnetics Code) NEC

Der Numerical Electromagnetics Code (NEC Version 2) ist ein frei erhältlicher Code um elektromagnetische Felder von Antennen im freien Raum oder über einer Grundplatte zu berechnen.

Die Berechnung erfolgt basierend auf der numerischen Lösung der Integralgleichungen über die auf der Antenne induzierten Ströme (numerische Lösung der Sommerfeld Integrale), wobei die Antennenanregung entweder eine ebene Welle auf die Antenne oder eine Spannungsquelle an der Antenne ist.

Man kann sowohl perfekt leitende Materialien, wie auch verlustbehaftete Materialien, Flächen und Drähte simulieren.

Die mittels Textfiles definierten Antennen werden gemäss Eingabe von NEC in Segmente unterteilt. NEC berechnet darauf die Stromverteilung auf jedem einzelnen Segment. Aufgrund dieser approximierten Stromverteilung auf den einzelnen Elementen ist es möglich, die elektrischen und magnetischen Felder, sowie den Gewinn, die abgegebene Leistung und auf Wunsch noch einiges mehr zu berechnen.

Die Ausgabe erfolgt in einem wiederum schwierig lesbaren Textfile.

3.1. Der Output Interpreter

Der Output Interpreter 4nec2 ist ein Programm, das die Werte aus dem textuellen Output File von NEC grafisch darstellt. Für unsere Betrachtungen war vor allem das Radiation Pattern, das den Gain in db graphisch zeigt, sehr hilfreich.

 

3.2. Der Input Generator

Da die im Internet vorhandenen Input Generators immer auf eine spezielle Antennenanordnung ausgelegt sind und damit nicht übertragbar sind auf abweichende Antennenanordnungen, haben wir uns einen eigenen Input Generator programmiert, das Programm SmartAntenna. SmartAntenna stellt eine graphische Oberfläche zur Verfügung, mit Hilfe derer die Input Files für NEC einfach und schnell generiert werden können. Die genaue Beschreibung von SmartAntenna ist weiter unten und im Anhang A zu finden.

4. Simulation mit NEC

4.1. Annahmen: Simulation vs. Wirklichkeit

Um unsere reale Messanordnung simulieren zu können, haben wir ein paar vereinfachende und abstrahierende Annahmen gemacht, die hier noch ein bisschen weiter erläutert werden sollen.

Der Drehteller, auf dem die Antennenelemente montiert wurden, hat einen Durchmesser von 38 cm und ist widerstandsbehaftet. Um die Simulation einfach zu halten, haben wir den Drehteller als unendlich ausgedehnte, perfekt leitende Grundfläche angenommen. Diese Annahme ist gemäss unserer Betreuer durchaus gerechtfertigt. Theoretisch wäre es auch möglich, die Grundfläche zu beschränken und in NEC sogar mit einem Widerstand simulieren zu lassen, wir haben aber hier darauf verzichtet.

Die Antennenelemente wurden durch Gewindestäbe mit einem Durchmesser von 3 mm realisiert, in der Simulation haben wir sie durch eine perfekt leitende Stabantenne mit 3 mm Durchmesser approximiert. Ausserdem gilt zu beachten, dass in der Simulation die Antennenelemente in Segmente unterteilt werden, um die Stromverteilung simulieren zu können. Das Schraubgewinde, das die Antennenelemente mit dem Drehteller verbindet ist als perfekte Verbindung angenommen. Während im Realen die Speisung des aktiven Antennenelements am Fusspunkt erfolgt, wird es in NEC als Speisung im untersten Segment interpretiert.

 

4.2. Input File

 

Die nachfolgende Graphik zeigt ein typisches NEC Input File. Zu sehen sind verschiedene Kürzel und Parameter, die für folgende physikalischen Eigenschaften stehen:

CM: Kommentar (Comment)

GW: Drahtantennenelement (General Wire)

GN: Grundfläche (Ground)

EX: Anregung, Speisung (Exitation)

FR: Frequenz (Frequency)

RP: Strahlungscharakteristik (Radiation Pattern)

 

CM PPS Smart Antenna

CM

CM (1) X: 0.0mm Y: 0.0mm Höhe: 84.0mm (aktiv Antenne)

CM (2) X: 39.9mm Y: 57.0mm Radius: 69.6mm Winkel: 55.0° Höhe: 93.0mm

CM (3) X: -39.9mm Y: 57.0mm Radius: 69.6mm Winkel: 125.0° Höhe: 93.0mm

CM (4) X: 0.0mm Y: -69.6mm Radius: 69.6mm Winkel: 270.0° Höhe: 76.0mm

CM

CM

CE

GW 1 50 0 0 0 0 0 0.0840 1.5E-03

GW 2 50 0.0399 0.0570 0 0.0399 0.0570 0.0930 1.5E-03

GW 3 50 -0.0399 0.0570 0 -0.0399 0.0570 0.0930 1.5E-03

GW 4 50 0.0000 -0.0696 0 0.0000 -0.0696 0.0760 1.5E-03

GE 1

GN 1 0

EX 0 1 1 0 1 0

FR 0 1 0 0 823 0

RP 0 1 36 1500 90 0 0 10 2

Abbildung 3: Ein Beispielfile eines NEC Inputs

 

Um diese Input-Files möglichst einfach kreieren zu können, haben wir eine eigenes graphisches User-Interface programmiert. Das Programm ist in Anhang A genauer beschrieben.

 

 

4.3. Output der NEC-Simulation

Das Output File einer NEC – Simulation ist wie schon das Input File eine Textdatei. Im Folgenden werden die wichtigsten Ausgaben anhand eines Auszugs aus einem NEC – Output erklärt.

 

 

- - - RADIATION PATTERNS - - -

RANGE= 2.000000E+00 METERS

EXP(-JKR)/R= 5.00000E-01 AT PHASE-176.52 DEGREES

 

- - ANGLES - - - POWER GAINS - - - - POLARIZATION - - - - - - E(THETA) - - - - - - E(PHI) - - -

THETA PHI VERT. HOR. TOTAL AXIAL TILT SENSE MAGNITUDE PHASE MAGNITUDE PHASE

DEGREES DEGREES DB DB DB RATIO DEG. VOLTS/M DEGREES VOLTS/M DEGREES

90.00 0.00 -0.30 -999.99 -0.30 0.00000 0.00 LINEAR 6.30658E-01 -162.69 0.00000E+00 -176.52

90.00 1.00 -0.61 -999.99 -0.61 0.00000 0.00 LINEAR 6.08485E-01 -163.72 0.00000E+00 -176.52

90.00 2.00 -0.93 -999.99 -0.93 0.00000 0.00 LINEAR 5.86677E-01 -164.77 0.00000E+00 -176.52

90.00 3.00 -1.25 -999.99 -1.25 0.00000 0.00 LINEAR 5.65245E-01 -165.85 0.00000E+00 -176.52

90.00 4.00 -1.58 -999.99 -1.58 0.00000 0.00 LINEAR 5.44198E-01 -166.95 0.00000E+00 -176.52

90.00 5.00 -1.92 -999.99 -1.92 0.00000 0.00 LINEAR 5.23547E-01 -168.08 0.00000E+00 -176.52

90.00 6.00 -2.26 -999.99 -2.26 0.00000 0.00 LINEAR 5.03301E-01 -169.25 0.00000E+00 -176.52

90.00 7.00 -2.61 -999.99 -2.61 0.00000 0.00 LINEAR 4.83470E-01 -170.44 0.00000E+00 -176.52

 

Abbildung 4: Auszug aus einem NEC- Output Textfile

Die Messpunkte im Output File sind in Kugelkoordinaten angegeben (Angles: Theta, Phi). Wo und wie viele Messpunkte berechnet werden sollen, wird im Input File mit dem Befehl RP (Radiaton Pattern) definiert.

Da wir nur 2 dimensionale Messungen durchführen ist Theta immer gleich 90º. Phi haben wir in 10º Schritten variiert. Der Radius ist immer auf 2 Meter festgelegt (Range).

NEC berechnet den Gewinn (Gain) in dBi, die Polarisation und das Elektrische Feld (E(Theta), E(Phi)). Für unsere Berechnungen benutzten wir lediglich den Gewinn. Dieser beschreibt den Leistungsgewinn gegenüber dem isotropen Kugelstrahler in eine bestimmte Richtung. Er wird im Output File in dBi (Dezibel) angegeben.

4.4. Simulationsbeispiele und -analysen

4.4.1 Variation der Segmentanzahl pro Antenne

Damit NEC das Antennenfeld genau berechnen kann, sollten die Segmentlängen kleiner als ein Zehntel der Wellenlänge sein. In unserem Fall ist das:

Segmentlänge < 0.1 * c / 823Mhz = 3.6mm (c: Lichtgeschwindigkeit)

Für die 76mm und 93mm Antennen bedeutet das also 21 bzw. 26 Segmente oder mehr.

Wir haben eine Antenneaufstellung mit unterschiedlichen Segmentanzahlen berechnen lassen. Man kann erkennen, dass die Resultate mit wenigen Segmenten (5-15) merklich variieren, ab 20 Segmenten aber relativ stabil bleiben. Zu viele Segmente verlangsamen die Berechnung, bringen aber keine wesentlich genaueren Resultate.

 

 

Abbildung 5: 5 Segmente pro Antenne Abbildung 6: 10 Segmente pro Antenne

Abbildung 7: 15 Segmente pro Antenne Abbildung 8: 50 Segmente pro Antenne

 

4.4.2. Simulation von Fertigungsungenauigkeiten

Um zu sehen, ob und wie stark sich Ungenauigkeiten in der mechanischen Fertigung der Antenne auf die Messung auswirken, haben wir eine Antennenaufstellung mit künstlich fehlerbehafteten Werten simuliert.

Zum einen haben wir die Höhe der Antennen um ±2% variiert. Das sind je nach Antenne ungefähr 1.5mm bis 1.9mm. Zum andern haben wir auch Neigungen einzelner Antennenelemente simuliert, d.h. wir haben jeweils die Spitze einer Antenne um 2mm in x- und in y-Richtung verschoben. Die simulierten Abweichungen sind bewusst gewählte Extremwerte, die bei der Fertigung vorkommen könnten.

Bei all diesen Variationen hat sich gezeigt, dass kleine mechanische Fehler kaum einen wesentlichen Einfluss auf die Messung haben. Lediglich bei der Höhenvariation des Direktors konnten wir einen deutlichen Einfluss auf die Richtcharakteristik feststellen.

Die interessantesten Resultate sind im folgenden abgebildet. Weitere Resultate finden sich im Anhang B.

Abbildung 9: Höhe des Direktors +2% Abbildung 10: Höhe des Direktors -2%

 

Abbildung 11: Höhe eines Reflektors +2% Abbildung 12: Höhe eines Reflektors -2%

 

5. Messungen an der realen Antenne

5.1. Grundbegriffe der Antennentheorie

Um eine Antenne charakterisieren zu können, werden verschiedene Parameter verwendet, wobei wir uns bei unseren Messungen auf die für uns wichtigsten beschränkten:

 

5.1.1. Halbwertsbreite oder 3-dB-Breite

Unter diesem Begriff verstehen wir den Winkelbereich, innerhalb dessen die Strahlungsdichte auf nicht mehr als die Hälfte (was in dB ausgedrückt 3 dB entspricht) der maximalen Strahlungsdichte absinkt.

5.1.2. Das Vor- Rückverhältnis

Das Vor- Rückverhältnis ist definiert als das Verhältnis zwischen dem Maximalwert und dem Wert, der diesem um 180 Grad verschoben gegenüber liegt. Das Vor- Rückverhältnis (VRV) kann sowohl für die Spannung U als auch für die Leistung P definiert werden.

 

(1)

 

5.1.3. Der Antennengewinn oder Gain

Der Antennengewinn (oder englisch gain) ist wie folgt definiert:

 

, ( 2)

wobei = power radiated per unit solid angle in direction (abgestrahlte Leistung in Richtung )

und = total power accepted from source (gesamte von der Quelle aufgenommene Leistung).

Beide Leistungen sind absolut angegeben.

Der Gewinn ist immer gegenüber einer bekannten Elementarantenne definiert, hier in unserem Fall gegenüber dem Monopol, den wir, um die Normierung machen zu können, auch bei jeder neuen Versuchsanordnung separat mitgemessen haben. Der Monopol wiederum ist gegenüber dem isotropen Kugelstrahler normiert, was aber für unsere Berechnungen keinen Einfluss hat, da sowohl der Monopol als auch die gemessenen Werte des Gewinns auf den isotropen Kugelstrahler bezogen sind und sich die beiden Normierungen gegenseitig aufheben. (In der Definitionsformel des gains könnten sowohl der Zähler als auch der Nenner noch auf den isotropen Kugelstrahler normiert werden, dann kürzen sich die beiden Normierungen

wieder weg.)

Hier noch einige weitere Betrachtungen zur Normierung der Leistung:

 

Für die Messung gilt: (3)

 

Für die Simulation gilt: (4)

Da für beide gleich sein muss, haben wir gezeigt, dass die gemessenen Werte in Form von Leistung direkt verglichen werden dürfen mit den simulierten Gain-Werten. Diese Erkenntnis bildete die Grundlage für den Vergleich zwischen den von uns gemessenen Werten und den von NEC simulierten Werten.

5.2. Auswertung und Analyse der Messresultate

Das Ziel unserer Messungen und der Auswertung bestand darin, die gegebene Messanordnung zu testen und allfällige Mängel zu erkennen und zu verbessern. Folgende Schwerpunkte haben wir gesetzt:

  1. Reproduzierbarkeit der Messung
  2. Übereinstimmung Messung – Simulation
  3. Allfällige Verbesserungen der Messanordnung

 

 

5.2.1. Reproduzierbarkeit der Messung

Zu Beginn unserer Messungen haben wir eine Antenne zweimal mit den gleichen Parametern ausgemessen, um die Reproduzierbarkeit zu kontrollieren. Dabei haben wir festgestellt, dass die Messung in ihrer vorhandenen Anordnung sehr genau reproduzierbar ist.

 

5.2.2. Variationen der Tisch- und Rückabsorber

In der Folge haben wir verschiedene Parameter der Messanordnung verändert, um die Auswirkung auf die Messresultate ermitteln zu können.

Ein weiteres Ziel war feststellen zu können, mit welcher Messanordnung wir am nahesten an die simulierten Werte kommen konnten. Im Idealfall sollten die Resultate der Messung und der Simulation exakt übereinstimmen, was aber wegen Interferenzen mit reflektierten Wellen und minimalen Veränderungen im Messaufbau nicht

möglich sein wird.

Abbildung 13: Versuchsanordnung mit Absorber

 

 

Abbildung 14: Richtcharakteristik verschiedener Absorbervariationen

Auf der radialen Achse der Graphik ist der gain in dB angegeben, während die Unterteilung des Kreises in einzelne Segmente die verschiedenen Winkel bei den einzelnen Messungen darstellt.

Auffallend bei dieser Graphik ist, dass die erhaltenen Diagramme, entgegen den Erwartungen, nicht symmetrisch sind. Der Grund dafür liegt in der Reflektion an der Wand, die nicht von einem Absorber abgeschirmt ist. Die Werte im Halbwertsbereich liegen alle sehr nahe beieinander und auch die Halbwertsbreite stimmt für alle Variationen überein.

Wenn wir speziell die Messungen mit und ohne Rückabsorber (RA) betrachten, fällt auf, dass der RA keinen merklichen Einfluss auf die Messdaten hat. Deshalb haben wir den RA in keiner weiteren Messung verwendet. Bei den Messungen mit dem Tischabsorber (TA) hingegen fällt auf, dass der TA sehr wohl einen nicht zu vernachlässigenden Einfluss auf die Messdaten hat und deshalb sind alle weiteren Messungen mit dem TA gemacht worden. Der grosse Einfluss des TA ist auch intuitiv naheliegend, denn die Reflektionen vom Tisch sind beträchtlich und führen so in Interferenz mit den zu messenden Wellen zu Verfälschungen der Messdaten.

Als letztes soll noch der (graphisch betrachtet) grosse Unterschied zwischen Messungen und Simulation untersucht werden. Die Abweichungen von der Simulation sind auf die grössere Störempfindlichkeit bei tieferen Werten (entspricht den betragsmässig grössten negativen Werten in dB) und Ungenauigkeiten beim Ablesen wegen Schwankungen auf der Anzeige des Messgerätes zurückzuführen. Ausserdem muss beachtet werden, dass der Unterschied von 15 dB der Minimalwerte gegenüber den Maximalwerten immerhin einem Faktor 60 entspricht. Daher können diese Ungenauigkeiten im Bereich der tieferen Gainwerte für praktische Zwecke durchaus in Kauf genommen werden.

Abbildung 15: Richtcharakteristik verschiedener Absorbervariationen (in kartesischen Koord.)

In dieser Graphik sind noch einmal dieselben Messungen wie in der vorherigen Graphik dargestellt, diesmal aber in kartesischen Koordinaten. Die horizontale Achse stellt die Winkelgrade dar, die vertikale Achse den Gain wiederum in dB. Interessant ist diese Darstellung vor allem um die Minimalstellen der Strahlungscharakteristiken untereinander zu vergleichen. Auch hier stellen wir fest, dass der Rückabsorber keinen grossen Einfluss hat der Tischabsorber hingegen schon.

 

 

5.2.3. Variationen der Seitenabsorber

 

Abbildung 16: Variationen der Versuchsanordnung mit Seitenabsorbern

Die wichtigste Erkenntnis aus diesen Messungen ist, dass sich die Asymmetrie beinahe beheben lässt mit dem Einsatz des Seitenabsorbers, da sich dann das Problem mit den von der Wand reflektierten Wellen erübrigt. Besonders effektiv ist der Einsatz des Seitenabsorbers in Querstellung, da damit die grössere Länge gegenüber der Hochstellung vor Interferenz mit reflektierten Wellen geschützt werden kann. Auch der Halbwertsbereich ist genauer bestimmbar und das Vor-Rückverhältnis verbessert sich ebenfalls, dies da sich nicht nur der Maximalwert, sondern eben auch der Minimalwert verbessert. Der Seitenabsorber sollte also für alle Messungen verwendet werden, denn die Verbesserungen der Resultate sind markant.

 

5.2.4.Variationen mit Kondensatoren auf den Reflektoren

Abbildung 17: Variationen der Antennenanordnung (mit und ohne Abschlusskondensatoren)

Aus dem Vergleich der verschiedenen Messreihen ist ersichtlich, dass der Einsatz von Kondensatoren in Form von auf die Reflektoren schraubbaren, runden Deckeln keine sehr merkliche Verbesserung der Messdaten bringt. Ob der Grund im schlechten Kontakt (durch die kleine Kontaktfläche der Schraubgewinde) liegt, müsste mit weiteren Messungen, so zum Beispiel mit fest verbundenem Kondensator und Reflektor, verifiziert werden.

6. Conclusion

Anhand unserer Messungen haben wir festgestellt, dass der Tisch- und der Seitenabsorber einen merklichen Einfluss auf die Messdaten haben, der Rückabsorber und die Kondensatoren in der hier verwendeten Form hingegen nicht. Im allgemeinen haben die simulierten und die gemessenen Daten recht gut übereingestimmt, einzig im Rückbereich gibt es grössere Differenzen, die aber messtechnisch bedingt sind, da die Messungen im Rückbereich sehr empfindlich sind.

 

 

7. Literaturverzeichnis

Karl Rothammel:

Antennebuch, 1984

A.W. Rudge, K. Milne, A.D. Olver, P. Knight:

The Handbook of Antenna Design, Volume 1, 1982

Albrecht Hock, ,Peter Pauli u.a.:

Antennentechnik, 1982


Anhang A: Programm SmartAnt.exe

Die Erstellung von NEC Input Files ist recht mühsam. Der Code ist unleserlich und es können nur kartesische Koordinaten verwendet werden. Deshalb haben wir ein Programm (SmartAnt.Exe) entwickelt, welches diese Arbeit erleichtern soll.

Das Programm stellt den im PSS verwendeten Antennendrehtisch graphisch dar. Per Mausklick lassen sich die gewünschten Passivantennen setzen, worauf automatisch die Koordinaten berechnet werden und der Code erzeugt wird. Die Aktiv-Antenne ist fix im Nullpunkt einprogrammiert. Zusätzlich werden die Antennendaten in einer gut leserlichen Form in die Kommentarzeilen des NEC Input Files geschrieben.

 

A.1. Quellcode

Die verwendete Entwicklungsumgebung ist Borland Delphi 3. Diese basiert auf der Sprache Pascal. Graphische Elemente lassen sich per Drag & Drop definieren. Delphi ist somit eine Art Visual Pascal.

Um den Code flexibel für Änderungen zu machen, befinden sich alle Definitionen verwendeter Konstanten am Anfang der Unit Main. Dazu gehören z.B. Anzahl Segmente pro Antenne, Antennenradius, Senderfrequenz und vor allem die geometrische Definition des Drehtisches.

Für einen tieferen Einblick ist hier die Implementation der Unit Main aufgelistet. Diese enthält alle wesentlichen Funktionen des Programms. Zusätzlich sei noch das Interface der Unit Coordinates erwähnt, welches Funktionen zur Umrechnung von kartesischen zu Polarkoordinaten zur Verfügung stellt.

unit Coordinates;

{ Umrechnung polar <--> kartesische Koordinaten }

interface

function XYtoR(x,y:real):real;

function XYtoPhi(x,y:real):real;

function PolarToX(r,phi:real):real;

function PolarToY(r,phi:real):real;

 

- - - - - -

 

unit Main;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, Spin, ExtCtrls, coordinates;

 

const

maxAntennas = 10; { Maximale Anzahl Passiv-Antennen }

nrOfSegments = 30; { Anzahl Segmente pro Antenne }

AntennaRadius = 1.5; { Antennen Radius [mm] }

Frequency = 823; { Frequenz [MHz] }

{ Definition des Drehtisches: }

dPhi = Pi/36; { DeltaPhi = 5° }

nrOfCircles = 5; { Anzahl Steckplatzkreise }

Radius1 = 69.55; { Radius des innersten Steckplatzkreises [mm] }

dRadius = 7.35; { Abstand der Steckplatzkreise [mm] }

stretch = 1.8; { Streckungsfaktor für die graphische Darstellung }

moveTurntable = 30; { Verschiebung des graphischen Drehtisches diagonal

in x und y Richtung, relativ zum Fenster-Nullpunkt. [Pixel] }

type

Antenna = record

r, Phi, x, y, height :real; { Position und Höhe einer Antenne }

end;

TMainForm = class(TForm)

Button_CreateFile: TButton;

Button_Reset: TButton;

Edit_FileName: TEdit;

Label_Filename: TLabel;

RadioGroup_AntennaLength: TRadioGroup;

RadioButton76: TRadioButton;

RadioButton84: TRadioButton;

RadioButton93: TRadioButton;

procedure Init(Sender: TObject);

procedure Reset(Sender: TObject);

procedure CreateFile(Sender: TObject);

procedure ProcessMouse(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure DrawTurntable(Sender: TObject);

private

function realMod(a, b: real):real;

procedure VisualizeAntenna(x,y,nr :integer; A:Antenna);

public

end;

var

MainForm: TMainForm;

implementation

{$R *.DFM}

var

Antennas :array[0..maxAntennas-1] of Antenna;

{ Daten der gesetzten Passiv-Antennen , Längeneinheit: mm }

nrOfAntennas :byte; { Anzahl gesetzter Antennen }

 

function TMainForm.realMod(a, b: real):real;

{ Mod-Funktion für Real-Werte: c := a mod b }

var

c :real;

begin

c := a;

while (c > b) do

c := c - b;

realMod := c;

end;

 

procedure TMainForm.VisualizeAntenna(x,y,nr :integer; A:Antenna);

{ Gesetzte Antenne graphisch anzeigen, und Daten in Tabelle ausgeben. }

var

strNr, strX, strY, strR, strPhi, strHeight: string;

Radius2 :real; { äussester Radius (Drehtisch) }

origin :integer; { Drehtisch Mittelpunkt, relative Verschiebung zum Fenster-Nullpunkt }

begin

Radius2 := Radius1 + (nrOfCircles * dRadius) - dRadius;

origin := round(stretch * Radius2) + moveTurntable;

canvas.pen.style:=psSolid;

canvas.pen.color:=0;

canvas.brush.color:=clWhite;

canvas.Ellipse(origin+x-5, origin-y-5, origin+x+5, origin-y+5);

canvas.brush.color:=clLtGray;

str(nr, strNr);

str(A.x:3:1, strX);

str(A.y:3:1, strY);

str(A.r:3:1, strR);

str((180*A.phi/Pi):3:0, strPhi);

str(A.height:3:1, strHeight);

canvas.textout(2*origin+30, 84+20*nr, strNr);

canvas.textout(2*origin+70, 84+20*nr, strX+' mm');

canvas.textout(2*origin+130, 84+20*nr, strY+' mm');

canvas.textout(2*origin+210, 84+20*nr, strR+' mm');

canvas.textout(2*origin+260, 84+20*nr, strPhi+'°');

canvas.textout(2*origin+320, 84+20*nr, strHeight+' mm');

end; { VisualizeAntenna }

 

procedure TMainForm.Init(Sender: TObject);

begin

nrOfAntennas := 0;

RadioGroup_AntennaLength.ItemIndex:=1;

end;

 

procedure TMainForm.Reset(Sender: TObject);

var

Radius2 :real; { Radius der äussersten Steckplätze }

origin :integer;

begin

Radius2 := Radius1+(nrOfCircles * dRadius) - dRadius;

origin := round(stretch*Radius2) + moveTurntable;

nrOfAntennas := 0;

canvas.FillRect(Rect(2*origin+26, 95, 2*origin+360, 105+20*maxAntennas));

DrawTurntable(self);

end;

 

procedure TMainForm.CreateFile(Sender: TObject);

{ NEC-Datei erzeugen }

var

f: textfile;

i: integer;

begin

assignfile(f, Edit_FileName.Text);

{$I-}

rewrite(f);

{$I+}

if (ioresult<>0) then

begin

MessageDlg('Datei kann nicht zum schreiben geöffnet werden!', mtWarning, [mbOk], 0);

exit;

end;

writeln(f, 'CM PPS Smart Antenna');

writeln(f, 'CM ');

writeln(f, 'CM (1) X= 0.0mm Y= 0.0mm Höhe= 84.0mm (aktiv Antenne)');

for i:=1 to nrOfAntennas do

begin

write(f, 'CM ');

write(f, '(', i+1, ') ');

write(f, 'X= ',Antennas[i-1].x:3:1,'mm ');

write(f, 'Y= ',Antennas[i-1].y:3:1,'mm ');

write(f, 'R= ',Antennas[i-1].r:3:1,'mm ');

write(f, 'Phi= ',180*Antennas[i-1].Phi/Pi:3:1,'° ');

writeln(f, 'Höhe= ',Antennas[i-1].height:3:1,'mm');

end;

writeln(f, 'CM ');

writeln(f, 'CM ');

writeln(f, 'CE');

writeln(f, 'GW 1 ',nrOfSegments ,' 0 0 0 0 0 0.0840 ',AntennaRadius/1000:5:4);

for i:=1 to nrOfAntennas do

begin

write(f, 'GW ');

write(f, i+1, ' ');

write(f, nrOfSegments, ' ');

write(f, Antennas[i-1].x/1000:5:4, ' ');

write(f, Antennas[i-1].y/1000:5:4, ' ');

write(f, '0 ');

write(f, Antennas[i-1].x/1000:5:4, ' ');

write(f, Antennas[i-1].y/1000:5:4, ' ');

write(f, Antennas[i-1].height/1000:5:4, ' ');

writeln(f, AntennaRadius/1000:5:4);

end;

writeln(f, 'GE 1');

writeln(f, 'GN 1 0'); { unendlich ausgedehnte perfekt leitende Grundfläche }

writeln(f, 'EX 0 1 1 0 1 0'); { Anregung der Aktiv-Antenne }

writeln(f, 'FR 0 1 0 0 ',Frequency,' 0'); { Frequenz }

writeln(f, 'RP 0 1 360 1000 90 0 0 1'); { Radiation Pattern }

writeln(f, 'EN');

closefile(f);

end; { CreateFile }

 

procedure TMainForm.ProcessMouse(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

var

r, Phi :real;

roundedR, roundedPhi: real;

rx, ry :integer; { xy-Koordinaten relativ zum Drehtisch-Mittelpunkt }

roundedX, roundedY :real;

height :real; { Höhe der neu gesetzten Antenne }

Radius2 :real; { äussester Radius des Drehtisches }

origin :integer; { Drehtisch-Mittelpunkt, relativ zum Fenster-Nullpunkt }

begin

{ Falls maximale Anzahl von Antennen bereits gesetzt -> Exit }

if nrOfAntennas>=maxAntennas then exit;

{ Variablen Initialisierung }

Radius2 := Radius1 + (nrOfCircles * dRadius) - dRadius;

origin := round(stretch * Radius2) + moveTurntable;

{ MouseClick von kartesischen in Polar-Koordinaten umrechnen }

rx := x - origin;

ry := origin - y;

r := XYtoR(rx, ry) / stretch;

Phi := XYtoPhi(rx,ry);

{ Falls MouseClick ausserhalb des graphischen Drehtisches -> Exit }

if (r <= (Radius1 - (dRadius/2))) or (r >= (Radius2 + (dRadius/2))) then

exit;

{ Maus-Koordinaten auf gültige Positionen runden }

roundedR := r - realMod(r, dRadius) + realMod(Radius1, dRadius);

if (realMod(r, dRadius)-realMod(Radius1,dRadius)-(dRadius/2)) >= 0 then

roundedR := roundedR + dRadius;

roundedPhi := Phi - realMod(Phi, dPhi);

if (realMod(Phi, dPhi)-(dPhi/2)) >= 0 then

roundedPhi := roundedPhi + dPhi;

if (roundedPhi >= 2*Pi) then roundedPhi := roundedPhi-2*Pi;

{ gerundete Position von Polar- zurück in kartesische Koordinaten umrechnen }

roundedX := PolarToX(roundedR, roundedPhi);

roundedY := PolarToY(roundedR, roundedPhi);

{ Länge der Antenne }

if RadioButton76.checked then

height:=76

else if RadioButton84.checked then

height:=84

else

height:=93;

{ Gesetzte Antenne speichern }

Antennas[nrOfAntennas].r := roundedR;

Antennas[nrOfAntennas].Phi := roundedPhi;

Antennas[nrOfAntennas].x := roundedX;

Antennas[nrOfAntennas].y := roundedY;

Antennas[nrOfAntennas].height := height;

inc(nrOfAntennas);

{ Passiv-Antenne zeichnen und Daten ausgeben }

VisualizeAntenna(round(stretch*roundedX), round(stretch*roundedY), nrOfAntennas, Antennas[nrOfAntennas-1]);

end; { ProcessMouse }

 

procedure TMainForm.DrawTurntable(Sender: TObject);

{ Graphische Darstellung des Drehtisches }

var

r, Phi :real;

x, y, i :integer;

Radius2 :real; { Radius der äussersten Steckplätze }

origin, radOuterCircle, cross :integer;

dAngle :real;

begin

Radius2 := Radius1+(nrOfCircles * dRadius) - dRadius;

origin := round(stretch*Radius2) + moveTurntable;

{ Tabelle der gesetzten Antennen: }

canvas.brush.color:=clLtGray;

canvas.pen.color:=clNavy;

canvas.MoveTo(2*origin+26, 95);

canvas.LineTo(2*origin+360, 95);

canvas.MoveTo(2*origin+26, 105+20*maxAntennas);

canvas.LineTo(2*origin+360, 105+20*maxAntennas);

canvas.brush.color:=clLtGray;

canvas.textout(2*origin+30, 80, 'Antenne');

canvas.textout(2*origin+90, 80, 'X');

canvas.textout(2*origin+150, 80, 'Y');

canvas.textout(2*origin+210, 80, 'Radius');

canvas.textout(2*origin+260, 80, 'Winkel');

canvas.textout(2*origin+320, 80, 'Höhe');

{ Äusserer Kreis }

canvas.pen.color:=clBlack;

canvas.brush.color:=clLtGray;

canvas.pen.style:=psSolid;

radOuterCircle := round(stretch * (Radius2 + dRadius));

canvas.Ellipse(origin-radOuterCircle, origin-radOuterCircle, origin+radOuterCircle, origin+radOuterCircle);

{ 90° Kreuz }

cross := round(stretch*(Radius1-dRadius));

canvas.MoveTo(origin-round(0.71*cross), origin);

canvas.LineTo(origin-cross, origin);

canvas.MoveTo(origin+round(0.71*cross), origin);

canvas.LineTo(origin+cross, origin);

canvas.MoveTo(origin, origin-round(0.71*cross));

canvas.LineTo(origin, origin-cross);

canvas.MoveTo(origin, origin+round(0.71*cross));

canvas.LineTo(origin, origin+cross);

{ 45° Kreuz }

canvas.MoveTo(origin-(cross div 2), origin-(cross div 2));

canvas.LineTo(origin-round(0.71*cross), origin-round(0.71*cross));

canvas.MoveTo(origin+(cross div 2), origin+(cross div 2));

canvas.LineTo(origin+round(0.71*cross), origin+round(0.71*cross));

canvas.MoveTo(origin+(cross div 2), origin-(cross div 2));

canvas.LineTo(origin+round(0.71*cross), origin-round(0.71*cross));

canvas.MoveTo(origin-(cross div 2), origin+(cross div 2));

canvas.LineTo(origin-round(0.71*cross), origin+round(0.71*cross));

{ Winkel Skala }

dAngle:=2*dPhi;

for i:=1 to round(180/dPhi) do

begin

canvas.MoveTo(origin-round(PolarToX(cross,i*dAngle)), origin-round(PolarToY(cross,i*dAngle)));

canvas.LineTo(origin-round(PolarToX(cross-4,i*dAngle)), origin-round(PolarToY(cross-4,i*dAngle)));

end;

{ Steckplätze für Passiv-Antennen }

Phi := 0;

while (Phi < 2*Pi) do

begin

r := Radius1;

while (r <= Radius2) do

begin

x := round(PolarToX(stretch*r, Phi)) + origin;

y := round(PolarToY(stretch*r, Phi)) + origin;

canvas.Ellipse(x-2,y-2,x+2,y+2);

r := r + dRadius;

end;

Phi := Phi + dPhi;

end;

{ Antennen Daten }

for i:=0 to nrOfAntennas-1 do

begin

x := round(PolarToX(stretch*Antennas[i].r, Antennas[i].phi));

y := round(PolarToY(stretch*Antennas[i].r, Antennas[i].phi));

VisualizeAntenna(x, y, i+1, Antennas[i]);

end;

end; { DrawTurntable }

end.


B: Simulationsvariationen

B1: Änderung der Anzahl Antennensegmente

5 Segmente pro Antenne 10 Segmente pro Antenne

15 Segmente pro Antenne 30 Segmente pro Antenne

50 Segmente pro Antenne

B2: Änderung der Antennenhöhe

 

Höhe der Aktiv-Antenne +2% Höhe eines Reflektors +2%

Höhe des Direktors +2% Höhe der Aktiv-Antenne -2%

 

Höhe eines Reflektors -2% Höhe des Direktors -2%

 

B3: Änderung des Winkels zwischen Platte und Antenne

 

Spitze der Aktiv-Antenne, Spitze eines Reflektors

+2mm in x-und y-Richtung +2mm in x- und y-Richtung

 

Spitze des Direktors

+2mm in x- und y-Richtung

 

C Messdaten

C.1. Variationen von Tisch – und Rückabsorbern