Klirrfaktor simulieren mit LTspice

Dass LTspice (auch bekannt als SwitcherCAD) von Linear Technology ein gut geeigneter und vor allem günstiger Simulator für Verstärker- und Audioschaltungen vielerlei Arten ist, hat sich ja inzwischen rumgesprochen. Allerdings gibt es ein paar Dinge zu beachten, um die Genauigkeit der Simulationsergebnisse erheblich zu verbessern. Wenn man sich längere Zeit mit dem Simulator auseinander setzt, wird einem so einiges klar, was auf den ersten (und auch auf den zweiten) Blick verborgen bleibt. LTspice ist ein durchaus leistungsfähiges Programm und auch die Hilfedatei ist sehr ausführlich, aber eben nicht sehr leicht verständlich :-). Hier möchte ich meine eigenen Erfahrungen (und Recherche-Ergebnisse) mit dem Programm mitteilen, in der Hoffnung, dass jemand drüber stolpert und sie zu seinem Vorteil nutzen kann.

Klirrfaktor simulieren

Eine häufig durchgeführte Messung an Audioverstärkern ist die Messung des Klirrfaktors, oder THD – Total Harmonic Distortion. Diese lässt sich auch sehr schön mit LTspice simulieren. Genau wie in der Realität braucht man dazu erstmal eine Signalquelle mit einem möglichst geringen Klirrfaktor. Im Simulator ist dafür eine Sinusförmige Spannungsquelle das Mittel der Wahl. Eine einfache Testschaltung ist schnell aufgebaut: Eine Spannungsquelle und die Masse als Referenz, fertig. Ich habe im Beispiel die häufig verwendete Frequenz von 1kHz gewählt. Der Ausgang der Spannungsquelle kann in der Luft hängen, da ohne weitere Einstellungen keine parasitären Effekte beachtet werden und die Quelle somit „ideal“ ist, also lastunabhängig. Ich habe lediglich ein Label mit dem Namen „out“ draufgesetzt. Die Simulationszeit beträgt 10ms, was exakt 10 Perioden bei 1kHz entspricht. Die Periodendauer muss für die FFT immer exakt eingehalten werden, da es sonst zu unschönen Verzerrungen kommt.

Das erste Simulationsergebnis ist relativ ernüchternd. Ein Noise Floor von etwa -120dB und starke „Verunreinigungen“ ab 50kHz – für eine ideale Signalquelle nicht wirklich zu gebrauchen. Die Klirrfaktor-Berechnungen des .four-Befehls sind ebenfalls nicht sehr erfreulich:

Total Harmonic Distortion: 0.000508%

Komprimiert und kompromittiert

Okay, 0.0005% sind schon recht wenig, aber alles andere als „ideal“. Um diese „Leistung“ wesentlich zu verbessern, gibt es ein paar einfache Möglichkeiten. Erstens: Komprimierung abschalten. Richtig – LTspice komprimiert standardmäßig die simulierten Daten, um Speicherplatz zu sparen. Wenn man bedenkt, dass das Programm ursprünglich dafür entwickelt wurde um Schaltnetzteile zu simulieren, macht das durchaus Sinn. Denn da muss so eine Simulation schonmal das Langzeitverhalten über mehrere Betriebsstunden umfassen, wobei der verfügbare Speicherplatz eine größere Rolle spielt als die exakte Wellenform im Mikrosekundenbereich. Ganz im Gegenteil zu unserer Klirrfaktormessung: Jegliche Verformung des Signals wirkt sich negativ aus, so eben auch die Verformung durch die Komprimierung. Die Komprimierung lässt sich auf zwei Wegen ausschalten: Entweder im Control Panel oder durch ein Dot-Command. Das Control Panel ist für den Ungeübten sicherlich einfacher, aber auch umständlicher. Die Einstellung bleibt nämlich nicht bis zum nächsten Programmstart erhalten :-( – man müsste also nach jedem Start wieder ins Menü… Die andere Version ist ein einfacher Befehl im Schaltplan, der quasi als erstes in jeden neuen Entwurf gehört:

.option plotwinsize=0

Das „.option“ kann dabei auch durch „.opt“ abgekürzt werden. Standardmäßig ist der Wert plotwinsize auf 300 gesetzt, das heißt es werden bis zu 300 Punkte zu einem Einzigen zusammengefasst. Wie negativ sich das beim Nulldurchgang eines Sinus‘ auswirken kann dürfte offensichtlich sein ;-).

Schon besser! Das Grundrauschen liegt bei etwa -150dB und ist im wichtigsten Bereich bis 20kHz linealflach. Die Fourier-Analyse ergibt:

Total Harmonic Distortion: 0.000044%

Schon fast perfekt. Aber es geht noch besser.

Im Gleichschritt, marsch!

