Hi, ich stehe gerade vor einem Problem. Und zwar habe gerade eben ein Übertragungssystem durchgemessen. Nun soll ich dieses gemessene System in meine Simulation einbauen und ein gegebenes Signal (das ich im Frequenzbereich habe) mit dem System multiplizieren um dann die Antwort zu erhalten. Leider hat das gemessene System je einen Wert im Frequenzabstand von 49.950 MHz und insgesamt 201 Samplepunkte. Der Startwert der Messung ist 1 GHz. Mein Signal hat jedoch 128 Samples bei einer Samplefrequenz von 2Ghz. Wie bekomm ich es jetzt hin das ich die zwei Signale elementweise multiplizieren kann, sodass ich das ergebnis im frequenzbereich habe? Viele Grüße und danke schön, Pedde
Wenn ich das Problem richtig verstehe, dann bleibt dir nix übrig, als zwischen den Punkten irgendeine Art von Interpolation zu machen -- wahrscheinlich genügt eine lineare. In dem Fall tust du ungefähr dies: Für Punkt n der Messreihe A berechnest du die Frequenz f1, zu die dieser Punkt gehört (das ist ja leicht, n * delta f oder so). Dann suchst du in Messreihe B die zwei Punkte, die diesen Punkt einschließen, also zwei Punkte zu Frequenzen f2a und f2b, deren Frequenz gerade ein bisschen kleiner oder ein bisschen größer ist als f1 (f2a < f1 < f2b). Wenn Genauigkeit nicht so wichtig ist, kannst du einfach den kleineren der beiden nehmen, oder den größeren. Wenn es etwas besser werden soll, nimmst du beide, berechnest den Abstand dfa = f2a - f1 und dfb = f2b - f1 und gewichtest die Messwerte (y-Werte) der beiden Punkte damit. Fertig. Eine der Kurvenform angemessene Interpolation würde ein noch besseres Ergebnis bringen, aber das lohnt mit Sicherheit nicht. Edit: Ha, wusste ich doch, dass ich da mal eine Python-Klasse für geschrieben habe. Ungefähr so:
1 | class LinearInterpolation(): |
2 | def __init__(self, datafile, dataRange): |
3 | with open(datafile, 'r') as f: |
4 | stringdata = f.readlines() |
5 | self.data = [] |
6 | self.dataRange = dataRange |
7 | self.rangeSize = self.dataRange[1] - self.dataRange[0] |
8 | for line in stringdata: |
9 | try: self.data.append(float(line)) |
10 | except: pass |
11 | |
12 | def value(self, at): |
13 | index = (at - self.dataRange[0]) / self.rangeSize * len(self.data) |
14 | lower = int(round(index-0.5)) |
15 | upper = int(round(index+0.5)) |
16 | lowerWeight = upper - index |
17 | upperWeight = index - lower |
18 | return lowerWeight * self.data[lower] + upperWeight * self.data[upper] |
Grüße, Sven
Wie mein Vorredner schon richtig geschrieben hat, musst Du interpolieren, so dass beide FFTs die gleichen Frequenzstützstellen haben. OT: Was für ein System hast Du denn? Und welches Messsystem hat eine Samplefrequenz von 2GHz? Gruß Uli
Sven B. schrieb: > zwischen den Punkten irgendeine Art von Interpolation zu machen -- > wahrscheinlich genügt eine lineare. das würd ich jetzt so nicht sagen, ich würds eher mit zero padding machen.... einfach so viele nullen dranhängen, dass die sampleanzahl übereinstimmt.... dann hast du natürlich noch das problem mit den abtastfrequenzen, die erste abtastfrequenz ist ja 201*49,905MHz= 1GHz (??) und bei der zweiten messung 2 GHz, dann musst du natürlich noch ne abtastratenänderung machen.... also beim ersten signal immer zwischen zwei messwerte ne null einfügen, fft berechnen, obere hälfte vom spektrum abschneiden und ifft. und dann das kürzere signal solange mit nullen auffüllen, bis beide gleichlang sind.
Warum nicht einfach beide Signale auf die höhere Samplerate resampeln, wie von mir beschrieben? Das klingt irgendwie einfacher, zumindest in meinem Kopf. ;) Moderne Oszilloskope der mittleren Preisklasse messen mit 2GS/s, zum Beispiel.
Hi, also es ist so, ich hab das Signal eigentlich im Zeitbereich gesampelt in Matlab. D.h. es wurde nicht gesampelt, sondern mit einer Sampelfrequenz erzeugt, die aber bei 6 GHz liegt nicht bei zwei (hab mich vertan...sorry dafür). Ich habe allerdings die möglichkeit geringfügig mit der Samplefrequenz zu spielen. D.h. ich mach erstmal ne fft von dem Signal. Gibts nicht da schon die Möglichkeit in Matlab die Samples und frequenzpunkte anzupassen...Ohne Interpolation Vielen Dank für eure großartige Hilfe
Hi Sven, ja sowas hat ein Kumpel von mir auch schon gesagt, aber ehrlich gesagt haperts da ein bisschen beim Verständnis von mir, meinst du könntest mir ein kleines Beispiel geben? Zu dem Signal. Die erste frequenz ist 1 GHz, die nächste ist 1,049,905 GhZ. Ich wollte damit sagen dass das Sampling nicht bei null los geht, sondern bei einem GHz und dann die Punkte einen Abstand von 49,905MHz haben. Das gesampelte Signal geht bis 10 GHz. Aber das mit den Nullen hört sich sehr interessant an
Ein kleines Problem ist auch, dass 2 Ghz kein vielfaches von 49,905MHz ist...
Hallo, also, man könnte zum Resampeln zum Beispiel so vorgehen: du schreibst ein Skript, was die ursprünglichen Messdaten alle einliest und in eine Liste (oder Map oder so) schreibt. Dann machst du eine Schleife, mit der du alle gewünschten, neuen x-Werte durchläufst. Für jeden dieser Werte berechnest du dann den y-Wert aus den alten Daten wie in meinem ersten Beitrag beschrieben duch lineare Interpolation. Diese neuen x- und y-Werte schreibst du in eine neue Liste und die gibst du dann aus. Die Skriptsprache Python ist für sowas hervorragend geeignet. Wenn die Daten aus einer Simulation kommen, die du selbst kontrollierst... dann bietet es sich höchstwahrscheinlich an, das dort zu ändern, anstatt die Daten dann nacher nochmal umzuschreiben. Überhaupt ist mir das ganze Vorgehen nicht so klar -- warum sampelt man ein Signal "von Hand", um es zu fouriertransformieren, wenn man es schon in digitales Form (Matlab) vorliegen hat? Aber wahrscheinlich mangelt es mir da einfach an Überblick für dein Projekt. ;) Grüße, Sven
Hallo nochmals. Also ich habe jetzt einfach die intp1(x,y,range) verwendet. Hat ganz gut funktioniert. Danke für eure Hilfe, Grüße, Pedde
Hi, jetzt ist mir aber nochmals ne Frage aufgekommen. Und zwar hab ich jetzt meine ERgebnis im Frequenzbereich ausgerechnet. Jetzt möchte ich das ganze per ifft wieder den Zeitbereich transformieren und darstellen lassen. Jetzt ist jedoch die Zeitliche Darstellung zu klein. Wie kann ich diese vergrößern? so dass das signal nicht abgeschnitten wird?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.