离散余弦变换的FPGA设计

文章目录

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:figFIG(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,...,N1}=>anX={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,...,N1}=>aijXX(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(afig)=aDCT(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=212 1cos16πcos167π2 1cos163πcos1621π2 1cos1615πcos16105π(45)

1.8.2.2. ref [4] p47 酉矩阵

G是酉矩阵,因此该变换是相似变换
G − 1 = G T (51) G^{-1}=G^T \tag{51} G1=GT(51)

1.9. D C T − 1 D DCT-1D DCT1D变换的性质

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=0N1x(n)y(n)=N1k=0N1X(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(Nn),1nN1X(k)=X(Nk),1kN1(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(axb)(54)

1.10. 线性变换

1.10.1. 2D DCT也是一种线性变换?

2. D C T DCT DCT算法

2.1. D C T − 2 D DCT-2D DCT2D

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=07j=07fi,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)={2 1,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=07Fxcos(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 DCT1D

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=07fi,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)=22 1(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(2 1)=0.353

2.2.4. FPGA算法

量化
交叉加减
编组
LUT
查找
移位
累加

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±f7i)Ci,x=i=032fi±f7i2Ci,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+f7ivi=2fif7ix=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 ui0ui1uiB1,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=1B12juij(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=1B12juij]Ci,x=i=03ui0Ci,x+j=1B12ji=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,,(B1)

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=03Ci,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=1B12jDx(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=1B12jDx(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=27x1(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=28x21(76)
假设 x = x 0 x 1 ⋯ x 7 x=x_0x_1\cdots x_7 x=x0x1x7,那么
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.x0x1x7+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} ui0ui1uiB1,则
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=1B12juij(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=03Ci,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实现

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值