DCT

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,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,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))));

相关文章

这篇文章主要介绍“基于nodejs的ssh2怎么实现自动化部署”的...
本文小编为大家详细介绍“nodejs怎么实现目录不存在自动创建...
这篇“如何把nodejs数据传到前端”文章的知识点大部分人都不...
本文小编为大家详细介绍“nodejs如何实现定时删除文件”,内...
这篇文章主要讲解了“nodejs安装模块卡住不动怎么解决”,文...
今天小编给大家分享一下如何检测nodejs有没有安装成功的相关...