#include #include #define DCT_SIZE 8 #define TOTAL_DCT_BLOCKS 100 #define element_t int16_t #define real_t double #define DCT_COS_TABLE_SIZE 32 // DCT_COS_TABLE[i] = cos(i * PI / (2 * DCT_SIZE)) #define DCT_COS_TABLE (double[DCT_COS_TABLE_SIZE]) { \ 1, 0.980785, 0.92388, 0.83147, 0.707107, 0.55557, 0.382683, \ 0.19509, 0, -0.19509, -0.382683, -0.55557, -0.707107, -0.83147, \ -0.92388, -0.980785, -1, -0.980785, -0.92388, -0.83147, -0.707107, \ -0.55557, -0.382683, -0.19509, 0, 0.19509, 0.382683, 0.55557, \ 0.707107, 0.83147, 0.92388, 0.980785 } #define INV_SQRTDCT_SIZE (real_t) 0.3535533906 #define SQRT2_INV_SQRTDCT (real_t) 0.5 void dct_2d(element_t* matrix_in, element_t* matrix_out) { real_t cu, cv, sum, cos_u, cos_v; int u, v, i, j; for (u = 0; u < DCT_SIZE; u++) { cu = u == 0 ? INV_SQRTDCT_SIZE : SQRT2_INV_SQRTDCT; for (v = 0; v < DCT_SIZE; v++) { cv = v == 0 ? INV_SQRTDCT_SIZE : SQRT2_INV_SQRTDCT; sum = 0; for (i = 0; i < DCT_SIZE; i++) { cos_u = DCT_COS_TABLE[((2 * i + 1) * u) % DCT_COS_TABLE_SIZE]; for (j = 0; j < DCT_SIZE; j++) { cos_v = DCT_COS_TABLE[((2 * j + 1) * v) % DCT_COS_TABLE_SIZE]; sum += matrix_in[i * DCT_SIZE + j] * cos_u * cos_v; } } matrix_out[u * DCT_SIZE + v] = cu * cv * sum; } } } void populate_mock_matrices(element_t** mock_matrices) { for (long i = 0; i < TOTAL_DCT_BLOCKS; i++) { for (int j = 0; j < DCT_SIZE; j++) { for (int k = 0; k < DCT_SIZE; k++) { mock_matrices[i][j * DCT_SIZE + k] = j + k; } } } } element_t** generate_mock_matrices() { element_t **mock_matrices = (element_t **) malloc(TOTAL_DCT_BLOCKS * sizeof(element_t*)); for (int i = 0; i < TOTAL_DCT_BLOCKS; i++) { mock_matrices[i] = (element_t *) malloc(DCT_SIZE * DCT_SIZE * sizeof(element_t)); } populate_mock_matrices(mock_matrices); return mock_matrices; } void free_mock_matrices(element_t** mock_matrices) { for (int i = 0; i < TOTAL_DCT_BLOCKS; i++) { free(mock_matrices[i]); } free(mock_matrices); } int main() { element_t **mock_matrices = generate_mock_matrices(); int i; element_t* matrix_out = (element_t *) malloc(DCT_SIZE * DCT_SIZE * sizeof(element_t)); for(i = 0; i < TOTAL_DCT_BLOCKS; i++) { dct_2d(mock_matrices[i], matrix_out); } free_mock_matrices(mock_matrices); free(matrix_out); return 0; }