背景
DCT
是離散餘弦變換的縮寫,由於其變換後具有較高的能量聚集度,通常作爲音視頻編碼的變換去使用。而由於DCT的塊效應,人們發明了很多方法去克服塊效應。例如LOT 、MDCT 。在aac的編碼中採用時域重疊的MDCT
去實現(TDAC )。本博文僅從DFT 到DCT的推導以及MDCT的編解碼流程進行講解,力求以數學的推導來闡明過程。
DFT : 離散傅立葉變換. 用於將離散的時域信號轉換到頻域上。 DCT : 離散餘弦變換,也是正交變換。用於將離散的時域信號轉換爲頻域上的信息 MDCT : 改進後的離散餘弦變換. 通過時域重疊來消除混疊。 IMDCT : MDCT的逆變換,時域信號在經過MDCT編碼以及IMDCT解碼後,還原出的並不是原始信號
DFT到DCT的推導
DFT :
X
(
k
)
=
∑
n
=
0
N
−
1
x
[
n
]
.
e
−
j
.
2
π
.
k
n
N
\large X(k) = \sum_{n=0}^{N-1} x[n].e^{\frac{-j.2\pi.kn}{N}} \text{ }
X ( k ) = ∑ n = 0 N − 1 x [ n ] . e N − j . 2 π . k n 歐拉公式 :
e
−
j
θ
=
c
o
s
θ
+
j
.
s
i
n
θ
\large e^{-j\theta} = cos\theta + j.sin\theta
e − j θ = c o s θ + j . s i n θ
step:
虛部爲0 : 觀察DFT變換可得,當其爲實偶信號時,虛部爲0。因爲實偶信號的性質是x(n) = - x(n),故在將DFT的複數部分拆開後由於其虛部爲奇函數,故實偶信號的虛部將會抵消。
構建實偶信號 : 時域信號經抽樣後皆爲實數,而要滿足偶函數的性質需要人爲構造。 假設抽樣後具有從0到N-1的N點離散數字信號,其數學定義爲
x
[
m
]
=
{
x
[
0
]
,
.
.
.
.
,
x
[
N
−
1
]
}
\large x[m] = \{ {x[0],....,x[N-1]} \}
x [ m ] = { x [ 0 ] , . . . . , x [ N − 1 ] } 。將該序列進行偶延拓,其數學定義更改爲
x
[
m
]
ˊ
=
{
x
[
m
]
,
if n belong to { 0,..,N-1 }
x
[
−
m
−
1
]
,
if n belong to { -N,..,-1 }
\acute{x[m]} = \begin{cases} x[m], & \text{if n belong to \{ {0,..,N-1} \}} \\ x[-m-1], & \text{if n belong to \{ {-N,..,-1} \} } \end{cases}
x [ m ] ˊ = { x [ m ] , x [ − m − 1 ] , if n belong to { 0 , . . , N - 1 } if n belong to { - N , . . , - 1 }
x
[
m
]
ˊ
\acute{x[m]}
x [ m ] ˊ 信號如下圖1 所示: 再將
x
[
m
]
ˊ
\acute{x[m]}
x [ m ] ˊ 序列整體向右偏移
1
2
\Large\frac{1}{2}
2 1 ,令
x
[
m
]
¨
\large\ddot{x[m]}
x [ m ] ¨ 爲
x
[
m
−
1
2
]
ˊ
\large\acute{x[m-\frac{1}{2}]}
x [ m − 2 1 ] ˊ ,
x
[
m
]
¨
\large\ddot{x[m]}
x [ m ] ¨ 如下圖2 所示:
重新推導實偶信號的DFT公式 :
X
(
k
)
=
∑
m
=
−
N
+
1
2
N
−
1
2
x
[
m
−
1
2
]
¨
.
e
−
j
.
2
π
.
k
m
2
N
=
2
∗
∑
m
=
1
2
N
−
1
2
x
[
m
−
1
2
]
¨
.
e
−
j
.
2
π
.
k
m
2
N
\large X(k) = \sum_{m=-N+\frac{1}{2}}^{N-\frac{1}{2}} \ddot{x[m - \frac{1}{2}]}.e^{\frac{-j.2\pi.km}{2N}} \text{ } = 2 *\sum_{m=\frac{1}{2}}^{N-\frac{1}{2}} \ddot{x[m - \frac{1}{2}]}.e^{\frac{-j.2\pi.km}{2N}}
X ( k ) = m = − N + 2 1 ∑ N − 2 1 x [ m − 2 1 ] ¨ . e 2 N − j . 2 π . k m = 2 ∗ m = 2 1 ∑ N − 2 1 x [ m − 2 1 ] ¨ . e 2 N − j . 2 π . k m 令n = m +
1
2
\frac{1}{2}
2 1 ,則上式可化爲
2
∗
∑
n
=
0
N
−
1
x
[
n
]
ˊ
.
c
o
s
(
(
n
+
1
2
)
.
k
π
N
)
\Large2*\sum_{n=0}^{N-1} \acute{x[n]}.cos(\frac{(n+\frac{1}{2}).k\pi}{N})
2 ∗ ∑ n = 0 N − 1 x [ n ] ˊ . c o s ( N ( n + 2 1 ) . k π )
正交變換 : 將DCT變換中與x[n]相乘的係數組織成矩陣C,如果該矩陣正交則有
C
.
C
T
=
E
C.C^{T} = E
C . C T = E .故將變換核的係數2 做變換可得下式:
2
N
.
g
k
∗
∑
n
=
0
N
−
1
x
[
n
]
ˊ
.
c
o
s
(
(
n
+
1
2
)
.
k
π
N
)
(1)
\Large\sqrt{\frac{2}{N}}.g_k*\sum_{n=0}^{N-1} \acute{x[n]}.cos(\frac{(n+\frac{1}{2}).k\pi}{N}) \tag{1}
N 2
. g k ∗ n = 0 ∑ N − 1 x [ n ] ˊ . c o s ( N ( n + 2 1 ) . k π ) ( 1 ) 其中
g
k
g_k
g k 的數學定義爲:
g
k
=
{
1
/
2
,
k == 0
1
,
k != 0
\large g_k = \begin{cases} 1/\sqrt{2}, & \text{ k == 0} \\ 1, & \text{ k != 0 } \end{cases}
g k = ⎩ ⎨ ⎧ 1 / 2
, 1 , k == 0 k != 0
MDCT的編解碼流程簡述
MDCT
作爲改進的離散餘弦變換,所以編碼由DCT過渡到MDCT是其本身的優勢的。DCT在二維圖片分量的變換中,其變換系數的高頻分量集中在左上角(轉換矩陣的左上角),而由於圖片的編碼是將整體圖片切割成一個個小方塊進行編碼轉換,更是造成了相鄰方塊間在轉換之後容易引入噪聲,這就是方塊效應
,在視覺上表示爲圖片編碼後相鄰小方塊間的白條。 而諸如LOT
、MDCT
採用了TDAC實現的編碼轉換,轉換後的單位抽樣響應是由中間向其兩邊遞減的,如下圖3 所示: 故MDCT 可以很好的消除方塊效應。 在MDCT 變換中,輸入的離散數字信號長度爲2N,但是經過IMDCT[MDCT[x[n]]]的有效信號長度實則爲N,下圖4 能很好的表示出來:
現對上圖4的編解碼流程進行數學推導 :
MDCT 變換公式:
X
(
k
)
=
2
N
∗
∑
n
=
0
N
−
1
x
[
n
]
.
c
o
s
[
2
π
N
.
(
n
+
1
2
+
N
4
)
.
(
k
+
1
2
)
]
k
∈
{
0
,
.
.
,
N
/
2
−
1
}
\Large X(k) = \frac{2}{N}*\sum_{n=0}^{N-1} x[n].cos[ \frac{2\pi}{N}.(n+\frac{1}{2}+\frac{N}{4}).(k+\frac{1}{2})] \quad \text{k $\in \{0,..,N/2-1\} $}
X ( k ) = N 2 ∗ n = 0 ∑ N − 1 x [ n ] . c o s [ N 2 π . ( n + 2 1 + 4 N ) . ( k + 2 1 ) ] k ∈ { 0 , .. , N /2 − 1 } 在MDCT變換中,由於X(k) == X(N+k),所以X(k)只有N/2個獨立分量,故k 的範圍爲
{
0
,
.
.
,
N
/
2
−
1
}
\{ 0,..,N/2-1\}
{ 0 , . . , N / 2 − 1 }
IMDCT 變換公式:
x
(
n
)
=
2
∗
∑
k
=
0
N
2
−
1
X
[
k
]
.
c
o
s
[
2
π
N
.
(
n
+
1
2
+
N
4
)
.
(
k
+
1
2
)
]
n
∈
{
0
,
.
.
,
N
−
1
}
\Large x(n) = 2*\sum_{k=0}^{\frac{N}{2}-1} X[k].cos[ \frac{2\pi}{N}.(n+\frac{1}{2}+\frac{N}{4}).(k+\frac{1}{2})] \quad \text{n $\in \{0,..,N-1\} $}
x ( n ) = 2 ∗ k = 0 ∑ 2 N − 1 X [ k ] . c o s [ N 2 π . ( n + 2 1 + 4 N ) . ( k + 2 1 ) ] n ∈ { 0 , .. , N − 1 }
如何從解碼端獲取原始信號: 假設輸入信號的序列爲
x
[
n
]
=
{
x
1
,
x
2
}
\large x[n]=\{ x_1,x_2 \}
x [ n ] = { x 1 , x 2 } ,現證明經過MDCT變換以及IMDCT變換後的輸出信號
y
[
n
]
=
{
x
1
−
x
1
ˊ
,
x
2
+
x
2
ˊ
}
\large y[n]=\{ x_1-\acute{x_1},x_2+\acute{x_2} \}
y [ n ] = { x 1 − x 1 ˊ , x 2 + x 2 ˊ } ,
x
1
ˊ
\large\acute{x_1}
x 1 ˊ 爲
x
1
\large x_1
x 1 的逆序序列,而
x
2
ˊ
\large\acute{x_2}
x 2 ˊ 爲
x
2
\large x_2
x 2 的逆序序列。 令輸入的離散信號長度N爲4,
x
[
n
]
=
{
x
0
,
x
1
,
x
2
,
x
3
}
\large x[n]=\{x_0,x_1,x_2,x_3\}
x [ n ] = { x 0 , x 1 , x 2 , x 3 } ,則需證明
y
[
n
]
=
{
x
0
−
x
1
,
x
1
−
x
0
,
x
2
−
x
3
,
x
3
−
x
2
}
\large y[n] =\{ x_0 - x_1,x_1-x_0,x_2-x_3,x_3-x_2\}
y [ n ] = { x 0 − x 1 , x 1 − x 0 , x 2 − x 3 , x 3 − x 2 } 令長度N爲4的MDCT變換矩陣爲C ,則C 的數學定義如下:
C
k
,
n
=
[
C
0
,
0
C
1
,
0
C
0
,
1
C
1
,
1
C
0
,
2
C
1
,
2
C
0
,
3
C
1
,
3
]
,
y
[
n
]
=
x
[
n
]
.
C
.
C
T
⟹
y
[
n
]
=
x
[
n
]
.
(
C
C
T
)
C_k,_n= \begin{bmatrix} C_0,_0 & C_1,_0 \\ C_0,_1 & C_1,_1 \\ C_0,_2 & C_1,_2 \\ C_0,_3 & C_1,_3 \\ \end{bmatrix} ,\quad y[n]=x[n].C.C^T \Longrightarrow \quad y[n]=x[n].(CC^T)
C k , n = ⎣ ⎢ ⎢ ⎡ C 0 , 0 C 0 , 1 C 0 , 2 C 0 , 3 C 1 , 0 C 1 , 1 C 1 , 2 C 1 , 3 ⎦ ⎥ ⎥ ⎤ , y [ n ] = x [ n ] . C . C T ⟹ y [ n ] = x [ n ] . ( C C T ) 再令
Q
=
C
C
T
Q = CC^T
Q = C C T ,且Q爲4*4矩陣,則上述證明轉換爲推導
Q
0
,
0
=
1
,
Q
0
,
1
=
−
1
Q_0,_0 = 1,Q_0,_1=-1
Q 0 , 0 = 1 , Q 0 , 1 = − 1 。再N=4的情況下,C表示如下:
C
k
,
n
=
[
c
o
s
3
8
π
c
o
s
9
8
π
c
o
s
5
8
π
c
o
s
15
8
π
c
o
s
7
8
π
c
o
s
21
8
π
c
o
s
9
8
π
c
o
s
27
8
π
]
,
c
o
s
a
.
c
o
s
b
=
c
o
s
(
a
+
b
)
+
c
o
s
(
a
−
b
)
2
C_k,_n= \begin{bmatrix} cos\frac{3}{8}\pi & cos\frac{9}{8}\pi \\ cos\frac{5}{8}\pi & cos\frac{15}{8}\pi \\ cos\frac{7}{8}\pi & cos\frac{21}{8}\pi \\ cos\frac{9}{8}\pi & cos\frac{27}{8}\pi \\ \end{bmatrix}\quad,\quad cosa.cosb = \frac{cos(a+b) + cos(a-b)}{2}
C k , n = ⎣ ⎢ ⎢ ⎡ c o s 8 3 π c o s 8 5 π c o s 8 7 π c o s 8 9 π c o s 8 9 π c o s 8 1 5 π c o s 8 2 1 π c o s 8 2 7 π ⎦ ⎥ ⎥ ⎤ , c o s a . c o s b = 2 c o s ( a + b ) + c o s ( a − b )
Q
0
,
0
=
C
0
,
0
∗
C
0
,
0
+
C
1
,
0
∗
C
1
,
0
⟹
c
o
s
3
8
π
.
c
o
s
3
8
π
+
c
o
s
9
8
π
.
c
o
s
9
8
π
⟹
1
Q_0,_0=C_0,_0*C_0,_0 + C_1,_0*C_1,_0 \Longrightarrow cos\frac{3}{8}\pi.cos\frac{3}{8}\pi +cos\frac{9}{8}\pi.cos\frac{9}{8}\pi \Longrightarrow 1
Q 0 , 0 = C 0 , 0 ∗ C 0 , 0 + C 1 , 0 ∗ C 1 , 0 ⟹ c o s 8 3 π . c o s 8 3 π + c o s 8 9 π . c o s 8 9 π ⟹ 1
Q
0
,
1
=
C
0
,
1
∗
C
0
,
0
+
C
1
,
1
∗
C
1
,
0
⟹
c
o
s
5
8
π
.
c
o
s
3
8
π
+
c
o
s
15
8
π
.
c
o
s
9
8
π
⟹
−
1
Q_0,_1=C_0,_1*C_0,_0 + C_1,_1*C_1,_0 \Longrightarrow cos\frac{5}{8}\pi.cos\frac{3}{8}\pi +cos\frac{15}{8}\pi.cos\frac{9}{8}\pi \Longrightarrow -1
Q 0 , 1 = C 0 , 1 ∗ C 0 , 0 + C 1 , 1 ∗ C 1 , 0 ⟹ c o s 8 5 π . c o s 8 3 π + c o s 8 1 5 π . c o s 8 9 π ⟹ − 1
Q
0
,
2
=
C
0
,
2
∗
C
0
,
0
+
C
1
,
2
∗
C
1
,
0
⟹
c
o
s
7
8
π
.
c
o
s
3
8
π
+
c
o
s
21
8
π
.
c
o
s
9
8
π
⟹
0
Q_0,_2=C_0,_2*C_0,_0 + C_1,_2*C_1,_0 \Longrightarrow cos\frac{7}{8}\pi.cos\frac{3}{8}\pi +cos\frac{21}{8}\pi.cos\frac{9}{8}\pi \Longrightarrow 0
Q 0 , 2 = C 0 , 2 ∗ C 0 , 0 + C 1 , 2 ∗ C 1 , 0 ⟹ c o s 8 7 π . c o s 8 3 π + c o s 8 2 1 π . c o s 8 9 π ⟹ 0
Q
0
,
3
=
C
0
,
3
∗
C
0
,
0
+
C
1
,
3
∗
C
1
,
0
⟹
c
o
s
9
8
π
.
c
o
s
3
8
π
+
c
o
s
27
8
π
.
c
o
s
9
8
π
⟹
0
Q_0,_3=C_0,_3*C_0,_0 + C_1,_3*C_1,_0 \Longrightarrow cos\frac{9}{8}\pi.cos\frac{3}{8}\pi +cos\frac{27}{8}\pi.cos\frac{9}{8}\pi \Longrightarrow 0
Q 0 , 3 = C 0 , 3 ∗ C 0 , 0 + C 1 , 3 ∗ C 1 , 0 ⟹ c o s 8 9 π . c o s 8 3 π + c o s 8 2 7 π . c o s 8 9 π ⟹ 0
故
[
x
0
x
1
x
2
x
3
]
∗
[
1
C
1
,
0
C
2
,
0
C
3
,
0
−
1
C
1
,
1
C
2
,
1
C
3
,
1
0
C
1
,
2
C
2
,
2
C
3
,
2
0
C
1
,
3
C
2
,
3
C
3
,
3
]
=
{
y
0
,
y
1
,
y
2
,
y
3
}
\large \begin{bmatrix} x_0 & x_1 &x_2 &x_3 \\ \end{bmatrix} * \begin{bmatrix} 1 & C_1,_0 &C_2,_0 &C_3,_0 \\ -1 &C_1,_1 &C_2,_1 &C_3,_1 \\ 0 &C_1,_2 &C_2,_2 &C_3,_2 \\ 0 &C_1,_3 &C_2,_3 &C_3,_3 \\ \end{bmatrix} = \{y_0,y_1,y_2,y_3\}
[ x 0 x 1 x 2 x 3 ] ∗ ⎣ ⎢ ⎢ ⎢ ⎡ 1 − 1 0 0 C 1 , 0 C 1 , 1 C 1 , 2 C 1 , 3 C 2 , 0 C 2 , 1 C 2 , 2 C 2 , 3 C 3 , 0 C 3 , 1 C 3 , 2 C 3 , 3 ⎦ ⎥ ⎥ ⎥ ⎤ = { y 0 , y 1 , y 2 , y 3 } 可得
y
0
=
x
0
−
x
1
\large y_0 = x_0 - x_1
y 0 = x 0 − x 1 ,後續
y
1
\large y_1
y 1 的推導讀者可以自證。 令
x
i
˘
=
{
x
i
,
x
i
+
1
}
\breve{x_i} =\{ x_i,x_{i+1} \}
x i ˘ = { x i , x i + 1 } ,
x
i
+
1
˘
=
{
x
i
+
1
,
x
i
+
2
}
\breve{x_{i+1}}=\{x_{i+1},x_{i+2}\}
x i + 1 ˘ = { x i + 1 , x i + 2 } ,在MDCT的輸入序列中,當前序列和下個序列的時域重疊爲50%.而
y
i
=
I
M
D
C
T
(
M
D
C
T
(
x
i
˘
)
)
=
{
x
i
−
x
i
ˊ
,
x
i
+
1
+
x
i
+
1
ˊ
}
y_i= IMDCT(MDCT(\breve{x_i})) = \{\ x_i - \acute{x_i},x_{i+1} + \acute{x_{i+1}} \}
y i = I M D C T ( M D C T ( x i ˘ ) ) = { x i − x i ˊ , x i + 1 + x i + 1 ˊ }
y
i
+
1
=
I
M
D
C
T
(
M
D
C
T
(
x
i
+
1
˘
)
)
=
{
x
i
+
1
−
x
i
+
1
ˊ
,
x
i
+
2
+
x
i
+
2
ˊ
}
y_{i+1}= IMDCT(MDCT(\breve{x_{i+1}})) = \{\ x_{i+1} - \acute{x_{i+1}},x_{i+2} + \acute{x_{i+2}} \}
y i + 1 = I M D C T ( M D C T ( x i + 1 ˘ ) ) = { x i + 1 − x i + 1 ˊ , x i + 2 + x i + 2 ˊ } 再令輸出序列的
yspan style="height: 0.15em;">
− x i ˊ , x i + 1 + x i + 1 ˊ }
y
i
+
1
=
I
M
D
C
T
(
M
D
C
T
(
x
i
+
1
˘
)
)
=
{
x
i
+
1
−
x
i
+
1
ˊ
,
x
i
+
2
+
x
i
+
2
ˊ
}
y_{i+1}= IMDCT(MDCT(\breve{x_{i+1}})) = \{\ x_{i+1} - \acute{x_{i+1}},x_{i+2} + \acute{x_{i+2}} \}
y i + 1 = I M D C T ( M D C T ( x i + 1 ˘ ) ) = { x i + 1 − x i + 1 ˊ , x i + 2 + x i + 2 ˊ } 再令輸出序列的
y
i
,
y
i
+
1
y_i,y_{i+1}
y i ,