Forum: Digitale Signalverarbeitung / DSP / Machine Learning Diskrete Hilbert-Transformation


von Paul (Gast)


Lesenswert?

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.

von Tobias P. (hubertus)


Lesenswert?

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.

von Paul (Gast)


Lesenswert?

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?

von Tobias P. (hubertus)


Lesenswert?

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.

von Paul (Gast)


Angehängte Dateien:

Lesenswert?

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?

von Paul (Gast)


Lesenswert?

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!

von Tobias P. (hubertus)


Lesenswert?

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.

von Paul (Gast)


Lesenswert?

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

von Tobias P. (hubertus)


Lesenswert?

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.

von Paul (Gast)


Lesenswert?

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