Hallo,
ich habe eine Frage zur diskreten Hilbert-Transformation:
https://de.wikipedia.org/wiki/Hilbert-Transformation#Diskrete_Hilbert-Transformation
Warum ist die zeitdiskrete Impulsantwort nicht die abgetastete Version
der zeitkontinuierlichen Impulsantwort? Wie kommt man sonst auf die
zeitdiskrete Impulsantwort? Wie könnte man sich das herleiten?
Freue mich über jegliche Tipps.
Schönen Sonntag wünsche ich.
Paul schrieb:> Warum ist die zeitdiskrete Impulsantwort nicht die abgetastete Version> der zeitkontinuierlichen Impulsantwort?
Das muss im Allgemeinen nicht so sein, und damit auch nicht bei der
Hilberttransformation.
Vom Zeitkontinuierlichen ins Zeitdiskrete gibt es mehrere Wege,
beispielsweise Bilineartransformation, impulsinvariante Transformation,
matched z-Transformation und vermutlich noch weitere.
Diese Transformationen überführen die Pole und Nullstellen eines
zeitkontinuierlichen Systems in die zeitdiskrete Welt, unter
Beibehaltung verschiedener Eigenschaften. Die impulsinvariante
Transformation zb. heisst so, weil die Impulsantwort durch diese
Transformation beibehalten wird. Dafür können beim Frequenzgang
Abweichungen entstehen und die Sprungantwort kann anders aussehen.
Bei der Bilineartransformation wiederum bleibt die Sprungantwort mehr
oder weniger gleich, während die Impulsantwort und der Frequenzgang
abweichen können.
Je nach dem, welche Eigenschaften einem wichtig sind, muss man eine
andere Transformation anwenden und kommt daher auch auf andere
Impulsantworten.
Hallo Tobias,
Danke für die Antwort, das leuchtet mir nun ein.
Aber wie kann man sich dann die zeitdiskrete Impulsantwort der
Hilbert-Transformation herleiten?
Paul schrieb:> Aber wie kann man sich dann die zeitdiskrete Impulsantwort der> Hilbert-Transformation herleiten?
darüber habe ich jetzt nicht nachgeforscht, aber ich vermute dass man
zB. die Impulsantwort der kontinuierlichen Hilberttransformation nehmen
kann und eine der üblichen Umrechnungen ins Diskrete anwendet.
In dem Beispiel hier
https://www.dsprelated.com/freebooks/sasp/Hilbert_Transform_Design_Example.html
wird die Fenstermethode angewandt.
Hallo,
ok, dann akzeptiere ich das mal so. Ich habe nun ein bisschen mit Octave
experimentiert:
Der Plot zeigt in Blau ein cos-förmiges Eingangssignal, in Rot die (per
FFT berechnete) Hilbert-Transformierte dazu und in Gelb die per Faltung
berechnete Hilbert-Transformierte.
Es scheint im Frequenzbereich alles zu funktionieren, jedenfalls sehe
ich die 90° Phasenverschiebung, aber mit der Faltung hat es nicht so
geklappt. Woran könnte das liegen?
Hallo,
hat niemand einen Tipp für mich?
Warum funktioniert es mit
1
X = fft(x);
2
Y = S .* X;
3
y = real(ifft(Y));
aber nicht mit
1
s = ifft(S);
2
z = real(conv(s', x'));
?
Die Multiplikation im Frequenzbereich müsste sich doch in eine Faltung
im Zeitbereich übersetzen lassen, sprich, da müsste das selbe Ergebnis
rauskommen? Wo ist hier mein Fehler?
Vielen Dank für irgendwelche Tipps!
Paul schrieb:> Die Multiplikation im Frequenzbereich müsste sich doch in eine Faltung> im Zeitbereich übersetzen lassen, sprich, da müsste das selbe Ergebnis> rauskommen? Wo ist hier mein Fehler?
stimmt denn dein s überhaupt? es wird natürlich zwangsläufig nie exakt
stimmen, da die Impulsantwort im Zeitbereich zwangsläufig trunkiert
werden muss. Dann, als nächstes ist die Impulsantwort nicht kausal, man
muss also noch, wie in dem dsprelated Link oben genannt, einen Delay
einfügen, womit das Resultat dann auch diesen Delay beinhaltet, sprich
phasenverschoben ist.
Hallo,
naja, das s[n] ist ja einfach ifft(S[k]) und das S[k] verwende ich ja um
per Multiplikation im Frequenzbereich die Hilbert-Transformierte zu
berechnen (und das funktioniert ja, siehe rote Kurve).
Warum geht es per Faltung nicht? Wie viel Delay muss ich einfügen und
warum benötige ich keinen Delay wenn ich es per FFT berechne?
Viele Grüße,
Paul
Hast du denn schon mal die Impulsantwort deines Hilbertfilters
angeschaut? also dein ifft(S). Das liefert nämlich nicht genau das, was
du haben möchtest, denn es liefert das Spektrum zentriert um fs/2 und
nicht um 0.
der code
1
f = 1e6;
2
T = 1/f;
3
fs = 1/(10*T/1000)
4
t = (0:(1/fs):(10*T))';
5
x = cos(2*pi*f*t);
6
7
8
for i = 1:length(x)
9
if i < (length(x)/2)
10
S(i,1) = -1j;
11
else
12
S(i,1) = 1j;
13
end;
14
end;
15
16
% builtin hilbert transform
17
y1 = imag(hilbert(x));
18
19
% transform in the frequency domain
20
X = fft(x);
21
Y2 = S.*X;
22
y2 = real(ifft(Y2));
23
24
% transform using convolution
25
s = fftshift(ifft(S));
26
y3 = conv(s,x);
27
y3 = y3(1:length(s));
28
29
plot(t,x,t,y1,t,y2,t,y3)
liefert 3 gleiche Kurven. Bei der Faltung muss man aufpassen, da das
Faltungsprodukt y3 länger ist als die beiden gefalteten Vektoren s und x
muss man da was abschneiden.
Schaue einmal den Vektor s mit und ohne die Operation fftshift an.
Hallo Tobias,
wow, super, vielen Dank, genau daran lag es, fftshift!
Ok, dass die Funktion fft() ein Spektrum liefert, bei welchem die
positiven Frequenzen am Anfang (also "links") liegen und die negativen
Frequenzen am Ende (rechts von der Mitte), das war mir bekannt.
Aber dass es mit ifft() auch so ein Problem gibt, daran habe ich nicht
gedacht.
Vielen Dank für die Geduld und die Erklärungen!
Gruß,
Paul