zoukankan      html  css  js  c++  java
  • DFT&IDFT学习笔记

    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^{2pi i}=1=x^n\ e^{frac{2pi i}{n}}=x\ ecause x_i^n=1\ herefore 模长为1,均匀分布在以原点为圆心的一个单位圆上\ 则设omega_n^x为方程x^n=1的第x个根(x_0=1,x_1=e^{frac{2pi i}{n}},dots,x_k=e^{frac{2pi ik}{n}},dots,x_{n-1}=e^{frac{2pi i(n-1)}{n}})\ 称omega_n^1(即omega_n)为单位根\ omega_n^k=e^{frac{2pi ik}{n}}\ ]


    引理1:

    [forallomega_{nk}^{tk}=e^{frac{2pi itk}{nk}}=e^{frac{2pi it}{n}}=omega_{n}^{t}\ 即上下同时乘一个数依然成立\ ]

    引理2:

    [omega_n^{frac n 2+k}=e^{frac{2pi i(frac n 2+k)}{n}}=e^{frac{pi in+2pi ik}{n}}\ =e^{frac{pi in}{n}} imes e^{frac{2pi ik}{n}}=e^{pi i} imes e^{frac{2pi ik}{n}}\ =e^{pi i} imes e^{frac{2pi ik}{n}}=-e^{frac{2pi 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_iomega_n^{ki}\ 在这令n为2^m(m为使nleq2^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^ksum_{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^ksum_{i=0}^{frac n 2-1} a_{2i+1}omega_{frac n 2}^{ki}\ ]

    [令0leq k<frac n 2\ f(omega_n^k)=sum_{i=0}^{frac n 2-1} a_{2i}omega_{frac n 2}^{ki}+omega_n^ksum_{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^ksum_{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\ ecause omega_n^n=1\ herefore 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^ksum_{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^ksum_{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^ksum_{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(nlog_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\ 将点坐标代入\ egin{cases}egin{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 imes p的矩阵,元素为a_{i,j}\ B为p imes m的矩阵,元素为b_{i,j}\ A imes B=C\ C为n imes m的矩阵,元素为c_{i,j}\ c_{i,j}=sum_{k=1}^p a_{i,k} imes b_{k,j}\ ]

    2.单位元矩阵与逆矩阵

    [单位元:类似乘法的单位元为1,异或运算的单位元为0等\ 矩阵乘法的单位元为 I= egin{bmatrix} 1&0&cdots&0\ 0&1&cdots&0\ vdots&vdots&ddots&vdots\ 0&0&cdots&1\ end{bmatrix}\ 即n imes n的从左上角到右下角都是1的矩阵,其余元素都是0\ 称I_k为k imes k的单位元矩阵\ 逆矩阵:如有A imes B=I\ 则称B是A的逆矩阵\ 记做B=A^{-1} ]

    Tips:

    矩阵乘法不满足交换律

    一个矩阵乘上一个数的结果是矩阵中每个元素都乘上这个数后的矩阵

    [n imes D o d_{i,j} imes n ]


    [解出以上方程组,即可知道所有a_i的值,也就成功将点值表示法转化为系数表示法\ 将上述方程组转化为矩阵乘法形式\ egin{bmatrix} f(omega_n^0)\ f(omega_n^1)\ vdots\ f(omega_n^{n-1}) end{bmatrix} = egin{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} egin{bmatrix} a_0\ a_1\ vdots\ a_{n-1}\ end{bmatrix} ]

    [设矩阵V= egin{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=egin{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 imes a=sum_{i=0}^{n-1}a^{i+1}=sum_{i=1}^na^i\ S imes a-S=sum_{i=1}^na^i-sum_{i=0}^{n-1}a^i=a^n-1\ S imes(a-1)=a^n-1\ S=frac{a^n-1}{a-1} ]


    [再设E=D imes V\ 则e_{i,j}=sum_{k=0}^{n-1} d_{i,k} imes v_{k,j}\ =sum_{k=0}^{n-1} (omega_n^{-i})^k imes (omega_n^k)^j\ =sum_{k=0}^{n-1} omega_n^{-ik} imesomega_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 ot=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\ herefore e_{i,j}=[i=j]n\ herefore E=nI ]

    [ herefore DV=E=nI\ herefore frac 1 nDV=I\ herefore frac 1 nD=IV^{-1}\ ecause I为矩阵乘法的单位元\ herefore frac 1 nD=V^{-1}\ V^{-1}=frac 1 nD ]

    [egin{bmatrix} f(omega_n^0)\ f(omega_n^1)\ vdots\ f(omega_n^{n-1}) end{bmatrix} =Vegin{bmatrix} a_0\ a_1\ vdots\ a_{n-1}\ end{bmatrix}\ ]

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

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

    [\egin{bmatrix} a_0\ a_1\ vdots\ a_{n-1}\ end{bmatrix}=egin{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})所有数,成功将点值表示法转换为系数表示法

  • 相关阅读:
    TP
    vim manual 个人笔记
    关于动画属性
    过渡
    关于 css3 的filter属性
    html 中行内元素和块级元素区别
    JS以不同的格式保存文件内容
    64位Kali无法顺利执行pwn1问题的解决方案
    鱼龙混杂 · 数据结构学习笔记(01)
    Terminal(终端) 在 OS X下如何快速调用
  • 原文地址:https://www.cnblogs.com/hzf29721/p/10701091.html
Copyright © 2011-2022 走看看