zoukankan      html  css  js  c++  java
  • Fourier Transform

    Fourier Transform

    基本的定义

    严格来说, 傅里叶变换是Schwartz space 上的一一映射, 对于(L^1), 即可积函数我们都可以找到其对应的傅里叶变换.

    符号 定义
    傅里叶变换: (hat{f}(u)) (int_{-infty}^{+infty} f(t) e^{-j2pi u t} mathrm{d}t)
    逆傅里叶变换: (check{F}(t)) (int_{-infty}^{+infty} F(u) e^{j2pi tu} mathrm{d}u)
    离散傅里叶变换: (F_m=hat{f}_m) (sum_{n=0}^{N-1} f_n e^{-j2pi nm/N})
    离散逆傅里叶变换: (f_n = check{F}_n) (frac{1}{N}sum_{m=0}^{N-1} F_m e^{j2pi mn /N})
    卷积: (f star g (t)) (int_{-infty}^{+infty} f( au) g(t- au) mathrm{d} au)
    correlation: (f ullet g(t)) (int_{-infty}^{+infty}f^*( au)g( au + t)mathrm{d} au)
    二元傅里叶变换: (hat{f}(u, v)) (int_{-infty}^{+infty}int_{-infty}^{+infty} f(t, z) e^{-j2pi ut} e^{-j2pi vz} mathrm{d}t mathrm{d}z)
    二元傅里叶逆变换: (check{F}(t, z)) (int_{-infty}^{+infty}int_{-infty}^{+infty} F(u, v) e^{j2pi tu} e^{-j2pi zv} mathrm{d}t mathrm{d}z)
    二元卷积: (f star g (t, z)) (int_{-infty}^{+infty}int_{-infty}^{+infty} f( au, omega) g(t - au, z - omega) mathrm{d} au mathrm{d}omega)
    共轭 (f^*(t) = [r(t) + j i(t)]^* = r(t) - ji(t), quad r(t), i(t) in mathbb{R})

    注: 不同版本的傅里叶变换的定义存在系数上的差异.

    性质

    (hat{}) (mathop{Leftrightarrow} limits^{mathcal{F}}) (check{})
    1 (f(t)) (mathop{Leftrightarrow} limits^{mathcal{F}}) (F(u))
    2 (f star g (t)) (mathop{Leftrightarrow} limits^{mathcal{F}}) (F(u) cdot G (u))
    3 (f ullet g(t)) (mathop{Leftrightarrow} limits^{mathcal{F}}) (F^*(u) cdot G(u))
    4 $f(t) cdot g(t) $ (mathop{Leftrightarrow} limits^{mathcal{F}}) (F star G (u))
    5 (f(t) + g(t)) (mathop{Leftrightarrow} limits^{mathcal{F}}) (F(u) + G(u))
    6 (f(t + t_0)) (mathop{Leftrightarrow} limits^{mathcal{F}}) (e^{j2pi t_0 u} F(u))
    7 (f(-t)) (mathop{Leftrightarrow} limits^{mathcal{F}}) (F(-u))
    8 (F(u)=hat{f}(u)) (mathop{Leftrightarrow} limits^{mathcal{F}}) (f(-t) = hat{hat{f}}(t))
    以上 对于 离散 成立
    9 (f(at)) (mathop{Leftrightarrow} limits^{mathcal{F}}) $frac{1}{
    10 (f'(t)) (mathop{Leftrightarrow} limits^{mathcal{F}}) (j2pi u F(u))
    11 (-j2pi tf(t)) (mathop{Leftrightarrow} limits^{mathcal{F}}) (F'(u))
    12 (f(R mathbf{t})), (R^TR=I) (mathop{Leftrightarrow} limits^{mathcal{F}}) (F(Rmathbf{u}))

    注: 虽然以上性质除11外都是用了标量, 但是实际上对于一般的傅里叶变换也是成立的.

    1. pass

    2. 卷积:

      [egin{array}{ll} (f star g)^{hat{}}(u) &= int f star g (t) e^{-j2pi u t} mathrm{d}t \ &= int int f(t- au) g ( au) mathrm{d} au e^{-j2pi u t} mathrm{d}t \ &= int int f(t- au) g ( au) e^{-j2pi u t} mathrm{d}t mathrm{d} au quad ightarrow mathrm{Fubini}\ &= int int f(t- au) e^{-j2pi u (t- au)} mathrm{d}t : g( au)e^{-j2pi u au} mathrm{d} au quad \ &= F(u) cdot G(u). end{array} ]

      (Leftarrow)是类似的证明.

    3. correlation:

      [egin{array}{ll} (f ullet g)^{hat{}}(u) &= int f*g(t) e^{-j2pi ut} mathrm{d}t \ &= int int f^*( au) g( au + t) mathrm{d} au e^{-j2pi ut} mathrm{d}t \ &= int f^*( au) int g( au + t) e^{-j2pi ut} mathrm{d}t mathrm{d} au \ &= G(u)int f^*( au) e^{j2pi u au} mathrm{d} au \ &= G(u)[int f( au) e^{-j2pi u au} mathrm{d} au]^* \ &= F^*(u)G(u) end{array} ]

    4. 乘积的证明和上面是一样的, 无非是作用于(check{})上.

    5. pass

    6. 平移:

      [(f(t+t_0))^{hat{}} = int f(t+t_0) e^{-j2pi ut} mathrm{d}t =e^{j2pi u t_0}int f(t+t_0) e^{-j2pi u(t+t_0)} mathrm{d}t = e^{j2pi t_0u} F(u). ]

    7. 逆:

      [(f(-t))^{hat{}} = int f(-t) e^{-j2pi u t} mathrm{d}t = int f(t) e^{j2pi u t} mathrm{d}t = F(-u). ]

    8. (hat{F}(t) = int F(u) e^{j2pi t u} mathrm{d}u = (F(-u))^{check{}}(t) = f(-t)).

    9. scaling:

      [(f(at))^{hat{}}(u) = int_{-infty}^{+infty} f(at) e^{-j2pi ut} mathrm{d}t = frac{1}{|a|}int_{-infty}^{+infty} f(z) e^{-j2pi frac{u}{a}z} dz = frac{1}{|a|} F(frac{u}{a}). ]

    10. 导函数:

      [egin{array}{ll} f'(t) &= frac{mathrm{d}}{mathrm{d}t} int_{-infty}^{+infty} F(u) e^{j2pi t u} mathrm{d}u \ &= int_{-infty}^{+infty} F(u) frac{mathrm{d}}{mathrm{d}t} e^{j2pi t u} mathrm{d}u \ &= int_{-infty}^{+infty} F(u) (j2pi u) e^{j2pi t u} mathrm{d}u \ &= (j2pi u F(u))^{check{}}. end{array} ]

    11. 同上

    12. 这个性质说明了, 对原图像加以旋转, 等价地在频域上加以同样的旋转.

      [egin{array}{ll} G(mathbf{u}) &=int f(Rmathbf{t}) e^{-j2 pi mathbf{u}^T mathbf{t}} mathrm{d}mathbf{t} \ &=int f(mathbf{x}) e^{-j2 pi (Rmathbf{u})^T mathbf{x}} |R^{-1}|mathrm{d}mathbf{x} \ &=int f(mathbf{x}) e^{-j2 pi (Rmathbf{u})^T mathbf{x}} mathrm{d}mathbf{x} \ &=F(Rmathbf{u}) end{array} ]

    对称性

    主要指的:

    1. 奇函数

      [f(x) = -f(-x). ]

    2. 偶函数

      [f(x) = f(-x). ]

    3. 共轭对称

      [f^*(x) = f(-x). ]

    考查(f(t)=r(t) + j i(t))(F(u) = R(u) + j I(u))之间的关系:

    (hat{ }) (Leftrightarrow) (check{ })
    1 (f(t) = r(t)) (Leftrightarrow) (F^*(u) = F(-u))
    2 (f(t)=r(t)) (Leftrightarrow) (R(u)=R(-u), I(u)=-I(-u))
    3 (f(t) = ji(t)) (Leftrightarrow) (F^*(-u) = -F(u))
    4 (f(t) = ji(t)) (Leftrightarrow) (R(u)=-R(-u), I(u)=I(-u))
    (hat{}) (mathop{Leftrightarrow} limits^{mathcal{F}}) (check{})
    5 (f(-t)in mathbb{R}) (mathop{Leftrightarrow} limits^{mathcal{F}}) (F^*(u) in mathbb{C})
    6 (f(-t) in mathbb{C}) (mathop{Leftrightarrow} limits^{mathcal{F}}) (F(-u) in mathbb{C})
    7 (f^*(t) in mathbb{C}) (mathop{Leftrightarrow} limits^{mathcal{F}}) (F^*(-u) in mathbb{C})
    8 (f(t) in mathbb{R}), 且(f(t) = f(-t)) (mathop{Leftrightarrow} limits^{mathcal{F}}) (F(u) in mathbb{R}), 且满足(F(u)=F(-u))
    9 (f(t) in mathbb{R}), 且(f(t) = -f(-t)) (mathop{Leftrightarrow} limits^{mathcal{F}}) (F(u) = jI(u) in mathbb{C}), 且(F(u)=-F(-u))
    10 (f(t) = ji(t) in mathbb{C}), 且(f(t) = f(-t)) (mathop{Leftrightarrow} limits^{mathcal{F}}) (F(u) = jI(u) in mathbb{C}), 且(F(u)=F(-u))
    11 (f(t)=ji(t) in mathbb{C}), 且(f(t)=-f(-t)) (mathop{Leftrightarrow} limits^{mathcal{F}}) (F(u) in mathbb{R}), 且满足(F(u)=-F(-u))
    12 (f(t) in mathbb{C}), 且(f(t) = f(-t)) (mathop{Leftrightarrow} limits^{mathcal{F}}) (F(u) in mathbb{C}), 且满足(F(u) = F(-u))
    13 (f(t) in mathbb{C}), 且(f(t) = -f(-t)) (mathop{Leftrightarrow} limits^{mathcal{F}}) (F(u) in mathbb{C}), 且满足(F(u) = -F(-u))
    1. real ->((Leftarrow)采用反证法即可)

      [egin{array}{ll} F^*(u) &=[int f(t) e^{-j2pi ut} mathrm{d}t]^* \ &=int f^*(t) e^{j2pi ut} mathrm{d}t \ &=int f(t) e^{-j2pi (-u)t} mathrm{d}t ightarrow f*(t) = r^*(t) = r(t)\ &=F(-u). end{array} ]

    2. 由1易证.

    3. imaginary ->

      [egin{array}{ll} F^*(-u) &=[int f(t) e^{j2pi ut} mathrm{d}t]^* \ &=int f^*(t) e^{-j2pi ut} mathrm{d}t \ &=int -f(t) e^{-j2pi ut} mathrm{d}t ightarrow f^*(t) = -ji(t)=-f(t) \ &=-F(u). end{array} ]

    4. 由3易证.

    5. 由性质6以及上述的对称性3可知((f(-t))^{hat{}}= F(-u) = F^*(u)).

    6. 由性质6可知((f(-t))^{hat{}} = F(-u)).

    7. [int f^*(t) e^{-j2pi ut} mathrm{d}t = [int f(t) e^{j2pi ut} mathrm{d}t]^* = F^*(-u). ]

    8. [F(u) = (f(t))^{hat{}} = (f(-t))^{hat{}} = F(-u) = F^*(u). ]

    9. [F(u) = (f(t))^{hat{}} = -(f(-t))^{hat{}} = -F(-u) = -F^*(u). ]

    10. [F(u) = (f(t))^{hat{}} = (f(-t))^{hat{}} = F(-u) = -F^*(u). ]

    11. [F(u) = (f(t))^{hat{}} = -(f(-t))^{hat{}} = -F(-u) = F^*(u). ]

    12. [F(u) = (f(t))^{hat{}} = (f(-t))^{hat{}} = F(-u). ]

    13. [F(u) = (f(t))^{hat{}} = -(f(-t))^{hat{}} = -F(-u). ]

    卷积

    这里特别说明离散卷积的一个重要性质:
    注意到

    [h star f (n) = sum_{k=0}^{N-1} h(n-k) f(k) = a^T_n f, \ a(n) = [h(0), h(n-1), cdots, h(n-N+1)], ]

    [A = [a_0, a_1, cdots, a_{N-1}] = left [ egin{array}{cccc} h(0) & h(1) &cdots & h(N-1) \ h(-1) & h(0) & cdots & h(N-2)\ vdots & vdots & ddots & vdots \ h(1-N) & h(2-N) & cdots & h(0), end{array} ight ] [h star f] = A^T f. ]

    定义

    [h'(n) = h(-n), ]

    则有

    [[h' star f] = Af. ]

    FFT

    考虑离散傅里叶变换:

    [F_m = sum_{n=0}^{N-1} f_n e^{-j2pi nm/N}, m=0,1,cdots, N-1. ]

    每次计算包含(N)个乘法, 故傅里叶变换的计算量是(N^2)级别的.

    下面假设(N = P * Q, P, Q in mathbb{N}^+), 则

    [m = uQ + v, quad u=0,1,cdots, P-1, v=0,1,cdots, Q-1, \ n = sP + t, quad s=0,1,cdots, Q-1, t=0,1,cdots, P-1. \ ]

    注意到:

    [nm = (sP + t)(uQ + v) = su N + svP + tm. ]

    此时, (m, n)与唯一的((u,v), (s, t))匹配, 则傅里叶变换可以表示为:

    [egin{align} F_m &= sum_{n=0}^{N-1}f_n e^{-j2pi nm / N} \ &= sum_{n=0}^{N-1}f_n e^{-j2pi (sP+t)(uP+v)/ N} \ &= sum_{n=0}^{N-1}f_n e^{-j2pi (suN + svP + tm)/ N} \ &= sum_{n=0}^{N-1}f_n e^{-j2pi (svP + tm)/ N} \ &= sum_{t=0}^{P-1}e^{-j2pi tm / N}sum_{s=0}^{Q-1} f_{sP+t} e^{-j2pi sv/ Q} \ end{align} ]

    [F_v^t := sum_{s=0}^{Q-1} f_{sP+t} e^{-j2pi sv /Q}, quad v = 0,1, cdots, Q-1, t=0,1,cdots, P-1. ]

    显然总共需要(QN)次乘法, 而

    [F_m = sum_{t=0}^{P-1} e^{-j2pi tm / N} F_v^t, quad m=0,1,cdots, N-1, \ F_{uQ+v} = sum_{t=0}^{P-1} e^{-j2pi tv /N}F_v^t e^{-j2pi tu / P} . ]

    总共有(PN)次乘法, 故总共有((P+Q) N)次乘法运算.
    由于每个(F^t)都是一个独立的傅里叶变换过程, 故倘若(Q)能够进一步分解, 计算量可以进一步降低.
    甚至, 若假设(N = P^J), 则可以证明最后的计算量可以分解为

    [PJN = P Nlog_P N, ]

    特别的, 常常(N=2^J), 则计算量是(Nlog_2 N)量级的.

    注: 卷积运算([fstar g]_n, n=0,cdots, N-1), 计算量也是(N^2)级别的, 但是通过FFT, 应当是((PNlog_P + 1)N)​乘法次数, 也是可以降低计算量的.

    逆傅里叶变换实际上就是

    [hat{F^*}^* = [sum_{m=0}^{N-1} F_m^* e^{-j2pi mn/N}]^*, ]

    虽然下面的代码我并没有采取这种策略.

    from typing import Iterable, Union
    import numpy as np
    
    
    
    def factorization(N: int):
        for P in range(2, N + 1):
            if N % P is 0:
                return P
    
    def dft(arr: Iterable, m: int):
        N = len(arr)
        basis = np.arange(N) * m * 2 * np.pi * 1j * -1
        basis = np.exp(basis / N)
        return arr @ basis
    
    def idft(arr: Iterable, m: int):
        N = len(arr)
        basis = np.arange(N) * m * 2 * np.pi * 1j
        basis = np.exp(basis / N) / N
        return arr @ basis
    
    def basis_dft(N: int):
        basis = np.outer(np.arange(N), np.arange(N))
        basis = basis * 2 * np.pi * 1j * -1
        return np.exp(basis / N)
    
    def basis_idft(N: int):
        basis = np.outer(np.arange(N), np.arange(N))
        basis = basis * 2 * np.pi * 1j
        return np.exp(basis / N) / N
    
    def fft(arr: Iterable) -> np.ndarray:
        N = len(arr)
        P = factorization(N)
        if P is N:
            return arr @ basis_dft(N)
        Q = N // P
        Fvt = np.array([fft(arr[t::P]) for t in range(P)]).T # Q x P
        dummy = np.outer(np.arange(Q), np.arange(P))
        dummy = np.exp((dummy * 2 * np.pi * 1j * -1) / N)
        Fvt_ext = Fvt * dummy
        return (Fvt_ext @ basis_dft(P)).T.flatten()
    
    def ifft(arr: Iterable) -> np.ndarray:
        N = len(arr)
        P = factorization(N)
        if P is N:
            return arr @ basis_idft(N)
        Q = N // P
        Fvt = np.array([ifft(arr[t::P]) for t in range(P)]).T # Q x P
        dummy = np.outer(np.arange(Q), np.arange(P))
        dummy = np.exp((dummy * 2 * np.pi * 1j) / N)
        Fvt_ext = Fvt * dummy
        return (Fvt_ext @ basis_idft(P)).T.flatten()
    
  • 相关阅读:
    Leetcode 811. Subdomain Visit Count
    Leetcode 70. Climbing Stairs
    Leetcode 509. Fibonacci Number
    Leetcode 771. Jewels and Stones
    Leetcode 217. Contains Duplicate
    MYSQL安装第三步报错
    .net 开发WEB程序
    JDK版本问题
    打开ECLIPSE 报failed to load the jni shared library
    ANSI_NULLS SQL语句
  • 原文地址:https://www.cnblogs.com/MTandHJ/p/15183071.html
Copyright © 2011-2022 走看看