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

Berechnung Betrag/Phase zweier gegebener Zeitfunktionen

 

Larsomat3000
Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 28.11.14
Wohnort: Aachen
Version: ---
     Beitrag Verfasst am: 28.11.2014, 11:58     Titel: Berechnung Betrag/Phase zweier gegebener Zeitfunktionen
  Antworten mit Zitat      
Hallo zusammen,

ich bin noch relativ frisch im Matlab Universum unterwegs und bräuchte etwas Hilfe.

Folgendes Szenario: Ich möchte im Rahmen einer Systemidentifikation eines Prozesses eine Frequenzanalyse vornehmen. Die Rohdaten erhalte ich aus Mathematica, heißt ich bekomme zu einer bestimmten Frequenz die Funktionswerte der Eingangssinusschwingung und der Ausgangsschwingung. Meine Frage ist jetzt: Wie kann ich daraus erstmal recht simpel den Betrag und die Phase berechnen?

Normalerweise liegt einem ja bspw. die Übertragungsfunktion vor, woraus man dann Betrag und Phase berechnen und somit ein Bodediagramm erstellen kann. Nur wie geht man vor, wenn man praktisch nur das Ein-/Ausgangsverhalten zu variablen Frequenzen hat?

Ich hoffe, ihr versteht mein Problem, und ihr könnt mir etwas auf die Sprünge helfen!
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: 28.11.2014, 12:22     Titel:
  Antworten mit Zitat      
Zitat:
...heißt ich bekomme zu einer bestimmten Frequenz die Funktionswerte der Eingangssinusschwingung und der Ausgangsschwingung.


Was heißt Funktionswerte konkret? Was ist gemessen worden?

Code:

abs() % Betrag
angle() % Phase in rad
 


Und warum heißt es im Threadtitel "...Zeitfunktionen" aber anderseits sprichst du von Funktionswerten gegenüber der Frequenz?
Private Nachricht senden Benutzer-Profile anzeigen
 
Larsomat3000
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 28.11.14
Wohnort: Aachen
Version: ---
     Beitrag Verfasst am: 28.11.2014, 12:52     Titel:
  Antworten mit Zitat      
Mir liegen im MATLAB Workspace jetzt drei Vektoren vor: ein Zeitvektor, ein Vektor worin alle Funktionswerte des Eingangssignals liegen und ein Vektor worin alle Funktionswerte des Ausgangssignals liegen!

Mein Eingangssignal ist eine Leistung, die um den Mittelwert 3000 mit der Frequenz 400Hz schwingt. Mein Ausgangssignal schwingt phasenverschoben ebenfalls!

Meine Frage ist jetzt, wie kann ich daraus jetzt händisch praktisch einen Punkt des Bodediagramms berechnen, also Betragspunkt und Phasenpunkt? Berechne ich zu jedem Zeitpunkt den Betrag des Quotienten von Ausgang zu Eingang bspw.?
Tut mir leid, falls ich mich umständlich ausdrücke!
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: 28.11.2014, 13:11     Titel:
  Antworten mit Zitat      
Also sind die Signale aus dem Zeitbereich! Somit muss eine Transformation in den Frequenzbereich stattfinden um ein Bodediagramm zu erzeugen. Das geht mittels FFT.

Diese Funktion erstellt dir das Frequenzspektrum.

Code:

function [mag, mag_dB, phase, fv] = FFT_Spektrum( signal, nfft, fa, scale) ;
% Input:
% Signal im Zeitbereich
% nfft = Anzahl Messwerte für fft
% wenn nfft > length(sig) -> fft(sig,nfft) führt Zeropadding durch
% fa = Abtastfreq.
% scale: 0 = keine Impulsantwort als Eingang, 1 = Impulsantwort
% Output:
% Magnitude des Spektrums linear und dB skaliert
% Frequenzvektor fv in [Hz] von 0...fa/2

% un-,gerade Anzahl Messwerte?
if mod(nfft,2) == 0;
    k = (nfft/2) + 1;
else
    nfft = nfft + 1;
    k = (nfft/2) + 1;
end

fn = fa/2; % Nyquistfreq.
df = fa/nfft; % Frequenzauflösung des Spektrums
% Frequenzvektor: Darstellung bis Nyquistfreq.
fv = 0: df : fn;

