Discrete cosine transform.
Inverse discrete cosine transform.
X = dct(A) X = dct(A, sign) X = dct(A, sign, selection) X = dct(A, sign, dims, incr) X = dct(.., option) X = idct(A) X = idct(A, selection) X = idct(A, dims, incr) X = idct(.., option)
a real or complex vector or real or complex array (vector, matrix or N-D array.
A
.1
or
-1
. Select direct or inverse
transform. The default value is -1
(direct transform).A
array
dimensions. See the Description part for details.Each element must be a divisor
of the total number of elements of A
.
The product of the elements must be less than the total
number of elements of A
.
incr
must have the same number of
elements than dims
.
Each element must be a divisor of the total number of
elements of A
.
The incr
elements must be in strictly
increasing order.
"dct1"
, "dct2"
,
"dct4"
or "dct"
for
direct transform and "dct1"
,
"dct3"
, "dct4"
or
"idct"
for inverse transform. The
default value is "dct"
for direct
transform and "idct"
for inverse
transform. See the Description part for details.This function realizes direct or
inverse 1-D or N-D Discrete Cosine Transforms with shift depending on the
option
parameter value. For a 1-D array A
of length n:
For "dct1"
the function computes the unnormalized DCT-I transform:
For "dct2"
the function computes the unnormalized DCT-II transform:
For "dct3"
the function computes the unnormalized DCT-III transform:
For "dct4"
the function computes the unnormalized DCT-IV transform:
For "dct"
the function computes the normalized DCT-II transform:
For "idct"
the function computes the normalized DCT-III transform:
The multi-dimensional DCT transforms , in general, are the separable product of the given 1d transform along each dimension of the array. For unnormalized transforms , computing the forward followed by the backward/inverse multi-dimensional transform will result in the original array scaled by the product of the dimension sizes.
The normalized multi-dimensional DCT transform of an array
A
with dimensions n1,
n2, …, np is given by
The normalized multi-dimensional DCT inverse transform of an
array A
with dimensions n1,
n2, …, np is given by
X=dct(A,-1 [,option])
or
X=dct(A [,option])
gives a direct
transform according to the option value. The default is normalized DCT-II direct transform.
If A
is a vector (only one
dimension greater than 1) a 1-d transform is performed
and in the other cases a n-dimensional transform is
done.
(the -1
argument refers
to the sign of the exponent..., NOT to
"inverse"),
X=dct(A,1 [,option])
or
X=idct(A [,option])
performs the inverse
transform.
If A
is a vector (only one
dimension greater than 1) a 1-d transform is performed
and in the other cases a n-dimensional transform is
done.
X=dct(A,sign,selection [,option])
allows to perform efficiently all direct or inverse
dct of the "slices" of A
along
selected dimensions.
For example, if A
is a 3-D array
X=dct(A,-1,2)
is equivalent to:
and X=dct(A,-1,[1 3])
is equivalent to:
X=dct(A,sign,dims,incr)
is
an old syntax that also allows to perform all direct or
inverse dct of the slices of A
along
selected dimensions.
For example, if A
is an array with
n1*n2*n3
elements
X=dct(A,-1,n1,1)
is equivalent to
X=dct(matrix(A,[n1,n2,n3]),-1,1)
.
and X=dct(A,-1,[n1 n3],[1 n1*n2])
is equivalent to
X=dct(matrix(A,[n1,n2,n3]),-1,[1,3])
.
Remark: function automatically stores his last parameters in memory to re-use it in a second time. This improves greatly the time computation when consecutives calls (with same parameters) are performed.
It is possible to go further in dct optimization using get_fftw_wisdom, set_fftw_wisdom functions.
This function uses the fftw3 library.
1-D dct
//Frequency components of a signal //---------------------------------- // build a sampled at 1000hz containing pure frequencies // at 50 and 70 Hz sample_rate = 1000; t = 0:1/sample_rate:0.6; N = size(t,'*'); //number of samples s = sin(2*%pi*50*t) + sin(2*%pi*70*t+%pi/4) + grand(1,N,'nor',0,1); d = dct(s); // zero low energy components d(abs(d)<1) = 0; size(find(d<>0), '*') //only 30 non zero coefficients out of 600 clf plot(s,'b') plot(dct(d,1),'r') | ![]() | ![]() |
2-D dct
function z=__milk_drop(x, y) sq = x.^2+y.^2; z = exp( exp(-sq).*(exp(cos(sq).^20)+8*sin(sq).^20+2*sin(2*(sq)).^8) ); endfunction x = -2:0.1:2; [X,Y] = ndgrid(x,x); A = __milk_drop(X,Y); d = dct(A); d(abs(d)<1)=0; size(find(d<>0),'*') A1 = dct(d,1); clf gcf().color_map = graycolormap(128); subplot(121), grayplot(x,x,A) subplot(122), grayplot(x,x,A1) | ![]() | ![]() |
Matteo Frigo and Steven G. Johnson, "FFTW Documentation" http://www.fftw.org/#documentation