DCT算法原理 & 频域均衡器

参考博文

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)
其中N表示一维数据的点的总数
C ( u ) = { 1 n 2 n C(u)=\left\{ \begin{aligned} & \sqrt\frac 1n\\ & \sqrt\frac 2n\\ \end{aligned} \right.
一维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)
可以发现,二维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}
其中 C {C} 为正交矩阵 C × C T = E {C}\times{C^T}=E 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}
其中 a a = 1 2 \frac{1}{2} , b b = 1 2 c o s π 8 \sqrt\frac12cos\frac\pi{8} , c c = 1 2 c o s 3 π 8 \sqrt\frac12cos\frac{3\pi}{8} 进一步推导可转换为如下变换:
Y = B × X × B T D Y=B\times{X}\times{B^T}\bigoplus{D}
其中 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}
矩阵 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}
进一步将实数运算简化为整数运算,可将矩阵 B B 变换为 B B' ,矩阵 D D 变化为 D D' ,矩阵 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}
矩阵 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}

2.2.2DCT公式详细推导过程

Y = C × X × C T Y=C\times{X}\times{C^T}
如何演变为 Y = B × X × B T D Y=B\times{X}\times{B^T}\bigoplus{D} 给出说明
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} 假设 d = c b d=\frac cb 那么
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 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}

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}
对角矩阵移项得到
[ 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}
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}
其中d为0.4142,为实数,此时令d=1/2,设置 b = 2 5 b=\sqrt \frac 2{5} c = 1 10 c=\sqrt \frac 1{10} ,经过行列缩放变换后可得整数变换式子 Y = B × X × B T D Y=B'\times{X}\times{B'^T}\bigoplus{D'}

3.快速沃尔什变换( Fast Walsh-Hadamard Transform)

简单讲就是位运算卷积的一种处理方法,下面将or、and、xor三种位运算分别讲述FWT的推导以及使用方法。

C k C_k = i + j = k \sum\limits_{i+j=k} A i A_i + B j B_j 是多项式卷积的基础表达形式
C k C_k = i j = k \sum\limits_{i|j=k} A i A_i + B j B_j 是或运算卷积
C k C_k = i & j = k \sum\limits_{i\&j=k} A i A_i + B j B_j 是和运算卷积
C k C_k = i j = k \sum\limits_{i\bigoplus j=k} A i A_i + B j B_j 是异或运算卷积

发布了38 篇原创文章 · 获赞 5 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/zhiyanzhai563/article/details/100619707
今日推荐