Forum: Digitale Signalverarbeitung / DSP / Machine Learning FFT aus Messdaten mit MATLAB - Frequenzvektor - Problem


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von M1809 (Gast)


Lesenswert?

Hallo zusammen,

vorweg: Ich bin neu hier, Forumssuche wurde benutzt, allerdings ist mein 
Problem vielleicht etwas spezieller.

Was ich vorhabe:

Ich möchte mithilfe von MATLAB Messdaten, die in der Form "Zeitpunkt in 
sec" und "Spannungswert in Volt" vorliegen mittels der FFT in den 
Frequenzbereich transformieren. Soweit so gut. Das klappt auch, 
allerdings muss mir an entscheidender Stelle das Wissen fehlen. Denn 
erreichen möchte ich eine Multiplikation im Frequenzbereich mit anderen 
Messdaten, die ich für die Bestimmung der Übertragungsfunktion eines 
elektrischen Bauteils aufgenommen habe.

Dabei habe ich mehrere einzelne Übertragungsfunktionen durch Messungen 
in der Form "Frequenz in Hz" und "Komplexe Zahl (einheitenlos)". 
Einheitenlos, da schon die Übertragungsfunktion zu der passenden 
Frequenz aus dem Verhältnis des Ausgangsspannungssignals zum 
Eingangsspannungssignal unter Berücksichtigung der Phasenverschiebung 
berechnet wurde. Ich habe also zu jeder Frequenz die passende 
Übertragungsfunktion in Form einer komplexen Zahl.
Die Frequenzbereiche habe ich dabei linear durchfahren, es sind immer 
Frequenzdekaden wie z.B. von 10 kHz bis 100 kHz oder 100 kHz bis 1 MHz. 
Je nach Dekade bestehen gibt es 201, 1601 oder 2048 Messwerte. Bei den 
höheren Frequenzen ab 10 kHz sind es immer 2048, da hier die Messungen 
schneller gingen.

An dem Bauteil habe ich an einer Stelle x einen Impuls eingespeist und 
an den beiden Klemmen des Bauteils die Spannung gemessen. Die Spannung 
habe ich ebenfalls am Einspeiseort gemessen. Nun möchte ich mittels FFT 
diese Spannungen in den Frequenzbereich bringen und nachweisen, dass

FFT vom Impuls   MAL   Übertragungsfunktion (Impulsort zu Klemme 1) auch 
wirklich das Spannungssignal an Klemme 1 ergibt.

Schrittfolge wäre also:

1) Übertragungsfunktion in Matlab aus CSV einlesen, man bekommt einen 
Frequenzvektor der Messung und einen Vektor mit den Werten der komplexen 
Zahlen zu diesen Frequenzen

2) Die drei Spannungswerte aus der Messung mit dem Oszilloskop einlesen 
(Impulseinspeiseort, Klemme 1, Klemme 2)

3) Jeweils eine FFT der drei Spannungsmessungen mit dem Oszilloskop, um 
diese Werte in den Frequenzbereich zu bringen

4) Multiplikation der FFT des Einspeiseorts mit der komplexen 
Übertragungsfunktion von Einspeiseort zu Klemme 1

5) Inverse FFT dieser Multiplikation

6) Vergleich des Ergebnisses von 5) mit dem gemessenen Spannungsverlauf 
an Klemme 1

Ich hoffe, dass das verständlich war.

Bei mir hakt es nun vor allem zwischen Schritt 3 und 4. Ich benötige 
durch das Anwenden der FFT exakt die gleichen Frequenzen, wie ich sie 
durch die Messung der Übertragungsfunktion auch schon habe.

Ich bin mir aber unsicher, wie ich das anstellen soll. Ich möchte also 
gezielt eine FFT machen, die als Ergebnis die komplexen 
Fourier-Koeffizienten bei exakt den Frequenzen der Übertragungsfunktion 
bietet, damit ich diese Multiplizieren und anschließend in den 
Zeitbereich zurücktransformieren kann.

Die Übertragungsfunktion hat beispielsweise 2048 Messwerte zwischen 10 
kHz und 100 kHz linear aufgeteilt und mit dem Oszilloskop habe ich eine 
Messung bei 50 ns/ div und einer Betrachtungszeit von 500 ns gemacht. 
Der Abstand zwischen den Messwerten betrug hierbei 400 ps und die 
Messung hat 1250 Messwerte, ergibt also eine Abtastrate von 2,5 GHz.


