DCT和DFT的關係以及MDCT的推導證明

背景

  DCT是離散餘弦變換的縮寫,由於其變換後具有較高的能量聚集度,通常作爲音視頻編碼的變換去使用。而由於DCT的塊效應,人們發明了很多方法去克服塊效應。例如LOTMDCT。在aac的編碼中採用時域重疊的MDCT去實現(TDAC)。本博文僅從DFT到DCT的推導以及MDCT的編解碼流程進行講解,力求以數學的推導來闡明過程。

DFT : 離散傅立葉變換. 用於將離散的時域信號轉換到頻域上。
DCT : 離散餘弦變換,也是正交變換。用於將離散的時域信號轉換爲頻域上的信息
MDCT : 改進後的離散餘弦變換. 通過時域重疊來消除混疊。
IMDCT : MDCT的逆變換,時域信號在經過MDCT編碼以及IMDCT解碼後,還原出的並不是原始信號

DFT到DCT的推導

DFT : X(k)=n=0N1x[n].ej.2π.knN \large X(k) = \sum_{n=0}^{N-1} x[n].e^{\frac{-j.2\pi.kn}{N}} \text{ }
歐拉公式 : ejθ=cosθ+j.sinθ\large e^{-j\theta} = cos\theta + j.sin\theta

step:

  1. 虛部爲0: 觀察DFT變換可得,當其爲實偶信號時,虛部爲0。因爲實偶信號的性質是x(n) = - x(n),故在將DFT的複數部分拆開後由於其虛部爲奇函數,故實偶信號的虛部將會抵消。
  2. 構建實偶信號: 時域信號經抽樣後皆爲實數,而要滿足偶函數的性質需要人爲構造。
    假設抽樣後具有從0到N-1的N點離散數字信號,其數學定義爲 x[m]={x[0],....,x[N1]}\large x[m] = \{ {x[0],....,x[N-1]} \}。將該序列進行偶延拓,其數學定義更改爲
    x[m]ˊ={x[m],if n belong to { 0,..,N-1 }x[m1],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]ˊ\acute{x[m]}信號如下圖1所示:

    再將x[m]ˊ\acute{x[m]}序列整體向右偏移12\Large\frac{1}{2},令x[m]¨\large\ddot{x[m]}x[m12]ˊ\large\acute{x[m-\frac{1}{2}]}x[m]¨\large\ddot{x[m]}如下圖2所示:
    在這裏插入圖片描述
  3. 重新推導實偶信號的DFT公式: X(k)=m=N+12N12x[m12]¨.ej.2π.km2N =2m=12N12x[m12]¨.ej.2π.km2N\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}}令n = m + 12\frac{1}{2},則上式可化爲2n=0N1x[n]ˊ.cos((n+12).kπN)\Large2*\sum_{n=0}^{N-1} \acute{x[n]}.cos(\frac{(n+\frac{1}{2}).k\pi}{N})
  4. 正交變換: 將DCT變換中與x[n]相乘的係數組織成矩陣C,如果該矩陣正交則有C.CT=EC.C^{T} = E.故將變換核的係數2做變換可得下式:2N.gkn=0N1x[n]ˊ.cos((n+12).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}
    其中gkg_k的數學定義爲:
    gk={1/2, k == 01, k != 0 \large g_k = \begin{cases} 1/\sqrt{2}, & \text{ k == 0} \\ 1, & \text{ k != 0 } \end{cases}

MDCT的編解碼流程簡述

  MDCT作爲改進的離散餘弦變換,所以編碼由DCT過渡到MDCT是其本身的優勢的。DCT在二維圖片分量的變換中,其變換系數的高頻分量集中在左上角(轉換矩陣的左上角),而由於圖片的編碼是將整體圖片切割成一個個小方塊進行編碼轉換,更是造成了相鄰方塊間在轉換之後容易引入噪聲,這就是方塊效應,在視覺上表示爲圖片編碼後相鄰小方塊間的白條。
  而諸如LOTMDCT採用了TDAC實現的編碼轉換,轉換後的單位抽樣響應是由中間向其兩邊遞減的,如下圖3所示:
在這裏插入圖片描述
MDCT可以很好的消除方塊效應。
  在MDCT變換中,輸入的離散數字信號長度爲2N,但是經過IMDCT[MDCT[x[n]]]的有效信號長度實則爲N,下圖4能很好的表示出來:
在這裏插入圖片描述

現對上圖4的編解碼流程進行數學推導

  1. MDCT變換公式:
    X(k)=2Nn=0N1x[n].cos[2πN.(n+12+N4).(k+12)]{0,..,N/21}\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\} $}
    在MDCT變換中,由於X(k) == X(N+k),所以X(k)只有N/2個獨立分量,故k的範圍爲{0,..,N/21}\{ 0,..,N/2-1\}
  2. IMDCT變換公式:
    x(n)=2k=0N21X[k].cos[2πN.(n+12+N4).(k+12)]{0,..,N1}\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\} $}
  3. 如何從解碼端獲取原始信號:
      假設輸入信號的序列爲x[n]={x1,x2}\large x[n]=\{ x_1,x_2 \},現證明經過MDCT變換以及IMDCT變換後的輸出信號y[n]={x1x1ˊ,x2+x2ˊ}\large y[n]=\{ x_1-\acute{x_1},x_2+\acute{x_2} \},x1ˊ\large\acute{x_1}x1\large x_1的逆序序列,而x2ˊ\large\acute{x_2}x2\large x_2的逆序序列。
      令輸入的離散信號長度N爲4,x[n]={x0,x1,x2,x3}\large x[n]=\{x_0,x_1,x_2,x_3\},則需證明y[n]={x0x1,x1x0,x2x3,x3x2}\large y[n] =\{ x_0 - x_1,x_1-x_0,x_2-x_3,x_3-x_2\}
      令長度N爲4的MDCT變換矩陣爲C,則C的數學定義如下:
    Ck,n=[C0,0C1,0C0,1C1,1C0,2C1,2C0,3C1,3],y[n]=x[n].C.CTy[n]=x[n].(CCT) 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)
      再令Q=CCTQ = CC^T,且Q爲4*4矩陣,則上述證明轉換爲推導Q0,0=1,Q0,1=1Q_0,_0 = 1,Q_0,_1=-1。再N=4的情況下,C表示如下:
    Ck,n=[cos38πcos98πcos58πcos158πcos78πcos218πcos98πcos278π],cosa.cosb=cos(a+b)+cos(ab)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}
       Q0,0=C0,0C0,0+C1,0C1,0cos38π.cos38π+cos98π.cos98π1Q_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
       Q0,1=C0,1C0,0+C1,1C1,0cos58π.cos38π+cos158π.cos98π1Q_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
       Q0,2=C0,2C0,0+C1,2C1,0cos78π.cos38π+cos218π.cos98π0Q_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
       Q0,3=C0,3C0,0+C1,3C1,0cos98π.cos38π+cos278π.cos98π0Q_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

   故
