view main/signal/inst/dst.m @ 2791:bdf52a4c6969 octave-forge

Discrete sine transform, type I
author pkienzle
date Tue, 05 Dec 2006 19:27:31 +0000
parents
children 5bf69b6cc369
line wrap: on
line source

## y = dst (x, n)
##    Computes the disrete sine transform of x.  If n is given, then
##    x is padded or trimmed to length n before computing the transform.
##    If x is a matrix, compute the transform along the columns of the
##    the matrix. The transform is faster if x is real-valued and even
##    length.
##
## The discrete sine transform X of x can be defined as follows:
##
##                     N
##   X[k] = sqrt(2/N) sum x[n] sin (pi n k / N ),  k = 1, ..., N
##                    n=1
##
## See also: idst

## Author: Paul Kienzle
## 2006-12-08
##   * initial release
function y = dst (x, n)

  if (nargin < 1 || nargin > 2)
    usage ("y = dst(x [, n])");
  endif

  transpose = (rows (x) == 1);
  if transpose, x = x (:); endif

  [nr, nc] = size (x);
  if nargin == 1
    n = nr;
  elseif n > nr
    x = [ x ; zeros(n-nr,nc) ];
  elseif n < nr
    x (nr-n+1 : n, :) = [];
  endif

  y = fft ([ zeros(1,nc); x ; zeros(1,nc); -flipud(x) ])/-2j;
  y = y(2:nr+1,:);
  if isreal(x), y = real (y); endif

  ## Compare directly against the slow transform
  # y2 = x;
  # w = pi*[1:n]'/(n+1);
  # for k = 1:n, y2(k) = sum(x(:).*sin(k*w)); end
  # y = [y,y2];

  if transpose, y = y.'; endif


endfunction


%!test
%! x = log(linspace(0.1,1,32));
%! y = dst(x);
%! assert(y(3), sum(x.*sin(3*pi*[1:32]/33)), 100*eps)