Fourier Transform

Fourier Transform

基本的定义

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

符号 定义
傅里叶变换: \(\hat{f}(u)\) \(\int_{-\infty}^{+\infty} f(t) e^{-j2\pi u t} \mathrm{d}t\)
逆傅里叶变换: \(\check{F}(t)\) \(\int_{-\infty}^{+\infty} F(u) e^{j2\pi tu} \mathrm{d}u\)
离散傅里叶变换: \(F_m=\hat{f}_m\) \(\sum_{n=0}^{N-1} f_n e^{-j2\pi nm/N}\)
离散逆傅里叶变换: \(f_n = \check{F}_n\) \(\frac{1}{N}\sum_{m=0}^{N-1} F_m e^{j2\pi mn /N}\)
卷积: \(f \star g (t)\) \(\int_{-\infty}^{+\infty} f(\tau) g(t-\tau) \mathrm{d}\tau\)
correlation: \(f \bullet g(t)\) \(\int_{-\infty}^{+\infty}f^*(\tau)g(\tau + t)\mathrm{d}\tau\)
二元傅里叶变换: \(\hat{f}(u, v)\) \(\int_{-\infty}^{+\infty}\int_{-\infty}^{+\infty} f(t, z) e^{-j2\pi ut} e^{-j2\pi vz} \mathrm{d}t \mathrm{d}z\)
二元傅里叶逆变换: \(\check{F}(t, z)\) \(\int_{-\infty}^{+\infty}\int_{-\infty}^{+\infty} F(u, v) e^{j2\pi tu} e^{-j2\pi zv} \mathrm{d}t \mathrm{d}z\)
二元卷积: \(f \star g (t, z)\) \(\int_{-\infty}^{+\infty}\int_{-\infty}^{+\infty} f(\tau, \omega) g(t - \tau, z - \omega) \mathrm{d}\tau \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 \bullet 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^{j2\pi 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}}\) \(j2\pi u F(u)\)
11 \(-j2\pi tf(t)\) \(\mathop{\Leftrightarrow} \limits^{\mathcal{F}}\) \(F'(u)\)
12 \(f(R \mathbf{t})\), \(R^TR=I\) \(\mathop{\Leftrightarrow} \limits^{\mathcal{F}}\) \(F(R\mathbf{u})\)

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

  1. pass

  2. 卷积:

    \[\begin{array}{ll} (f \star g)^{\hat{}}(u) &= \int f \star g (t) e^{-j2\pi u t} \mathrm{d}t \\ &= \int \int f(t-\tau) g (\tau) \mathrm{d}\tau e^{-j2\pi u t} \mathrm{d}t \\ &= \int \int f(t-\tau) g (\tau) e^{-j2\pi u t} \mathrm{d}t \mathrm{d}\tau \quad \rightarrow \mathrm{Fubini}\\ &= \int \int f(t-\tau) e^{-j2\pi u (t-\tau)} \mathrm{d}t \: g(\tau)e^{-j2\pi u\tau} \mathrm{d}\tau \quad \\ &= F(u) \cdot G(u). \end{array} \]

    \(\Leftarrow\)是类似的证明.

  3. correlation:

    \[\begin{array}{ll} (f \bullet g)^{\hat{}}(u) &= \int f*g(t) e^{-j2\pi ut} \mathrm{d}t \\ &= \int \int f^*(\tau) g(\tau + t) \mathrm{d}\tau e^{-j2\pi ut} \mathrm{d}t \\ &= \int f^*(\tau) \int g(\tau + t) e^{-j2\pi ut} \mathrm{d}t \mathrm{d}\tau \\ &= G(u)\int f^*(\tau) e^{j2\pi u\tau} \mathrm{d}\tau \\ &= G(u)[\int f(\tau) e^{-j2\pi u\tau} \mathrm{d}\tau]^* \\ &= F^*(u)G(u) \end{array} \]

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

  5. pass

  6. 平移:

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

  7. 逆:

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

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

  9. scaling:

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

  10. 导函数:

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

  11. 同上

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

    \[\begin{array}{ll} G(\mathbf{u}) &=\int f(R\mathbf{t}) e^{-j2 \pi \mathbf{u}^T \mathbf{t}} \mathrm{d}\mathbf{t} \\ &=\int f(\mathbf{x}) e^{-j2 \pi (R\mathbf{u})^T \mathbf{x}} |R^{-1}|\mathrm{d}\mathbf{x} \\ &=\int f(\mathbf{x}) e^{-j2 \pi (R\mathbf{u})^T \mathbf{x}} \mathrm{d}\mathbf{x} \\ &=F(R\mathbf{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\)采用反证法即可)

    \[\begin{array}{ll} F^*(u) &=[\int f(t) e^{-j2\pi ut} \mathrm{d}t]^* \\ &=\int f^*(t) e^{j2\pi ut} \mathrm{d}t \\ &=\int f(t) e^{-j2\pi (-u)t} \mathrm{d}t \rightarrow f*(t) = r^*(t) = r(t)\\ &=F(-u). \end{array} \]

  2. 由1易证.

  3. imaginary ->

    \[\begin{array}{ll} F^*(-u) &=[\int f(t) e^{j2\pi ut} \mathrm{d}t]^* \\ &=\int f^*(t) e^{-j2\pi ut} \mathrm{d}t \\ &=\int -f(t) e^{-j2\pi ut} \mathrm{d}t \rightarrow 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^{-j2\pi ut} \mathrm{d}t = [\int f(t) e^{j2\pi 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 [ \begin{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} \right ] [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^{-j2\pi 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)\)匹配, 则傅里叶变换可以表示为:

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

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

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

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

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

\[PJN = P N\log_P N, \]

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

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

逆傅里叶变换实际上就是

\[\hat{F^*}^* = [\sum_{m=0}^{N-1} F_m^* e^{-j2\pi 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()
posted @ 2021-08-24 23:42  馒头and花卷  阅读(339)  评论(0编辑  收藏  举报