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

Fourier Analyse - Die Grundschwingung bestimmen

 

Gast50

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.05.2016, 14:26     Titel: Fourier Analyse - Die Grundschwingung bestimmen
  Antworten mit Zitat      
Hallo liebe Forum Mitglieder,

ich habe hier ein Problem und komme leider nicht weiter.
Natürlich habe ich zuvor viel in eurem Forum recherchiert und habe diesen Thread entdeckt:
http://www.gomatlab.de/fft-umfassendes-beispiel-t777.html

Hab den Code erstmal 1:1 kopiert und getestet, scheint zu laufen.

Dann habe ich versucht diesen Code auf meinen Signal zu "überstülpen".
Leider scheint dies nicht zu funktionieren, vielleicht kann der eine oder andere mir helfen.

Was Matlab angeht, bin ich ein Anfänger.

Ich muss bei meiner Aufgabe die Grundwelle des gemessenen Signals filtern.
Aus dieser Grundwelle soll dann die Effektivwerte und später dann die Grundschwingungsgehalt sowie Oberschwingungsgehalt berechnet werden.

Bei t= zeit und y = current habe ich meine Vektoren angefügt.

Code:

% Zeitbereich
% ----------------------------------

fa = 8000; % Abtastfrequenz
fn = fa/2; % Nyquistfrequenz
N = 1024; % gewünschte FFT-Länge (N=2^x, sonst wird der DFT-Algorithmus verwendet!)
df = fa/N; % Frequenzauflösung
% Erzeugung eines Datensatzes mit N Abtastwerten
% ----------------------------------------------
t = zeit;  % x-Vektor                        
% Frequenzvorgabe in Hz als ganzzahlig Vielfaches der Frequenzauflösung der DFT/FFT:
f1 = df*100; % bei fa = 8000 Hz und N = 1024 beträgt df = 7,8125 Hz und
% f1 damit 781,25 Hz
 f1 = 784;
 f1 = df;
 phase = pi/2;

a1 = 1; % Amplitudenvorgabe
y = current;                
%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 -max_y 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 = a1;
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


% Fensterfunktion
% ----------------------

% Anhang an die bereits erfolgte Untersuchung
% -------------------------------------------
win = hann(N)';
%y_win = y.*win; % Fensterung ohne Amplitudenkorrektur
y_win = y.*win*N/sum(win); % Fensterung mit Amplitudenkorrektur
max_y = max(abs(y_win))*1.1;

fig = figure(fig+1);
plot(y_win)
axis([0 N -max_y max_y])
title('Datensatz nach Fensterung mit Hann-Fenster')
ylabel('Amplitude')
xlabel('N Stützstellen')
grid