[x0x1x2x3][1C1,0C2,0C3,01C1,1C2,1C3,10C1,2C2,2C3,20C1,3C2,3C3,3]={y0,y1,y2,y3}\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\}
   可得y0=x0x1\large y_0 = x_0 - x_1,後續y1\large y_1的推導讀者可以自證。
   令xi˘={xi,xi+1}\breve{x_i} =\{ x_i,x_{i+1} \},xi+1˘={xi+1,xi+2}\breve{x_{i+1}}=\{x_{i+1},x_{i+2}\},在MDCT的輸入序列中,當前序列和下個序列的時域重疊爲50%.而yi=IMDCT(MDCT(xi˘))={ xixiˊ,xi+1+xi+1ˊ} y_i= IMDCT(MDCT(\breve{x_i})) = \{\ x_i - \acute{x_i},x_{i+1} + \acute{x_{i+1}} \} yi+1=IMDCT(MDCT(xi+1˘))={ xi+1xi+1ˊ,xi+2+xi+2ˊ} y_{i+1}= IMDCT(MDCT(\breve{x_{i+1}})) = \{\ x_{i+1} - \acute{x_{i+1}},x_{i+2} + \acute{x_{i+2}} \}
   再令輸出序列的yi,yi+1y_i,y_{i+1}進行時域50%重疊,即可還原出2xi+1\large x_{i+1}

MDCT的快速算法

