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: 09.12.2016, 14:45     Titel:
  Antworten mit Zitat      
Da hat sich irgendwie ein Fehler eingeschlichen. Siehe Screenshot. Der Peak ist falsch

ice_screenshot_20161209-134342.png
 Beschreibung:

Download
 Dateiname:  ice_screenshot_20161209-134342.png
 Dateigröße:  28.33 KB
 Heruntergeladen:  249 mal


Tom_Gast

Gast


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

das ist anhand des Screenshots schwierig zu sagen, woran das liegt.

Wird mit dem Code ohne diese neue Schleife auch schon die falsche Ampltude angezeigt?

Gruß Tom
 
Sanjaa

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.12.2016, 15:11     Titel:
  Antworten mit Zitat      
Ohne die Schleife kommt der richtige Wert raus.

Hier der Code nochmal ohne Schleife

Code:
array = csvread('datei.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')
 


und mit Schleife

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(dateien{indx});                     %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 = 1.0000e+08;                                    %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


Es wird auch nur ein einziger Peak angezeigt.
Wenn ich WertPeak ins Sommand eingebe, werden mir 2 verschiedene Werte angezeigt, allerdings beide falsch
 
Tom_Gast

Gast


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

ich sehe da jetzt keinen Fehler, allerings kann ich es ohne zu Testen nicht genau sagen. Eigentlich kann die Ursache nicht an der Schleife liegen.

Wenn du die beiden .csv Datein mal hier mit anhängst könnte ich das bei mir mal testen und genauer schauen, an was es liegen könnte.

Gruß Tom
 
Sanjaa

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.12.2016, 15:35     Titel:
  Antworten mit Zitat      
Ich habe die CSV Dateien hier hochgeladen

http://workupload.com/archive/rmerD8h
 
Tom_Gast

Gast


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

also bei meinem Test liegt es nicht an der Schleife, auch das Programm ohne Schleife zeigt schon die falsche Amplitide an. Warum das so ist, kann ich mir nicht erklären. Wenn du einen idealen Sinus nimmst, z.B.
Code:
signaldata = 3.5*sin(2*pi*signaltime*1000);  

wird die Amplitude richtig angezeigt (3.5). Ich denke also, dass das was mit Messfehlern zu tun hat.

Wieso willst du eigentlich unbedingt die FFT nehmen um die Ampltude zu bestimmen? Sind das Vorgaben? Bei deinen einfachen Signalen könntest du auch die Ampltude mit
Code:
amplitude = (max(signaldata)-min(signaldata))/2

bestimmen.

Gruß Tom
 
Sanjaa

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.12.2016, 16:21     Titel:
  Antworten mit Zitat      
Wenn du aber mit nur einer csv Datei arbeitest, zeigt er dir die richtige Amplitude an.

Wenn ich reinzoome, sehe ich eine Amplitude von 1,5852 und wenn ich den Befehl

amplitude = (max(signaldata)-min(signaldata))/2

benutze, dann wird mir ein anderer Wert angezeigt(1.6093)

Ich glaube die FFT ist genauer
 
Sanjaa

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.12.2016, 16:31     Titel:
  Antworten mit Zitat      
Ok sorry, sehe grad das bei mir auch bei eine Datei der falsche Peak angeizeigt wird. Bei einer anderen Datei mit einer anderen Frequenz(viel höher) wurde mir nämlich der richtige Peak anezeigt
 
Sanjaa

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.12.2016, 17:37     Titel:
  Antworten mit Zitat      
Wenn man sich eine andere Datei anschaut, die mehrere Perioden darstellt, dann scheint es zu funktionieren?!

http://workupload.com/archive/phjcrMf
 
Tom_Gast

Gast


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

mehrere Perioden sind auf jeden Fall besser. Was aber ebenfalls wichtig ist, dass du ganzzahlige Vielfache der Perioden nimmst, also 1 oder 2 usw.
So wie ich das sehe hast du bei deiner CSV-Datei ca. 1.25 Perioden. Reduiziere das mal auf eine Periode und versuch es nochmal.

Du kannst solche Dinge auch z.B. mit einem idealen Sinus ausprobieren:
Code:

signalfrequenz = 10;
anzahl_perioden = 1;
t = 0:1/Fs:anzahl_perioden/signalfrequenz;
signal = sin(2*pi*f*t);
%Hier die FFT auf 'signal' durchführen
 

