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

FFT: Anwendung auf Messdatenreihe

 

Cococabana
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 15.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.07.2012, 09:05     Titel: FFT: Anwendung auf Messdatenreihe
  Antworten mit Zitat      
Hallo,

ich bin absoluter FFT-Neuling und habe mit dem Skript in http://www.gomatlab.de/fft-umfassendes-beispiel-t777.html versucht eine FFT aus meinen messdaten zu erstellen. Leider kommen da ein zwei Fehlermeldung. Der Thread in http://www.gomatlab.de/fft-verstaendnisfrage-t24506.html half mir bislang auch nicht recht.

Ich lese eine *.mat-Datei ein die 2 Spaltenvektoren beinhaltet. Zeit und Spannung. Ich will jedoch nur über Ausschnitte dieser großen Datei mit der FFT rübergehen. Die Abtastzeit meiner messwerte beträgt 500e-6s. Hier ist mein Versuch:

Code:
% Zeitbereich
% ----------------------------------
clear
clc
load 'daten.mat';

Ta = 500e-6;    % Abtastzeit
fa = 1 / Ta;    % Abtastfrequenz
fn = fa/2;      % Nyquistfrequenz
t_start = 5;    % startzeit in s
t_end = 5.15;      % entzeit in s

startfeld = t_start * (1/Ta); % 1s z.B. 2000 Felder bei Ta=500µs
endfeld = t_end * (1/Ta);    
N = endfeld - startfeld;    % gewünschte FFT-Länge (N=2^x, sonst wird der DFT-Algorithmus verwendet!)
df = fa/N;      % Frequenzauflösung

t = time(startfeld:endfeld);
y = Iq(startfeld:endfeld);
y = [y(1:N/2) zeros(1, N/2)];

% Graphische Darstellung
% ----------------------
% max. Amplitude zur Skalierung der graphischen Darstellung feststellen:
max_y = max(abs(y))*1.1;
fig = figure(1);
plot(y)
axis([0 N 0.58 max_y])
title('Datensatz')
ylabel('Amplitude')
xlabel('N Stützstellen')
grid

% Frequenzbereich
% ----------------------------------

% Berechnung der FFT
% ------------------
H = fft(y, N);
% Berechnung des Amplitudengangs aus dem komplexen Frequenzvektor H:
amplH = abs(H);
% Amplitudenskalierung (Normierung auf N) und verschieben der Elemente des
% Amplitudenvektors, so dass die Darstellung des Amplitudengangs von -fn...0...fn
% erfolgen kann:
amplitudengang = fftshift(amplH/N);
% Graphische Darstellung
% ----------------------
% Frequenzvektoren (werden bei der graphischen Darstellung benötigt):
x_fn = 0 : df : fn-df;
x_fa = 0 : df : fa-df;
% max. Amplitude zur Skalierung der graphischen Darstellung feststellen:
%a = max([a1, a2, a3, a4, a5]); % wird später benötigt
a = 1;
fig = figure(fig+1);
stem(x_fa-fn, amplitudengang, 'b.-')
axis([-fn fn 0 a/2*1.1])
title('Amplitudengang')
ylabel('Amplitude')
xlabel(['Auflösung: ',num2str(df),' Hz Frequenz in Hz'])
grid

% Ausgabe in dB
% ------------------
fig = figure(fig+1);
plot(x_fa-fn, 20*log10(amplitudengang))
%axis([-fn fn -100 20*log10(a/2)+3])
axis([-fn fn -100 3])
title('Amplitudengang')
ylabel('Amplitude in dB')
xlabel(['Auflösung: ',num2str(df),' Hz Frequenz in Hz'])
grid

% Darstellung des interessierenden Frequenzbereichs des
% Amplitudengangs (0...fn) und
% daran angepasste Amplitudenskalierung (Normierung auf N/2):
amplitudengang = [amplH(1)/N amplH(2:N/2)/(N/2)]; % DC-Bin auf N normieren!
fig = figure(fig+1);
stem(x_fn, amplitudengang, 'b.-')
axis([0 fn 0 a*1.1])
title('Amplitudengang')
ylabel('Amplitude')
xlabel(['Auflösung: ',num2str(df),' Hz Frequenz in Hz'])
grid

