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

PT1-Glied: Impulsantwort -> Übertragungsfunktion

 

Eric
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 19.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.04.2012, 17:03     Titel: PT1-Glied: Impulsantwort -> Übertragungsfunktion
  Antworten mit Zitat      
Erstmal ein herzliches 'Hallo' ins Matrix Labor!

Ich ermittle die Impulsantwort eines PT1-Gliedes mit Hilfe einer numerischen Simulation. Aus dem Vektor der Impulsantwort bestimme ich über die diskrete Fourier Transformation die Übertragungsfunktion. Soweit so gut.

Da ich die Übertragungsfunktion nur im Frequenzbereich F_min bis F_max bestimmen muss, und ich den Speicher- und Rechenaufwand möglichst minimieren möchte, habe ich mir für die erforderliche zeitliche Auflösung "dt" und die Aufnahmedauer "T" der Impulsantwort Folgendes überlegt:
dt = 1/(2*F_max) gemäß Nyquist-Theorem
T = 1/F_min

Lasse ich mir die resultierende Übertragungsfunktion plotten erhalte ich ein merkwürdiges Ergebnis:
Code:
% Konstanten
A =  1;         % Amplitudenverhältnis des PT1-Gliedes
B = 15;         % Zeitkonstante des PT1-Gliedes
F_min = 1E-4;   % Frequenzauflösung bzw. kleinste Frequenz der Ü-Funktion
F_max = 1E+0;   % Maximale Frequenz der Übertragungsfunktion

% Zeit- und Frequenzvektoren
dt = 1/(2*F_max);   % Zeitabstand zwischen 2 Werten der Impulsantwort
T = 1/F_min;        % Gesamt-Zeitdauer der Impulsantwort
t = 0:dt:T;         % Zeitvektor der Impulsantwort
dF = 1/T;           % Frequenzauflösung der Übertragungsfunktion
F = 0:dF:1/dt;      % Frequenzvektor der Übertragungsfunktion

% Rekonstruktion der Übertragungsfunktion aus Impulsantwort
h = (A/B)*exp(-t./B);   % Impulsantwort des PT1-Gliedes
H = fft(h)*dt;          % Übertragungsfunktion des PT1-Gliedes

% Darstellung
semilogx(F,abs(H),F,angle(H))
legend({'Amplitudenverhältnis','Phasenverschiebung'})
xlabel('Frequenz')
axis([F_min F_max -pi/2 1.1])


Der Phasengang müsste ohne Umwege asymptotisch zu -pi/2 gehen und das Amplitudenverhältnis sollte bei niedriger Frequenz genau 1 sein. Erhöht man die zeitliche Auflösung der Impulsantwort um das 100-fache (dt = 1/(200*F_max)) ergibt sich ein korrektes, aber ressourcenhungriges Ergebnis:

Code:
% Konstanten
A =  1;         % Amplitudenverhältnis des PT1-Gliedes
B = 15;         % Zeitkonstante des PT1-Gliedes
F_min = 1E-4;   % Frequenzauflösung bzw. kleinste Frequenz der Ü-Funktion
F_max = 1E+0;   % Maximale Frequenz der Übertragungsfunktion

% Zeit- und Frequenzvektoren
dt = 1/(200*F_max);   % Zeitabstand zwischen 2 Werten der Impulsantwort
T = 1/F_min;        % Gesamt-Zeitdauer der Impulsantwort
t = 0:dt:T;         % Zeitvektor der Impulsantwort
dF = 1/T;           % Frequenzauflösung der Übertragungsfunktion
F = 0:dF:1/dt;      % Frequenzvektor der Übertragungsfunktion

% Rekonstruktion der Übertragungsfunktion aus Impulsantwort
h = (A/B)*exp(-t./B);   % Impulsantwort des PT1-Gliedes
H = fft(h)*dt;          % Übertragungsfunktion des PT1-Gliedes

% Darstellung
semilogx(F,abs(H),F,angle(H))
legend({'Amplitudenverhältnis','Phasenverschiebung'})
xlabel('Frequenz')
axis([F_min F_max -pi/2 1.1])
 


Gibt es ein Kriterium, nach dem man die benötigte zeitliche Auflösung dt bestimmen kann?