Bei 'anzahl_perioden' = 1 oder 2 usw. wird die Amplitude richtig angezeigt.
Bei beispielswiese 'anzahl_perioden' = 1.5 ist die Amplitude nicht richtig.

Gruß Tom
 
Tom_Gast

Gast


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

kleine Korrektur: Die Perioden müssen keine ganzzahlige Vielfache sein, sondern es genügt wenn sie ganzzahlig sind.

Gruß Tom
 
Sanjaa

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.12.2016, 12:42     Titel:
  Antworten mit Zitat      
Habe genau zwei Perioden genommen und das Ergebnis ist leider falsch. Entweder sind das doch nicht genau 2 Perioden, wegen der Abtastung, kann ich vllt. nicht genau 2 Perioden haben oder das Programm hat einen Fehler
 
Sanjaa

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.12.2016, 14:06     Titel:
  Antworten mit Zitat      
Hat es denn funktioniert bei dir als du ein eigenes Signal erzeugt hast?
 
Tom_Gast

Gast


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

was meinst du mit "eigenes Signal erzeugt"?
Ich habe einen Sinus erzeugt (den Code siehst du in meinem letzten Post) und damit hat das funktioniert. Wie gesagt, es funktioniert nur mit ganzzahligen Perioden.
Nimm mal diesen Code und setze für 'anzahl_perioden' unterschiedliche Werte ein. Z.b. 10: Ampltude wird richtig angezeigt. Z.b. 9.5: Amplitude wird nicht richtig angezeigt.

Code:
f = 10;
Fs = 1e5;
Ts = 1/Fs;
anzahl_perioden = 9.5;
t = 0:Ts:anzahl_perioden/f-Ts;
signal = sin(2*pi*f*t);
L = length(signal);
Y = fft(signal);
p = abs(Y/L);
p = p(1:L/2+1);
p(2:end) = p(2:end)*2;
f = Fs/2*linspace(0,1,L/2+1);
plot(f,p)


Du solltest also ganzzahlige Perioden messen und mehr als nur eine.
Ich habe mal aus einer deiner Datei eine Periode rausgenommen, diese dann z.B. 10 mal hintereinander kopiert und dann zeigt auch die FFT eine genauere Amplitude an.

Gruß Tom
 
Sanjaa

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.12.2016, 18:13     Titel:
  Antworten mit Zitat      
Danke für die Hilfe.
Ich habe es geschafft. Nach gefühlten 100Std Wink Es ist folgender Code entstanden:

Code:
clear;

fo = 100;              

array = csvread('datei.csv');                        %Signal importieren

signaltime = array(:, 1);                           %x
signaldata = array(:, 2);
Ts = (signaltime(2)-signaltime(1));


signaltime = array(1:(1/fo)/(Ts), 1);                           %x
signaldata = array(1:(1/fo)/(Ts), 2);


Fs = 1/(signaltime(2)-signaltime(1));            % Sampling frequency
T = 1/Fs;             % Sampling period
L = size(signaltime,1);    % Length of signal
t = (0:L-1)*T;        % Time vector

S = signaldata;

Y = fft(S);

P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);

f = Fs*(0:(L/2))/L;

subplot(1,2,1), plot(signaltime,signaldata)
xlabel('Time(s)'),ylabel('Amplitude')
subplot(1,2,2), plot(f,P1)
xlabel('Frequency (Hz)'),ylabel('Amplitude')

Y = fft(S);
P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);

subplot(1,2,1), plot(signaltime,signaldata)
xlabel('Time(s)'),ylabel('Amplitude')
subplot(1,2,2), plot(f,P1)
xlabel('Frequency (Hz)'),ylabel('Amplitude')


Im moment ist es so, dass fo meine Frequenz ist und ich die für jede Datei seperat eingeben muss.
Ich möchte mit der for Schleife arbeiten die du(tom_Gast) bereits gepostet hast. Aber das klappt nicht, weil jede Datei eine andere Frequenz hat. Ich muss irgendwie in einem Vektor alle meine Frequenzen reinpacken und es so prgrammieren dass mit jeder neuen Datei die richtige Frequenz genommen wird. Ich hoffe ihr habt es verstanden. Vielleicht kann mir jemand weiterhelfen?
 
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.