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

 

Sanjaa

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.12.2016, 14:30     Titel:
  Antworten mit Zitat      
Leider stimmt der Code immer noch nicht ganz.

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')



Warum muss es nur so kompliziert sein ;(

verlauf.png
 Beschreibung:
Dieser Verlauf wird mir angezeigt.
X-Achse geht bis 3,5 dann hört es auf und geht nicht nach oben

Download
 Dateiname:  verlauf.png
 Dateigröße:  33.71 KB
 Heruntergeladen:  259 mal


Tom_Gast

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.12.2016, 15:45     Titel:
  Antworten mit Zitat      
Hallo,

was meinst du mit "stimmt immer noch nicht ganz". Es ist schwierig bzw. unmöglich zu erraten, was genau noch nicht stimmt. Schreibe also immer, wie das aktuelle Ergebnis von deinem gewünschten Ergebnis abweicht.

Für mich sieht das richtig aus. Die Ampltude wird richtig angezeigt, die Frequenz sicherlich auch. Wenn du z.B. die Frequenzen ab 1kHz nicht betrachten willst, kannst du auch die Frequenzachse entsprechend begrenzen.

Gruß Tom
 
Sanjaa

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.12.2016, 16:14     Titel:
  Antworten mit Zitat      
Hier nochmal ein anderer Screenshot. Die Amplitude zeigt den richtigen Wert an, aber wieso ist der peak bei 0Hz und wieso ist unten so ein waagerechter Verlauf?

ice_screenshot_20161207-151309.png
 Beschreibung:

Download
 Dateiname:  ice_screenshot_20161207-151309.png
 Dateigröße:  18.47 KB
 Heruntergeladen:  242 mal
 
Tom_Gast

Gast


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

es sieht vermutlich nur auf dem Bild so aus, dass es bei 0Hz ist. Nutze z.B. die Zoom-Funktion oder begrenze deine Frequenzachse, wie ich bereits vorgeschlagen habe.
Die waagrechte Linie kommt eben davon, dass du durch deine sehr sehr hohe Abtastfrequenz auch hohe Frequenzen darstellen kannst, die allerdings alle bei 0 sind, weil keine dieser hohen Frequenzen in deinem Signal vorkommen.

Plotte also nur bis zu den Frequenzen, die dich auch interessieren z.B. mit

Code:
df = Fs/N; %Frequenzauflösung
fmax = 1.5e3; %maximale Frequenz die du darstellen möchtest
fmax_idx = round(fmax/df)+1; %Index der maximalen Frequenz
plot(f(1:fmax_idx), p(1:fmax_idx)); %Angepasster Plot
 


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, 20:52     Titel:
  Antworten mit Zitat      
Hallo Sanjaa,

Die Diskussion in diesem Thread wäre wesentlich weniger kompliziert, wenn Du die Ratschläge berücksichtigen und auf die Rückfragen eingehen würdest.

Zitat:
aber wieso ist der peak bei 0Hz und wieso ist unten so ein waagerechter Verlauf?

Das Endergebnis ist ganz exakt genau das, was die Berechnung ergibt. Der waagrechte Verlauf hängt wie bereits gesagt mit der Skalierung zusammen. Vielleicht hilft Dir eine logarithmische Einteilung.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.12.2016, 21:43     Titel:
  Antworten mit Zitat      
Danke für die Hilfe
 
Sanjaa

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.12.2016, 09:58     Titel:
  Antworten mit Zitat      
Ich muss euch leider nochmal stören.

Ich Frage mich, ob ich mir den Peak irgendwie direkt als Wert anzeigen lassen kann?
Also im moment zoome ich die Kurve und lese den Peak ab.
Bei vielen Messungen ist es jedoch sehr Zeitaufwendig.
 
Tom_Gast

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.12.2016, 10:28     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Ich muss euch leider nochmal stören.

Das ist doch kein Problem, dafür ist das Forum doch da.

Also in der Theorie könntest du einfach bei deiner FFT bei der Signalfrequenz schauen, wie hoch da der Wert ist, also
Code:
WertPeak = p(f==1000)

Da das aber in den meisten Fällen nicht klappen wird wegen der Frequenzauflösung und weil dein Signal wahrscheinlich nicht genau bei 1000 Hz ist würde ich dir das hier empfehlen:
Code:
WertPeak = max(p);

Es wird einfach der Wert des Maximums der FFT ausgegeben. Solltest du aber irgendwann mal mehrere Peaks in der FFT haben und willst alle bestimmen, musst du bei der Suche des Maximums mit max eben nur den westenlichen Teil der FFT innerhalb einer kleinen Spanne übergeben:
Code:
WertPeak = max(p(find(f>950,1):find(f>1050,1)))

Hier wird jetzt z.B. nach dem Maximum zwischen 950Hz und 1050Hz gesucht, also eine Spanne von +-50Hz. Und da wird dann auch dein Peak bei ca. 1000Hz gefunden. Wenn du jetzt zusätzlich noch einen Peak bei 2000Hz hättest, könntest du diesen entsprechend mit
Code:
WertPeak = max(p(find(f>1950,1):find(f>2050,1)))

finden.

Gruß Tom
 
Sanjaa

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.12.2016, 10:53     Titel:
  Antworten mit Zitat      
Danke, hat mir schon weitergeholfen.

Ist es auch folgendes möglich:

In moment bestimme ich den Peak einer CSV Datei. Kann man es irgendwie programmieren, sodass mehrere CSV Datei gleichzeitig durchgearbeitet werden und mir von jeder CSV der Peak gleichzeitig angezeigt wird?
 
Jan S
Moderator

Moderator


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

"Gleichzeitig" geht das nicht, aber nacheinander. Dazu kannst Du den Code in eine Funktion packen. Dann erstellst Du eine Schleife über die File-Namen und gibst sie als Input an Deine Funktion.

Suche mal im Netz nach "Matlab process sequence of files" und Du wirst feststellen, dass dies zu den FAQ gehört, den "häufig gestellten Fragen" - für die man schon fertige Tutorials findet.

Gruß Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Tom_Gast

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.12.2016, 11:36     Titel:
  Antworten mit Zitat      
Hallo,

ja, das ist mit Hilfe einer Schleife möglich.
Was du dafür brauchst ist:
1. Ein z.B. Cell-Array mit den Dateinamen, die du alle einlesen möchtest, erstellen. Die gibst du entweder händisch in den Code ein, z.B. so
Code:
dateien = {'datei1.csv', 'datei2.csv', 'datei3.csv'}

oder du lässt sie automatisch mit z.B. dir einlesen.
2. Eine Schleife über all diese Dateien und Werte abspeichern
Code:

subplot(1,2,1); hold on; %Damit später alle Plots angezeigt werden
subplot(1,2,2); hold on;
WertPeak = zeros(1,numel(dateien)) %Preallocation
for indx = 1:numel(dateien)
%Hier kommt dein bisheriger Code hin
%Also Datei einlesen und FFT durchführen und Plotten
WertPeak(indx) = max(p); %Wert in Vektor abspeichern
end


Gruß Tom
 
Sanjaa

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.12.2016, 13:04     Titel:
  Antworten mit Zitat      
Es sieht jetzt so aus

Code:
dateien = {'datei1.csv', 'datei2.csv'}

subplot(1,2,1); hold on; %Damit später alle Plots angezeigt werden
subplot(1,2,2); hold on;
WertPeak = zeros(1,numel(dateien)) %Preallocation
for indx = 1:numel(dateien)

array = csvread('datei1.csv');                       %Signal importieren
signaltime = array(:, 1);                           %x
signaldata = array(:, 2);                           %y
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              
Fs = 5.0000e+07;                                    %Abtast-Frequenz

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')
%Also Datei einlesen und FFT durchführen und Plotten
WertPeak(indx) = max(p); %Wert in Vektor abspeichern
end


Was muss aber bei

array = csvread('datei1.csv');

reinschreiben. Das kann ich ja so nicht stehen lassen
 
Tom_Gast

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.12.2016, 13:27     Titel:
  Antworten mit Zitat      
Hallo,

die tust du durch
Code:
array = csvread(dateien{indx});  

ersetzen.

Gruß Tom
 
Sanjaa

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.12.2016, 14:06     Titel:
  Antworten mit Zitat      
Ich habe danach im Command Window folgendes eingeben

WertPeak(indx) = max(p)

Aber die Ergebnisse stimmen nicht. Irgendwas falsch gemacht?
 
Tom_Gast

Gast


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

meinst du mit "dannach" nach der Simulation und du möchtest die Werte nun anschschauen? Wenn ja dann darfst du nur
Code:

im Command Window eingeben

Gruß Tom
 
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.