Gabor-Transformation mit MATLAB

18/10/2008 - 18:54 von Andreas Weishaupt | Report spam
Hallo

Ich sollte die Gabor-Transformation mittels MATLAB implementieren, ich
darf nicht eine bereits existierende Funktion und auch nicht die SFT
brauchen. Habe sie also mittels Faltung implementiert, aber sie scheint
überhaupt nicht zu funktionieren (sehr seltsame outputs) und ich komme
nicht draus, weshalb sie nicht funktioniert bzw. was ich falsch gemacht
habe.

Soweit ich richtig verstanden habe, kann ich die Transformation mittels
Faltung berechnen, d.h.

G_f (omega, t) = f(t) * g_omega(t) (Sternchen für Faltung)

wobei g_omega(t) = 1/2*sqrt(sigma*pi) * exp (-t^2/(4*sigma))
das Gauss-Fenster darstellt.

Nun habe ich dies folgendermassen implementiert:

%-- Code-Schnipsel
% omega ist ein Zeilen-Vektor mit diskreten Frequenzen,
% z.B. omega = linspace(-3, 3, 100)
function [] = timeFreq (signal, sigma, omega)
% Transformation durchführen, sollte G_f-Matrix zurückgeben
gabor = gaborTransformation (signal, sigma, omega);

% Transformation plotten
image (abs (gabor));

% Transformations-Methode (nested)
function G = gaborTransformation (signal, sigma, omega)
G = zeros (length(omega), length(signal));

% für das Gauss-Fenster
tau = linspace (-pi, pi, length(signal));

% eine Transformation pro diskrete Frequenz
for i=1:length(omega)
gaussian = 1/(2*sqrt(pi*sigma)) .* exp (-tau.^2/(4*omega(i)));
gaborFilter = gaussian .* exp (j*omega(i).*tau);

% bin mir nicht sicher, ob der fftshift nötig ist,
% denke aber schon, da tau von -pi nach pi geht
GPart = conv (signal, fftshift(gaborFilter));

% zu langen Vektor kürzen
GPart = GPart(1:length(signal));

% in resultierende Matrix einfügen
G(i,:) = exp (-j*omega(i).*tau) .* GPart;
end
end
end
% Ende Code-Schnipsel

Wenn ich das ganze teste mit z.B.

t = linspace (0, 20, 200);
signal = cos(t);
sigma = 1;
omega = linspace (-2, 2, 20);
timeFreq (signal, sigma, omega);

kommt überhaupt nichts Schlaues heraus (schön buntes Fenster)... Sieht
ihr, wo ich den Denkfehler mache?

Vielen Dank für eure Hilfe

Andreas
 

Lesen sie die antworten

#1 Christian Gollwitzer
18/10/2008 - 22:54 | Warnen spam
Andreas Weishaupt schrieb:
Ich sollte die Gabor-Transformation mittels MATLAB implementieren, ich
darf nicht eine bereits existierende Funktion und auch nicht die SFT
brauchen. Habe sie also mittels Faltung implementiert, aber sie scheint
überhaupt nicht zu funktionieren (sehr seltsame outputs) und ich komme
nicht draus, weshalb sie nicht funktioniert bzw. was ich falsch gemacht
habe.

Soweit ich richtig verstanden habe, kann ich die Transformation mittels
Faltung berechnen, d.h.

G_f (omega, t) = f(t) * g_omega(t) (Sternchen für Faltung)

wobei g_omega(t) = 1/2*sqrt(sigma*pi) * exp (-t^2/(4*sigma))
das Gauss-Fenster darstellt.


*exp(-jwt), aber das scheint unten zu stimmen.


Nun habe ich dies folgendermassen implementiert:

%-- Code-Schnipsel
% omega ist ein Zeilen-Vektor mit diskreten Frequenzen,
% z.B. omega = linspace(-3, 3, 100)
function [] = timeFreq (signal, sigma, omega)
% Transformation durchführen, sollte G_f-Matrix zurückgeben
gabor = gaborTransformation (signal, sigma, omega);

% Transformation plotten
image (abs (gabor));

% Transformations-Methode (nested)
function G = gaborTransformation (signal, sigma, omega)
G = zeros (length(omega), length(signal));

% für das Gauss-Fenster
tau = linspace (-pi, pi, length(signal));



Das sieht verdàchtig aus. Die Breite des Gaußfensters skaliert mit
sigma. (Du musst es so breit machen, dass keine wesentlichen Anteile
außerhalb von tau liegen. Theoretisch "unendlich" groß, praktisch
f*sigma, suche Dir anhand eines Plots von gaussian einen vernünftigen
Faktor f.)



% eine Transformation pro diskrete Frequenz
for i=1:length(omega)
gaussian = 1/(2*sqrt(pi*sigma)) .* exp (-tau.^2/(4*omega(i)));



Hier auch. Vergleiche diese Zeile mit Deiner Formel oben.

gaborFilter = gaussian .* exp (j*omega(i).*tau);

% bin mir nicht sicher, ob der fftshift nötig ist,
% denke aber schon, da tau von -pi nach pi geht
GPart = conv (signal, fftshift(gaborFilter));



Hab jetzt nicht nachgesehen, wie conv und fftshift funktionieren.

% zu langen Vektor kürzen
GPart = GPart(1:length(signal));

% in resultierende Matrix einfügen
G(i,:) = exp (-j*omega(i).*tau) .* GPart;
end
end
end



Christian

Ähnliche fragen