dct method

List<double> dct (
  1. List<double> x,
  2. bool norm
)

Returns the discrete cosinus transform.

Uses the scipy type-II dct implementation:

y(k) = 2 * sum{n ∈ [0,N-1]} x(n) * cos(pi * k * (2n+1)/(2 * N)), 0 <= k < N.

if norm is set to true apply a scaling factor f to y(k) as followed:

  • f = sqrt(1/(4*N)) if k = 0
  • f = sqrt(1/(2*N)) otherwise.

Implementation

static List<double> dct(List<double> x, bool norm){
  var result = List<double>(x.length);
  var N = x.length;
  var sum = 0.0;
  var scaling_factor0 = sqrt(1 / (4 * N));
  var scaling_factor = sqrt(1 / (2 * N));
  for (var k = 0; k < N; k++){
    sum = 0.0;
    for (var n = 0; n < N ; n++) {
      sum += x[n] * cos(pi * k * (2 * n + 1)/(2 * N));
    }
    sum *= 2;
    if (norm){
      if (k == 0){
        sum = sum * scaling_factor0;
      } else {
        sum = sum * scaling_factor;
      }
    }
    result[k] = sum;
  }
  return result;
}