API Beispiel pymininec, plot-antenna


Dies ist ein Beispiel für die Verwendung des API von pymininec zusammen mit dem API von plot-antenna. Wir berechnen eine Antenne mit pymininec und plotten dann das Antennendiagramm, das Stehwellenverhältnis (VSWR), und die Antennen-Geometrie mit plot-antenna. Es gibt bereits eine bescheidene API Beschreibung für plot-antenna, für pymininec verwenden wir im wesentlichen den Code in der main() Funktion in mininec/mininec.py – das alle API-Aufrufe im Beispiel enthält. Zu beachten ist dass API-Features verwendet werden die in der derzeit noch nicht als Release verfügbaren Version von pymininec auf github enthalten sind.

Weiterlesen…

"Wasser": Ein Mehrdimensionales Benchmark Problem


Dies ist ein kurzes Essay das eigentlich in die Dokumentation von PGAPack gehört, aber ich habe es nicht geschafft, plotly Grafiken in ein github README.rst file einzubinden, nichtmal mit der Proxy-Seite raw.githack.com (das ist eine Seite die html und javascript files mit dem richtigen Content-Type ausliefert so dass man sie im Web-Browser anzeigen kann, github liefert diese Seiten mit dem Content-Type text/plain aus). Github weigert sich, einen iframe in einer github Seite zu rendern.

Das "Wasser Ressourcenplanungs-Problem" [RTS01] ist ein technisches Problem das als Benchmark für das Testen von Optimierungssalgorithmen mit mehreren Zielfunktionen in der Literatur verwendet wird, unter andererem in Klassikern wie dem NSGA-II Artikel [DPAM02]. Das Problem besteht aus sieben Randbedingungen und einer fünfdimensionalen Zielfunktion.

Ich nutze dieses Problem seit einiger Zeit als Test meiner NSGA-II Implementierung in PGAPack. Es ist im Verzeichnis examples/nsgaii und kann (nach compilieren) mit dem Test-Problem Index 12 aufgerufen werden:

examples/nsgaii/optimize 12

Die Ausgabe des Programms kann auch in der folgenden Datei gefunden werden:

test/nsgaii_optimize_12.data

Zum Testen liefere ich auch das Script crowdingplot zum Plotten von mehrdimensionalen Optimierungsproblemen mit. Es findet sich im selben Directory wie der Code für das Beispiel.

Weiterlesen…

Neue Messungen zur Nicht-Dominanz Sortierung


Dies ist eine Aktualisierung zu einem früheren Beitrag [Sch25] zur Implementierung von Nicht-Dominanz Sortierung in PGAPack. Nicht-Dominanz Sortierung ist eine zentrale Komponente von Optimierungsalgorithmen mit mehreren Zielfunktionen.

Im früheren Beitrag hatte ich nicht erwähnt für wie viele Generation der Test lief: Die Anzahl der Generationen im letzten und in diesem Test war 200. Im letzten Test war der Code ohne Optimierung compiliert. Die folgenden Messungen wurden mit der Option -O3 gemacht, der besten die gcc anbietet. Ausserdem war mir aufgefallen, dass meine Implementierung des DTLZ-1 tests [DTLZ05] quadratisch in der Anzahl der Zielfunktionen ist und ich befürchtete dass dies die Tests beeinflussen könnte. Es stellte sich aber heraus dass dies nicht der Fall war, der Overhead für 20 Zielfunktionen ist immer noch zu klein um bemerkbar zu sein.

Zusätzlich zu den ersten Tests messe ich jetzt – neben der Gesamtzeit – auch die Zeit nur für die Nicht-Dominanz Sortierung. Im folgenden gibt es also zwei Typen von Grafiken: Wo im Titel "Overall" steht ist die Zeit für die Zielfunktion und was der Algorithmus sonst noch an Verwaltung tut inkludiert (Gesamtzeit). Die anderen welche mit "Non-dominated" anfangen messen nur die Zeit für die Nicht-Dominanz Sortierung.

Weiterlesen…

Nicht-Dominanz Sortierung bei Optimierung mit mehreren Zielfunktionen


Einige Leser hier wissen dass ich PGApack, ein Paket für Genetische Algorithmen, zusammen mit PGApy einer Python Bibliothek pflege (maintaine). PGAPack implementiert Optimierung mit mehreren Zielfunktionen (multi-objective optimization) mit NSGA-II [DPAM02] und NSGA-III [DJ14], [JD14].