sig = signal(:);

% Signal transformieren
Fy = fft(sig,nfft);
 
%   Betrag - nur positives Freq.spektrum
if scale == 0
    Fy_pos0 = abs(Fy(1:k));

    %   Skalierung  
    mag = [Fy_pos0(1)/nfft ;Fy_pos0(2:k-1)/(nfft/2);Fy_pos0(k)/nfft];
else % nicht durch nfft teilen bei Impulsantwort
    mag = abs(Fy(1:k));
end

% Umrechnung in dB
mag_dB = 20*log10(mag + eps); % eps = kleine Konstante zur Vermeidung von log(0)

% Phase in rad
phase = angle(Fy(1:k));
 


Für die Darstellung des Spektrums...

Code:

signal = ... % Ue bzw. Ua -> Oder für das Übertragungsverhalten Ua ./ Ue
fa = ... % Abtastfrequenz 1/(t(2)-t(1))
nfft = ... % Anzahl Messwerte von signal
scale = 0;

% Funktionsaufruf
[mag, mag_dB, fv] = FFT_Spektrum( signal, nfft, fa, scale) ;

figure(1)
% Darstellung Betrag, f in[Hz]
semilogx(fv,mag_dB); % logarithmische Darstellung
figure(2)
subplot(2,1,1);
omega = 2*pi*fv; % Umrechnung in rad/s
semilogx(omega,mag_dB); % logarithmische Darstellung, entspricht bode standard
subplot(2,1,2);
% Darstellung Phase
semilogx(omega,phase); % logarithmische Darstellung, entspricht bode standard
 


Oder du arbeitest mit dem Matlab eigenen Tool

Code:


...einfach im Command Window eingeben und starten. Dort dann Signal laden und unter Spectra dann das Bodediagramm erzeugen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Larsomat3000
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 28.11.14
Wohnort: Aachen
Version: ---
     Beitrag Verfasst am: 28.11.2014, 14:30     Titel:
  Antworten mit Zitat      
Okay vielen Dank schonmal für die Funktion!

Nur frage ich mich nun, in welcher Form muss der Input "signal" vorliegen? Als Vektor? Und welches Signal nehme ich denn jetzt? Ich brauche doch das Verhältnis von Ausgang zu Eingang, oder denke ich da gerade grundlegend falsch?
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: 28.11.2014, 14:34     Titel:
  Antworten mit Zitat      
Als Spalten- oder Zeilenvektor, der nur die Messwerte enthält. Du kannst Ein- und Ausgang getrennt plotten oder als Verhältnis...

Code:

signal = Ausgangssignal ./ Eingangssignal; % elementweise Division
 


Und nfft sollte eine 2er Potenz sein, damit der schnelle FFT Algorithmus verwendet wird statt dem langsamen DFT.

Code:

N = length(Signal); % Anzahl Messwerte
nfft = 2^nextpow2(N); % nächste 2er potenz von N
 


Wenn nfft > N werden vor der Transformation automatisch die fehlenden Messwerte als Nullen angängt um die Länge nfft zu erhalten.
Private Nachricht senden Benutzer-Profile anzeigen
 
Larsomat3000
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 28.11.14
Wohnort: Aachen
Version: ---
     Beitrag Verfasst am: 28.11.2014, 14:57     Titel:
  Antworten mit Zitat      
Alles klar, jetzt hat es funktioniert Wink Auch wenn das Ergebnis wirklich nicht schön ist!

Hast du zufällig auch ein Skript parat, welches mir gewisse Spalten aus einer Datei einliest? Bisher mache ich das über den "ImportData"-Button und muss per Hand auswählen, welche Spalten ich gerne importieren möchte und in welchem Zeilenbereich diese liegen dürfen!

Meine Daten liegen im Dateiformat .dat vor!
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: 28.11.2014, 15:05     Titel:
  Antworten mit Zitat      
Nein, aber schau dir mal beim Importfenster den Button "Import Selection" an. Dort kannst du dir eine Funktion generieren, welche du dann immer wieder nutzen kannst und die deine manuellen Importsettings ausführt.
Private Nachricht senden Benutzer-Profile anzeigen
 
