Forum: Digitale Signalverarbeitung / DSP / Machine Learning bodediagramm + impulsantwort


von tobias hofer (Gast)


Lesenswert?

Hallo

Wenn ich ein einfaches lti system habe z.b. pt1. und die impulsantwort
des systems messe sollte ich doch mit anschliessender fft der 
impulsantwort
zum bodediagramm gelangen.

ich versuche nun schon eine weile das mit matlab hinzukriegen. bisher 
jedoch ohne erfolg.
vieleicht kann mir jemand die paar zeilen code zeigen wie das an einem 
einfachen bsp. funktioniert.

was ich bisher versucht habe. aber vermutlich liegt bei mir der fehler 
nach der fft. da habe ich ja ein spiegelbildliches spektrum um fo. wie 
gesag wäre ich froh um einen kleinen tip.
1
sys = tf([1],[1 1]);
2
figure(5)
3
subplot(211)
4
bode(sys)
5
grid
6
title('PT1');
7
8
subplot(212);
9
[y time]=impulse(sys);
10
grid
11
title('impuse')
12
13
figure(6)
14
a=fft(y);                %invers fft
15
inv_spectrum=20*log10(abs(a))
16
semilogx(time,inv_spectrum);
17
grid

gruss
tobias

von Detlef _. (detlef_a)


Lesenswert?

>> sys = tf([1],[1 1]);
macht Dir nen kontinuierliches System. Für 'impulse' ist die Abtastzeit 
'chosen automatically', was immer das heißen mag. Da vagleichse Birnen 
mit Äpfeln. Für rein abtastende Systeme geht das. Für Vergleich 
kontinuierliche/abtastende Systeme ist das nicht so schlicht.

Cheers
Detlef

von tobias hofer (Gast)


Lesenswert?

Hallo

Ok, dann werde ich ein bodediagramm auf herkömmliche weise zeichnen und 
es nochmals versuchen. gebe die ergebnisse bekannt.

gruss
tobias

von tobias hofer (Gast)


Lesenswert?

noch eine frage

nun plote ich mir das bodediagram auf folgende weise:
1
G=1./(1+ 4*j*w + 5.5*j*w*2);
2
betr=20*log10(abs(G));

nun wollte ich zum test folgendes:

a = ifft(betr,8192);
b = fft(a,8192);

nun sollte ja nach beiden transformationen wieder betr rauskommen.
das funktioniert nun so aber gar nicht. hast du da eine idee?

gruss

von Detlef _. (detlef_a)


Lesenswert?

Bei mir kommt dasgleiche raus:
betr=rand(1,109);
a=ifft(betr,8192);
b=fft(a,8192);
sum(abs(b(1:109)-betr))

btw: 5.5*j*w*2) soll 5.5*j*w.^2) heißen?

Cheers
Detlef


von tobias hofer (Gast)


Lesenswert?

Hallo

Nun habe ich ein bisschen geübt und folgenden code:
(vor und wieder rücktransformation funktioniert)
1
clear
2
clc
3
4
N = 8192;
5
t = linspace(0,1,N);
6
7
figure(1)                    %test funktion zu überprüfung des ergebniss
8
subplot(211)
9
sys=tf([1],[1 0.1 4]);
10
impulse(sys)
11
grid
12
13
w = logspace(-3,3,N);        %transfer function
14
G=1./(-w.^2 + 0.1*j*w + 4);
15
betr=20*log10(abs(G));
16
17
figure(2)                    %bode diagramm
18
semilogx(w,betr)
19
title('transferfucntion')
20
grid
21
22
figure(3)                    %inverse fft von bodediagramm
23
subplot(211);
24
inv_g = ifft(betr,N);
25
plot(t,abs(inv_g));          %ausgabe zur kontrolle, das müsste nun die impulsantwort sein
26
axis([0 0.01 0 20])
27
title('ifft -> das müsste jetzt die impulsantwor sein')
28
grid
29
30
subplot(212);
31
f_g = fft(inv_g,N);          %rücktransformation
32
plot(t*10e2,f_g);            %ausgabe zur kontrolle
33
title('fft -> hier wieder das bodediagramm')
34
grid

Figure 1 ist zur Kontrolle und müsste dann auch das Resultat sein.
Figure 2 ist meine übertragungsfunktion.
Gebe ich nun diese Transferfunktion in meine IFFT() müsste ich als 
Resultat ja die Impulsanwort von fig. 1 bekommen. Als Resulat bekomme 
ich in etwa die Hüllkurve des zu erwartenden Resultat. Die Skallierung 
ist auch Mist.

Hat das evtl. etwas mit der Auflösung der IFFT zu tun, oder Fensterung?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.