zoukankan      html  css  js  c++  java
  • OI 中的 FFT

    不行啊最近备考简直变成文化狗了= =。。我还脑洞大开想学俄语什么心态。。

    简单地说一下FFT(来,跟我一起念,法〰法〜塔,法斯特~福铝页~圈死佛而母)。。

    FFT本来是做信号变换用的,当然OI和信号变换搭不上边.但是大家都知道,FFT可以快速求卷积.这可以说是由复数的性质决定的.

    FFT是什么

    FFT,是DFT的一种实现.它可以在$Theta left( nlog_2{n} ight)$(其中n为输入规模)时间内完成DFT.

    也就是说,FFT是DFT的一种具体实现.因此,与其问FFT是什么,更不如问DFT是什么.

    DFT:Discrete Fourier Transform即离散傅里叶变换.由于计算机并不能真正处理连续数据,因此我们所说的傅里叶变换仅限于DFT.

    具体的,计算机和人类都不可能完全识别连续数据,设这个连续数据是一个函数$mathtt{F} ( t) mathtt{ } ( t in mathbb{R}^+)$,我们只能选择一些点$t_n mathtt{ } ( t_n in mathbb{R}^+, n in mathbb{Z}^+, t_{n - 1} < t_n)$,令$f_n = mathtt{F} ( t_n)$,这个过程称为采样,这些$t_n$被称为采样点.一般我们规定只能取有限个采样点并且每个采样点间距相同,即$t_n = t_{n - 1} + b mathtt{ } left( mathtt{const } b = frac{1}{max n}, n in mathbb{Z}^+ ight)$,此时既然采样点间距相同,采样点的数据也是成序列的.不妨设这个序列为$mathtt{S}_{mathtt{F}}$.

    傅里叶变换其实是由一个定义在F上的积分[ widehat{mathtt{F}} (xi) = int_{- infty}^{infty} mathtt{F} (x) e^{- 2 pi i x xi} ext{dx} ]定义的.这是连续傅立叶变换,自然的,我们可以很轻松地写出离散傅里叶变换[ widehat{mathtt{S}_{mathtt{F}}} [ k] = sum_{n = 0}^{N - 1} mathtt{S}_{mathtt{F}} [ n] e^{frac{- 2 pi i n k}{N}} left( mathrm{for easier input,lets define N as }max n ight) ]基本就是把积分换成求和而已.

    附加题×1: 已知傅立叶变换的逆变换是[ mathtt{F} (x) = int_{0}^{infty} hat{mathtt{F}} (xi) e^{2 pi i xi x} hspace{0.25em} d xi ]写出它的离散形式.

    FFT适用性

    很自然地,我们想到一个问题: FFT,既然是`快速`算法,它怎么做?

    具体的,对于任何一个输入长度为N的序列,我们可以理论上精确地在$Theta ( n log_2 n)$的时间内完成FFT.但是由于混合基FFT过于复杂,我们这里只讨论$N=2^a left( ain  mathbb{R} ight)$的情况,即序列长度为2的幂时的情况.

    DFT与卷积的关系

    (按照算导的写法,姑且将$omega_n$理解为wiki里的$omega_n$共轭,做刚好相对称的FFT.)

    暂且设$omega_n = e^{2 pi i / n}$.注意到我们这里出现了复数次幂,这是什么意思呢?

    [e^{iu}=cos{u}+i sin{u}]

    因此,如果将每一个复数投射到复平面上,这些点顺时针形成一个圈.

     

    我们的B点,称为我们的主n次单位根.其它点则都是它的幂.

    我们求FFT,相当于对一个多项式在这一圈的所有复数上进行求值,因为[ widehat{mathtt{S}_{mathtt{F}}} [ k] = sum_{n = 0}^{N - 1} mathtt{S}_{mathtt{F}} [ n] omega_N^{nk} ]

    - 概念

    -- 复数的模

    复数$x$的模,记作$| x |$.

    [ | x | = sqrt{| Im ( x)^2 | + Re ( x)^2} ]

    [ | e^{ia+b} | = e^b , bin mathbb{R} ]

    -- 复数乘法

    两个复数$a+bi$与$c+di$的积$( a + b i) cdot ( c + d i) = ( a c - b d) + ( b c + a d) i$

    积的模等于原两复数模之积,积的幅角等于原两复数幅角之和.

    - 引理

    -- 消去引理

    $omega^{kn}_{dn}=omega^{k}_{d}$

    [egin{eqnarray*} | omega^d_k | = 1 & & mathtt{(1)}\ arg omega_k = 2 pi / k & & mathtt{(2)}\ & Downarrow & \ arg omega^{nd}_{nk} = n arg omega^d_{nk} = arg omega_k^d & & mathtt{(res)} end{eqnarray*}]

    -- 折半引理

    对于n>0且!(n|1),$| { omega^k_n mid 0 leqslant k leqslant n, k in mathbb{Z} } | = 2 | { w_n^{2 k} mid 0 leqslant k leqslant n, k in mathbb{Z} } |$,${ w_n^{2 k} mid 0 leqslant k leqslant n, k in mathbb{Z} } = { w_{n / 2}^k mid 0 leqslant k leqslant n / 2, k in mathbb{Z} }$.

    证明很简单,留作思考题.

    - FFT

  • 相关阅读:
    判断广播是否已注册
    Android 之使用LocalBroadcastManager解决BroadcastReceiver安全问题
    Android BroadcastReceiver 注册和反注册
    关于Android TaskAffinity的那些事儿
    文件读取方法(FileHelpers) z
    FileHelpers 用法 z
    tdf sample
    打开文件
    async/await 异步编程
    使用Topshelf创建Windows服务
  • 原文地址:https://www.cnblogs.com/tmzbot/p/4320955.html
Copyright © 2011-2022 走看看