Ich danke schon vielmals im Voraus!

von Egon D. (Gast)


Lesenswert?

M1809 schrieb:

> Bei mir hakt es nun vor allem zwischen Schritt 3 und 4.
> Ich benötige durch das Anwenden der FFT exakt die
> gleichen Frequenzen, wie ich sie durch die Messung
> der Übertragungsfunktion auch schon habe.

Die FFT setzt m.W. äquidistante Abtastpunkte voraus, und
will normalerweise eine glatte Zweierpotenz als Anzahl
sehen.
Mit anderen Worten: Die ermittelte Übertragungsfunktion
ist m.M.n. ein Schuss ins Knie.


> Die Übertragungsfunktion hat beispielsweise 2048 Messwerte
> zwischen 10 kHz und 100 kHz linear aufgeteilt und mit dem
> Oszilloskop habe ich eine Messung bei 50 ns/ div und einer
> Betrachtungszeit von 500 ns gemacht.
> Der Abstand zwischen den Messwerten betrug hierbei 400 ps
> und die Messung hat 1250 Messwerte, ergibt also eine
> Abtastrate von 2,5 GHz.

???

10kHz, 1250 Messwerte und Abtastrate 2.5GHz?
Die Zahlen ergeben nicht den geringsten Sinn.
Nochmal überprüfen.


Abgesehen davon: Ich kenne MATLAB nicht, aber prinzipiell
ist eine FFT von 10^6 Messpunkten kein Problem für einen
normalen PC. Von den ggf. langen Messzeiten abgesehen
kann man also mehrere Dekaden mit einer einzigen FFT
abdecken.

von M1809 (Gast)


Lesenswert?

Vielen Dank erstmal für die Antwort :)

Egon D. schrieb:
> M1809 schrieb:
>
>> Bei mir hakt es nun vor allem zwischen Schritt 3 und 4.
>> Ich benötige durch das Anwenden der FFT exakt die
>> gleichen Frequenzen, wie ich sie durch die Messung
>> der Übertragungsfunktion auch schon habe.
>
> Die FFT setzt m.W. äquidistante Abtastpunkte voraus, und
> will normalerweise eine glatte Zweierpotenz als Anzahl
> sehen.
> Mit anderen Worten: Die ermittelte Übertragungsfunktion
> ist m.M.n. ein Schuss ins Knie.


Äquidistante Abtastpunkte wären meiner Meinung nach vorhanden, sowohl 
bei der linearen Messung der Übertragungsfunktion, aber vor allem für 
die FFT (oder auch DFT, das macht für mich durch die Computerberechnung 
nur einen zeitlichen Unterschied) auch bei der Messung mit dem 
Oszilloskop.

Die Übertragungsfunktion ist ja bereits vorhanden und bietet folgende 
(lineare) Frequenzbereiche:

20 Hz bis 100 Hz     mit 201  Datenpunkten
100 Hz bis 1000 Hz   mit 1601 Datenpunkten
1 kHz bis 10 kHz     mit 1601 Datenpunkten
10 kHz bis 100 kHz   mit 2048 Datenpunkten
100 kHz bis 1 MHz    mit 2048 Datenpunkten
1 MHz bis 10 MHz     mit 2048 Datenpunkten
10 MHz bis 50 MHz    mit 2048 Datenpunkten.

Bei der Messung mit dem Oszilloskop gibt es folgende Auflösungen pro 
Div:

100 µs / div, also insgesamt   1 ms Zeitdauer
 20 µs / div, also insgesamt 200 µs Zeitdauer
 10 µs / div, also insgesamt 100 µs Zeitdauer
  1 µs / div, also insgesamt  10 µs Zeitdauer
500 ns / div, also insgesamt   5 µs Zeitdauer
100 ns / div, also insgesamt   1 µs Zeitdauer
 50 ns / div, also insgesamt 500 ns Zeitdauer.