Für Hilfe wäre ich sehr dankbar,

Viele Grüße
Eric
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: 23.04.2012, 13:00     Titel:
  Antworten mit Zitat      
Du hast zwar das Abtasttheorem beachtet, aber in der Praxis ist der Faktor 2 eben viel zu wenig. Besonders da du eine sehr hohe Auflösung im niederfreq. Bereich haben möchtest. Außerdem ist deine Frequenzachse sowie die Skalierung der Amplitude falsch. Schau mal in der Skriptecke unter "umfassendes FFT Bsp." wie es richtig sein müsste. Du kannst mit der FFT auch immer nur bis zur halben Abtastfreq. darstellen, was du hier ebenfalls mißachtest.

Hast du die Control System und Signal Processing Toolbox für Matlab? Da würde es nämlich mit tf, bode etc. oder dem sptool deutlich einfacher gehen.

Ebenfalls sollte dir bewusst sein, dass einem kontinuierlichen PT1 entsprichst, du hier aber mit einem diskreten System arbeiten möchtest/musst. Da gibt es Unterschiede Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
Eric
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 19.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.04.2012, 14:01     Titel:
  Antworten mit Zitat      
Hallo DSP,

vielen Dank für deine Antwort. Du schreibst:

Zitat:
Du hast zwar das Abtasttheorem beachtet, aber in der Praxis ist der Faktor 2 eben viel zu wenig.


Soweit sogut, aber nach welchem Kriterium lege ich die Abtastrate fest? Ist da Ausprobieren angesagt? (wäre ja iterativ möglich, bis Konvergenz erreicht)

Zitat:
Außerdem ist deine Frequenzachse sowie die Skalierung der Amplitude falsch.


Da sehe ich den Fehler nicht, aber darum gehts ja jetzt auch nicht primär...

Zitat:
Hast du die Control System und Signal Processing Toolbox für Matlab? Da würde es nämlich mit tf, bode etc. oder dem sptool deutlich einfacher gehen.


Ja, allerdings will ich das Programm ohnehin später in Fortran umsetzen, sodass ich das Problem irgendwie lösen muss.

Jede weitere Hilfe wird geschätzt.

Viele Grüße
eciman
Private Nachricht senden Benutzer-Profile anzeigen
 
Andidas
Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 16.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.04.2012, 14:14     Titel: Abtastzeit
  Antworten mit Zitat      
Hallo Eric,
habe gerade im Buch "Regelungstechnik 2" von Jan Lunze(S. 420-S.421) reingesehen.
Er schreibt, dass sich in der Praxis Abtastfrequenz= 6...20 mal Grenzfrequenz als sinnvoll erwiesen hat.
Die Grenzfrequenz ist die größte im Regelkreis auftretende Frequenz.
Da du nur eine Regelstrecke hast ist in deinem Fall die Zeitkonstante deines Pt1-Systems die einzige Zeitkonstante die hierbei berücksichtigt werden muss.


Viel Erfolg
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: 23.04.2012, 14:29     Titel:
  Antworten mit Zitat      
Es hat natürlich auch einen Grund, warum das so lange dauert. Ist die Anzahl deiner Messwerte keine 2er Potenz (wie auch hier in dem Bsp.) so wird der deutlich langsamere DFT Algorith. bei dem fft() Befehl verwendet.
Private Nachricht senden Benutzer-Profile anzeigen
 
Eric
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 19.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.04.2012, 15:37     Titel:
  Antworten mit Zitat      
Hallo Andidas,

Danke für den Hinweis! Das Buch werd ich mir mal näher ansehen.

@DSP: Jep, in der Hinsicht war mein Beispiel etwas unglücklich gewählt.

Viele Grüße
Eric
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: 24.04.2012, 11:22     Titel:
  Antworten mit Zitat      
