Code covered by the BSD License

DCT and DST (+ inverse) in arbitrary dimension

Damien Garcia (view profile)

07 Dec 2009 (Updated )

Discrete cosine/sine transforms and their inverses

dstmtx(n)
```function c = dstmtx(n)
%DSTMTX Discrete sine transform matrix.
%   D = DSTMTX(N) returns the N-by-N DST transform matrix.  D*A is the DST
%   of the columns of A and D'*A is the inverse DST of the columns of A
%   (when A is N-by-N).
%
%   If A is square, the two-dimensional DST of A can be computed as D*A*D'.
%   This computation is sometimes faster than using DSTN, especially if you
%   are computing large number of small DST's, because D needs to be
%   determined only once.
%
%   Class Support
%   -------------
%   N is an integer scalar of class double. D is returned as a matrix of
%   class double.
%
%   Example
%   -------
%       D = dstmtx(size(A,1));
%       dst = D*A*D';
%       figure, imshow(dst)
%
%
%   -- Damien Garcia -- 2009/11
%   -- Adapted from DCTMTX --
%   website: <a
%   href="matlab:web('http://www.biomecardio.com')">www.BiomeCardio.com</a>

%   I/O Spec
%      N - input must be double
%      D - output DCT transform matrix is double

iptchecknargin(1,1,nargin,mfilename);
iptcheckinput(n,{'double'},{'integer' 'scalar'},mfilename,'n',1);

[cc,rr] = meshgrid(0:n-1);

c = sqrt(2 / n) * sin(pi * (2*cc + 1) .* (rr + 1) / (2 * n));
c(n,:) = c(n,:) / sqrt(2);
```