1. 程式人生 > >DFT&IDFT學習筆記

DFT&IDFT學習筆記

clas tip 上下 方程組 idf 很快 cas 行為 歐拉

DFT:
\[ 多項式定義:\sum_{i=0}^n a_i x^i\系數表示法:f(x)=\sum_{i=0}^n a_i x^i\點值表示法:\{(x_0,f(x_0)),(x_1,f(x_1)),\dots,(x_n,f(x_n))\} \]


\[ i^2=-1,i=\sqrt{-1}\解方程x^n=1,n個根\歐拉公式e^{\pi i}=-1\e^{2\pi i}=1=x^n\e^{\frac{2\pi i}{n}}=x\\because x_i^n=1\\therefore 模長為1,均勻分布在以原點為圓心的一個單位圓上\則設\omega_n^x為方程x^n=1的第x個根(x_0=1,x_1=e^{\frac{2\pi i}{n}},\dots,x_k=e^{\frac{2\pi ik}{n}},\dots,x_{n-1}=e^{\frac{2\pi i(n-1)}{n}})\稱\omega_n^1(即\omega_n)為單位根\\omega_n^k=e^{\frac{2\pi ik}{n}}\\]


引理1:

\[ \forall\omega_{nk}^{tk}=e^{\frac{2\pi itk}{nk}}=e^{\frac{2\pi it}{n}}=\omega_{n}^{t}\即上下同時乘一個數依然成立\\]

引理2:

\[ \omega_n^{\frac n 2+k}=e^{\frac{2\pi i(\frac n 2+k)}{n}}=e^{\frac{\pi in+2\pi ik}{n}}\=e^{\frac{\pi in}{n}}\times e^{\frac{2\pi ik}{n}}=e^{\pi i}\times e^{\frac{2\pi ik}{n}}\=e^{\pi i}\times e^{\frac{2\pi ik}{n}}=-e^{\frac{2\pi ik}{n}}=-\omega_n^k\即\omega_n^{\frac n 2+k}=-\omega_n^k \]

\[ 由玄學內容可知\將\omega_n^k代入f(x)並將其轉為點值表示法很快\\]

\[ 則f(\omega_n^k)=\sum_{i=0}^n a_i\omega_n^{ki}\在這令n為2^m(m為使n\leq2^m的最小值),之後的a_i補零便於二分\f(\omega_n^k)=\sum_{i=0}^{\frac n 2-1} a_{2i}\omega_n^{2ki}+\sum_{i=0}^{\frac n 2-1} a_{2i+1}\omega_n^{k(2i+1)}\f(\omega_n^k)=\sum_{i=0}^{\frac n 2-1} a_{2i}\omega_n^{2ki}+\omega_n^k\sum_{i=0}^{\frac n 2-1} a_{2i+1}\omega_n^{2ki}\f(\omega_n^k)=\sum_{i=0}^{\frac n 2-1} a_{2i}\omega_{\frac n 2}^{ki}+\omega_n^k\sum_{i=0}^{\frac n 2-1} a_{2i+1}\omega_{\frac n 2}^{ki}\\]

\[ 令0\leq k<\frac n 2\f(\omega_n^k)=\sum_{i=0}^{\frac n 2-1} a_{2i}\omega_{\frac n 2}^{ki}+\omega_n^k\sum_{i=0}^{\frac n 2-1} a_{2i+1}\omega_{\frac n 2}^{ki}\f(\omega_n^{k+\frac n 2})=\sum_{i=0}^{\frac n 2-1} a_{2i}\omega_{\frac n 2}^{(k+\frac n 2)i}+\omega_n^{k+\frac n 2}\sum_{i=0}^{\frac n 2-1} a_{2i+1}\omega_{\frac n 2}^{(k+\frac n 2)i}\=\sum_{i=0}^{\frac n 2-1} a_{2i}\omega_{\frac n 2}^{(k+\frac n 2)i}-\omega_n^k\sum_{i=0}^{\frac n 2-1} a_{2i+1}\omega_{\frac n 2}^{(k+\frac n 2)i}\\]


\[ \omega_{\frac n 2}^{(k+\frac n 2)i}=\omega_{\frac n 2}^{ki+\frac n 2i}=\omega_{\frac n 2}^{ki}(\omega_{\frac n 2}^{\frac n 2})^i\\because \omega_n^n=1\\therefore \omega_{\frac n 2}^{(k+\frac n 2)i}=\omega_{\frac n 2}^{ki} \]


