This is where navigation should be.

DGT - Discrete Gabor transform

Usage

c=dgt(f,g,a,M);
c=dgt(f,g,a,M,L);
c=dgt(f,g,a,M,'lt',lt);
[c,Ls]=dgt(...);

Input parameters

f Input data.
g Window function.
a Length of time shift.
M Number of channels.
L Length of transform to do.
lt Lattice type (for non-separable lattices).

Output parameters

c \(M \times N\) array of coefficients.
Ls Length of input signal.

Description

dgt(f,g,a,M) computes the Gabor coefficients (also known as a windowed Fourier transform) of the input signal f with respect to the window g and parameters a and M. The output is a vector/matrix in a rectangular layout.

The length of the transform will be the smallest multiple of a and M that is larger than the signal. f will be zero-extended to the length of the transform. If f is a matrix, the transformation is applied to each column. The length of the transform done can be obtained by L=size(c,2)*a;

The window g may be a vector of numerical values, a text string or a cell array. See the help of gabwin for more details.

dgt(f,g,a,M,L) computes the Gabor coefficients as above, but does a transform of length L. f will be cut or zero-extended to length L before the transform is done.

[c,Ls]=dgt(f,g,a,M) or [c,Ls]=dgt(f,g,a,M,L) additionally returns the length of the input signal f. This is handy for reconstruction:

[c,Ls]=dgt(f,g,a,M);
fr=idgt(c,gd,a,Ls);

will reconstruct the signal f no matter what the length of f is, provided that gd is a dual window of g.

[c,Ls,g]=dgt(...) additionally outputs the window used in the transform. This is useful if the window was generated from a description in a string or cell array.

The Discrete Gabor Transform is defined as follows: Consider a window g and a one-dimensional signal f of length L and define \(N=L/a\). The output from c=dgt(f,g,a,M) is then given by:

\begin{equation*} c\left(m+1,n+1\right)=\sum_{l=0}^{L-1}f(l+1)\overline{g(l-an+1)}e^{-2\pi ilm/M} \end{equation*}

where \(m=0,\ldots,M-1\) and \(n=0,\ldots,N-1\) and \(l-an\) is computed modulo L.

Non-separable lattices:

dgt(f,g,a,M,'lt',lt) computes the DGT for a non-separable lattice given by the time-shift a, number of channels M and lattice type lt. Please see the help of matrix2latticetype for a precise description of the parameter lt.

The non-separable discrete Gabor transform is defined as follows: Consider a window g and a one-dimensional signal f of length L and define \(N=L/a\). The output from c=dgt(f,g,a,M,L,lt) is then given by:

\begin{equation*} c\left(m+1,n+1\right)=\sum_{l=0}^{L-1}f(l+1)\overline{g(l-an+1)}e^{-2\pi il(m+w(n))/M} \end{equation*}

where \(m=0,\ldots,M-1\) and \(n=0,\ldots,N-1\) and \(l-an\) are computed modulo L. The additional offset \(w\) is given by \(w(n)=\mod(n\cdot lt_1,lt_2)/lt_2\) in the formula above.

Additional parameters:

dgt takes the following flags at the end of the line of input arguments:

'freqinv' Compute a DGT using a frequency-invariant phase. This is the default convention described above.
'timeinv' Compute a DGT using a time-invariant phase. This convention is typically used in FIR-filter algorithms.

Examples:

In the following example we create a Hermite function, which is a complex-valued function with a circular spectrogram, and visualize the coefficients using both imagesc and plotdgt:

a=10;
M=40;
L=a*M;
h=pherm(L,4); % 4th order hermite function.
c=dgt(h,'gauss',a,M);

% Simple plot: The squared modulus of the coefficients on
% a linear scale
figure(1);
imagesc(abs(c).^2);

% Better plot: zero-frequency is displayed in the middle,
% and the coefficients are show on a logarithmic scale.
figure(2);
plotdgt(c,a,'dynrange',50);

References:

K. Gröchenig. Foundations of Time-Frequency Analysis. Birkhäuser, 2001.

H. G. Feichtinger and T. Strohmer, editors. Gabor Analysis and Algorithms. Birkhäuser, Boston, 1998.