Forum: Mikrocontroller und Digitale Elektronik Zwei FFTs mit unterschiedlicher Sampleanzahl und Samplefrequnenz


von Pedde (Gast)


Lesenswert?

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

von Sven B. (scummos)


Lesenswert?

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

von Uli (Gast) (Gast)


Lesenswert?

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

von Jonas K. (jonas_k)


Lesenswert?

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.

von Sven B. (scummos)


Lesenswert?

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.

von Pedde (Gast)


Lesenswert?

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

von Pedde (Gast)


Lesenswert?

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

von Pedde (Gast)


Lesenswert?

Ein kleines Problem ist auch, dass 2 Ghz kein vielfaches von 49,905MHz 
ist...

von Sven B. (scummos)


Lesenswert?

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

von Pedde (Gast)


Lesenswert?

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

von Pedde (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.