const MtxDCT = (function(N) {
var dct = new Array(N);
for(var i=0; i<N; i++) {
var Ci = Math.sqrt(i ? 2/N : 1/N);
dct[i] = new Array(N);
for(var j=0; j<N; j++)
dct[i][j] = Ci*Math.cos(Math.PI*(j+0.5)*i/N);
}
return dct;
})(8);
const MtxIDCT = (function(dct) {
var N = dct.length;
var idct = new Array(N);
for(var i=0; i<N; i++) {
idct[i] = new Array(N);
for(var j=0; j<N; j++)
idct[i][j] = dct[j][i];
}
return idct;
})(MtxDCT);
function Mul(left, right) {
if (left.length !== right.length)
throw new Error('left.length !== right.length');
var N = left.length;
var Y = new Array(N);
for(var i=0; i<N; i++) {
Y[i] = new Array(N);
for(var j=0; j<N; j++) {
Y[i][j] = 0;
for(var k=0; k<N; k++)
Y[i][j] += left[i][k]*right[k][j];
}
}
return Y;
}
function INT(block) {
var Y = new Array(block.length);
for(var i=0; i<block.length; i++) {
Y[i] = new Array(block[i].length);
for(var j=0; j<block[i].length; j++)
Y[i][j] = Math.round(block[i][j]);
}
return Y;
}
module.exports = {
F: block => Mul(Mul(MtxDCT, block), MtxIDCT),
f: block => Mul(Mul(MtxIDCT, block), MtxDCT),
INT
}
////////////////////// TEST ////////////////////////////
const dct = require('./dct');
const D = [
[ 36, 242, 131, 90, 35, 19, 156, 26],
[ 32, 176, 160, 189, 198, 45, 132, 86],
[ 6, 253, 191, 99, 246, 223, 196, 28],
[234, 61, 98, 159, 141, 134, 221, 90],
[102, 221, 98, 253, 167, 72, 81, 78],
[ 46, 8, 243, 124, 119, 170, 166, 212],
[ 91, 187, 112, 186, 210, 228, 125, 114],
[ 71, 117, 207, 188, 66, 192, 27, 112]
];
console.log(D);
console.log(dct.INT(dct.f(dct.F(D))));
DCT
原文作者:一͛世͛珍͛藏͛
原文地址: https://segmentfault.com/a/1190000010297696
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://segmentfault.com/a/1190000010297696
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。