Forum: Digitale Signalverarbeitung / DSP Diskrete Hilbert-Transformation


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Paul (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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:

Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

hat niemand einen Tipp für mich?

Warum funktioniert es mit
X = fft(x);
Y = S .* X;
y = real(ifft(Y));

aber nicht mit
s = ifft(S);
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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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
f = 1e6;
T = 1/f;
fs = 1/(10*T/1000)
t = (0:(1/fs):(10*T))';
x = cos(2*pi*f*t);


for i = 1:length(x)
  if i < (length(x)/2)
    S(i,1) = -1j;
  else
    S(i,1) = 1j;
  end;
end;

% builtin hilbert transform
y1 = imag(hilbert(x));

% transform in the frequency domain
X = fft(x);
Y2 = S.*X;
y2 = real(ifft(Y2));

% transform using convolution
s = fftshift(ifft(S));
y3 = conv(s,x);
y3 = y3(1:length(s));

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)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.