N點的MDCT可以轉化爲N/2點的DCT-IV進行計算。

  1. MDCT的公式如下:
    X(k)=2Nn=0N1x[n].cos[2πN.(n+12+N4).(k+12)]{0,..,N/21}\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\} $}
    令N=2m,可變換爲:
    X(k)=1Mn=02M1x[n].cos[πM.(n+12+M2).(k+12)]{0,..,N/21}\Large X(k) = \frac{1}{M}*\sum_{n=0}^{2M-1} x[n].cos[ \frac{\pi}{M}.(n+\frac{1}{2}+\frac{M}{2}).(k+\frac{1}{2})] \quad \text{k $\in \{0,..,N/2-1\} $}
    同時令εn=cos[πM.(n+12).(k+12)]\varepsilon_n=cos[\frac{\pi}{M}.(n+\frac{1}{2}).(k+\frac{1}{2})],而εn\varepsilon_n即是DCT變換核的係數因子。現通過εn\varepsilon_n將MDCT化簡:
    X(k)=1Mn=02M1x[n].cos[2πN.(n+12+M2).(k+12)]=n=02M1xn.εM2+n\Large X(k) = \frac{1}{M}*\sum_{n=0}^{2M-1} x[n].cos[ \frac{2\pi}{N}.(n+\frac{1}{2}+\frac{M}{2}).(k+\frac{1}{2})] = \sum_{n=0}^{2M-1} x_n.\varepsilon_{\frac{M}{2}+n}
    =n=0M21[xn.εM2+n+xM1n.ε3M21n+ε2M1n.x3M21n+ε2M+n.x3M2+n](3)\Large = \sum_{n=0}^{\frac{M}{2}-1} [ x_n.\varepsilon_{\frac{M}{2}+n} + x_{M-1-n}.\varepsilon_{\frac{3M}{2}-1-n}+ \varepsilon_{2M-1-n}.x_{\frac{3M}{2}-1-n} + \varepsilon_{2M+n}.x_{\frac{3M}{2}+n} ]\tag{3} 又因爲ε2M+n=ε2M1n=εn\large\varepsilon_{2M+n}=\varepsilon_{2M-1-n}=-\varepsilon_n,式3可化爲:
    n=0M21[xn.εM2+nxM1n.εM2+nεn.x3M21nε2M+n.x3M2+n]\Large \quad \sum_{n=0}^{\frac{M}{2}-1} [ x_n.\varepsilon_{\frac{M}{2}+n} - x_{M-1-n}.\varepsilon_{\frac{M}{2}+n} - \varepsilon_{n}.x_{\frac{3M}{2}-1-n} - \varepsilon_{2M+n}.x_{\frac{3M}{2}+n} ] =n=M/2M1εn.(xnM2x3M21n)n=0M21εn.(x3M21n+x3M2+n)\Large = \sum_{n=M/2}^{M-1} \varepsilon_{n}.(x_{n-\frac{M}{2}} - x_{\frac{3M}{2}-1-n} ) - \sum_{n=0}^{\frac{M}{2}-1} \varepsilon_{n}.( x_{\frac{3M}{2}-1-n} + x_{\frac{3M}{2}+n} ) 則MDCT可以化爲類似DCT變換的求和式:n=0M1xn˘εn,xn˘\large\sum_{n=0}^{M-1}\breve{x_n}\varepsilon_n,\breve{x_n}爲:
    xn˘={(x3M21n+x3M2+n), n = {0,..,M2-1 }(xnM2x3M21n),, n = {M2,..,M -1 }\large \breve{x_n} = \begin{cases} -(x_{\frac{3M}{2}-1-n}+x_{\frac{3M}{2}+n}), & \text{ n = \{0,..,$\frac{M}{2}$-1 \}} \\ (x_{n-\frac{M}{2}} - x_{\frac{3M}{2}-1-n}),, & \text{ n = \{$\frac{M}{2}$,..,$\small M$ -1 \}} \end{cases} 所以2N點的MDCT可以化爲N/2的DCT進行計算,而DCT可以轉化爲FFT通過蝶形單元減少算法的計算時間度。
發佈了5 篇原創文章 · 獲贊 33 · 訪問量 4434
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章