Mehrere Zielfunktionen heisst dass wir mehr als ein Zielfunktion (auch Fitness-Funktion genannt) haben. Typischerweise widersprechen sich die Ziele – wenn eine Lösung in einer Zielfunktion besser ist wird, wird sie typischerweise in einer anderen Lösung schlechter – wir müssen uns also überlegen was besser im Kontext von mehreren Zielfunktionen bedeutet. Eine Lösung \(A\) ist strikt besser als eine andere Lösung \(B\) – wir sprechen davon dass Lösung \(A\) die Lösung \(B\) dominiert – wenn \(A\) besser oder gleich \(B\) in allen Zielfunktionen ist und strikt besser in mindestens einer davon.

Weil wir keine einfache Fitness für Lösungen haben, etablieren Algorithmen für mehrere Zielfunktionen typischerweise eine Rangfolge (ranking) der Lösungen nach Dominanz. Lösungen die nicht von einer anderen Lösung dominiert werden bekommen den Rang 0. Dann entfernt man alle Lösungen mit Rang 0. Alle Lösungen die dann nicht dominiert sind bekommen Rang 1 usw. Diese Prozedur heisst typischerweise Nicht-Dominanz Sortierung (non-dominated sorting). Der Rang ist dann eine der Komponenten für eine neue Fitness-Funktion.

Der NSGA-II Artikel [DPAM02] implementiert diese Sortierung indem jede Lösung gegen jede andere Lösung der Population auf Dominanz verglichen wird. Dann werden nicht-dominierte Lösungen eine nach der anderen entfernt und die Ränge zugewiesen wie oben angedeutet. Dieser Algorithmus zur Sortierung hat eine Laufzeit die mit der Anzahl der Lösungen quadratisch ansteigt. In der Informatik schreiben wir mit der O-Notation (auch Landau Symbole) Aussagen über die Laufzeit auf. Der quadratische Aufwand wird als \(O(n^2)\) notiert, wobei \(n\) die Anzahl der Lösungen ist.

2003 hat Jensen [Jen03] einen Algorithmus publiziert der die Nicht-Dominanz-Sortierung mit einem Aufwand von \(O\left(n\cdot(\log n)^{m-1}\right)\) durchführen kann wobei \(m\) die Anzahl der Zielfunktionen (und \(n\) wieder die Populationsgröße) ist. Jensen's Algorithmus wurde zehn Jahre später nochmal geändert publiziert weil das Original nicht mit gleichen Werten der Zielfunktionen umgehen konnte. Jensen schreibt zwar das sei einfach, offensichtlich nicht für andere [FGP13]. Ein Jahr später gab es dann nochmal eine kleinere Modifikation um formal zu beweisen dass die Laufzeit-Komplexität wirklich der obigen Formel folgt [BS14].

Weiterlesen…

Dynamisches DNS mit Bind funktioniert nicht mehr


Im Jahr 2021 hatte ich ein dynamisches DNS-Service mit dem ISC Bind DNS-Server aufgesetzt und das Setup in einem Blog Artikel gepostet [1].

Vor kurzem (in der zweiten Hälfte von 2024) haben die DNS Updates plötzlich nicht mehr funktioniert. In der Konfiguration hatte ich das Public Key Verfahren namens SIG(0) verwendet. Dieses wird schon lange in Bind unterstützt und es ist auch dokumentiert dass es funktioniertin der letzten Version.

Plötzlich wurden alles DNS Update Anfragen mit einem REFUSED Status zurückgewiesen. Selbst mit aufgedrehtem Debugging mit -d 15 bekam ich keine weiteren Informationen, auch nicht wenn alle Logs auf Standard Error umgeleitet wurden mit der Option -g.

Es stellte sich heraus dass das Public Key Verfahren SIG(0) wegen eines "Denial of Service" Angriffsvektors, der in CVE-2024-1975 dokumentiert ist, entfernt worden war. DNS updates mit TSIG keys funktionieren noch. Leider sah es so aus als ob das nicht dokumentiert ist und es kamen auch keine sinnvollen Logmeldungen, daher habe ich einen Bug report gemacht.

Wie sich dann herausstellte hätte ich in die Dokumentation von 9.18 – die Version die von Debian bookworm paketiert ist – schauen müssen. Diese dokumentiert dass SIG(0) entfernt wurde wegen CVE-2024-1975.

