-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdct.cpp
135 lines (116 loc) · 4.57 KB
/
dct.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/*******************************************************************************
Vendor: Xilinx
Associated Filename: dct.cpp
Purpose: Vivado HLS tutorial example
Device: All
Revision History: March 1, 2013 - initial release
*******************************************************************************
Copyright 2008 - 2013 Xilinx, Inc. All rights reserved.
This file contains confidential and proprietary information of Xilinx, Inc. and
is protected under U.S. and international copyright and other intellectual
property laws.
DISCLAIMER
This disclaimer is not a license and does not grant any rights to the materials
distributed herewith. Except as otherwise provided in a valid license issued to
you by Xilinx, and to the maximum extent permitted by applicable law:
(1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL FAULTS, AND XILINX
HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY,
INCLUDING BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-INFRINGEMENT, OR
FITNESS FOR ANY PARTICULAR PURPOSE; and (2) Xilinx shall not be liable (whether
in contract or tort, including negligence, or under any other theory of
liability) for any loss or damage of any kind or nature related to, arising under
or in connection with these materials, including for any direct, or any indirect,
special, incidental, or consequential loss or damage (including loss of data,
profits, goodwill, or any type of loss or damage suffered as a result of any
action brought by a third party) even if such damage or loss was reasonably
foreseeable or Xilinx had been advised of the possibility of the same.
CRITICAL APPLICATIONS
Xilinx products are not designed or intended to be fail-safe, or for use in any
application requiring fail-safe performance, such as life-support or safety
devices or systems, Class III medical devices, nuclear facilities, applications
related to the deployment of airbags, or any other applications that could lead
to death, personal injury, or severe property or environmental damage
(individually and collectively, "Critical Applications"). Customer asresultes the
sole risk and liability of any use of Xilinx products in Critical Applications,
subject only to applicable laws and regulations governing limitations on product
liability.
THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE AT
ALL TIMES.
*******************************************************************************/
#include "dct.h"
void dct_1d(dct_data_t src[DCT_SIZE], dct_data_t dst[DCT_SIZE])
{
unsigned int k, n;
int tmp;
const dct_data_t dct_coeff_table[DCT_SIZE][DCT_SIZE] = {
#include "dct_coeff_table.txt"
};
DCT_Outer_Loop:
for (k = 0; k < DCT_SIZE; k++) {
DCT_Inner_Loop:
for(n = 0, tmp = 0; n < DCT_SIZE; n++) {
int coeff = (int)dct_coeff_table[k][n];
tmp += src[n] * coeff;
}
dst[k] = DESCALE(tmp, CONST_BITS);
}
}
void dct_2d(dct_data_t in_block[DCT_SIZE][DCT_SIZE],
dct_data_t out_block[DCT_SIZE][DCT_SIZE])
{
dct_data_t row_outbuf[DCT_SIZE][DCT_SIZE];
dct_data_t col_outbuf[DCT_SIZE][DCT_SIZE], col_inbuf[DCT_SIZE][DCT_SIZE];
unsigned i, j;
// DCT rows
Row_DCT_Loop:
for(i = 0; i < DCT_SIZE; i++) {
dct_1d(in_block[i], row_outbuf[i]);
}
// Transpose data in order to re-use 1D DCT code
Xpose_Row_Outer_Loop:
for (j = 0; j < DCT_SIZE; j++)
Xpose_Row_Inner_Loop:
for(i = 0; i < DCT_SIZE; i++)
col_inbuf[j][i] = row_outbuf[i][j];
// DCT columns
Col_DCT_Loop:
for (i = 0; i < DCT_SIZE; i++) {
dct_1d(col_inbuf[i], col_outbuf[i]);
}
// Transpose data back into natural order
Xpose_Col_Outer_Loop:
for (j = 0; j < DCT_SIZE; j++)
Xpose_Col_Inner_Loop:
for(i = 0; i < DCT_SIZE; i++)
out_block[j][i] = col_outbuf[i][j];
}
void read_data(short input[N], short buf[DCT_SIZE][DCT_SIZE])
{
int r, c;
RD_Loop_Row:
for (r = 0; r < DCT_SIZE; r++) {
RD_Loop_Col:
for (c = 0; c < DCT_SIZE; c++)
buf[r][c] = input[r * DCT_SIZE + c];
}
}
void write_data(short buf[DCT_SIZE][DCT_SIZE], short output[N])
{
int r, c;
WR_Loop_Row:
for (r = 0; r < DCT_SIZE; r++) {
WR_Loop_Col:
for (c = 0; c < DCT_SIZE; c++)
output[r * DCT_SIZE + c] = buf[r][c];
}
}
void dct(short input[N], short output[N])
{
short buf_2d_in[DCT_SIZE][DCT_SIZE];
short buf_2d_out[DCT_SIZE][DCT_SIZE];
// Read input data. Fill the internal buffer.
read_data(input, buf_2d_in);
dct_2d(buf_2d_in, buf_2d_out);
// Write out the results.
write_data(buf_2d_out, output);
}