参考博文
https://blog.csdn.net/orbit/article/details/45485197
参考此博文中频域均衡器使用,加深对离散fft算法理解
1.频域均衡器
2.DCT算法原理
2.1一维DCT变换公式
F
(
u
)
=
C
(
u
)
∑
i
=
0
N
−
1
c
o
s
(
2
i
+
1
)
π
2
N
f
(
i
)
F(u)=C(u)\sum\limits_{i=0}^{N-1}cos\frac{(2i+1)\pi}{2N}f(i)
F(u)=C(u)i=0∑N−1cos2N(2i+1)πf(i)
其中N表示一维数据的点的总数
C
(
u
)
=
{
1
n
2
n
C(u)=\left\{ \begin{aligned} & \sqrt\frac 1n\\ & \sqrt\frac 2n\\ \end{aligned} \right.
C(u)=⎩
⎨
⎧n1n2
一维DCT变换的复杂度是O(n^2)。
2.2二维DCT变换公式
F
(
u
,
v
)
=
C
(
u
)
C
(
v
)
∑
i
=
0
N
−
1
∑
j
=
0
N
−
1
c
o
s
(
2
i
+
1
)
π
2
N
c
o
s
(
2
j
+
1
)
π
2
N
f
(
i
,
j
)
F(u,v)=C(u)C(v)\sum\limits_{i=0}^{N-1}\sum\limits_{j=0}^{N-1}cos\frac{(2i+1)\pi}{2N}cos\frac{(2j+1)\pi}{2N}f(i,j)
F(u,v)=C(u)C(v)i=0∑N−1j=0∑N−1cos2N(2i+1)πcos2N(2j+1)πf(i,j)
可以发现,二维DCT变换其实是在一维DCT变换的基础上,再做一次一维DCT变换。二维DCT也可以写成矩阵相乘的形式:
二维DCT变换的复杂度达到O(n^4),所以进行DCT变换的矩阵不宜过大。在实际处理图片的过程中,需要先把矩阵分块,一般分为8x8或16x16大小,这样DCT变换不至于耗费过多的时间。
2.2.1二维DCT变换推导
dct变换核心公式:
Y
=
C
×
X
×
C
T
Y=C\times{X}\times{C^T}
Y=C×X×CT
其中
C
{C}
C为正交矩阵
C
×
C
T
=
E
{C}\times{C^T}=E
C×CT=E,
C
{C}
C具体表达为
[
a
a
a
a
b
c
−
c
−
b
a
−
a
−
a
a
c
−
b
b
−
c
]
\begin{bmatrix} a&a&a&a\\ {b}&{c}&{-c}&{-b}\\ a&-a&-a&a\\ {c}&{-b}&{b}&{-c} \end{bmatrix}
abacac−a−ba−c−aba−ba−c
其中
a
a
a=
1
2
\frac{1}{2}
21,
b
b
b=
1
2
c
o
s
π
8
\sqrt\frac12cos\frac\pi{8}
21cos8π,
c
c
c=
1
2
c
o
s
3
π
8
\sqrt\frac12cos\frac{3\pi}{8}
21cos83π进一步推导可转换为如下变换:
Y
=
B
×
X
×
B
T
⨁
D
Y=B\times{X}\times{B^T}\bigoplus{D}
Y=B×X×BT⨁D
其中
B
B
B可表示为如下矩阵:
[
1
1
1
1
1
1
2
−
1
2
1
1
−
1
−
1
1
1
2
−
1
1
−
1
2
]
\begin{bmatrix} 1&1&1&1\\ {1}&{\frac12}&{-\frac{1}2}&{1}\\ 1&-1&-1&1\\ {\frac12}&{-1}&{1}&{-\frac12} \end{bmatrix}
11121121−1−11−21−11111−21
矩阵
D
D
D表示为如下矩阵:
[
a
2
a
b
a
2
a
b
a
b
b
2
a
b
b
2
a
2
a
b
a
2
a
b
a
b
b
2
a
b
b
2
]
\begin{bmatrix} a^2&{ab}&a^2&{ab}\\ {ab}&{b^2}&{ab}&{b^2}\\ a^2&{ab}&a^2&{ab}\\ {ab}&{b^2}&{ab}&{b^2}\\ \end{bmatrix}
a2aba2ababb2abb2a2aba2ababb2abb2
进一步将实数运算简化为整数运算,可将矩阵
B
B
B变换为
B
′
B'
B′,矩阵
D
D
D变化为
D
′
D'
D′,矩阵
B
′
B'
B′的表达式为
[
1
1
1
1
2
1
−
1
2
1
−
1
−
1
1
1
−
2
2
−
1
]
\begin{bmatrix} 1&1&1&1\\ {2}&{1}&{-1}&{2}\\ 1&-1&-1&1\\ {1}&{-2}&{2}&{-1} \end{bmatrix}
121111−1−21−1−12121−1
矩阵
D
′
D'
D′的表达式为
[
a
2
a
b
2
a
2
a
b
2
a
b
2
b
2
4
a
b
2
b
2
4
a
2
a
b
2
a
2
a
b
2
a
b
2
b
2
4
a
b
2
b
2
4
]
\begin{bmatrix} a^2&\frac{ab}{2}&a^2&\frac{ab}{2}\\ {\frac{ab}{2}}&\frac{b^2}{4}&{\frac{ab}{2}}&\frac{b^2}{4}\\ a^2&\frac{ab}{2}&a^2&\frac{ab}{2}\\ {\frac{ab}{2}}&\frac{b^2}{4}&{\frac{ab}{2}}&\frac{b^2}{4}\\ \end{bmatrix}
a22aba22ab2ab4b22ab4b2a22aba22ab2ab4b22ab4b2
2.2.2DCT公式详细推导过程
Y
=
C
×
X
×
C
T
Y=C\times{X}\times{C^T}
Y=C×X×CT
如何演变为
Y
=
B
×
X
×
B
T
⨁
D
Y=B\times{X}\times{B^T}\bigoplus{D}
Y=B×X×BT⨁D给出说明
C
=
C=
C=
[
a
a
a
a
b
c
−
c
−
b
a
−
a
−
a
a
c
−
b
b
−
c
]
\begin{bmatrix} a&a&a&a\\ {b}&{c}&{-c}&{-b}\\ a&-a&-a&a\\ {c}&{-b}&{b}&{-c} \end{bmatrix}
abacac−a−ba−c−aba−ba−c
假设
d
=
c
b
d=\frac cb
d=bc那么
C
=
[
a
0
0
0
0
b
0
0
0
0
a
0
0
0
0
b
]
×
[
1
1
1
1
1
d
−
d
−
1
1
−
1
−
1
1
d
−
1
1
−
d
]
C=\begin{bmatrix} a&0&0&0\\ 0&b&0&0\\ 0&0&a&0\\ 0&0&0&b\\ \end{bmatrix}\times\begin{bmatrix} 1&1&1&1\\ 1&d&-d&-1\\ 1&-1&-1&1\\ d&-1&1&-d\\ \end{bmatrix}
C=
a0000b0000a0000b
×
111d1d−1−11−d−111−11−d
进一步变换可得
C T = [ 1 1 1 d 1 d − 1 − 1 1 − d − 1 1 1 − 1 1 − d ] × [ a 0 0 0 0 b 0 0 0 0 a 0 0 0 0 b ] C^T=\begin{bmatrix} 1&1&1&d\\ 1&d&-1&-1\\ 1&-d&-1&1\\ 1&-1&1&-d\\ \end{bmatrix}\times\begin{bmatrix} a&0&0&0\\ 0&b&0&0\\ 0&0&a&0\\ 0&0&0&b\\ \end{bmatrix} CT= 11111d−d−11−1−11d−11−d × a0000b0000a0000b
Y
=
C
×
X
×
C
T
=
[
a
0
0
0
0
b
0
0
0
0
a
0
0
0
0
b
]
×
[
1
1
1
1
1
d
−
d
−
1
1
−
1
−
1
1
d
−
1
1
−
d
]
×
X
×
[
1
1
1
d
1
d
−
1
−
1
1
−
d
−
1
1
1
−
1
1
−
d
]
×
[
a
0
0
0
0
b
0
0
0
0
a
0
0
0
0
b
]
Y=C\times{X}\times{C^T}=\begin{bmatrix} a&0&0&0\\ 0&b&0&0\\ 0&0&a&0\\ 0&0&0&b\\ \end{bmatrix}\times\begin{bmatrix} 1&1&1&1\\ 1&d&-d&-1\\ 1&-1&-1&1\\ d&-1&1&-d\\ \end{bmatrix}\times X \times\begin{bmatrix} 1&1&1&d\\ 1&d&-1&-1\\ 1&-d&-1&1\\ 1&-1&1&-d\\ \end{bmatrix}\times\begin{bmatrix} a&0&0&0\\ 0&b&0&0\\ 0&0&a&0\\ 0&0&0&b\\ \end{bmatrix}
Y=C×X×CT=
a0000b0000a0000b
×
111d1d−1−11−d−111−11−d
×X×
11111d−d−11−1−11d−11−d
×
a0000b0000a0000b
对角矩阵移项得到
[
a
−
1
0
0
0
0
b
−
1
0
0
0
0
a
−
1
0
0
0
0
b
−
1
]
×
Y
×
[
a
−
1
0
0
0
0
b
−
1
0
0
0
0
a
−
1
0
0
0
0
b
−
1
]
=
[
1
1
1
1
1
d
−
d
−
1
1
−
1
−
1
1
d
−
1
1
−
d
]
×
X
×
[
1
1
1
d
1
d
−
1
−
1
1
−
d
−
1
1
1
−
1
1
−
d
]
\begin{bmatrix} a^{-1}&0&0&0\\ 0&b^{-1}&0&0\\ 0&0&a^{-1}&0\\ 0&0&0&b^{-1}\\ \end{bmatrix} \times Y \times \begin{bmatrix} a^{-1}&0&0&0\\ 0&b^{-1}&0&0\\ 0&0&a^{-1}&0\\ 0&0&0&b^{-1}\\ \end{bmatrix} = \begin{bmatrix} 1&1&1&1\\ 1&d&-d&-1\\ 1&-1&-1&1\\ d&-1&1&-d\\ \end{bmatrix}\times X \times\begin{bmatrix} 1&1&1&d\\ 1&d&-1&-1\\ 1&-d&-1&1\\ 1&-1&1&-d\\ \end{bmatrix}
a−10000b−10000a−10000b−1
×Y×
a−10000b−10000a−10000b−1
=
111d1d−1−11−d−111−11−d
×X×
11111d−d−11−1−11d−11−d
Y
⨁
[
a
−
2
a
b
−
1
a
−
2
a
b
−
1
a
b
−
1
b
−
2
a
b
−
1
b
−
2
a
−
2
a
b
−
1
a
−
2
a
b
−
1
a
−
2
a
b
−
1
a
−
2
a
b
−
1
]
=
[
1
1
1
1
1
d
−
d
−
1
1
−
1
−
1
1
d
−
1
1
−
d
]
×
X
×
[
1
1
1
d
1
d
−
1
−
1
1
−
d
−
1
1
1
−
1
1
−
d
]
Y \bigoplus \begin{bmatrix} a^{-2}&{ab^{-1}}&a^{-2}&{ab^{-1}}\\ {ab^{-1}}&{b^{-2}}&{ab^{-1}}&{b^{-2}}\\ a^{-2}&{ab^{-1}}&a^{-2}&{ab^{-1}}\\ a^{-2}&{ab^{-1}}&a^{-2}&{ab^{-1}}\\ \end{bmatrix} = \begin{bmatrix} 1&1&1&1\\ 1&d&-d&-1\\ 1&-1&-1&1\\ d&-1&1&-d\\ \end{bmatrix}\times X \times\begin{bmatrix} 1&1&1&d\\ 1&d&-1&-1\\ 1&-d&-1&1\\ 1&-1&1&-d\\ \end{bmatrix}
Y⨁
a−2ab−1a−2a−2ab−1b−2ab−1ab−1a−2ab−1a−2a−2ab−1b−2ab−1ab−1
=
111d1d−1−11−d−111−11−d
×X×
11111d−d−11−1−11d−11−d
其中d为0.4142,为实数,此时令d=1/2,设置
b
=
2
5
b=\sqrt \frac 2{5}
b=52
c
=
1
10
c=\sqrt \frac 1{10}
c=101,经过行列缩放变换后可得整数变换式子
Y
=
B
′
×
X
×
B
′
T
⨁
D
′
Y=B'\times{X}\times{B'^T}\bigoplus{D'}
Y=B′×X×B′T⨁D′
3.快速沃尔什变换( Fast Walsh-Hadamard Transform)
简单讲就是位运算卷积的一种处理方法,下面将or、and、xor三种位运算分别讲述FWT的推导以及使用方法。
C
k
C_k
Ck=
∑
i
+
j
=
k
\sum\limits_{i+j=k}
i+j=k∑
A
i
A_i
Ai+
B
j
B_j
Bj是多项式卷积的基础表达形式
C
k
C_k
Ck=
∑
i
∣
j
=
k
\sum\limits_{i|j=k}
i∣j=k∑
A
i
A_i
Ai+
B
j
B_j
Bj是或运算卷积
C
k
C_k
Ck=
∑
i
&
j
=
k
\sum\limits_{i\&j=k}
i&j=k∑
A
i
A_i
Ai+
B
j
B_j
Bj是和运算卷积
C
k
C_k
Ck=
∑
i
⨁
j
=
k
\sum\limits_{i\bigoplus j=k}
i⨁j=k∑
A
i
A_i
Ai+
B
j
B_j
Bj是异或运算卷积