dct method
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;
}