文章目录
- 1. $DCT$变换
- 1.1. $DCT$ 和 $IDCT$
- 1.2. $DCT$是一泛函,而且是线性泛函
- 1.3. $fig$所在空间$X$,$X$不是线性空间,$X$==有界==
- 1.4. $X$为==拓扑空间==
- 1.5. $FIG$所在的值域是什么
- 1.6. 误差范围
- 1.7. $DCT$性质
- 1.8. ==使用张量和矩阵重新表达==
- 1.9. $DCT-1D$变换的性质
- 1.10. 线性变换
- 2. $DCT$算法
- 3. $DCT$并行算法
- 4. FPGA考虑
- 5. 参考文献
1. D C T DCT DCT变换
1.1. D C T DCT DCT 和 I D C T IDCT IDCT
离散余弦变换
D C T : f i g ∣ → F I G (1) DCT:fig|\rightarrow FIG \tag{1} DCT:fig∣→FIG(1)
1.2. D C T DCT DCT是一泛函,而且是线性泛函
1.2.1. 泛函是什么
1.2.1.1. 函数到函数的映射
1.2.1.2. f i g fig fig是函数吗?
是
a. 一维
D
C
T
DCT
DCT
f
i
g
=
n
∈
{
0
,
1
,
.
.
.
,
N
−
1
}
=
>
a
n
∈
X
=
{
0...255
}
(21)
fig=n\in\{0,1,...,N-1\}=>a_n\in X=\{0...255\} \tag{21}
fig=n∈{0,1,...,N−1}=>an∈X={0...255}(21)
b. 二维
D
C
T
DCT
DCT
f
i
g
=
i
,
j
∈
{
0
,
1
,
.
.
.
,
N
−
1
}
=
>
a
i
j
∈
X
⨂
X
(22)
fig=i,j\in\{0,1,...,N-1\}=>a_{ij}\in X\bigotimes X \tag{22}
fig=i,j∈{0,1,...,N−1}=>aij∈X⨂X(22)
1.2.1.2.1. 向量和矩阵是函数吗?
1.2.2. 线性泛函又是什么
原像做线性运算,其像也做线性变换
1.3. f i g fig fig所在空间 X X X, X X X不是线性空间, X X X有界
因为
f
i
g
1
+
f
i
g
2
fig_1+fig_2
fig1+fig2可能超过了
X
X
X的界限
∥
X
∥
=
x
1
2
+
x
2
2
+
x
3
2
(23)
\begin{Vmatrix}X\end{Vmatrix}=\sqrt{x_1^2+x_2^2+x_3^2} \tag{23}
∥∥X∥∥=x12+x22+x32(23)
1.4. X X X为拓扑空间
具有度量属性
1.4.1. X X X不是紧集
任意两点的中点也属于该集合
1.5. F I G FIG FIG所在的值域是什么
1.6. 误差范围
1.7. D C T DCT DCT性质
1.7.1. D C T ( a ∗ f i g ) = a ∗ D C T ( f i g ) DCT\begin{pmatrix}a*fig\end{pmatrix}=a*DCT\begin{pmatrix} fig \end{pmatrix} DCT(a∗fig)=a∗DCT(fig)
线性泛函
1.7.2. D C T ( f i g 1 + f i g 2 ) = D C T ( f i g 1 ) + D C T ( f i g 2 ) DCT\begin{pmatrix}fig_1+fig_2\end{pmatrix}=DCT\begin{pmatrix} fig_1 \end{pmatrix}+DCT\begin{pmatrix} fig_2 \end{pmatrix} DCT(fig1+fig2)=DCT(fig1)+DCT(fig2)
1.8. 使用张量和矩阵重新表达
消除累加符号
1.8.1. 张量表示
1.8.1.1. 矩阵是几阶张量?
1.8.1.1.1. ref [5] p59
n n n维空间中任一种形式的二阶张量分量均含有 n × n n\times n n×n个分量,可以按通常的方法列出
1.8.1.2. 张量的相似性
1.8.2. 矩阵表示
1.8.2.1. Ref [2]
Formula (1) can also be expressed in a matrix form as:
F
=
G
.
f
.
G
T
(41)
F=G.f.G^T \tag{41}
F=G.f.GT(41)
f
=
G
T
.
F
.
G
(42)
f=G^T.F.G \tag{42}
f=GT.F.G(42)
其中
F
=
[
F
(
0
,
0
)
F
(
0
,
1
)
⋯
F
(
0
,
7
)
F
(
1
,
0
)
F
(
1
,
1
)
⋯
F
(
1
,
7
)
⋯
⋯
⋯
⋯
F
(
7
,
0
)
F
(
7
,
1
)
⋯
F
(
7
,
7
)
]
(43)
F=\begin{bmatrix} F(0,0)&F(0,1)&\cdots&F(0,7)\\ F(1,0)&F(1,1)&\cdots&F(1,7)\\ \cdots&\cdots&\cdots&\cdots\\ F(7,0)&F(7,1)&\cdots&F(7,7) \end{bmatrix} \tag{43}
F=⎣⎢⎢⎡F(0,0)F(1,0)⋯F(7,0)F(0,1)F(1,1)⋯F(7,1)⋯⋯⋯⋯F(0,7)F(1,7)⋯F(7,7)⎦⎥⎥⎤(43)
f
=
[
f
(
0
,
0
)
f
(
0
,
1
)
⋯
f
(
0
,
7
)
f
(
1
,
0
)
f
(
1
,
1
)
⋯
f
(
1
,
7
)
⋯
⋯
⋯
⋯
f
(
7
,
0
)
f
(
7
,
1
)
⋯
f
(
7
,
7
)
]
(44)
f=\begin{bmatrix} f(0,0)&f(0,1)&\cdots&f(0,7)\\ f(1,0)&f(1,1)&\cdots&f(1,7)\\ \cdots&\cdots&\cdots&\cdots\\ f(7,0)&f(7,1)&\cdots&f(7,7) \end{bmatrix} \tag{44}
f=⎣⎢⎢⎡f(0,0)f(1,0)⋯f(7,0)f(0,1)f(1,1)⋯f(7,1)⋯⋯⋯⋯f(0,7)f(1,7)⋯f(7,7)⎦⎥⎥⎤(44)
G = 1 2 [ 1 2 1 2 ⋯ 1 2 cos π 16 cos 3 π 16 ⋯ cos 15 π 16 ⋯ ⋯ ⋯ ⋯ cos 7 π 16 cos 21 π 16 ⋯ cos 105 π 16 ] (45) G=\frac{1}{2}\begin{bmatrix} \frac{1}{\sqrt{2}}&\frac{1}{\sqrt{2}}&\cdots&\frac{1}{\sqrt{2}}\\ \cos{\frac{\pi}{16}}&\cos{\frac{3\pi}{16}}&\cdots&\cos{\frac{15\pi}{16}}\\ \cdots&\cdots&\cdots&\cdots\\ \cos{\frac{7\pi}{16}}&\cos{\frac{21\pi}{16}}&\cdots&\cos{\frac{105\pi}{16}} \end{bmatrix} \tag{45} G=21⎣⎢⎢⎡21cos16π⋯cos167π21cos163π⋯cos1621π⋯⋯⋯⋯21cos1615π⋯cos16105π⎦⎥⎥⎤(45)
1.8.2.2. ref [4] p47 酉矩阵
G是酉矩阵,因此该变换是相似变换
G
−
1
=
G
T
(51)
G^{-1}=G^T \tag{51}
G−1=GT(51)
1.9. D C T − 1 D DCT-1D DCT−1D变换的性质
1.9.1. 正交变换不改变向量的度量?
向量元素平方和不相等?
1.9.2. 离散傅里叶变换的性质
1.9.2.1. 帕塞瓦定理
∑
n
=
0
N
−
1
x
(
n
)
y
∗
(
n
)
=
1
N
∑
k
=
0
N
−
1
X
(
k
)
Y
∗
(
k
)
(52)
\sum_{n=0}^{N-1}{x(n)y^*(n)}=\frac{1}{N}\sum_{k=0}^{N-1}{X(k)Y^*(k)} \tag{52}
n=0∑N−1x(n)y∗(n)=N1k=0∑N−1X(k)Y∗(k)(52)
还是对不上
1.9.2.2. 实偶函数的傅里叶变换只含实的余弦项
1.9.2.2.1. x ( n ) x(n) x(n)为实偶函数,则 X ( k ) X(k) X(k)也为实偶函数
ref [6] p92
x
(
n
)
=
x
(
N
−
n
)
,
1
≤
n
≤
N
−
1
⇒
X
(
k
)
=
X
(
N
−
k
)
,
1
≤
k
≤
N
−
1
(53)
\begin{array}{l} x(n)=x(N-n),1\leq n\leq N-1 \Rightarrow \\ X(k)=X(N-k),1\leq k\leq N-1 \end{array} \tag{53}
x(n)=x(N−n),1≤n≤N−1⇒X(k)=X(N−k),1≤k≤N−1(53)
1.9.3. 离散余弦变换的性质
1.9.3.1. 同离散傅里叶变换的关系
根据离散傅里叶变换的性质,实偶函数的傅里叶变换只含实的余弦项,因此构造了一种实数域的变换——离散余弦变换(DCT)。
1.9.3.2. 线性变换性质
D C T ( a x − b ) (54) DCT(ax-b)\tag{54} DCT(ax−b)(54)
1.10. 线性变换
1.10.1. 2D DCT也是一种线性变换?
2. D C T DCT DCT算法
2.1. D C T − 2 D DCT-2D DCT−2D
2.1.1. Ref[1] 4
F x , y = C ( x ) C ( y ) 4 ∑ i = 0 7 ∑ j = 0 7 f i , j cos ( ( 2 i + 1 ) x π 16 ) cos ( ( 2 j + 1 ) y π 16 ) (61) F_{x,y}=\frac{C(x)C(y)}{4} \sum_{i=0}^{7} {\sum_{j=0}^{7}{ f_{i,j} \cos\left(\frac{(2i+1)x\pi}{16}\right) \cos\left(\frac{(2j+1)y\pi}{16}\right) }} \tag{61} Fx,y=4C(x)C(y)i=0∑7j=0∑7fi,jcos(16(2i+1)xπ)cos(16(2j+1)yπ)(61)
其中
C
(
n
)
=
{
1
2
,
n
=
0
1
,
n
≠
0
(62)
C(n)= \begin{cases} \frac{1}{\sqrt{2}},n=0\\ 1,n\ne0 \end{cases} \tag{62}
C(n)={21,n=01,n=0(62)
用张量表示为:
F
x
,
y
=
G
x
,
i
f
i
,
j
G
y
,
j
=
G
x
,
i
f
i
,
j
G
j
,
y
T
(621)
F_{x,y}=G_{x,i}f_{i,j}G_{y,j} =G_{x,i}f_{i,j}G^T_{j,y}\tag{621}
Fx,y=Gx,ifi,jGy,j=Gx,ifi,jGj,yT(621)
2.1.2. 矩阵表示
G x , i = C ( x ) 2 cos ( ( 2 i + 1 ) x π 16 ) (622) G_{x,i}=\frac{C(x)}{2}\cos\left( \frac{(2i+1)x\pi}{16} \right) \tag{622} Gx,i=2C(x)cos(16(2i+1)xπ)(622)
2.1.3. 转化为一维
由
(
t
1
)
(t1)
(t1)可得:
F
x
,
y
=
C
(
y
)
2
∑
j
=
0
7
F
x
cos
(
(
2
j
+
1
)
y
π
16
)
(63)
F_{x,y}=\frac{C(y)}{2}\sum_{j=0}^{7}{F_x\cos\left( \frac{(2j+1)y\pi}{16} \right)} \tag{63}
Fx,y=2C(y)j=0∑7Fxcos(16(2j+1)yπ)(63)
2.1.4. 计算方法
F = G . f . G T = G ( G F T ) T (68) F=G.f.G^T=G(GF^T)^T \tag{68} F=G.f.GT=G(GFT)T(68)
2.2. D C T − 1 D DCT-1D DCT−1D
2.2.1. 一维离散余弦变换
F
x
,
j
=
C
(
x
)
2
∑
i
=
0
7
f
i
,
j
cos
(
(
2
i
+
1
)
x
π
16
)
(71)
F_{x,j}=\frac {C(x)} {2} \sum _{i=0} ^{7} {f_{i,j}\cos \left( \frac {(2i+1)x\pi} {16} \right)} \tag{71}
Fx,j=2C(x)i=0∑7fi,jcos(16(2i+1)xπ)(71)
用张量表示为
F
x
,
j
=
G
x
,
i
f
i
,
j
(711)
F_{x,j}=G_{x,i}f_{i,j} \tag{711}
Fx,j=Gx,ifi,j(711)
2.2.2. 矩阵表示
G
x
,
i
=
C
(
x
)
2
cos
(
(
2
i
+
1
)
x
π
16
)
(712)
G_{x,i}=\frac{C(x)}{2}\cos\left( \frac{(2i+1)x\pi}{16} \right) \tag{712}
Gx,i=2C(x)cos(16(2i+1)xπ)(712)
那么第0行元素为:
G
0
,
i
=
C
(
0
)
2
=
1
2
2
(713)
G_{0,i}=\frac{C(0)}{2}=\frac{1}{2\sqrt{2}} \tag{713}
G0,i=2C(0)=221(713)
Table 1 用了转置矩阵的写法
C
=
G
T
(714)
C=G^T \tag{714}
C=GT(714)
2.2.3. Table 1
C = 1 2 ( 1 2 ) = 0.353 C=\frac{1}{2} \left(\frac{1}{\sqrt{2}}\right)=0.353 C=21(21)=0.353
2.2.4. FPGA算法
G
G
G矩阵的第
x
x
x行元素,或者对称(
x
=
0
,
2
,
4
,
6
x=0,2,4,6
x=0,2,4,6),或者反对称(
x
=
1
,
3
,
5
,
7
x=1,3,5,7
x=1,3,5,7). 当
x
=
0
,
2
,
4
,
6
x=0,2,4,6
x=0,2,4,6时,取正号;当
x
=
1
,
3
,
5
,
7
x=1,3,5,7
x=1,3,5,7时,取负号:
F
x
=
∑
i
=
0
3
(
f
i
±
f
7
−
i
)
C
i
,
x
=
∑
i
=
0
3
f
i
±
f
7
−
i
2
∗
2
C
i
,
x
=
∑
i
=
0
3
u
i
C
i
,
x
(715)
\begin{array}{ll} F_x & = \sum_{i=0}^{3}{(f_i\pm f_{7-i})C_{i,x}}\\ & =\sum_{i=0}^{3}{\frac{f_i\pm f_{7-i}}{2}*2C_{i,x}} \\ & =\sum_{i=0}^{3}{u_i C_{i,x}} \end{array}\tag{715}
Fx=∑i=03(fi±f7−i)Ci,x=∑i=032fi±f7−i∗2Ci,x=∑i=03uiCi,x(715)
其中
u
i
=
f
i
+
f
7
−
i
2
x
=
0
,
2
,
4
,
6
v
i
=
f
i
−
f
7
−
i
2
x
=
1
,
3
,
5
,
7
(7151)
\begin{array}{cc} u_i=\frac{f_i+f_{7-i}}{2} & x=0,2,4,6\\ v_i=\frac{f_i-f_{7-i}}{2} & x=1,3,5,7 \end{array} \tag{7151}
ui=2fi+f7−ivi=2fi−f7−ix=0,2,4,6x=1,3,5,7(7151)
实际代码中,除数的2换算到量化里面去了;最后结果要根据量化到[-1,1),进行处理得到最终结果
假设
u
i
u_i
ui使用补码表示为:
u
i
0
u
i
1
⋯
u
i
B
−
1
,
B
=
9
u_i^0 u_i^1 \cdots u_i^{B-1}, B=9
ui0ui1⋯uiB−1,B=9,则
u
i
=
−
u
i
0
+
∑
j
=
1
B
−
1
2
−
j
u
i
j
(716)
u_i=-u_i^0+\sum_{j=1}^{B-1}{2^{-j}u_i^j} \tag{716}
ui=−ui0+j=1∑B−12−juij(716)
则
F
x
=
∑
i
=
0
3
[
−
u
i
0
+
∑
j
=
1
B
−
1
2
−
j
u
i
j
]
C
i
,
x
=
−
∑
i
=
0
3
u
i
0
C
i
,
x
+
∑
j
=
1
B
−
1
2
−
j
∑
i
=
0
3
u
i
j
C
i
,
x
(717)
\begin{array}{ll} F_x & =\sum_{i=0}^{3}{\left[-u_i^0+\sum_{j=1}^{B-1}{2^{-j}u_i^j} \right] C_{i,x}} \\ &= -\sum_{i=0}^{3}{u_i^0C_{i,x}+\sum_{j=1}^{B-1}{2^{-j}\sum_{i=0}^3{u_i^jC_{i,x}}}} \end{array}\tag{717}
Fx=∑i=03[−ui0+∑j=1B−12−juij]Ci,x=−∑i=03ui0Ci,x+∑j=1B−12−j∑i=03uijCi,x(717)
假设 u j = u 0 j u 2 j u 4 j u 6 j , v j = u 1 j u 3 j u 5 j u 7 j , j = 0 , ⋯ , ( B − 1 ) u^j=u^j_0u^j_2u^j_4u^j_6, v^j=u^j_1u^j_3u^j_5u^j_7, j=0,\cdots,(B-1) uj=u0ju2ju4ju6j,vj=u1ju3ju5ju7j,j=0,⋯,(B−1)
D x ( u j ) = ∑ i = 0 3 C i , x u i j (718) D_x(u^j)=\sum_{i=0}^3{C_{i,x}u^j_i} \tag{718} Dx(uj)=i=0∑3Ci,xuij(718)
因此:
F
x
=
∑
j
=
1
B
−
1
2
−
j
D
x
(
u
j
)
−
D
x
(
u
0
)
f
o
r
x
=
0
,
2
,
4
,
6
(72)
F_x=\sum_{j=1}^{B-1}{ 2^{-j}D_x(u^j)-D_x(u^0) \quad for \quad x=0,2,4,6 } \tag{72}
Fx=j=1∑B−12−jDx(uj)−Dx(u0)forx=0,2,4,6(72)
F x = ∑ j = 1 B − 1 2 − j D x ( v j ) − D x ( v 0 ) f o r x = 1 , 3 , 5 , 7 (73) F_x=\sum_{j=1}^{B-1}{ 2^{-j}D_x(v^j)-D_x(v^0) \quad for \quad x=1,3,5,7 } \tag{73} Fx=j=1∑B−12−jDx(vj)−Dx(v0)forx=1,3,5,7(73)
2.2.4.1. u j u^j uj是什么意思
由(12)式下面的式子定义
u j = ( u 0 j , u 1 j , u 2 j , u 3 j ) (74) u_j=(u_0^j,u_1^j,u_2^j,u_3^j) \tag{74} uj=(u0j,u1j,u2j,u3j)(74)
2.2.4.2. 图片像素的量化
2.2.4.2.1. [0,255]量化为[-1,1)
y = x 2 7 − 1 (75) y=\frac{x}{2^7}-1 \tag{75} y=27x−1(75)
- 像素第1位是0则改为1,是1则改为0
2.2.4.2.2. [0,255]量化为[-0.5,0.5)
确保后面的加减运算不会溢出
y
=
x
2
8
−
1
2
(76)
y=\frac{x}{2^8}-\frac{1}{2} \tag{76}
y=28x−21(76)
假设
x
=
x
0
x
1
⋯
x
7
x=x_0x_1\cdots x_7
x=x0x1⋯x7,那么
y
=
0.
x
0
x
1
⋯
x
7
+
1.10000000
(77)
y=0.x_0x_1\cdots x_7+1.10000000 \tag{77}
y=0.x0x1⋯x7+1.10000000(77)
- 像素第1位是0则改为11,是1则改为00
2.2.5. 那么一维 D C T DCT DCT是不是 F = G f F=Gf F=Gf?
对
2.2.6. distributed arithmetic method
2.2.6.1. ref [7] 2.5.1 分布式算法基础
2.3. 考虑的问题
2.3.1. B B B的取值
B = 9 B=9 B=9
2.3.2. D x D_x Dx的位数
整数4位,小数9位
2.3.3. F x F_x Fx的位数
3. D C T DCT DCT并行算法
3.1. 补码表示
假设纯小数
u
i
u_i
ui使用补码表示为:
u
i
0
u
i
1
⋯
u
i
B
−
1
u_i^0 u_i^1 \cdots u_i^{B-1}
ui0ui1⋯uiB−1,则
u
i
=
−
u
i
0
+
∑
j
=
1
B
−
1
2
−
j
u
i
j
(81)
u_i=-u_i^0+\sum_{j=1}^{B-1}{2^{-j}u_i^j} \tag{81}
ui=−ui0+j=1∑B−12−juij(81)
最高阶取相反数,其余阶不变
B = 8 B=8 B=8
3.2. 图片数据stream怎么流向处理器
- 视频数据由电脑传给FPGA,采用通用的总线接口,使用RAM来存储这些数据
- 一列一列处理(8x1),需要64位总线
- 处理后的结果传出到寄存器组,通过64位总线
- 处理下一列,一直处理完所有列
- 读取寄存器组里面的转置数据,进行另外一组一维DCT变换,一行一行处理
- 处理下一行,一直处理完所有行
- 第二次1D DCT变换完成后,将寄存器组里面的数据全部传出
- 一列一列传
- 继续处理下一张图片
- dct处理完,后序要经过量化,然后编码
- 如果是预测编码,还要减去预测部分,余量很小,编码量相应变小
3.3. 并行化考虑
- 多列同时处理
- 最大8列一起处理,总线宽度为:64x8=512位
- RAM也需要512位的接口
- ROM每一组需要8个,一共8组
3.4. ROM数据计算
需要8个不同的ROM
D
x
(
u
j
)
=
∑
i
=
0
3
C
i
,
x
u
i
j
(91)
D_x(u^j)=\sum_{i=0}^{3}{C_{i,x}u_i^j} \tag{91}
Dx(uj)=i=0∑3Ci,xuij(91)
4. FPGA考虑
4.1. 转化浮点数为定点数
- python考虑的内容,转换后存入ROM
- 整数部分为4位,小数部分11位
- 会不会超过范围
- 那么DCT变换的结果就应该是15位
- 输入是8位,输出是15位?
- 大多数结果数据都接近于0,被后面的熵编码用短码替换了
5. 参考文献
[1] SystemC co-design for image compression: Fast Discrete Cosine Transformation using Distributed Arithmetic Method
[2] Fast 2D 8x8 discrete cosine transform algorithm
[3] 数字信号处理-冈萨雷斯
[4] 矩阵分析
[5] 张量分析
[6] 数字信号处理-高西全
[7] 数字信号处理的FPGA实现