% Ausgabe in dB
% ------------------
fig = figure(fig+1);
plot(x_fn, 20*log10(amplitudengang))
axis([0 fn -100 20*log10(a)+3])
title('Amplitudengang')
ylabel('Amplitude in dB')
xlabel(['Auflösung: ',num2str(df),' Hz Frequenz in Hz'])
grid


Ich gebe mit t_start und t_end meinen Messdatenausschnitt an, rechne die Zeiten um in das zutreffende start- und endfeld diese Zeit im Vektor. Die Vektorausschnitte werden richtig erstellt, aber irgendwie hab ich das Gefühl das ich es mir da mit diesem variablen Auschnitt zu einfach mache. Embarassed
Ich bekomme die Fehlermeldung:

??? Error using ==> vertcat
CAT arguments dimensions are not consistent.

Error in ==> FFT2 at 20
y = [y(1:N/2); zeros(1, N/2)];


Ich gehe davon aus das, wie im Link oben, auch ich irgendwo die Zeilen und Spalten miteinander vermenge Rolling Eyes . Komme aber nciht dahinter. Habt ihr eine Idee?

Anbei meine Messdatendatei als .mat file. Bitte umbenennen! Damit isses einfacher nachzustellen.

Grüße und Danke, Cococabana

daten.jpg
 Beschreibung:
 Dateigröße:  460.24 KB
 Angeschaut:  2689 mal

daten.jpg

Private Nachricht senden Benutzer-Profile anzeigen


DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 17.07.2012, 09:34     Titel:
  Antworten mit Zitat      
Dann müsste glaube ich diese Zeile hier geändert werden...

Code:

% Für Zeilenvekoren
y = [y(1:N/2) zeros(1, N/2)];
% für Spaltenvektoren
y = [y(1:N/2); zeros(N/2, 1)];

% Damit man nicht ständig im Code die Dimensionen ändern muss, weil das Signal mal als Spalten oder Zeilenvektor vorliegt, sollte man folgendes machen:

signal = y(:); % dann hat man immer Spaltenvektoren
...
signal_neu = [signal(1:N/2); zeros(N/2, 1)];
 


Warum verwendest du allerdings nur die Hälfte deines Signals? Ist das Segment so gewählt, dass ganze Perioden des Signals enthalten sind? Sonst bekommst du den Leakage Effekt...dann solltest du dein Signal Fenstern.
Private Nachricht senden Benutzer-Profile anzeigen
 
Cococabana
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 15.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.07.2012, 09:59     Titel:
  Antworten mit Zitat      
Danke DSP!!!

ich hatte mir damit geholfen erstmal das Füllen mit nullen zu streichen. Da gings auch schon. Aber so ist es besser und komfotabler für zukünftige Anwednungen.

Warum ich das halbe Signal verwende? Wie gesagt, ich bin in Sachen FFT eine echter Neuling. Ich hatte das so aus dem Skript übernommen erstmal. Embarassed

Wenn sich der Leakage-Effekt darin äußert, das ich über das gesamte Spektrum einen von 0 bis fn abfallenden Linien-"schweif" sehe dann, ja, den hab ich gefunden und der ist nicht erwünscht. Mit
Code:
y = [y(1:N); zeros(N, 1)];


bekomme ich nun aber das Spektrum das ich erwartet habe!

Danke nochmal Very Happy
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 17.07.2012, 10:07     Titel:
  Antworten mit Zitat      
Du solltest dich mal genauer mit diesem Effekt befassen...der Artikel auf Wikipedia ist da schon ausreichend. Dann selber in deinem Code anhand eines einfachen Testsignals ( y = sin(2*pi * f * t) ) ausprobieren, wie sich das Spektrum ändert, wenn f ein ganzzahliges Vielfaches von df ist und wenn nicht.

Ich habe zu diesem Effekt auch schon einige Antworten hier im Forum gegeben. Einfach mal danach suchen...Leakage und Fensterung. Warum entsteht es, wie zeigt sich das im Spektrum und wie kann man den Effekt minimieren. Das sind die zentralen Fragen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



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 - 2025 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.