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: ---
Verfasst am: 09.12.2016, 15:11
Titel:
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
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
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: ---
Verfasst am: 09.12.2016, 15:30
Titel:
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.
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.
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
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: ---
Verfasst am: 09.12.2016, 16:31
Titel:
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: ---
Verfasst am: 09.12.2016, 17:37
Titel:
Wenn man sich eine andere Datei anschaut, die mehrere Perioden darstellt, dann scheint es zu funktionieren?!
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: ---
Verfasst am: 12.12.2016, 10:18
Titel:
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: ---
Verfasst am: 12.12.2016, 12:42
Titel:
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: ---
Verfasst am: 12.12.2016, 14:06
Titel:
Hat es denn funktioniert bei dir als du ein eigenes Signal erzeugt hast?
Tom_Gast
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 12.12.2016, 15:11
Titel:
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: ---
Verfasst am: 12.12.2016, 18:13
Titel:
Danke für die Hilfe.
Ich habe es geschafft. Nach gefühlten 100Std Es ist folgender Code entstanden:
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
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?
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.