WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Mittels fft die Amplitude bestimmen

 

Tom_Gast

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.12.2016, 16:29     Titel:
  Antworten mit Zitat      
Hallo,

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)

Gruß Tom


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 02.12.2016, 18:32     Titel:
  Antworten mit Zitat      
Hallo Mmmartina,

Zitat:
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Sanjaa

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.12.2016, 09:57     Titel:
  Antworten mit Zitat      
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
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 04.12.2016, 17:23     Titel:
  Antworten mit Zitat      
Hallo Sanjaa,

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.

Oder Du kannst Matlab automatisch stoppen lassen:
Code:


Debuggen ist wirklich einfach und absolut grundlegend.

Du könntest aber auch einfach im Commandwindow den Befehl laufen lassen, der nicht funktioniert:
Code:
filedata = importdata('werte.csv',';');

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
Private Nachricht senden Benutzer-Profile anzeigen
 
Tom_Gast

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.12.2016, 08:57     Titel:
  Antworten mit Zitat      
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: ---
     Beitrag Verfasst am: 05.12.2016, 09:05     Titel:
  Antworten mit Zitat      
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.

Gruß Tom
 
Sanjaa

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.12.2016, 13:08     Titel:
  Antworten mit Zitat      
Hab den Code hier genommen:

https://de.mathworks.com/matlabcent.....ta-collected-from-arduino

Das ist auch nur ein Forum.

Code:
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

@Tom: Was meinst du mit falscher Frequenzachse?

kurve.png
 Beschreibung:
Peak ist bei 35Mhz und bei 0Hz

Download
 Dateiname:  kurve.png
 Dateigröße:  29.54 KB
 Heruntergeladen:  231 mal
 
Tom_Gast

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.12.2016, 14:06     Titel:
  Antworten mit Zitat      
Hallo,

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:

Code:
f = Fs/2*linspace(0,1,N/2+1);


und so dein einseitiges Amplitudenspektrum:
Code:
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

Code:
Fs = 1/(signaltime(2) - signaltime(1));

Natürlich muss die Abtastfrequenz gleich sein, also
Code:

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: ---
     Beitrag Verfasst am: 06.12.2016, 10:01     Titel:
  Antworten mit Zitat      
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

f = Fs/2*linspace(0,1,N/2+1);                       %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')
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 06.12.2016, 12:45     Titel:
  Antworten mit Zitat      
Hallo Sanjaa,

Zitat:
Für Fs bekomme ich 3.2000e+11 raus

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
Private Nachricht senden Benutzer-Profile anzeigen
 
Sanjaa

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.12.2016, 13:47     Titel:
  Antworten mit Zitat      
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?

Wenn du mir es bitte erklären könntest?
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 06.12.2016, 20:30     Titel:
  Antworten mit Zitat      
Hallo Sanjaa,

Zitat:
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:
Code:
Fs = 3.2000e+11;

ist der Wert ja naheliegend, aber woher stammt dieser Wert? Wieso deckt er sich nicht mit "1/(signaltime(2) - signaltime(1))"?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Sanjaa

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.12.2016, 08:49     Titel:
  Antworten mit Zitat      
Zitat:
Aber ergibt trotzdem nicht den selben Wert.

Den selbsen Wert wie was?[/quote]

Tom_Gast hat oben geschrieben, dass

Code:
Fs = 1/(signaltime(2) - signaltime(1))
und

Code:
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:
Code:
Fs = 3.2000e+11;

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: ---
     Beitrag Verfasst am: 07.12.2016, 11:19     Titel:
  Antworten mit Zitat      
Hallo,

dann hast du meine Aussage falsch verstanden. Der Befehl
Code:

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.

Gruß Tom
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 07.12.2016, 13:48     Titel:
  Antworten mit Zitat      
Hallo Sanjaa,

Trinkst Du Kaffee? Dann wäre jetzt der richtige Augenblick für einen.

Zitat:
Code:
Fs = 1/(signaltime(2) - signaltime(1))
und
Code:
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.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite Zurück  1, 2, 3, 4, 5  Weiter

Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.