Es sieht so aus dass spätere Versionen von Bind (z.B. 9.20.6 und höher) wieder SIG(0) unterstützen, mit einem Quota-Mechanismus der einen Denial of Service verhindert. Aber für frühere Versionen besteht der "Fix" darin, SIG(0) komplett zu deaktivieren.

Modellieren einer Drahtantenne mit Isolation


[Update 2024-08-20: Korrektur der Formel zu L und äquivalentem Radius]

[Update 2024-09-19: Korrektur Literaturangabe Artikel von Stearns, Ergänzung zum Antenna Book [5]]

Für mein Antennen-Modellierungsprogramm pymininec (das eine Reimplementierung des original Mininec Basic-Codes darstellt) habe ich mich damit beschäftigt, wie man isolierte Drähte in Antennen modellieren kann. Ich hatte Roy Lewallen, W7EL, den Autor von EZNEC gefragt was er in EZNEC verwendet und einen Hinweis auf ein Paper von J. H. Richmond [1] erhalten, das das erste Paper war, welches einen Algorithmus für isolierte Drähte vorgeschlagen und auch implementiert hat. Der Algorithmus wurde von Jerry McCormack in seiner Masterarbeit [2] implementiert und später in einem Report [3] (dieser ist fast identisch mit der Masterarbeit bis auf neueren Fortran Code und einen anderen Autor) wiederveröffentlicht. Der original Fortran Code ist nicht nur in den obigen Reporten abgedruckt, sondern auch heute noch verfügbar auf Ray L. Cross' Seite zum "Antenna Scatterers Analysis Program" ASAP. Die Subroutine "DSHELL" implementiert den Algorithmus für isolierte Drähte. Mit einigen Modifikationen konnte ich diesen Code auch heute noch ausführen. Großer Dank gebührt an dieser Stelle Roy, W7EL der mir diese Infos zugänglich machte.

Um meine Implementierung in pymininec gegen gemessene Daten zu testen habe ich ein Paper von David Lamensdorf [4] ausgegraben wo der Effekt von Isolation wirklich mal gemessen wurde. Weil zu dieser Zeit der Einfluss von Isolation nur mit einem unendlichen Zylinder theoretisch modelliert werden konnte verwendete das Experiment Isolation die über das Ende des Drahtes hinausragte bis keine Änderung der gemessenen Parameter mehr beobachtet wurde.

Experimente mit den Formeln von Richmond [1] zeigten mir dass die resultierende Impedanzmatrix schlecht konditioniert ist: Für kurze Drahtsegmente erzeugen die Formeln sehr große absolute Werte die zur Hauptdiagonale addiert und von den beiden Nebendiagonalen (die Matrix ist symmetrisch, die beiden Nebendiagonalen sind für die obere und untere Dreiecksmatrix ident) subtrahiert werden. Weil diese Werte während der Matrix-Inversion subtrahiert werden, kommt es zu katastrophalen Auslöschungseffekten, was die Ergebnisse dominiert.

Also habe ich weiter nachgeforscht und bin auf ein Paper [5] und eine Präsentation [6] von Steve Stearns, K6OIK gestoßen, die Formeln für die verteilte Induktivität und einen äquivalenten Radius angibt mit welchen sich Isolation modellieren lässt. Seine Präsentation hat auch eine gute Übersicht über unterschiedliche Ansätze zur Modellierung von Isolation mit Programmen die dies nicht unterstützen (wie die original NEC-2 Implementierung oder das original Mininec):

\begin{align*} a_e &= a \left(\frac{b}{a}\right)^{\left(1- \frac{1}{\varepsilon_r}\right)} \\ L &= \frac{\mu_0}{2\pi}\left(1-\frac{1}{\varepsilon_r} \right)\log\left(\frac{b}{a}\right) \\ \sigma_e &= \sigma\left(\frac{a}{b}\right)^{2\left(1-\frac{1}{\varepsilon_r}\right)} \\ \end{align*}

Hier ist \(a\) der Original-Radius des Drahtes, \(b\) der Radius mit Isolation, \(\sigma\) ist die Elektrische Leitfähigkeit des Drahtes, \(\varepsilon_r\) ist die relative Permittivität der Isolation, \(a_e\) ist der äquivalente Radius und \(\sigma_e\) die äquivalente Permittivität die verwendet wird um den Effekt des veränderten Radius bei der Berechnung des Skin-Effekts aufzuheben. Die Induktivität \(L\) ist die Induktivität pro Länge des isolierten Drahtes (oder Drahtsegments).