>> Die Übertragungsfunktion hat beispielsweise 2048 Messwerte
>> zwischen 10 kHz und 100 kHz linear aufgeteilt und mit dem
>> Oszilloskop habe ich eine Messung bei 50 ns/ div und einer
>> Betrachtungszeit von 500 ns gemacht.
>> Der Abstand zwischen den Messwerten betrug hierbei 400 ps
>> und die Messung hat 1250 Messwerte, ergibt also eine
>> Abtastrate von 2,5 GHz.
>
> ???
>
> 10kHz, 1250 Messwerte und Abtastrate 2.5GHz?
> Die Zahlen ergeben nicht den geringsten Sinn.
> Nochmal überprüfen.
>
> Abgesehen davon: Ich kenne MATLAB nicht, aber prinzipiell
> ist eine FFT von 10^6 Messpunkten kein Problem für einen
> normalen PC. Von den ggf. langen Messzeiten abgesehen
> kann man also mehrere Dekaden mit einer einzigen FFT
> abdecken.

Ok, dabei verstehe ich noch nicht genau, woran es hakt. Also genau das 
ist ja mein Problem, dass es zwei unterschiedliche Systeme sind, die 
Zusammenzubringen sind. Wichtig ist für mich, dass die gemessenen 
Dekaden bei den Übertragungsfunktionen linear sind und es eben Dekaden 
sind. Den Zeitausschnitt bei der Impulseinspeisung habe ich natürlich 
sinnvoll am Oszilloskop gewählt, sodass der Impuls klar erkennbar ist 
und dann je nachdem, wie viel nach der Impulseinspeisung noch gesehen 
werden sollte. Die Abtastfrequenz ist dann eben so hoch. Die 1250 
Messwerte ergeben m.M.n. schon Sinn (vermute, es sieht auf den ersten 
Blick zu wenig aus), wenn man die Betrachtungszeit von 500 ns mit in 
Betracht zieht.