Ich habe mal verschiedene Sachen probiert, aber der Grund für den abweichenden Phasengang kann ich nicht finden. Wenn ich allerdings die Impulsantwort hd der diskreten Übertragungsfkt. an die fft() übergebe, erhalte ich das gleiche Ergebnis, wie auch beim Bodeplot. Hier stimmen dann Amplituden- und Phasengang überein. Verwendet man aber h oder hs, stimmt der Amplitudengang immer mit der diskreten Impulsantwort hd überein. Der Phasengang über fft(h) oder fft(hs) weicht bei beiden aber gegenüber dem Bodebefehl ab. Ebenfalls verstehe ich das hier mit der Abtastfreq. noch nicht ganz. Der Default beim Bodeplot ist Fs = 1, wobei dann alle 3 Amplitudengänge bis weit über die Eckfreq. hinaus übereinstimmen. Wenn man Fs für das diskrete System verringert, nähert sich der Phasengang immer mehr dem kontinuierlichen PT1 an, was ich schon nicht nachvollziehen kann. Es müsste doch umgekehrt sein.

Code:

clear;
% Konstanten
A =  1;         % Verstärkung des PT1-Gliedes
B = 15;         % Zeitkonstante des PT1-Gliedes
F_min = 1E-4;   % Frequenzauflösung bzw. kleinste Frequenz der Ü-Funktion
F_max = 1E+0;   % Maximale Frequenz der Übertragungsfunktion

N = 2^14; % Anzahl Abtastwerte, immer 2er Potenz nehmen da sonst der langsame DFT Alg. genutzt wird
Fs = 1; % Abtastfreq.
Fn = 0.5*Fs; % Nyquistfreq.
df = Fs/N; % Frequenzauflösung des Spektrums

% Zeit- und Frequenzvektoren
Ts = 1/Fs;   % Abtastrate
t = 0:Ts:(N-1)*Ts;         % Zeitvektor der Impulsantwort

% Rekonstruktion der Übertragungsfunktion aus Impulsantwort
h = (A/B)*(exp(-t./B));   % Impulsantwort des PT1-Gliedes
h = h/sum(h); % auf 1 normieren
% Test: Impulsantwort ist die Ableitung der Sprungantwort
%sprung = A*(1 - exp(-t./B));
% numerische Ableitung der Sprungantwort
%h = diff(sprung); % Länge N-1
%h = [h, 0]; % auf Länge N erweitern

% Transfer Laplace Funktion
s=tf('s');
Gs = A/(B*s+1);
hs = impulse(Gs,t); % Impulsantwort
hs = hs/sum(hs);
% diskrete Übertragungsfkt.
Gd = c2d(Gs,Fs);
[b,a] = tfdata(Gd,'v');
hd = impz(b,a,N,Fs); % diskrete Impulsantwort

% Bodediagramm über FFT
H = fft(h,N);          % Übertragungsfunktion des PT1-Gliedes

% Frequenzvektor
f = 0:df:Fn; % Darstellung bis zur Nyquistfreq.

% Skalierung
amplH = abs(H);
amplitudengang = amplH(1:(N/2)+1);
%amplitudengang = [amplH(1)/N, amplH(2:N/2)/(N/2), amplH((N/2)+1)/N];

% Zur Überprüfung
[mag_s,phase_s] = bode(Gs,2*pi*f);
[mag_d,phase_d] = bode(Gd,2*pi*f);

% Darstellung
figure(1)
plot(t,h,'*',t,hs,'-.',t,hd,'--');
legend({'h','hs','hd'})
grid on;
axis([0 100 0 0.07])
figure(2)
subplot(211)
% Amplitude in dB
semilogx(f,20*log10(amplitudengang),'b--*')
hold on;
semilogx(f,20*log10(mag_s(1,:)),'r--.')
semilogx(f,20*log10(mag_d(1,:)),'g--.')
hold off;
grid on;
xlabel('Frequenz in [Hz]')
ylabel('Magnitude in [dB]')
legend({'h','hs','hd'})
axis([F_min Fn -40 5])
subplot(212)
phase = unwrap(angle(H(1:(N/2)+1)));
semilogx(f,phase*(180/pi),'b-*')
hold on;
semilogx(f,phase_s(1,:),'r--.')
semilogx(f,phase_d(1,:),'g--.')
legend({'h','hs','hd'})
xlabel('Frequenz in [Hz]')
ylabel('Phase in Grad')
%line(F_min,-90)
axis([F_min Fn -180 0])
grid on;
pause
close all;

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