Dann habe ich ein Paper gesucht das die Formeln von Steve Stearns bestätigt und habe ein noch älteres Paper von Tai Tsun Wu [7] gefunden das exakt die gleichen Formeln für den äquivalenten Radius \(a_e\) und für die verteilte Impedanz \(L\) angibt.

Die Formel für die äquivalente Permittivität wird nur verwendet um den Effekt des äquivalenten Radius auf die Berechnung des Skin Effekts aufzuheben. In einem früheren Blog Post [8] hatte ich eine Formel für den Skin Effekt angegeben. In dieser Formel taucht die Elektrische Leitfähigkeit \(\sigma\) als ihr Kehrwert \(\rho\) auf, der spezifische Widerstand. Die Quadratwurzel aus \(\sigma\) wird immer als Produkt mit dem Radius verwendet. Daher können wir den Effekt der Radius-Änderung durch Multiplikation von \(\sigma\) mit dem Kehrbruch des Faktors für den äquivalenten Radius multiplizieren. Wir bekommen:

\begin{align*} \sqrt{\sigma}a &= \sqrt{\sigma_e}a\left(\frac{b}{a}\right)^{\left (1-\frac{1}{\varepsilon_r}\right)} \\ \frac{\sigma_e}{\sigma} &= \frac{1}{\left(\frac{b}{a}\right)^{2\left (1-\frac{1}{\varepsilon_r}\right)}} = \left(\frac{a}{b}\right)^{2\left(1-\frac{1}{\varepsilon_r}\right)} \\ \end{align*}

In pymininec brauche ich allerdings den äquivalenten Radius bei der Skin Effekt Berechnung nicht zu korrigieren da ich dort einfach den Original-Radius verwenden kann.

Weiterlesen…

Plotting Antenna Pattern


Ich bin der Autor eines Antennen-Plot-Programms namens plot-antenna. Es ist in Python geschrieben und hat Backends für Matplotlib und Plotly. Während ich das hier schreibe kann die Version auf pypi noch nicht unterschiedliche Frequenz-Auflösungen für Gewinn und Impedanz-Plots. Das Matplotlib Backend ist besser für die Erzeugung von Grafiken für gedruckte Dokumentation während Plotly sich eignet, interaktive Grafiken für das Web zu erzeugen. Die Doku von plot-antenna enthält einige Matplotlib Beispiele daher gehe ich hier mehr ins Detail was das Plotly Backend betrifft.

Vor kurzem habe ich Unterstützung für das "Antenna Scatterers Analysis Program" ASAP eingebaut. Das ist ein Antennen-Simulationsprogramm aus einer Zeit vor dem Fortran-77 Standard aus dem Jahr 1974. Es ist heute noch interessant weil es eine Formulierung der Momentenmethode (method of moments) verwendet, die sich sowohl von NEC [3] als auch Mininec [4] unterscheidet. Und ASAP hat zuerst eine Simulation von isolierten Drähten in einer Antenne unterstützt.

Im Folgenden verwende ich eine 3-Elemente Yagi-Uda Antenne die sich in der Beispiel-Sektion von ASAP findet. Die verwendete Eingabedatei exportiert Gewinn-Daten für 280 MHz bis 305 MHz in 5 MHz Schritten. Zusätzlich exportiert es Impedanzwerte in 1 MHz Schritten.

Weiterlesen…

Skin Effekt Belag und Impedanz: Update


In meinem letzten Post [1] habe ich mich gefragt, warum meine Implementierung von Skin Effekt Belag (Drähte mit einem endlichen Widerstand) nicht mit den Resultaten von NEC-2 übereinstimmten. Es stellt sich heraus dass ich falsch lag in der Annahme dass Skin-Effekt Belag nur eine rein ohmsche Komponente hat, durch den Skin Effekt ergibt sich in Wirklichkeit eine relativ große reaktive Komponente.

Hinweis: Dieser Artikel enthält ziemlich viel Mathematik, vielleicht möchten Sie ja ans Ende scrollen und checken wie die neue Implementierung in pymininec sich verglichen mit meinem letzten Artikel verhält wo nur ein rein ohmscher Widerstand angenommen wurde.

Der englische Wikipedia Artikel zum skin effect enthält die korrekte Formel:

\begin{equation*} \newcommand{\Int}{{\mathrm\scriptscriptstyle int}} \newcommand{\ber}{\mathop{\mathrm{ber}}\nolimits} \newcommand{\bei}{\mathop{\mathrm{bei}}\nolimits} \end{equation*}
\begin{equation*} Z_\Int = \frac{k\rho}{2\pi r}\frac{J_0 (kr)}{J_1 (kr)} \end{equation*}

wobei

\begin{equation*} k = \sqrt{\frac{-j\omega\mu}{\rho}} \end{equation*}

und \(r\) ist der Draht-Radius, \(J_v\) sind die Bessel-Funktionen der ersten Gattung mit der Ordnung \(v\). \(Z_\Int\) ist die Impedanz pro Längeneinheit des Drahtes.

NEC-2 verwendet eine andere Formel [2] (S.75):

\begin{equation*} Z_i = \frac{j\Delta_i}{a_i} \sqrt{\frac{\omega\mu}{2\pi\sigma}} \left[\frac{\ber (q) + j\bei (q)} {\ber^\prime(q)+ j\bei^\prime(q)}\right] \end{equation*}

mit

\begin{equation*} q = (\omega\mu\sigma)^{1/2} a_i \end{equation*}

und \(a_i\) ist der Draht-Radius, \(\Delta_i\) die Länge des Drahtsegments, \(\sigma\) die Elektrische Leitfähigkeit des Drahtes und \(\ber\) und \(\bei\) die Kelvin-Funktionen. Im folgenden werde ich wieder \(r\) für den Draht-Radius, und nicht \(a_i\) verwenden. Nachdem \(\ber^\prime\) die Ableitung von \(\ber\) ist, können wir \(\ber\) als \(\ber_0\) (Ordnung 0) und \(\ber^\prime\) als \(\ber_1\) (Ordnung 1) schreiben und analog für \(\bei\).

Im folgenden bin ich etwas ungenau in der Verwendung der magnetischen Permeabilität im Freiraum \(\mu_0\) vs. der Permeabilität eines Drahtes \(\mu\), für nicht ferromagnetische Drähte sind diese (fast) identisch: \(\mu = \mu_r * \mu_0\) mit \(\mu_r\approx 1\) für nicht ferromagnetische Materialien.

Der NEC-2 code verwendet die Fortran Funktion ZINT mit zwei Parametern, der Leitfähigkeit multipliziert mit der Wellenlänge \(\lambda\) (Parameter SIGL) und der Radius geteilt durch die Wellenlänge \(\lambda\) (Parameter ROLAM). Neben der Approximation der Kelvin-Funktionen (der Term mit dem Bruch aus Kelvin-Funktionen ist BR1), berechnet ZINT:

X = SQRT (TPCMU * SIGL) * ROLAM
ZINT = FJ * SQRT (CMOTP / SIGL) * BR1 / ROLAM

mit TPCMU = 2368.705, CMOTP=60.0, und FJ ist \(j\). Das berechnete X wird der Berechnung der Kelvin-Funktionen übergeben mit BR1 als Resultat des Bruch-Terms. Das berechnete ZINT enthält nicht die Segment-Länge, ist also äquivalent mit der Wikipedia Definition in pro Längeneinheit. Mit den Reverse-Engineerten magischen Zahlen

CMOTP \(\approx \frac{\mu_0 c}{2\pi}\)

TPCMU \(\approx 2\pi c\mu_0\)

(\(c\) ist die Lichtgeschwindigkeit) bekommen wir für X aus dem Code (was wir jetzt \(q\) nennen um mit der obigen Formel aus [2] konsistent zu sein):

\begin{align*} q &= \frac{r}{\lambda}\sqrt{2368.705\sigma\lambda} \\ &= r\sqrt{\frac{2368.705\sigma}{\lambda}} \\ &\approx r\sqrt{\frac{2\pi c\mu_0\sigma}{\lambda}} \\ &= r\sqrt{\frac{2\pi c\mu_0\sigma f}{c}} \\ &= r\sqrt{\frac{2\pi \mu_0\sigma \omega}{2\pi}} \\ &= r\sqrt{\omega\mu_0\sigma} \\ \end{align*}

Was mit der obigen Definition von \(q\) in [2] übereinstimmt.

Für \(Z_\Int\) der Fortran-Implementierung bekommen wir:

\begin{align*} Z_\Int &= \frac{j}{r} \sqrt{\frac{\mu_0 c}{2\pi\sigma\lambda}} \left[\frac{\ber_0 (q) + j\bei_0 (q)} {\ber_1(q)+ j\bei_1(q)}\right] \\ &= \frac{j}{r} \sqrt{\frac{\mu_0 c f}{2\pi\sigma c}} \left[\frac{\ber_0 (q) + j\bei_0 (q)} {\ber_1(q)+ j\bei_1(q)}\right] \\ &= \frac{j}{r} \sqrt{\frac{\mu_0 f}{2\pi\sigma}} \left[\frac{\ber_0 (q) + j\bei_0 (q)} {\ber_1(q)+ j\bei_1(q)}\right] \\ &= \frac{j}{r} \sqrt{\frac{\mu_0 \omega}{2\pi 2\pi\sigma}} \left[\frac{\ber_0 (q) + j\bei_0 (q)} {\ber_1(q)+ j\bei_1(q)}\right] \\ &= \frac{j}{2\pi r} \sqrt{\frac{\mu_0 \omega}{\sigma}} \left[\frac{\ber_0 (q) + j\bei_0 (q)} {\ber_1(q)+ j\bei_1(q)}\right] \\ \end{align*}

Diese Formel stimmt NICHT mit der Formel für \(Z_i\) aus [2] weiter oben überein. Es sieht so aus als ob die Formel aus [2] (S. 75) die Frequenz \(f\) statt der Kreisfrequenz \(\omega\) unter der Wurzel haben sollte. Die aus der NEC-2 Implementierung abgeleitete Formel ist aber konsistent mit der obigen Formel aus Wikipedia.

Der Term vor dem Bruch mit den Kelvin-Funktionen unterscheidet sich um einen Faktor von der Wikipedia Formel (Ich lasse \(\Delta_i\) weg und habe so eine Formel pro Längeneinheit wie in Wikipedia). Ausserdem gilt \(\rho=1/\sigma\):

Aus dem Code abgeleitet:

\begin{equation*} \frac{j}{2\pi r}\sqrt{\frac{\omega\mu}{\sigma}} \end{equation*}

Aus Wikipedia:

\begin{equation*} \frac{k\rho}{2\pi r} = \sqrt{\frac{-j\omega\mu}{\rho}}\frac{\rho}{2\pi r} = \frac{1}{2\pi r}\sqrt{-j\omega\mu\rho} = \frac{1}{2\pi r}\sqrt{\frac{-j\omega\mu}{\sigma}} \end{equation*}

Das ist ein Faktor von

\begin{equation*} \frac{\sqrt{-j}}{j} = -\frac{1+j}{\sqrt{2}} \end{equation*}

weil \(\sqrt{-j} = \frac{1-j}{\sqrt{2}}\)

Für die Kelvin-Funktionen gilt die folgende Äquivalenz zu den Bessel Funktionen [3] (10.61, Kelvin Functions):

\begin{equation*} \ber_v x + j \bei_v x = J_v \left(xe^{3\pi j/4}\right) = e^{v\pi j} J_v \left(xe^{-\pi j / 4}\right) \end{equation*}

Mit den Spezialfällen der Ordnung 0 und 1:

\begin{align*} \ber_0 x + j \bei_0 x &= e^{0} J_0 \left(xe^{-\pi j / 4}\right) \\ &= J_0 \left(\frac{1-j}{\sqrt{2}}x\right) \\ \ber_1 x + j \bei_1 x &= e^{j\pi} J_1 \left(xe^{-\pi j / 4}\right) \\ &= -J_1 \left(\frac{1-j}{\sqrt{2}}x\right) \\ \end{align*}

Die Wikipedia Formel übergibt \(kr\) an die Bessel-Funktionen:

\begin{equation*} kr = r\sqrt{\frac{-j\omega\mu}{\rho}} = r\sqrt{-j\omega\mu\sigma} \end{equation*}

während NEC-2 folgendes übergibt:

\begin{equation*} q = r\sqrt{\omega\mu\sigma} \end{equation*}

Diese unterscheiden sich um den Faktor \(\sqrt{-j}\). Das bedeutet wir übergeben einen Faktor um \(\sqrt{2}\) zu groß an die Bessel-Funktionen. Daraus ergibt sich wegen der Symmetrie der Bessel Funktionen und er Tatsache dass die Funktionen im Nenner die Ableitung der Funktionen im Zähler sind, dass das Ergebnis um einen Faktor von \(\sqrt{2}\) zu groß ist was den Faktor im ersten Term ausgleicht.

