📄 dct.java
字号:
package jpeg;
import java.lang.*;
import java.util.*;
import jcp.*;
/**
* DCT.java
* A component that performs a Discrete Cosine Transform.
*
* Input(s):
* in - Takes an 8x8 matrix of integers as input.
* Ouput(s):
* out - Outputs an 8x8 matrix of integers that is the DCT transform of the input.
*
* @see IntMatrix
*/
public class DCT extends SynchComponent
{
// Block size
private final static int N = 8;
// DCT coefficients
private double[][] c;
private Port in_p, out_p;
public DCT() {
setName("DCT");
in_p = addPort(true,"in");
out_p = addPort(false,"out");
c = new double[N][N];
initMatrix();
}
public void go(Port port) {
Object s = port.signal();
if (s instanceof IntMatrix) {
int[][] matrix = ((IntMatrix)s).get_matrix();
emit(new IntMatrix(forwardDCT(matrix)),out_p);
}
}
int output[][] = new int[N][N];
double temp[][] = new double[N][N];
double temp1;
private int[][] forwardDCT(int input[][])
{
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
temp[i][j] = 0.0;
for (int k = 0; k < N; k++) {
temp[i][j] += (((int)(input[i][k]) - 128) * c[j][k]);
}
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
temp1 = 0.0;
for (int k = 0; k < N; k++) {
temp1 += (c[i][k] * temp[k][j]);
}
output[i][j] = (int)Math.round(temp1);
}
}
return output;
}
private void initMatrix()
{
for (int i = 0; i < N; i++) {
double nn = (double)(N);
c[0][i] = 1.0 / Math.sqrt(nn);
}
for (int i = 1; i < N; i++) {
for (int j = 0; j < N; j++) {
double jj = (double)j;
double ii = (double)i;
c[i][j] = Math.sqrt(2.0/8.0) * Math.cos(((2.0 * jj + 1.0) * ii * Math.PI) / (2.0 * 8.0));
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -