return math.Sqrt2
}
+var cosines [32]float64 // cosines[k] = cos(π/2 * k/8)
+
+func init() {
+ for k := range cosines {
+ cosines[k] = math.Cos(math.Pi * float64(k) / 16)
+ }
+}
+
// slowFDCT performs the 8*8 2-dimensional forward discrete cosine transform:
//
// dst[u,v] = (1/8) * Σ_x Σ_y alpha(u) * alpha(v) * src[x,y] *
for y := 0; y < 8; y++ {
for x := 0; x < 8; x++ {
sum += alpha(u) * alpha(v) * float64(b[8*y+x]) *
- math.Cos(math.Pi*float64((2*x+1)*u)/16) *
- math.Cos(math.Pi*float64((2*y+1)*v)/16)
+ cosines[((2*x+1)*u)%32] *
+ cosines[((2*y+1)*v)%32]
}
}
dst[8*v+u] = sum / 8
for v := 0; v < 8; v++ {
for u := 0; u < 8; u++ {
sum += alpha(u) * alpha(v) * float64(b[8*v+u]) *
- math.Cos(math.Pi*float64((2*x+1)*u)/16) *
- math.Cos(math.Pi*float64((2*y+1)*v)/16)
+ cosines[((2*x+1)*u)%32] *
+ cosines[((2*y+1)*v)%32]
}
}
dst[8*y+x] = sum / 8