Weiterlesen…

Skin Effekt Belag und Impedanz


Vor kurzem habe ich für pymininec, meine Re-Implementierung des Mininec Antennen-Modellierungs-Codes Skin Effekt Belag (Drähte mit einem endlichen Widerstand) implementiert. Das Original-Mininec hatte dieses Feature nicht.

Um die Implementierung zu verifizieren entschied ich einer uralten Publikation von R. P. Haviland, W4MB [1] zu folgen wo er unter anderem den Effekt von Draht-Widerstand auf die Speisepunkt-Impedanz von Antennen untersucht. Er hat zwei Grafiken wo der Real- und Imaginärteil der Speisepunkt-Impedanz eines Dipols gegen das Verhältnis von Länge zu Durchmesser des Drahtes geplottet wird. Er erwähnt zwar Mininec im Text aber bei genauerer Analyse ist es nicht ganz klar ob für die Plots der Speisepunkt-Impedanz wirklich Mininec oder etwas anderes verwendet wurde. Ich habe versucht, seine Grafiken mit PyNEC, einem Python wrapper für eine C++ Implementierung von NEC-2, und meiner pymininec Implementierung von Mininec zu reproduzieren. Die Resultate von Haviland haben die gleiche Tendenz wie die folgenden NEC Resultate aber sind nicht gleich.

Weiterlesen…

Schwebung


Musiker kennen den Effekt beim Stimmen von Instrumenten: Wenn zwei Instrumente nicht ganz den selben Ton spielen klingt das als ob es eine periodische Variation der Lautstärke gibt. Die Periode wird größer je besser die beiden Instrumente gestimmt sind und stoppt wenn beide den selben Ton spielen. Wir nennen diesen Effekt "Schwebung".

Funkamateure kennen den "umgekehrten" Fall dieses Effekts von der Amplitudenmodulation einer Radio-Frequenz mit einer Sinusschwingung im Audio-Bereich: Das Resultat sind zwei Radio Frequenzen, eine um die Audio-Frequenz niedriger als die Modulationsfrequenz, eine um die Audio Frequenz höher.

Amplitudenmodulation ist eine einfache Multiplikation: Wir multiplizieren die Radiofrequenz mit dem Audio, wir haben:

$$m(t) = A(t) \cdot\cos(2\pi f t)$$

Wobei $t$ die Zeit ist, $m(t)$ das amplitudenmodulierte Signal, $\cos(2\pi f_r t)$ ist das Radiofrequenz-Signal mit der Frequenz $f_r$ und $A(t)$ ist das Audiosignal. Für eine einfache Audio Sinusschwingung bekommen wir:

$$m(t) = \cos(2\pi f_a t)\cdot\cos(2\pi f_r t)$$

wobei $f_a$ die Audio-Frequenz ist.

Wir möchten jetzt zeigen, dass beide Effekte das gleiche Ding sind. Wir brauchen keine Radiofrequenzen, wir können das gleiche einfach im Audio-Spektrum tun.

Aus Wikipedia bekommen wir eine trigonometrische Identität über Produkte von Winkelfunktionen, daraus nehmen wir die für zwei Cosinus Funktionen:

$$\displaystyle\cos\theta \cos\phi = \frac{\cos(\theta-\phi) + \cos(\theta+\phi)}{2}$$

Wenn wir die auf unser Modulation-Beispiel anwenden bekommen wir:

$$\displaystyle \begin{align} \ \cos(2\pi f_a t) \cos(2\pi f_r t) & = \frac{\cos(2\pi f_r t-2\pi f_a t) + \cos(2\pi f_r t+2\pi f_a t)}{2} \\ & = \frac{\cos(2\pi(f_r-f_a)t)) + \cos(2\pi(f_r+f_a)t)}{2} \\ \end{align} $$

Die Multiplikation von zwei Cosinus-Schwingungen mit unterschiedlichen Frequenzen resultiert in der Summe von zwei Cosinus-Schwingungen, eine davon die Differenz der beiden ursprünglichen Frequenzen, die andere die Summe.

Egal wie wir das modulierte Signal erzeugen, durch Multiplikation von zwei Signalen oder durch Addition von zwei Signalen, wir bekommen das selbe Resultat.

Weiterlesen…