Larsomat3000
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 28.11.14
Wohnort: Aachen
Version: ---
     Beitrag Verfasst am: 01.12.2014, 11:28     Titel:
  Antworten mit Zitat      
Guten Morgen nochmal,

vielen Dank für den Tipp! Das Dateneinlesen funktioniert super Wink

Jetzt stehe ich aber vor dem nächsten Problem. Mein Ziel ist es ja immer noch, dass ich zu einer bestimmten Anregung meines Systems mit der konstanten Frequenz (=400Hz bspw.) das Verhalten untersuchen will. Dazu liefert mir die Simulation ein Eingangssignal (ein Vektor mit 10000 Elementen), ein Zeitvektor und ein Ausgangssignal (ebenfalls ein Vektor mit 10000 Elementen). Jetzt würde ich gerne händisch das Amplitudenverhältnis und die Phasenverschiebung ausrechnen.

Um das Amplitudenverhältnis zu berechnen hatte ich die Idee, dass ich mir die maximalen Werte und die minimalen Werte anschaue und die Amplitude des jeweiligen Signals berechne. Nur wie könnte ich mir beispielsweise einen Mittelwert aus den Hochpunkten meines Signals berechnen?! Denn wenn ich nur den Maximalwert nehme, könnte das ja genauso gut ein Ausreißer sein, der am Ende das Ergebnis verfälscht!

Hat jemand eine Idee, wie ich das Problem lösen könnte?
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: 01.12.2014, 11:37     Titel:
  Antworten mit Zitat      
Du willst doch das Übertragungsverhalten deines Systems bestimmen, oder nicht?

Das ist nun mal: System = Ausgangssignal / Eingangssignal

Dein Eingangssignal ist die Anregung mit 400Hz. Welche Signalform...ein Sinus? Ausgangssignal wurde sicherlich gemessen.

Damit ist FFT(System) und die anschließende Darstellung von Betrag und Phase doch dein Amplitudenverhältnis und die Phasenverschiebung und zwar für den gesamten Frequenzbereich von 0...Fs/2.
Private Nachricht senden Benutzer-Profile anzeigen
 
Larsomat3000
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 28.11.14
Wohnort: Aachen
Version: ---
     Beitrag Verfasst am: 01.12.2014, 11:43     Titel:
  Antworten mit Zitat      
Richtig, das Übertragungsverhalten meines Systems wäre das Endziel!

Genau, mein System wird mit einem Sinus angeregt! Ich besitze jetzt die Rohdaten meines Eingangs- und Ausgangssignals von vielen Frequenzen (50Hz bis 5kHz)! Ich wollte das ganze jetzt am Beispiel f = 400Hz durchrechnen! Deswegen verstehe ich gerade nicht, wie ich mit deinem Code auf ein Bodediagramm schließen kann! Ich lese doch lediglich erstmal die Daten nur für die Anregungsfrequenz von f = 400 Hz ein! Wie kann dein Code dann daraus schließen, wie mein System für andere Frequenzen reagiert, wenn ich diese nicht einlese?

Scheinbar habe ich ein Brett vor dem Kopf, aber ich kann mir das nicht erklären!
Ich möchte nur händisch für eine Anregungsfrequenz das Amplitudenverhältnis und die Phasenverschiebung berechnen. Im nächsten Schritt dann für die nächste Frequenz etc, um dann abschließend ein Bodediagramm darstellen zu können...
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: 01.12.2014, 12:03     Titel:
  Antworten mit Zitat      
Ok...jetzt verstehe ich. Wer hat denn entschieden, dass das Übertragungsverhalten an Hand eines Sinus als Eingangssignal untersucht werden soll? Um was für eine System geht es denn?

Normalerweise nimmt man für die Darstellung des Frequenzgangs die Impulsantwort des Systems. Ein Impuls (Dirac-Funktion) der Höhe 1 bei t=0 hat einen Frequenzgang von 1 über alle Frequenzen. Deshalb sieht man hier sofort wo das System dämpft/verstärkt und die Phasenverschiebung.

Mit einem Sinus als Eingangsignal siehst du dann nur im Frequenzspektrum das Übertragungsverhalten des Systems bei dieser diskreten Frequenz. Mehr nicht...das ist dann kein Bode-Diagramm, wie du schon richtig bemerkst. Aber auch dazu nutzt du einfach meine Funktion. Da brauchst es keine händisches rechnen.

