Forum: PC-Programmierung Spektrum - von Centerfreq. die Start-/Stopfreq. berechnen


von Peter D. (Gast)


Lesenswert?

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.
5
// rStart - Die Startfrequenz in Hz.
6
// rStop - Die Stopfrequenz in Hz.
7
8
rScreenToWorld = rStart * Exp(((iX - iXLow) / (iXHigh - iXLow)) * Log(rStop / rStart))
9
10
rWorldToScreen = (iXLow + ((Log(rFrequency/rStart) / Log(rStop / rStart)) * (iXHigh - iXLow)))

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

von Karl H. (kbuchegg)


Angehängte Dateien:

Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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?

von Mark B. (markbrandis)


Lesenswert?

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.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Das heisst also, in Form von Gleichungen
1
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)

: Bearbeitet durch User
von Peter D. (Gast)


Lesenswert?

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

von Mark B. (markbrandis)


Lesenswert?

Mark B. schrieb:
> Kann mich natürlich auch irren.

Wenn Karl Heinz etwas anderes sagt, dann gilt natürlich obiges Zitat. 
;-)

von Karl H. (kbuchegg)


Lesenswert?

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.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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)

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

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.

von Peter D. (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.
1
  Bwmin = 0;
2
  Bwmax = Cw;
3
4
  do {
5
    Bw = (Bwmax + Bwmin) / 2.0;
6
    Ew = Bw + Span;
7
8
    Bs = toScreen( Bw );
9
    Es = toScreen( Ew );
10
    Cs = (Bs + Es) / 2.0;
11
    Cw_try = toWorld( Cs );
12
13
    if( Cw_try > Cw )
14
      Bwmax = Bw;
15
    else
16
      Bwmin = Bw;
17
  } while( fabs( Cw_try - Cw ) > allowedError );

(so in etwa)

: Bearbeitet durch User
von Peter D. (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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' 
:-)

: Bearbeitet durch User
von Mark B. (markbrandis)


Lesenswert?

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?

von Peter D. (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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 :-)

von Karl H. (kbuchegg)


Lesenswert?

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?

von Peter D. (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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?

: Bearbeitet durch User
von Peter D. (Gast)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.