# dct

Discrete cosine transform (DCT)

## Syntax

`y = dct(x)y = dct(x,n)`

## Description

`y = dct(x)` returns the unitary discrete cosine transform of `x`,

`$y\left(k\right)=w\left(k\right)\sum _{n=1}^{N}x\left(n\right)\mathrm{cos}\left(\frac{\pi }{2N}\left(2n-1\right)\left(k-1\right)\right),\text{ }k=1,2,\dots ,N,$`

where

`$w\left(k\right)=\left\{\begin{array}{ll}\frac{1}{\sqrt{N}},\hfill & k=1,\hfill \\ \sqrt{\frac{2}{N}},\hfill & 2\le k\le N,\hfill \end{array}$`

N is the length of `x`, and `x` and `y` are the same size. If `x` is a matrix, `dct` transforms its columns. The series is indexed from n = 1 and k = 1 instead of the usual n = 0 and k = 0 because MATLAB® vectors run from 1 to N instead of from 0 to N – 1.

`y = dct(x,n)` pads or truncates `x` to length `n` before transforming.

The DCT is closely related to the discrete Fourier transform. You can often reconstruct a sequence very accurately from only a few DCT coefficients, a useful property for applications requiring data reduction.

## Examples

collapse all

### Energy Stored in DCT Coefficients

Find how many DCT coefficients represent 99% of the energy in a sequence.

```x = (1:100) + 50*cos((1:100)*2*pi/40); X = dct(x); [XX,ind] = sort(abs(X),'descend'); i = 1; while norm(X(ind(1:i)))/norm(X)<0.99 i = i + 1; end Needed = i; ```

Reconstruct the signal and compare to the original.

```X(ind(Needed+1:end)) = 0; xx = idct(X); plot([x;xx]') legend('Original',['Reconstructed, N = ' int2str(Needed)], ... 'Location','SouthEast') ```

## References

[1] Jain, A. K. Fundamentals of Digital Image Processing. Englewood Cliffs, NJ: Prentice-Hall, 1989.

[2] Pennebaker, W. B., and J. L. Mitchell. JPEG Still Image Data Compression Standard. New York: Van Nostrand-Reinhold, 1993, chap. 4.