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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.