die Amplitude stimmt schon so.
Du musst beachten, dass sich die Amplitude bei einer FFT für jede Frequenz des Signals (bei dir ist das nur die Frequenz von f = 1kHz) auf -f und +f im Spektrum jeweils auf die Hälfte der Amplitude aufteilt. D.h. auch bei f=-1000Hz ist nochmal ein Peak von, in deinem Fall, ca. 0.75.
Du musst also beide Amplituden bei f = 1000Hz und f = -1000Hz zusammen addieren um die Amplitude deines Signals zu bekommen. Da diese allerdings exakt gleich sind, kannst du auch einfach die Ampltude mit 2 multiplizieren.
Dann kommst du auf die "richtige" Amplitude von deinem Signal (ca. 0.75*2 = 1.5)
Jan, ich habe ihr bereits zwei mal vorgeschlagen, das Ganze zu debuggen...
Aber sie ignoriert das. Das finde ich total spannend! Ich werde hier im Forum echt selten ignoriert. Und das auch noch bei einem so guten Vorschlag wie dem Debugger. Vermutlich war nur der aktuelle Ordner falsch, so dass der File-Import scheiterte. Es ging ja nur um die allererste Code-Zeile (mal von dem brutalen "clear"-Header abgesehen).
@Sanjaa: Wir würden Dir gerne helfen! Das ist unser Hobby. :-)
Liebe Grüße, Jan
Sanjaa
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 03.12.2016, 09:57
Titel:
Der peak ist komischerweise bei 0Hz und nicht bei minus 1KHz. Vielleicht soll es so sein?!
@Jan
Leider bräuchte ich wahrscheinlic Wochen um den Debugger zu verstehen. Der erste Code war nicht für einen 2 Dim Array bestimmt
Nein, der Debugger würde nur wenige Sekunden benötigen: Du kannst entweder einen Breakpoint in die Zeile setzen, die scheitert und dann den Code nochmal laufen lassen. Wenn Matlab dann dort stehen bleibt, kannst Du Dir den Inhalt der Variablen "filedata" anzeigen lassen im CommandWindow order WorkSpace-Browser.
Was bekommst Du dann für "filedata"? Gibt es eine Fehlermeldung?
Du bist mit dem ersten Code wirklich nur Sekunden und wahrscheinliche einen Mini-Fehler von der Lösung entfernt gewesen.
Zitat:
Der peak ist komischerweise bei 0Hz und nicht bei minus 1KHz. Vielleicht soll es so sein?!
Bitte poste den Code und die Ergebnisse. Andernfalls kann man nicht erraten, was wie sein soll oder ist.
Von negativen Frequenzen habe ich noch nie etwas gehört. Was soll das sein?!
Gruß, Jan
Tom_Gast
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 05.12.2016, 08:57
Titel:
Hallo,
die Frequenz = 0Hz ist immer der Gleichanteil deines Signals. Der hat aber nichts mit den 1kHz zu tun.
Gruß Tom
Tom_Gast
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 05.12.2016, 09:05
Titel:
Hallo,
ich sehe gerade an deinem Code (es ist ziemlich unpraktisch, wenn du den Code als Screenshot schickst) dass du das komplette Frequenzspektrum darstellst und das dazu noch auf eine falsche Frequenzachse. Schau dir mal die Matlab Hilfe zu
fft
an. Dort wird gezeigt, dass wie du nur das einseitige Amplitudensprektrum darstellst. Dort wird dann auch gezeigt, dass du, wie ich bereits erläutert habe, dann das Amplitudensprektum noch mit 2 multiplizieren musst.
array = csvread('fakesig.csv'); %Signal import
signaltime = array(:, 2); %Creating signal time
signaldata = array(:, 1); %Creating signal data
N = 2^nextpow2(length(signaldata));
p = abs(fft(signaldata,N))/N; %Power of signal
Fs = 2000; %Sampling frequency
f = Fs/2*linspace(0,1,N); %Frequency spacing
subplot(1,2,1), plot(signaltime,signaldata) xlabel('Time(s)'),ylabel('Amplitude') subplot(1,2,2), plot(f,p) xlabel('Frequency (Hz)'),ylabel('Amplitude')
Ich komme einfach nicht drauf was verkerrt ist.
Bei Fs habe ich die doppelte Frequenz eingetragen. Der peak zeigt bei der richtigen Frequenz und bei 0Hz einen Peak an. Wenn ich einen anderen Wert reinschreibe, werden bei dem Peak eine andere Frequenz als die tatsächliche angezeit
das Ergebnis von fft ist ein zweiseitiges Frequenzspektrum, welches von -Fs/2 bis Fs/2 geht. Man betrachtet aber meistens nur das einseitige Frequenzsspektrum, also von 0Hz bis Fs/2 (so willst du das ja auch haben). Daher solltest du auch nur die zweite Hälfte des Ergebnisses von fft verwenden. Das wurde ja auch schon von dem Helfer in dem Thread, den du verlinkt hast, angemerkt. So berechnest du also die Frequenzachse:
p = abs(fft(signaldata,N))/N; %Power of signal
p = p(1:N/2+1) %Einseitiges Frequenzsspektrum
p(2:end-1) = 2*p(2:end-1); %Alle Amplituden bis auf der Amplitude bei f = 0Hz verdoppeln (Erklärung siehe meine letzten Posts)
Für Fs darst du natürlich nicht einen beliebigen Wert nehmen, sondern die Frequenz, mit der dein Signal signaldata abgetastet wurde, Fs ist die Abtastfrequenz. Wenn du das nicht auswendig weist, lass es Matlab für dich Herausfinden, z.B. mit
muss immer den selben Wert ergeben, ansonsten kannst du eine FFT nicht durchführen.
All dies kannst du auch, wie ich bereits geschrieben habe, aus der Hilfe von Matlab
fft
entnehmen.
Gruß Tom
Sanjaa
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 06.12.2016, 10:01
Titel:
Ich habe es jetzt so geändert wie du es beschrieben hast.
Für Fs bekomme ich 3.2000e+11 raus
Bei diff(signaltime) erhalte ich allerdings 0.3125
Mein Code:
Code:
array = csvread('datei.csv'); %Signal import
signaltime = array(:, 1); %Creating signal time
signaldata = array(:, 2); %Creating signal data
N = 2^nextpow2(length(signaldata));
p = abs(fft(signaldata,N))/N; %Power of signal
p = p(1:N/2+1) %Einseitiges Frequenzsspektrum
p(2:end-1) = 2*p(2:end-1); %Alle Amplituden bis auf der Amplitude bei f = 0Hz verdoppeln (Erklärung siehe meine letzten Posts) %Power of signal
Fs = 3.2000e+11; %Sampling frequency
So weit ich sehe hast Du das fest in den Code einprogrammiert. Mit welcher Frequenz wurde Dein Signal denn aufgenommen? 10^11 Hz halte ich für ungewöhnlich hoch, aber möglich ist es natürlich.
Zitat:
Bei diff(signaltime) erhalte ich allerdings 0.3125
Bitte poste das genauer: Wenn "diff(signaltime)" zum Ergebnis "0.3125" führt, hättest Du nur zwei Zeitpunkte. Das ist ja nicht möglich.
Wenn die Zeitpunkte der Messung um 0.3125 aueinander liegen, ist 3.2e11 nicht sinnvoll für die Abtastfrequenz.
Verstehst Du, was Dein Signal physikalisch bedeutet?
Gruß, Jan
Sanjaa
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 06.12.2016, 13:47
Titel:
Ehrlich gesagt wusste ich nicht was ich damit bestimmen soll mit diff(signaltime) und Fs = 1/(signaltime(2) - signaltime(1))
Jetzt wo du es gesagt hast, wird es der Abstand sein zwischen 2 Abtastwerten?
Habe nochmal nachgeschaut. Es wird bei diff(signaltime), wenn ich es einer Variablen zuordne und öffne folgendes angezeigt:
15992x1 double mit 3.125000000000235e-12
Aber ergibt trotzdem nicht den selben Wert.
Das Oszi hat eine Abtastfrequenz im GHz-Bereich.
@Jan Verstehst Du, was Dein Signal physikalisch bedeutet?
Fs = 1/(signaltime(2) - signaltime(1))
Jetzt wo du es gesagt hast, wird es der Abstand sein zwischen 2 Abtastwerten?
Fast. Es ist der Kehrwert zwischen zwei aufeinanderfolgenden Abtastzeiten, oder anders ausgedrückt: die Abtastfrequenz.
Zitat:
Aber ergibt trotzdem nicht den selben Wert.
Den selbsen Wert wie was?
Zitat:
@Jan Verstehst Du, was Dein Signal physikalisch bedeutet?
Wenn du mir es bitte erklären könntest?
Du hast ein Signal, also einen Vector mit Werten, und einen Zeit-Vektor. Ist Dir jetzt klar, wie der Zeit-Vektor mit der Abtast-Frequenz zusammenhängt?
Was bedeutet "Für Fs bekomme ich 3.2000e+11 raus"?
Wobei bekommst Du das heraus?
Nach der Zeile:
den selben Wert haben müssen. Bei mir sind sie unterschiedlich.
Zitat:
Du hast ein Signal, also einen Vector mit Werten, und einen Zeit-Vektor. Ist Dir jetzt klar, wie der Zeit-Vektor mit der Abtast-Frequenz zusammenhängt?
Denke schon. Mitt signaltime(2) - signaltime(1) haben wir ja die Differenz zwischen 2 nebeneinanderliegenden Abtastzeiten bestimmt. Der kehrwert ist die Abtast-Frequenz.
Zitat:
Was bedeutet "Für Fs bekomme ich 3.2000e+11 raus"?
Wobei bekommst Du das heraus?
Nach der Zeile:
ist der Wert ja naheliegend, aber woher stammt dieser Wert? Wieso deckt er sich nicht mit "1/(signaltime(2) - signaltime(1))"?
Fs habe ich mit Fs = 1/(signaltime(2) - signaltime(1)) bestimmt und dann im Code eingetragen. War das falsch? Abtastfrequenz sollte doch normal min. doppelt so große Frequenz aufweisen wie unser normale Frequenz
Tom_Gast
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 07.12.2016, 11:19
Titel:
Hallo,
dann hast du meine Aussage falsch verstanden. Der Befehl
erzeugt nicht nur einen Wert, sondern insgesamt N-1 Werte, wobei N die Anzahl der Werte deines Datensatzes ist. Und diese Werte müssen gleich sein. Kurz zur Erklärung: diff berechnet die Differenz zwischen zwei Datenpunkten, also die Abtastzeit, und die muss für eine FFT immer gleich sein.
Also kurz gesagt: schau dir den Vektor von a = diff(signaltime) an und jedes Element dieses Vektors a muss immer den selben Wert besitzen.
Zitat:
Fs habe ich mit Fs = 1/(signaltime(2) - signaltime(1)) bestimmt und dann im Code eingetragen. War das falsch?
Nein ist nicht falsch, das kannst du so machen. Solltest du dein Signal in Zukunft mal mit einer anderen Abtastfrequenz abtasten, darfst du eben nicht vergessen, Fs auch enstprechend zu ändern.
Zitat:
Abtastfrequenz sollte doch normal min. doppelt so große Frequenz aufweisen wie unser normale Frequenz
Stimmt, das ist bei dir ja bei deiner sehr hohen Abtastfrequenz (muss die wirklich so hoch sein?) ja locker gegeben.
den selben Wert haben müssen. Bei mir sind sie unterschiedlich.
diff
berechnet die Differenz zwischen beachbarten Elementen. Wenn Du einen Zeitvektor hast, kannst Du per
diff
die Schrittweiten bestimmen und wenn Du das Signal mit FFT behandeln willst, müssen diese Schrittweiten alle gleich sein (bis auf Rundungsfehler, siehe
eps
).
diff(signaltime)
ist equivalent zu
(signaltime(2) - signaltime(1)
: Ersteres liefert die Werte für alle Zeitschritte, letzteres nur den ersten. Da der Wert aber für alle Zeitschritte gleich ist, kommt das auf's gleiche raus.
Natürlich wird
Fs
einen anderen Wert haben als
diff(signaltime)
, denn für FS wird doch der Kehrwert genommen.
Du schriebst "Bei diff(signaltime) erhalte ich allerdings 0.3125", später schriebst Du aber "3.125000000000235e-12". Das ist ein Unterschied.
Ich würde "Fs = 1/(signaltime(2) - signaltime(1))" so im Code eintragen.
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.