Zweitens: Der Timestep. Im Fenster „Edit Simulation Command“ gibt es den Punkt „Maximum Timestep“. Damit wird quasi die Simulationsschrittweite festgelegt, also der Zeitabstand, in dem die einzelnen Berechnungen erfolgen. Auch hier gilt, dass eine höhere „Abtastrate“ eine genauere Wellenform ergibt, die für unsere Klirrfaktorberechnung so wichtig ist. Dieser Wert, der standardmäßig gar nicht eingetragen ist, wird von LTspice variiert. Hieraus ergibt sich zum einen eine recht geringe Auflösung (damit die Rechenzeit nicht zu hoch wird) und zum anderen entstehen Artefakte, da nicht jeder Zeitschritt gleich groß wie der vorherige ist. Um diesen Mangel zu beheben, tragen wir hier einfach einen festen Wert ein. Jedoch gibt es auch dabei wieder ein paar Kleinigkeiten zu beachten. Generell gilt, je kleiner der Wert ist, desto genauer wird das Ergebnis. Allerdings erhöht sich dadurch auch die Rechenzeit, was bei langsameren Computern und komplizierten Schaltungen schnell mal in einer Wartezeit von mehreren Minuten enden kann. Also gilt es, einen Kompromiss aus Genauigkeit und Geschwindigkeit zu finden. Und genau das gibt's hier zu sehen :-):

Auffällig ist, dass bei den Textbefehlen zwei weitere Zeilen dazugekommen sind und die Zeile mit dem .tran-Befehl etwas umfangreicher geworden ist. Folgendes ist passiert: Die beiden .param-Zeilen legen uns jeweils einen Parameter fest, die uns einiges an Schreib- und Rechenarbeit abnehmen. Der Parameter „freq“ zum Beispiel enthält jetzt unsere simulierte Frequenz von 1kHz. Wie man sieht, habe ich überall im Schaltplan den Wert „1k“ durch „{freq}“ ersetzt: Im .four-Befehl und auch in der Spannungsquelle V1. Im .tran-Befehl kommt die Frequenz auch vor, weil dadurch direkt die Periodendauer und somit die Simulationszeit berechnet wird. Praktisch – man muss somit nur einmal den freq-Parameter ändern und nicht alles andere einzeln! Die geschweiften Klammern nicht vergessen, sonst meckert LTspice rum. Der Parameter fft bestimmt letztendlich die Genauigkeit der Simulation. Der hintere Teil, also „2**11“, bedeutet praktisch 2 hoch 11, also 2048. Das Ganze kommt dann noch mal 2 und mal Pi und ergibt somit einen bunten Wert, der dafür sorgt dass das Spektrum in der Fourieranalyse über fast drei Dekaden relativ sauber bleibt. Wer es etwas genauer mag, kann gerne mit der 11 experimentieren und z.B. auf 14 gehen. Weniger geht natürlich auch – Versuch macht kluch! Wie man im Plot oben sieht, sind wir jetzt bei einem Noise Floor von etwa -200dB angekommen, was nochmal wieder besser aussieht als vorher. Ein Blick ins Spice Error Log zeigt uns folgendes:

Total Harmonic Distortion: 0.000000%

Nichts anderes hatten wir erwartet, oder ;-)? Aber ein paar Tips habe ich noch…

Fine-Tuning für's Auge

Beim letzten Plot ist das Grundrauschen wieder deutlicher ein Rauschen geworden. Woran liegt das? Ganz einfach: Die „berechneten Messwerte“ sind so gering, dass die Genauigkeit von 6 Stellen hinterm Komma nicht mehr genau genug ist und es somit zu Rundungsfehlern kommt, die deutlich sichtbar sind. Aber auch dafür hat der Leutnant Spice eine Lösung parat:

.opt numdgt=7

Die „7“ bedeutet strenggenommen „double precision“ – soll heißen, mit 8, 9 oder 24 werden die Ergebnisse nicht noch besser.

Sieht schon wieder etwas sauberer aus. Wenn man bedenkt, dass wir die Messlatte schon bei -240dB, also 0,000000000001% liegen haben, ist es eigentlich quatsch noch mehr zu verlangen. Aber da wäre noch was…

Unser Gewürz kann nämlich noch eine weitere Integrationsmethode, die uns nochmal 30dB mehr Rauschabstand bringt. Toll, oder? An den 6 Nullen hinterm Komma im Error Log ändert das zwar rein gar nichts, aber machbar ist's eben. Und wenn man jetzt noch den Time Step etwas kleiner wählt, kommt man sogar noch unter -300dB:

Hier habe ich mal die 2*Pi weggelassen, weil dadurch das Ergebnis etwas sauberer aussieht. Und damit lässt's sich doch arbeiten, oder?

Das Ende vom Lied

Wem das alles doch ein wenig zu aufwändig erscheint, der drücke einfach im Schaltplan-Editor die Taste „S“ und kopiere folgenden Text hinein:

.opt plotwinsize=0
.opt numdgt=7
.opt method=gear
.opt maxstep={2**-20}

Damit sind alle wichtigen Optionen festgelegt und der Zeitschritt wird auf einen Wert von knapp einer Mikrosekunde gesetzt, der ein Vielfaches von 2 und somit möglichst gut teilbar ist. Das ist perfekt für simulationen bei 1kHz – bei höheren Werten kann man die 20 auf 24 oder gar 30 erhöhen, je nachdem wieviel Rechenzeit man opfern mag.