Hallo,
ich möchte für die logarithmische Darstellung eines Spektrums,
von der Centerfrequenz und dem Spanbereich, die Start- und Stopfrequenz
berechnen.
Es geht um mein Programm für den Rigol DSA815.
Ich kann mit folgendem Code zwischen Bildschirmpixel und Frequenzen
umrechnen:
1
// iXLow - Die Startposition des Bereichs in dem gezeichnet wird.
2
// iXHigh - Die Endposition des Bereichs in dem gezeichnet wird.
3
// iX - Die Position des Bereichs für den die Frequenz berechnet werden soll.
4
// rFrequency - Die Frequenz in Hz für die zu berechnende Bildschirmkoordinate.
Jetzt benötige ich aber die Start- und Stopfrequenz nur von der
Centerfrequenz und dem Spanbereich.
Das ist unabhängig von den Bildschirmpixel.
Konkretes Beispiel direkt am DSA eingegeben:
linear:
Start 250 MHz, Center 750 MHz, Stop 1,25 GHz, Span 1 GHz
umschalten auf logarithmisch ergibt:
Start 250 MHz, Center 559 MHz, Stop 1,25 GHz, Span 1 GHz
Jetzt nur die Centerfreq. am DSA auf 300 MHz ändern, ergibt:
Start 83 MHz, Center 300 MHz, Stop 1,083 MHz, Span 1 GHz
Mit obigen Code kann ich von zwei gegebenen Frequenzen, aus Start-,
Stop- oder Centerfreq. die dritte Frequenz berechnen.
Wie kann man jetzt nur aus der Centerfrequenz und dem Span, die Start-
und Stopfrequenz berechnen?
Danke,
Peter
Mal sehen, ob ich dein Problem richtig verstanden habe.
Gegeben eine Kurve (logarithmisch) und eine Centerfrequenz in World
Koordinaten
Bild 1
Du möchtest in Worldkoordinaten den Beginn(Bw) eines Bereichs so
definieren ....
Bild 2
dass du in der Abbildung den Startpunkt eines (noch unbekannten
Bereichs) Ss/2 hast
Bild 3
so dass, wenn du diese Distanz im Screenspace auf die andere Seite der
Cs bringst und zurücktransformierst, du im Worldspace auf eine ganz
bestimmte Spannbreite kommst
Bild 4
gesucht sind also bei gegebenem Cw, die Positionen von Bw und Ew
richtig so?
Karl H. schrieb:> gesucht sind also bei gegebenem Cw ....
... und natürlich der gewünschten Spannbreite im Worldspace, die
Positionen von Bw und Ew
>> richtig so?
Peter D. schrieb:> Wie kann man jetzt nur aus der Centerfrequenz und dem Span, die Start-> und Stopfrequenz berechnen?
Ich bin mir nicht sicher, ob das überhaupt möglich ist.
Im ersten Schritt (linear) ist der Zusammenhang ja einfach:
Beim Umschalten von linear auf logarithmisch jedoch gilt dieser
Zusammenhang so nicht mehr. Die Informationen über Start- und
Stopfrequenz können in diesem Schritt selbst nicht mehr berechnet
werden, sie bleiben aus dem vorherigen Schritt erhalten. Was bedeutet
dass sie bekannt sein müssen und ab Schritt 2 nicht mehr ohne vorheriges
Wissen zur Verfügung stehen.
Kann mich natürlich auch irren. Ich hab versucht, die oben genannten
Gleichungen zu logarithmieren, bekomme dabei aber kein gescheites
Ergebnis heraus. Vielleicht ist jemand anders schlauer als ich.
f sei die logarithmische Funktion, die von World in Screen Space umrechnet
2
3
f(Cw) - f(Bw) = f(Ew) - f(Cw) // im Screen space müssen die Abstände
4
// der Projektionen gleich sein
5
6
Ew - Bw = Span // und im Worldspace muss der vorgegebene
7
// Abstand stimmen
wenn man da mal in die erste Gleichung die Funktionsgleichung einsetzt,
wo landet man dann? Hast du das schon ausprobiert?
(Wenn das mathematisch zu kompliziert wird, dann kann man immer noch ein
iteratives Verfahren benutzen, das im Prinzip das nachvollzieht wie ich
da oben die Grafik konstruiert habe. Ergibt sich eine zu große
Spannbreite, dann wandert Bw eben näher an Cw ran, ist die resultierende
Spannbreite zu gering dann wandert es von Cw weg. Man könnte auch mit
einer immer zu grossen Spannbreite anfangen, Bw also sehr weit links
ansiedeln und dann mit Bifakturierung arbeiten. Das sollte eigentlich
schnell zu einer guten Lösung konvergieren)
Hallo Karl Heinz,
danke für deine Grafiken, so sieht das Problem auch für mich
verständlicher aus.
Ja, meine Frage ist genauso wie du sie beschrieben hast.
Peter
Mark B. schrieb:> Mark B. schrieb:>> Kann mich natürlich auch irren.>> Wenn Karl Heinz etwas anderes sagt, dann gilt natürlich obiges Zitat.> ;-)
Nein, nicht wirklich.
Ich denke wir sind auf demselben Ast.
Und ich denke auch, dass die Mathe dahinter nicht so ohne ist. Ein
System wie Mathematica sollte das aber schaffen, wenn es eine
geschlossene Lösung gibt.
Peter D. schrieb:> Hallo Karl Heinz,>> danke für deine Grafiken, so sieht das Problem auch für mich> verständlicher aus.
Eine Grafik sagt mehr als 1000 Worte.
Das bewahrheitet sich immer wieder.
PS: Ich denke, ich würds wirklich iterativ machen.
Allerdings ist mir eine einfachere Version eingefallen.
DIe Spannbreite ist ja bekannt.
D.h. ich nehme einfach mal ein Bw an. Mit der bekannten Spannbreite
kenne ich damit auch das Ew. Die rechne ich über die logarithmische
Funktion im in den Screen Space. Bs und Es
Genau in der Mitte der beiden muss ja das Cs liegen, was ich somit
berechnen kann.
Dieses Cs kann ich aber wieder zurück transformieren und erhalte so ein
Cw'
Jetzt vergleiche ich dieses Cw' mit dem vorgegebenem Cw. Ist es zu
klein, dann ist mein Bereich (Ew-Bw) zu weit links, ich muss also den
Bereich nach rechts korrigieren. Ist das Cw' größer als das vorgegebene
Cw, dann muss ich den Bereich nach links korrigieren. Ich schieb also
den Span auf der X-Achse hin und her, bis das aus diesem Span
resultierende Cw' mit der Vorgabe genau genug übereinstimmt. Wenn man
will, könnte man da jetzt sicherlich auch mit einer Newton Iteration das
ganze verfeinern, aber ich denke ein simples Verfahren tuts auch.
Ein iteratives Verfahren vermeidet dann auch die Fälle, in denen es
keine Lösung geben kann. Wenn mein vorgegebenes Cw zu klein ist, dann
kann es passieren dass bei einem zu gross angegebenem Spann überhaupt
keine Lösung mehr geben kann. Denn der Logarithmus von 0 ist ja minus
unendlich, d.h. die Kurve existiert links von der Y-Achse überhaupt
nicht, das Bw kann also nie auf der X-Achse ins negative rutschen.
Um bei deinem Beispiel zu bleiben, könnte es also für eine gewünschte
Center-Frequenz von 10Mhz und einem Span von 1Ghz keine Lösung geben
(ich hab nicht nachgerechnet, ob das wirklich so ist)
Karl H. schrieb:> Ein iteratives Verfahren vermeidet dann auch die Fälle, in denen es> keine Lösung geben kann. Wenn mein vorgegebenes Cw zu klein ist, dann> kann es passieren dass bei einem zu gross angegebenem Spann überhaupt> keine Lösung mehr geben kann. Denn der Logarithmus von 0 ist ja minus> unendlich, d.h. die Kurve existiert links von der Y-Achse überhaupt> nicht, das Bw kann also nie auf der X-Achse ins negative rutschen.> Um bei deinem Beispiel zu bleiben, könnte es also für eine gewünschte> Center-Frequenz von 10Mhz und einem Span von 1Ghz keine Lösung geben> (ich hab nicht nachgerechnet, ob das wirklich so ist)
Nein, das ist Quatsch.
Das Bw rückt dann immer näher ans Cw heran, während das Ew immer weiter
nach rechts geht. D.h es gibt bis auf den Fall Cw == 0 immer eine
Lösung. Die wird halt immer asymetrischer.
Hallo Karl Heinz,
danke für deine Antworten, auch an Mark.
Karl H. schrieb:> PS: Ich denke, ich würds wirklich iterativ machen.> Allerdings ist mir eine einfachere Version eingefallen.>> DIe Spannbreite ist ja bekannt.> D.h. ich nehme einfach mal ein Bw an. Mit der bekannten Spannbreite> kenne ich damit auch das Ew. Die rechne ich über die logarithmische> Funktion im in den Screen Space. Bs und Es> Genau in der Mitte der beiden muss ja das Ss liegen, was ich somit> berechnen kann.> Dieses Ss kann ich aber wieder zurück transformieren und erhalte so ein> Cw'>> Jetzt vergleiche ich dieses Cw' mit dem vorgegebenem Cw. Ist es zu> klein, dann ist mein Bereich (Ew-Bw) zu weit links, ich muss also den> Bereich nach rechts korrigieren. Ist das Cw' größer als das vorgegebene> Cw, dann muss ich den Bereich nach links korrigieren. Ich schieb also> den Span auf der X-Achse hin und her, bis das aus diesem Span> resultierende Cw' mit der Vorgabe genau genug übereinstimmt. Wenn man> will, könnte man da jetzt sicherlich auch mit einer Newton Iteration das> ganze verfeinern, aber ich denke ein simples Verfahren tuts auch.
Ich werde das so probieren, müsste eigentlich mit wenigen Vergleichen
auskommen.
Falls es interessiert, hier ist der Link zum Programm:
http://peter.dreisiebner.at/rigol-dsa815/index.htm
Danke,
Peter
Peter D. schrieb:> Ich werde das so probieren, müsste eigentlich mit wenigen Vergleichen> auskommen.
Ich denke auch, dass das nicht viele Iterationen benötigen wird. Mit
einer Bifakturierung sollte das recht schnell gehen. 2 'Punkte' zwischen
denen das Bw liegen muss, sind ja bekannt. Auf der einen Seite kann es
nicht kleiner als 0 sein, auf der anderen Seite kann es nicht größer als
Cw sein. Da nehm ich dann die Mitte davon, und je nachdem was die
Kontrollrechnung ergibt, verwerfe ich die eine oder die andere Hälfte
des möglichen Bereichs für das Bw und wiederhole das ganze, bis ich
genau genug drann bin.
Hallo Karl Heinz,
ich habe die Funktion fertig und getestet.
Bei einer Center-Frequenz zwischen 100 MHz und 500 MHz, habe ich eine
Abweichung von 100 Hz erlaubt.
Bei den gleichen Werten wie am DSA eingegeben, Center 300 MHz und Span 1
GHz, liegt das Ergebnis nach 22 Iterationen nur um 7 Hz daneben.
Start-, Stop- und Center-Frequenz sind bis auf die letzte Stelle gleich
mit dem DSA.
Mehr als 24 Iterationen habe ich bei den Tests noch nicht erreicht.
Danke,
Peter
Super.
Ich würd mir wahrscheinlich doch noch einen zwangsweisen Abbruch nach
einer bestimmten Anzahl Iterationen einbauen. Der Teufel schläft nicht
:-)
Das einzige was mich wurmt, das ist das 'klein beigeben vor der Mathe'
:-)
Nur mal so der mathematischen Vollständigkeit halber - wenn mich nicht
alles täuscht, dann muss man dieses nichtlineare Gleichungssystem lösen:
A = Startfrequenz
B = Endfrequenz
C = Centerfrequenz
S = Span
für bekannte Centerfrequenz C, Span S und unbekannte Start-/Endfrequenz
A und B.
Gleichung (2) nach Endfrequenz B aufgelöst und in (1) eingesetzt ergibt:
Kann man dies nach A auflösen, oder ist hier Schluss und der numerische
Teil fängt an?
Hallo Mark,
ich wünschte ich könnte eine Antwort geben, aber da reicht es bei mir
mit dem Wissen nicht.
Aber noch eine Bemerkung zu dem letzten Code-Beispiel von Karl Heinz.
'Bwmin' darf am Start nicht 0 sein, wenn der Span verkleinert wird.
Er muss mit der aktuellen Startfrequenz beginnen.
Peter
Peter D. schrieb:> Hallo Mark,>> ich wünschte ich könnte eine Antwort geben, aber da reicht es bei mir> mit dem Wissen nicht.
Ist bei mir auch schon lange her. Aus dem Bauch raus sind solche
Logarithmussachen in der Schule immer irgendwie ekelhaft geworden.
> Aber noch eine Bemerkung zu dem letzten Code-Beispiel von Karl Heinz.> 'Bwmin' darf am Start nicht 0 sein, wenn der Span verkleinert wird.> Er muss mit der aktuellen Startfrequenz beginnen.
"darf nicht" oder "dann braucht man mehr Iterationen als notwendig"
Letzters: ja, klar. Jetzt wo dus sagst, ist es logisch.
(Das ist es immer, wenn einen ein anderer mit der Nase drauf stösst :-)
Karl H. schrieb:>> Aber noch eine Bemerkung zu dem letzten Code-Beispiel von Karl Heinz.>> 'Bwmin' darf am Start nicht 0 sein, wenn der Span verkleinert wird.>> Er muss mit der aktuellen Startfrequenz beginnen.>> "darf nicht" oder "dann braucht man mehr Iterationen als notwendig">> Letzters: ja, klar. Jetzt wo dus sagst, ist es logisch.> (Das ist es immer, wenn einen ein anderer mit der Nase drauf stösst :-)
Hmm.
Das müsste aber auch umgekehrt gelten. Oder nicht?
Wenn der Span vergrößert wird, dann kann man mit einem Bwmax mit der
aktuellen Startfrequenz beginnen. Denn dann kann die Startfrequenz ja
nur kleiner werden.
Oder hab ich da jetzt einen Denkfehler?
Hallo Karl Heinz,
Karl H. schrieb:> Peter D. schrieb:>> Aber noch eine Bemerkung zu dem letzten Code-Beispiel von Karl Heinz.>> 'Bwmin' darf am Start nicht 0 sein, wenn der Span verkleinert wird.>> Er muss mit der aktuellen Startfrequenz beginnen.>> "darf nicht" oder "dann braucht man mehr Iterationen als notwendig">> Letzters: ja, klar. Jetzt wo dus sagst, ist es logisch.> (Das ist es immer, wenn einen ein anderer mit der Nase drauf stösst :-)
Mein Code funktioniert nur richtig, wenn beim Verkleinern das Spans,
'Bwmin' auf die aktuelle Startfrequenz gesetzt wird.
'Bwmax' wird sonst auch kleiner als die aktuelle Startfrequenz.
Beim Vergrößern des Spans ist 'Bwmin' immer 0.
EDIT:
Ich habe das jetzt verwechselt, muss nochmal meinen Code anschauen.
Jedenfalls muss die Startfrequenz vorgegebenen werden bei der
'Zoom-In'-Funktion des DSAs.
Ansonst dürfte es mit 'Bwmin = 0' schon stimmen.
Entschuldigung, aber so einen DSA zu simulieren, ist gar nicht so
einfach.
Peter
Peter D. schrieb:> Mein Code funktioniert nur richtig, wenn beim Verkleinern das Spans,> 'Bwmin' auf die aktuelle Startfrequenz gesetzt wird.
Dann muss es meinem Verständnis nach aber noch einen Bug geben.
Denn wenn ich nicht weiss, das der Span verkleinert wurde, dann muss ich
vom Worst Case ausgehen und eine komplett neue Berechnung machen. Und
dann habe ich keine aktuelle Startfrequenz und muss aber trotzdem zu
einem Ergebnis kommen.
D.h. mit Bwmin = 0 und Bwmax = gewünschte Centerfrequenz muss es immer
zu einem Ergebnis führen.
Wenn ich allerdings weiss, dass der Span kleiner geworden ist, dann kann
ich mir einige Iterationen sparen, weil ich ja weiss, dass Bwmin nicht
kleiner werden kann. d.h. wenn der SPann kleiner wird, dann kann ich mit
1
Bwmin = aktuelle Startfrequenz
2
Bwmax = gewünschte Centerfrequenz
mit dem iterieren anfangen und spar mir dadurch unter Umständen einige
Iterationen ein.
Umgekehrt, wenn der Span größer wird dann müsste eine Anfangsbelegung
von
1
Bwmin = 0
2
Bwmax = aktuelle Startfreqquenz
dasselbe in der umgekehrten Richtung leisten: einige Iterationen
einsparen.
Bist du sicher, dass du in diesem Fall beide Werte Bwmin UND Bwmax
jeweils neu besetzt?
Hallo Karl Heinz,
ich habe meinen vorigen Beitrag editiert in der Zwischenzeit.
Ich setze also die Startfrequenz nur beim Span verkleinern.
Da ist die Startfrequenz ja bekannt.
Ansonst lasse ich 'Bwmin' immer auf 0.
Ich habe das Programm gerade online aktualisiert.
Man kann damit auch ohne Gerät die aktivierten Funktionen ausprobieren.
Peter