Bisher klingen die Antworten auf mein Vorhaben ja recht 
niederschmetternd :(
Ich hoffe, dass nochmal klar geworden ist, welche Messdaten ich zur 
Verfügung habe und was ich damit vorhabe. Ich möchte also mit der FFT 
der Spannungssignale vom Oszi zu jedem Frequenzwert (den es auch in der 
Übertragungsfunktion gibt) einen komplexen Wert finden, um den komplexen 
Wert der Übertragungsfunktion bei z.B. Frequenz 10 kHz mit dem komplexen 
Wert aus der Spannungsmessung und anschließenden FFT oder DFT bei 
ebenfalls 10 kHz zu multiplizieren und anschließend die inverse FFT oder 
DFT durchführen zu können.

von Lenny D. (le-do)


Lesenswert?

TL;DR: Interpoliere deine bekannten Koeffizienten im Frequenzraum auf 
die Frequenzwerte, die sich aus der FFT des Oszi-Signals ergeben.

So speziell ist dein Problem glaube ich nicht, der viele Text lässt mich 
nur vermuten dass du es selber noch nicht 100% durchstiegen hast.
Wenn ich richtig verstehe:
* Du hast viele Messungen (egal in welchem Sampling) die für 1 exakte 
Frequenz dein Filterverhalten auf Amplitude und Phase beschreiben. (Die 
sind überhaupt nicht äquidistant von 20Hz-50MHz, sondern nur je Dekade, 
damit kann eine simple FFT nix anfangen.)
* Du würdest diese gerne zu 1 einzigen gesamten Impulsantwort im 
Frequenzraum zusammenbasteln
* Du hast 1 Oszi-Messung, wo du einen Puls ins System gibst und vorher 
und nachher den Zeitverlauf darstellen kannst, mit einer gegebenen 
Samplingrate und Zeitdauer
* Dann muss die Übertragungsfunktion nicht nur äquidistant, sondern auch 
in den exakt gleichen Schritten wie dein Signal gerastert sein.
* -> Das müsste durch Interpolieren aber ohne Probleme gehen.

Pragmatisch würde ich daher sagen:
* Deine zeitliche Messung gibt die sinnvollen Frequenzen vor, aus einem 
abgetasteten Signal kann man nämlich nicht mehr oder weniger rausholen 
als einem die FFT gibt. Beschäftige dich am besten nochmal grundsätzlich 
mit dem hin- und hertransformieren, Nyquist-Frequenz, Aliasing, usw.
* Du hast jetzt also eine FFT deines Signals. Für 1250samples @2.5GHz 
ergibt sich dabei automatisch die höchste auflösbare Frequenz 
(proportional dt, also 1.25GHz wenn ich richtig liege) und die 
Frequenzauflösung (proportional T_gesamt, also 1/500ns=2MHz Schritte)
* Deine Sammlung von Übertragungswerten (als Datenpaare 
Frequenz+komplexe Zahl) gibst du in eine Interpolationsfunktion, und 
wendest die auf dein Array von Frequenzen (Matlab fftfreq) oben an. 
Möglicherweise muss das separat für Amplitude und Phase der komplexen 
Zahlen passieren, wird man bestimmt irgendwo finden.
* Die Rücktransformation ergibt dir dein Signal gefaltet mit der 
Impulsantwort, wie gewünscht.

Abschließende Gedanken:
* Deine gemessenen Frequenz-Übetragungswerte reichen von 20Hz bis 50MHz, 
warum musstest du dann mit 400ps=2.5GHz samplen um das übertragene 
Signal gut darzustellen? Da fehlt dir dann für einen Großteil meiner 
oben beschriebenen Vorgehensweise der passende Koeffizient.
* Man könnte stattdessen (ist vielleicht sogar schlauer) aus allen 
Koeffizienten deiner Übertragungsfunktion (im Frequenzraum) eine 
Impulsantwort im Zeitraum errechnen. Das gemessene Signal muss damit 
dann gefaltet werden, was äquivalent ist zu einer Multiplikation im 
Frequenzraum
* Theoretisch wäre auch eine "Fourier-Trafo zu Fuß" möglich, wo du dein 
gemessenes Signal nicht in harmonische Frequenzen zerlegst wie bei der 
FT, sondern in jene Frequenzen für die du die Koeffizienten kennst, aber 
das ist glaube ich eher eine mathematische Übung als eine sinnvolle 
Herangehensweise
* Über die Behandlung von negativen Frequenzen habe ich nicht 
nachgedacht, aber gut möglich das das hier essentiell ist. Also 
letztendlich korrektes Anwenden von fftshift und ifftshift
* Allg. zu fftshift: auf die richtige Anzahl gepaarter 
fftshift/ifftshift achten, sonst kriegt man sehr verrückte Signale bei 
der Rücktransformation.

von Pandur S. (jetztnicht)


Lesenswert?

> FFT vom Impuls   MAL   Übertragungsfunktion (Impulsort zu Klemme 1) auch
wirklich das Spannungssignal an Klemme 1 ergibt.

Das ist eine Augenoeffner Idee. Aber wenn's denn sein muss. Denn die 
Uebertragungsfunktion ist die Fouriertransformierte der 
(Delta-)Impulsantwort. Das ist schon von der Definition her so. Was du 
auch immer herauskommen kannst sind Nichtidealitaeten.

zB ist dein Puls kein Deltapuls (Amplitude unendlich, laenge Null, 
Flaeche Eins). Falls der das denn waere ist dein Bauteil und deine 
Messapparatur zerschossen. Diese Definition gilt fuer die 
Fouriertransformation.
Wenn man die Fouriertransformation verstanden hat, kann man sich der FFT 
zuwenden, welche mancherlei Randbedingungen enthaelt.

Ohne die Theorie verstanden zu haben, hast du Resultate, welche wenig 
sinn ergeben.

So ganz nebenbei, moderne Oszilloskope koennen die FFT schon selbst. 
Einfach Math funktionen einschalten und die FFT waehlen. Babei gibt's 
nur noch das Filter, zB Hamming, und die Amplituden Skalierung als 
Einstellmoeglichkeit.

von M1809 (Gast)


Lesenswert?

Hallo zusammen und erstmal Danke für die Antworten!

Ich habe mich derweil noch einmal intensiv mit der DFT beschäftigt und 
auch in Matlab alles erstmal soweit hinbekommen, wie ich es wollte. Die 
Ergebnisse ergeben Sinn und meine Aussage, dass der ganze 
Frequenzbereich der Übertragungsfunktion aus äquidistanten Messpunkten 
besteht war natürlich falsch.
Was ich mich generell dadurch Frage: Ist es überhaupt möglich, eine 
Tabelle von komplexen Zahlen, die jeweils bestimmten Frequenzen 
zugeordnet sind, zu interpolieren?
Eine komplexe Zahl besteht nunmal immer aus einem Betrag und einer 
Phase, ich bin mir unsicher, ob man dort jetzt einfach getrennt Betrag 
und danach Phase interpolieren kann. Aus dem Bauch heraus würde ich 
sagen, dass das nicht möglich ist.

Mittels Zero-Padding habe ich die Frequenzauflösung auf meine gewünschte 
Auflösung von 1 Hz gebracht, ohne nennenswerte Veränderungen. Zuvor 
wurde das Signal mit einem Hanning-Fenster multipliziert mit der 
gleichen Zahl an Datenpunkten. Das Amplitudensprektrum zeigt vor allem 
Veränderungen und sichtliche Ausschläge um 1 kHz sowie im Bereich 
zwischen 55 kHz und 65 kHz.

Falls ich die Interpolation nun nicht hinbekomme, weil sie faktisch auch 
eventuell nicht geht, würde ich als nächsten Ansatz einmal die DFT der 
Einspeisung auf 1 Hz genau durchführen und dann jeweils einzeln die 
Übertragungsfunktionen mit dem entsprechenden Teilbereich der DFT 
multiplizieren. Ich denke gerade darüber nach, ob das Sinn ergibt und 
man vielleicht anhand der Einzelberechnungen die fertigen 
Multiplikationen der DFT mit den ÜF dann zusammenfügen kann (Addition 
oder Multiplikation im Frequenzbereich), um dann anschließend die IFFT 
zu bilden. Da schaue ich gerade, wie ich dann an den korrekten 
Zeitvektor bei der Rücktransformation komme.

Erstmal danke soweit :)