\[ f(\omega_n^{k+\frac n 2})=\sum_{i=0}^{\frac n 2-1} a_{2i}\omega_{\frac n 2}^{(k+\frac n 2)i}-\omega_n^k\sum_{i=0}^{\frac n 2-1} a_{2i+1}\omega_{\frac n 2}^{(k+\frac n 2)i}\f(\omega_n^{k+\frac n 2})=\sum_{i=0}^{\frac n 2-1} a_{2i}\omega_{\frac n 2}^{ki}-\omega_n^k\sum_{i=0}^{\frac n 2-1} a_{2i+1}\omega_{\frac n 2}^{ki} \]

\[ 令A'=\sum_{i=0}^{\frac n 2-1} a_{2i}\omega_{\frac n 2}^{ki}\A''=\omega_n^k\sum_{i=0}^{\frac n 2-1} a_{2i+1}\omega_{\frac n 2}^{ki}\觀察得f(\omega_n^k)=A'+A''\f(\omega_n^{k+\frac n 2})=A'-A''\即算出\omega_n^k的A'和A''即可O(1)算出f(\omega_n^{k+\frac n 2})=A'-A''\不斷二分,感性理解復雜度為O(n\log_2n)(類似於線段樹) \]

至此,由系數表示法轉化為點值表示法做完,接下來講這麽變回去(即由點值表示法變為系數表示法)

IDFT:
\[ 平面上有n個點,分別為\{(\omega_n^0,f(\omega_n^0)),(\omega_n^1,f(\omega_n^1)),\dots,(\omega_n^{n-1},f(\omega_n^{n-1}))\}(這是我們剛剛DFT轉成的點值表示法)\現想要得到這n個點組成的唯一能確定的n-1次的解析式\設解析式為f(x)=\sum_{i=0}^{n-1}a_ix^i\將點坐標代入\\begin{cases}\begin{array}{ccccccccccc} f(\omega_n^0)&=&a_0(\omega_n^0)^0&+&a_1(\omega_n^0)^1&+&a_2(\omega_n^0)^2&+&\dots&+&a_{n-1}(\omega_n^0)^{n-1}\f(\omega_n^1)&=&a_0(\omega_n^1)^0&+&a_1(\omega_n^1)^1&+&a_2(\omega_n^1)^2&+&\dots&+&a_{n-1}(\omega_n^1)^{n-1}\\vdots&&\vdots&&\vdots&&\vdots&&\vdots&&\vdots\f(\omega_n^{n-1})&=&a_0(\omega_n^{n-1})^0&+&a_1(\omega_n^{n-1})^1&+&a_2(\omega_n^{n-1})^2&+&\dots&+&a_{n-1}(\omega_n^{n-1})^{n-1}\\end{array}\end{cases} \]


矩陣有關預備知識

1.矩陣乘法

\[ A,B為兩個矩陣\A為n\times p的矩陣,元素為a_{i,j}\B為p\times m的矩陣,元素為b_{i,j}\A\times B=C\C為n\times m的矩陣,元素為c_{i,j}\c_{i,j}=\sum_{k=1}^p a_{i,k}\times b_{k,j}\\]

2.單位元矩陣與逆矩陣

\[ 單位元:類似乘法的單位元為1,異或運算的單位元為0等\矩陣乘法的單位元為 I= \begin{bmatrix} 1&0&\cdots&0\0&1&\cdots&0\\vdots&\vdots&\ddots&\vdots\0&0&\cdots&1\\end{bmatrix}\即n\times n的從左上角到右下角都是1的矩陣,其余元素都是0\稱I_k為k\times k的單位元矩陣\逆矩陣:如有A\times B=I\則稱B是A的逆矩陣\記做B=A^{-1} \]

Tips:

矩陣乘法不滿足交換律

一個矩陣乘上一個數的結果是矩陣中每個元素都乘上這個數後的矩陣
\[ n\times D\to d_{i,j}\times n \]


\[ 解出以上方程組,即可知道所有a_i的值,也就成功將點值表示法轉化為系數表示法\將上述方程組轉化為矩陣乘法形式\\begin{bmatrix} f(\omega_n^0)\f(\omega_n^1)\\vdots\f(\omega_n^{n-1}) \end{bmatrix} = \begin{bmatrix} (\omega_n^0)^0&(\omega_n^0)^1&(\omega_n^0)^2&\dots&(\omega_n^0)^{n-1}\(\omega_n^1)^0&(\omega_n^1)^1&(\omega_n^1)^2&\dots&(\omega_n^1)^{n-1}\\vdots&\vdots&\vdots&\ddots&\vdots\(\omega_n^{n-1})^0&(\omega_n^{n-1})^1&(\omega_n^{n-1})^2&\dots&(\omega_n^{n-1})^{n-1}\\end{bmatrix} \begin{bmatrix} a_0\a_1\\vdots\a_{n-1}\\end{bmatrix} \]

\[ 設矩陣V= \begin{bmatrix} (\omega_n^0)^0&(\omega_n^0)^1&(\omega_n^0)^2&\dots&(\omega_n^0)^{n-1}\(\omega_n^1)^0&(\omega_n^1)^1&(\omega_n^1)^2&\dots&(\omega_n^1)^{n-1}\\vdots&\vdots&\vdots&\ddots&\vdots\(\omega_n^{n-1})^0&(\omega_n^{n-1})^1&(\omega_n^{n-1})^2&\dots&(\omega_n^{n-1})^{n-1}\\end{bmatrix}\另設矩陣D=\begin{bmatrix} (\omega_n^{-0})^0&(\omega_n^{-0})^1&(\omega_n^{-0})^2&\dots&(\omega_n^{-0})^{n-1}\(\omega_n^{-1})^0&(\omega_n^{-1})^1&(\omega_n^{-1})^2&\dots&(\omega_n^{-1})^{n-1}\\vdots&\vdots&\vdots&\ddots&\vdots\(\omega_n^{-(n-1)})^0&(\omega_n^{-(n-1)})^1&(\omega_n^{-(n-1)})^2&\dots&(\omega_n^{-(n-1)})^{n-1}\\end{bmatrix}\\]

Tip:

\[ 為方便後續計算,我們稱第1行為第0行,第2行為第1行,第n行為第n-1行\則v_{i,j}=(\omega_n^i)^j\則d_{i,j}=(\omega_n^{-i})^j \]


\[ 等比求和公式:\求\sum_{i=0}^{n-1}a^i\令S=\sum_{i=0}^{n-1}a^i\則S\times a=\sum_{i=0}^{n-1}a^{i+1}=\sum_{i=1}^na^i\S\times a-S=\sum_{i=1}^na^i-\sum_{i=0}^{n-1}a^i=a^n-1\S\times(a-1)=a^n-1\S=\frac{a^n-1}{a-1} \]


\[ 再設E=D\times V\則e_{i,j}=\sum_{k=0}^{n-1} d_{i,k}\times v_{k,j}\=\sum_{k=0}^{n-1} (\omega_n^{-i})^k\times (\omega_n^k)^j\=\sum_{k=0}^{n-1} \omega_n^{-ik}\times\omega_n^{kj}\=\sum_{k=0}^{n-1} \omega_n^{k(j-i)}\當[i=j]時\e_{i,j}=\sum_{k=0}^{n-1} 1=n\當[i\not=j]時\e_{i,j}=\sum_{k=0}^{n-1} (\omega_n^{j-i})^k\=\frac{(\omega_n^{j-i})^n-1}{\omega_n^{j-i}-1}\=\frac{(\omega_n^n)^{j-i}-1}{\omega_n^{j-i}-1}\=\frac{1^{j-i}-1}{\omega_n^{j-i}-1}\=\frac{0}{\omega_n^{j-i}-1}\=0\\therefore e_{i,j}=[i=j]n\\therefore E=nI \]

\[ \therefore DV=E=nI\\therefore \frac 1 nDV=I\\therefore \frac 1 nD=IV^{-1}\\because I為矩陣乘法的單位元\\therefore \frac 1 nD=V^{-1}\V^{-1}=\frac 1 nD \]

\[ \begin{bmatrix} f(\omega_n^0)\f(\omega_n^1)\\vdots\f(\omega_n^{n-1}) \end{bmatrix} =V\begin{bmatrix} a_0\a_1\\vdots\a_{n-1}\\end{bmatrix}\\]
\[ \begin{bmatrix} f(\omega_n^0)\f(\omega_n^1)\\vdots\f(\omega_n^{n-1}) \end{bmatrix} V^{-1}=\begin{bmatrix} a_0\a_1\\vdots\a_{n-1}\\end{bmatrix}\\]
\[ \begin{bmatrix} a_0\a_1\\vdots\a_{n-1}\\end{bmatrix} =\begin{bmatrix} f(\omega_n^0)\f(\omega_n^1)\\vdots\f(\omega_n^{n-1}) \end{bmatrix} V^{-1} \]
\[ \\\begin{bmatrix} a_0\a_1\\vdots\a_{n-1}\\end{bmatrix}=\begin{bmatrix} f(\omega_n^0)\f(\omega_n^1)\\vdots\f(\omega_n^{n-1}) \end{bmatrix} \frac 1 n D \\]

搞定!至此就求出\(a_0\)\(a_{n-1}\)所有數,成功將點值表示法轉換為系數表示法

DFT&IDFT學習筆記