Forum: Digitale Signalverarbeitung / DSP / Machine Learning FFT aus Textdatei mit Octave


von Karina (Gast)


Lesenswert?

Hallo Leute


Ich hab als Nebenaufgabe bekommen, aus einer Textdatei mit 3 Achsen eine 
FFT an Octave durchzuführen, komme mit diesem Programm aber überhaupt 
nicht zurecht!

In der Textdatei stehen die Daten in folgender Form:
 x1,y1,z1
 x2,y2,z2
 ...

Nun soll ich hieraus für jede Messachse eine eigene FFT berechnen und 
als Plot ausgeben lassen.
Erste Frage wäre, geht das überhaupt oder müssen die jeweiligen Achsen 
in eigene Textdateien?
Und zweite Frage ist eher eine Bitte: Kann mir wer dafür ein Skript 
vorbeireiten, welches ich dann einfach auf meine Textdatei anwenden 
kann?
Würde mich sehr darüber freuen, weil ich noch nie mit diesem Programm in 
Berührung gekommen bin.


Danke.
LG
Karina

: Verschoben durch Admin
von Karina (Gast)


Lesenswert?

Jetzt hab ich doch glatt noch etwas Wichtiges vergessen: Die 
Abtastfrequenz der Messwerte betrug 2500Hz. Es sind einfache 
A/D-Wandler-Werte eines Mikrocontrollers von einem Sensor.

von Karina, so wird das nix! (Gast)


Lesenswert?

"ein Skript vorbeireiten"? Bin doch nicht verrückt mich auf dieses 
ungezähmte Biest zu setzen!

von Michael L. (Gast)


Lesenswert?

Hallo Karina,

> Ich hab als Nebenaufgabe bekommen, aus einer Textdatei mit 3 Achsen eine
> FFT an Octave durchzuführen, komme mit diesem Programm aber überhaupt
> nicht zurecht!
>
> In der Textdatei stehen die Daten in folgender Form:
>  x1,y1,z1
>  x2,y2,z2
>  ...
Ich vermute, die Dateien sind in ASCII-Zeichen.
1) Lösche zunächst mit einem Texteditor die Kommata und tausche sie 
beispielsweise gegen Leerzeichen aus (weiß nicht 100%ig, ob das nötig 
ist, aber mach es besser mal)
2) Achte darauf, daß der Dezimalpunkt tatsächlich ein Punkt ist.
3) Benennen die Datei "datei.asc".

Dann kannst Du in Octave die folgenden Befehle ausführen, am besten erst 
einzeln zur Fehlerkontrolle:

M = load('datei.asc');    % Matrix laden
x = M(:,1);
y = M(:,2);
z = M(:,3);

fs  = 2500;                                  % Abtastfrequenz
N   = length(x);                             % Laenge der Vektoren
f   = 0:1/N*fs:(N-1)/N*fs;                   % Frequenzvektor

ftx = fft(x);             % Fouriertransformation x
fty = fft(y);             % Fouriertransformation y
ftz = fft(z);             % Fouriertransformation z

figure(1);                % Bildschirmplot
subplot(3,1,1);           % Teilfenster
plot(f,abs(ftx));         % Betragsspektrum x-Vektor
subplot(3,1,2);           % Teilfenster
plot(f,abs(fty));         % Betragsspektrum y-Vektor
subplot(3,1,3);           % Teilfenster
plot(f,abs(ftz));         % Betragsspektrum z-Vektor
xlabel('f/Hz');
ylabel('Amplitudenspektrum');

Anschließend:

print -Peps2 'plot.eps'
(plottet in eine EPS-Datei)

wenn Dir die Qualität egal ist:
print -Ppng 'plot.png'   oder
print -Pjpg 'plot.jpg'

Wenn Du ein Phasenspektrum brauchst, nimmst Du angle(ftx) statt 
abs(ftx).
Beim Powerspektrum benutzt Du abs(ftx).^2

Beachte dabei den Punkt vor dem Hochkomma; er bewirkt, daß die Operation 
komponentenweise angewendet wird. Normalerweise versucht Matlab/Octave 
ansonsten eine Matrixmultiplikation.

Mit dem Befehl axis([x1,x2,y1,y2]) kannst Du in einen Bereich des Plots 
zoomen.

> Nun soll ich hieraus für jede Messachse eine eigene FFT berechnen und
> als Plot ausgeben lassen.
> Erste Frage wäre, geht das überhaupt oder müssen die jeweiligen Achsen
> in eigene Textdateien?
> Und zweite Frage ist eher eine Bitte: Kann mir wer dafür ein Skript
> vorbeireiten, welches ich dann einfach auf meine Textdatei anwenden
> kann?
> Würde mich sehr darüber freuen, weil ich noch nie mit diesem Programm in
> Berührung gekommen bin.
Das Programm kannst Du Dir ruhig anschauen. Die Befehle sind zu großen 
Teilen identisch mit Matlab.


Grüße
Michael

von Karina (Gast)


Lesenswert?

Hallo Michael


Vielen lieben Dank für deine Hilfe, es funktioniert ganz wunderbar!!!!


Liebe Grüße
Karina

von Peter (Gast)


Lesenswert?

Hallo


Ich hatte ein ähnliches Problem und auch mir hat die Antwort 
weitergeholfen.
Nun hätte ich allerdings noch eine ergänzende Frage:

Meine Messwerte sind in der Form

"untereGrenze Messwert1 obereGrenze"
"untereGrenze Messwert2 obereGrenze"
"untereGrenze Messwert3 obereGrenze"

in einer Logdatei gespeichert.
Wie kann sie nun in Octave gemeinsam in einem Diagramm anzeigen lassen?


Danke.

Gruß
Peter

von meckerziege (Gast)


Lesenswert?

Ich schätze mal, dass der Code von Michael nicht das richtige Ergebnis 
liefert.

Man tastet da (im Codebeispiel) mit 2.5kHz ab und das Spektrum geht von 
links (0Hz) bis rechts (ca. 2.5kHz). Shannon lässt grüßen...
Oder was meint ihr so?

von troll (Gast)


Lesenswert?

meckerziege schrieb:
> Ich schätze mal, dass der Code von Michael nicht das richtige Ergebnis
> liefert.
und ich schätze dass das nach Jahren niemanden mehr interessiert...

von Hannes J. (Firma: _⌨_) (pnuebergang)


Lesenswert?

troll schrieb:
> meckerziege schrieb:
>> Ich schätze mal, dass der Code von Michael nicht das richtige Ergebnis
>> liefert.
> und ich schätze dass das nach Jahren niemanden mehr interessiert...

Das, und da es sowieso stark nach verkappter Hausaufgabe roch, ist das 
gut so.

von Check (Gast)


Lesenswert?

Hat er jetzt schon die Hausaufgabe fertig?

von HalloItsMe! (Gast)


Lesenswert?

Ich stehe vor selbem Code!
Kann mir jemand bitte helffen ?

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.