von Lenny D. (le-do)


Lesenswert?

Dein letzter Absatz klingt wenn ich richtig verstehe also wie eine 
"stückweise definierte" Übertragungsfunktion. Das sollte prinzipiell 
gehen, ich denke aber es ist nicht unbedingt einfacher. Was du dabei ja 
nur machst ist aussuchen, aus welcher gemessenen Tabelle du den 
Übertragungswert (Amplitude/Phase) für eine bestimmte Frequenz nimmst. 
Wenn du einen Wert benötigst, der genau zwsichen 2 vorhandenen liegt, 
musst du zB den Durchschnitt ausrechnen. Damit hast du dann aber nur zu 
Fuß eine simple Interpolation nachgebaut :)

Ob eine Interpolation für allgemeine komplexe Funktionen Sinn macht, ist 
eine gute Frage, aber für alle relevanten physikalischen Probleme würde 
ich denken, ja es geht.
Und zwar darfst du jede komplexe Zahl als Amplitude und Phase 
aufschreiben, die Interpolation müsste dann für diese beiden 
reell-wertigen Funktionen getrennt ablaufen.
Das funktioniert solange gut, wie sich die Werte nur "smooth" mit der 
Frequenz ändern, was aber gegeben sein sollte.
Also komplexe Übertragungsfunktion U für gegebene Frequenz f:
wobei A(f) und phi(f) reelle Funktionen sind, die aus einer beliebigen, 
nicht-äquidistanten Tabelle interpoliert werden können. Einfach 
Wertetabelle und Interpolationsdaten für einen Frequenzvektor plotten, 
dann siehst du wie "smooth" deine Funktion ist.

von Jürgen S. (engineer) Benutzerseite


Lesenswert?

M1809 schrieb:
> die jeweils bestimmten Frequenzen
> zugeordnet sind, zu interpolieren?

ja sicher, warum nicht? Es ist eine Interpolation zwischen 2 
Vektor-Endpunkten, genau so, wie bei einer Bewegung in einer 2D-Ebene. 
Die Frage ist aber möglicherweise eine andere: Ist ein interpolierter 
Zwischenwert tatsächlich ein Repräsentant für den Wert der sich ergäbe, 
hätte man die FFT / DFT so aufgezogen, dass sie die gewünschte (zu 
interpolierende Frequenz) beschreibt .. also deren Amplitudenwert?

Das ist nämlich nicht so, weil die den Frequenzen zugeordneten 
Amplituden keinen linearen Übergang bilden, sondern sich über eine 
COS/SIN-Funktion zum Nachbarn bewegen. Das kann man sehr schön sehen, 
wenn man manche FFTs betrachtet und einen Sweep laufen lässt. Die 
Amplituden bewegen sich in leichten Wellen. Daher muss die Interpolation 
im Winkelsystem erfolgen, oder man nimmt das Vorwärts-Newton-Verfahren, 
um es iterativ zu lösen, wenn man genug Rechenpower hat.

: Bearbeitet durch User

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.