% Berechnung der FFT
% ------------------
H = fft(y_win, 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
% ----------------------
fig = figure(fig+1);
stem(x_fa-fn, amplitudengang, 'b.-')
axis([-fn fn 0 a/2*1.1])
title('Amplitudengang nach Fensterung')
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 nach Fensterung')
ylabel('Amplitude in dB')
xlabel(['Auflösung: ',num2str(df),' Hz Frequenz in Hz'])
grid
 
 


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 05.05.2016, 22:12     Titel: Re: Fourier Analyse - Die Grundschwingung bestimmen
  Antworten mit Zitat      
Hallo Gast50,

Bitte erkläre noch, was "Leider scheint dies nicht zu funktionieren" bedeutet.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.05.2016, 13:30     Titel:
  Antworten mit Zitat      
Sorry mein Fehler.
Ich habe es doch anders gemacht als ich oben beschrieben habe.

Nochmal der Code:

Code:
% Zeitbereich
% ----------------------------------

fa = 8000; % Abtastfrequenz
fn = fa/2; % Nyquistfrequenz
N = 1024; % gewünschte FFT-Länge (N=2^x, sonst wird der DFT-Algorithmus verwendet!)
df = fa/N; % Frequenzauflösung
% Erzeugung eines Datensatzes mit N Abtastwerten
% ----------------------------------------------
t = 0 : 1/fa : (N-1)/fa;  % x-Vektor                        
% Frequenzvorgabe in Hz als ganzzahlig Vielfaches der Frequenzauflösung der DFT/FFT:
f1 = df*100; % bei fa = 8000 Hz und N = 1024 beträgt df = 7,8125 Hz und
% f1 damit 781,25 Hz
 f1 = 784;
 f1 = df;
 phase = pi/2;

a1 = 1; % Amplitudenvorgabe
y = current; % y-Vektor
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 -max_y 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 = a1;
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


% Fensterfunktion
% ----------------------

% Anhang an die bereits erfolgte Untersuchung
% -------------------------------------------
win = hann(N)';
%y_win = y.*win; % Fensterung ohne Amplitudenkorrektur
y_win = y.*win*N/sum(win); % Fensterung mit Amplitudenkorrektur
max_y = max(abs(y_win))*1.1;

fig = figure(fig+1);
plot(y_win)
axis([0 N -max_y max_y])
title('Datensatz nach Fensterung mit Hann-Fenster')
ylabel('Amplitude')
xlabel('N Stützstellen')
grid

% Berechnung der FFT
% ------------------
H = fft(y_win, 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
% ----------------------
fig = figure(fig+1);
stem(x_fa-fn, amplitudengang, 'b.-')
axis([-fn fn 0 a/2*1.1])
title('Amplitudengang nach Fensterung')
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 nach Fensterung')
ylabel('Amplitude in dB')
xlabel(['Auflösung: ',num2str(df),' Hz Frequenz in Hz'])
grid
 


Habe hier nur y= "mein Signal" eingesetzt.
Als Fehlermeldung kommt folgendes raus:

Error using horzcat
Dimensions of matrices being concatenated are not consistent.

Error using plot
Vectors must be the same lengths.

Falls wichtig, mein Vektor hat 2500 einträge.
 
Mmmartina
Forum-Meister

Forum-Meister


Beiträge: 745
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 06.05.2016, 21:23     Titel:
  Antworten mit Zitat      
Diese Fehlermeldung besagt, dass du an irgend einer Stelle (welche du nicht nennst!) versuchst, unterschiedlich große Variablen miteinander zu verbinden.

Trage doch bitte mal vor deinem Code ein:
Code:


Dann läßt du es wieder laufen und schaust nach, was genau in den Variablen steht, an der Stelle, wo der Fehler geworfen wird.

Alternativ setze dir break points und gehe Zeile für Zeile vor, schaue was passiert, wie sich die Variablen verändern, etc.
Siehe auch:
http://de.mathworks.com/help/matlab.....process-and-features.html
_________________

LG
Martina

"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))
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: 07.05.2016, 09:36     Titel:
  Antworten mit Zitat      
Hallo,

ist current ein 1x2500 oder ein 2500x1 Array? Ich nehme mal an letzteres, welches auch dann zur Fehlermeldung passen würde, da der folgende Schritt nur mit einem Zeilen- nicht aber mit einem Spaltenarray funktioniert.

Code:
y = [y(1:N/2) zeros(1, N/2)];


Also den Array in 1x2500 umwandeln:

Code:
y = current';


Wenn du 2500 Messwerte hast, solltest du in dem Code auch das N entsprechend anpassen. Die obere Codezeile mit dem Anfügen von Nullen würde ich weglassen.

Gruß DSP
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast50

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.05.2016, 12:03     Titel:
  Antworten mit Zitat      
Vielen Dank. Habe N auf 2500 angepasst und y=current' gemacht.
Die Diagramme werden jetzt alle geplottet.
Nun stellt sich bei mir die Frage, wie ich die Grundfrequenz und dessen Amplitude ablesen kann.
Ich weiß von vorneherein schon, dass mein Grundsignal z.B. eine Frequenz von 50Hz hat.
Soll ich dann im Plott "Amplitudengang nach Fensterung" die Amplitude bei 50Hz ablesen?

[EDITED, Jan, Bitte kein Top-Quoting - Danke!]
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 07.05.2016, 13:17     Titel:
  Antworten mit Zitat      
Hallo,

woher sollen wir wissen was du suchst bzw. was deine Grundschwingung ist? Wenn ein Peak bei 50 Hz ist, wäre das eben ein Signalanteil. Ob das nun die Grundfrequenz ist, kann man aus den gegebenen Infos nicht sagen. Am besten mal einen Plot des Amplitudenspektrums ins Forum stellen Wink

Gruß DSP
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast50

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.05.2016, 16:03     Titel:
  Antworten mit Zitat      
Ich habe den aufgenommenen Strom und dessen Frequenzspektrum in der Datei angehängt.
Der Strom hat eine Frequenz von 30Hz.
Ich brauche jetzt die Grundschwingung um den Effektivwert den Grundschwingung bestimmen zu können.
Anschließend soll ich den Oberschwingungsgehalt sowie Grundschwingungsgehalt berechnen.

Strom mit f=30Hz.fig
 Beschreibung:

Download
 Dateiname:  Strom mit f=30Hz.fig
 Dateigröße:  8.78 KB
 Heruntergeladen:  338 mal
Frequenzspektrum.fig
 Beschreibung:

Download
 Dateiname:  Frequenzspektrum.fig
 Dateigröße:  78.87 KB
 Heruntergeladen:  318 mal
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 08.05.2016, 09:49     Titel:
  Antworten mit Zitat      
Hallo,

so ist da überhaupt nichts ablesbar. Warum schneidest du in dem relevanten Bereich die Amplitude ab, so dass man gar nicht die Maxima sehen kann?

Nutze folgende Funktion aus dem Anhang mit folgendem Aufruf:

Code:
FFT_betragsspektrum( current, 2500, 8000, 1, 0)


Bist du dir überhaupt sicher, dass die Abtastfrequenz deines Signals 8000 Hz ist? Oder hast du das einfach aus dem Skript übernommen? Wenn dein Signal mit einer anderen Abtastfrequenz aufgenommen wurde, ist das Ergebnis dann ohnehin nicht korrekt. Du musst schon die exakte Abtastfrequenz angeben.

Gruß DSP

FFT_betragsspektrum.m
 Beschreibung:

Download
 Dateiname:  FFT_betragsspektrum.m
 Dateigröße:  1.53 KB
 Heruntergeladen:  295 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast50

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.05.2016, 22:35     Titel:
  Antworten mit Zitat      
Stimmt jetzt wo du es sagst.
Der Abtastfrequenz ist 2kHz.
Ich habe jetzt für die Abtastfrequenz 2000 eingegeben und dann wieder geplottet.
Das Ergebnis hänge ich mal an. Der Plot ist wieder mit f=30Hz.

Dieses mal ist bei dem Amplitudenspektrum nicht mehr viele Frequenzen zu sehen.
Ist meine Grundfrequenz nun die Frequenz die eine maximale Ampltuide hat?
Oder ist meine Grundfrequenz bei f=30Hz und von dort muss ich die Amplitude ablesen?

Lg

untitled2.fig
 Beschreibung:

Download
 Dateiname:  untitled2.fig
 Dateigröße:  15.05 KB
 Heruntergeladen:  317 mal
untitled.fig
 Beschreibung:

Download
 Dateiname:  untitled.fig
 Dateigröße:  15.1 KB
 Heruntergeladen:  299 mal
 
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.