Um den Frequenzgang über alle Anregungen unterschiedlicher Frequenz als Eingang darzustellen, addierst du einfach alle Eingangs- und Ausgangssignale im Zeitbereich. Dann die Differenz aus Ausgang zu Eingang bilden und dieses Signal dann für die Funktion " FFT_Spektrum" nutzen. So hast du zwar immer noch keinen Frequenzgang über alle Frequenzen, sondern nur zu den diskreten der Eingangsfolge. Aber mehr hast du ja auch nicht gemessen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Larsomat3000
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 28.11.14
Wohnort: Aachen
Version: ---
     Beitrag Verfasst am: 01.12.2014, 12:17     Titel:
  Antworten mit Zitat      
Ich hatte das entschieden, da ich dachte, das das erstmal die gängige Vorgehensweise zur Untersuchung eines Systems ist.

Es handelt sich um ein sehr komplexes Systems bzw. Prozess. Es geht um das Schmelzschneiden mittels Laser! Dazu wird eben dieser Laser mit einer Sinusfrequenz angeregt und gemessen wird das emittierte "Licht" aus dem Prozess mittels Photodiode! Ist jetzt mal sehr grob erläutert Wink

Also du schlägst vor, dass ich das System erstmal mit einem Impuls anrege? Wenn ich dies vollzogen habe, dann gehe ich genauso vor, wie zuvor beschrieben? Oder wie funktioniert das bei Impulsanregung?

Bei deinem zweiten Vorschlag addiere ich erst alle Eingangs- und Ausgangssignale im Zeitbereich, okay! Meinst du dann die Differenz aus beiden Signalen oder das Verhältnis? Denn Differenz verstehe ich gerade nicht, inwiefern das Sinn macht.
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: 01.12.2014, 12:29     Titel:
  Antworten mit Zitat      
Sorry...Differenz ist falsch. Ich meine natürlich das Verhältnis.

System = summe(aller Ausgangssignale) / summe(aller Eingangssignale).

Wenn du die Möglichkeit hast einen Impuls zu erzeugen und die Impulsantwort zu messen, wäre damit der komplette Frequenzbereich gemessen. Allerdings ist das halt immer so eine Sache einen reellen Impuls zu erzeugen. Was digital sehr einfach geht, nämlich

Impuls = [1,0,0,0...0] also bei t(0)=1 ansonsten 0

lässt sich analog nur schwer nachbilden. Was ja nicht was du für Möglichkeiten hast. Damit könntest du dir aber die vielen Messungen eines Sinus unterschiedlicher Frequenzen sparen. Oder du misst die Sprungantwort des Systems, was sicherlich einfacher zu realisieren ist und leitest sie ab. Denn die Impulsantwort ist die Ableitung der Sprungantwort. Die Impulsantwort dann zur Darstellung des Bodediagramms an die Funktion FFT_Spektrum übergeben.
Private Nachricht senden Benutzer-Profile anzeigen
 
Larsomat3000
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 28.11.14
Wohnort: Aachen
Version: ---
     Beitrag Verfasst am: 01.12.2014, 12:30     Titel:
  Antworten mit Zitat      
Ich hoffe, ich raube dir nicht zu viel deiner kostbaren Zeit, aber ich hätte noch ein paar Fragen zu deinem Code!

Aus welchem Grund berechnest du dieses k?

Code:
if mod(nfft,2) == 0;
    k = (nfft/2) + 1;
else
    nfft = nfft + 1;
    k = (nfft/2) + 1;
end



Und warum berechnest du dann den Betrag nur von 1 bis k Messwerten?
Wie du in dem Fall scale=0 "mag" berechnest, ist mir auch nicht ganz einleuchtend Sad

Code:
if scale == 0
    Fy_pos0 = abs(Fy(1:k));

    %   Skalierung  
    mag = [Fy_pos0(1)/nfft ;Fy_pos0(2:k-1)/(nfft/2);Fy_pos0(k)/nfft];
else % nicht durch nfft teilen bei Impulsantwort
    mag = abs(Fy(1:k));
end
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  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 - 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.