Fourier Transform

Fourier Transform

基本的定义

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

符号 定义
傅里叶变换: f^(u) +f(t)ej2πutdt
逆傅里叶变换: Fˇ(t) +F(u)ej2πtudu
离散傅里叶变换: Fm=f^m n=0N1fnej2πnm/N
离散逆傅里叶变换: fn=Fˇn 1Nm=0N1Fmej2πmn/N
卷积: fg(t) +f(τ)g(tτ)dτ
correlation: fg(t) +f(τ)g(τ+t)dτ
二元傅里叶变换: f^(u,v) ++f(t,z)ej2πutej2πvzdtdz
二元傅里叶逆变换: Fˇ(t,z) ++F(u,v)ej2πtuej2πzvdtdz
二元卷积: fg(t,z) ++f(τ,ω)g(tτ,zω)dτdω
共轭 f(t)=[r(t)+ji(t)]=r(t)ji(t),r(t),i(t)R

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

性质

^ F ˇ
1 f(t) F F(u)
2 fg(t) F F(u)G(u)
3 fg(t) F F(u)G(u)
4 f(t)g(t) F FG(u)
5 f(t)+g(t) F F(u)+G(u)
6 f(t+t0) F ej2πt0uF(u)
7 f(t) F F(u)
8 F(u)=f^(u) F f(t)=f^^(t)
以上 对于 离散 成立
9 f(at) F $\frac{1}{
10 f(t) F j2πuF(u)
11 j2πtf(t) F F(u)
12 f(Rt), RTR=I F F(Ru)

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

  1. pass

  2. 卷积:

    (fg)^(u)=fg(t)ej2πutdt=f(tτ)g(τ)dτej2πutdt=f(tτ)g(τ)ej2πutdtdτFubini=f(tτ)ej2πu(tτ)dtg(τ)ej2πuτdτ=F(u)G(u).

    是类似的证明.

  3. correlation:

    (fg)^(u)=fg(t)ej2πutdt=f(τ)g(τ+t)dτej2πutdt=f(τ)g(τ+t)ej2πutdtdτ=G(u)f(τ)ej2πuτdτ=G(u)[f(τ)ej2πuτdτ]=F(u)G(u)

  4. 乘积的证明和上面是一样的, 无非是作用于ˇ上.

  5. pass

  6. 平移:

    (f(t+t0))^=f(t+t0)ej2πutdt=ej2πut0f(t+t0)ej2πu(t+t0)dt=ej2πt0uF(u).

  7. 逆:

    (f(t))^=f(t)ej2πutdt=f(t)ej2πutdt=F(u).

  8. F^(t)=F(u)ej2πtudu=(F(u))ˇ(t)=f(t).

  9. scaling:

    (f(at))^(u)=+f(at)ej2πutdt=1|a|+f(z)ej2πuazdz=1|a|F(ua).

  10. 导函数:

    f(t)=ddt+F(u)ej2πtudu=+F(u)ddtej2πtudu=+F(u)(j2πu)ej2πtudu=(j2πuF(u))ˇ.

  11. 同上

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

    G(u)=f(Rt)ej2πuTtdt=f(x)ej2π(Ru)Tx|R1|dx=f(x)ej2π(Ru)Txdx=F(Ru)

对称性

主要指的:

  1. 奇函数

    f(x)=f(x).

  2. 偶函数

    f(x)=f(x).

  3. 共轭对称

    f(x)=f(x).

考查f(t)=r(t)+ji(t)F(u)=R(u)+jI(u)之间的关系:

^ ˇ
1 f(t)=r(t) F(u)=F(u)
2 f(t)=r(t) R(u)=R(u),I(u)=I(u)
3 f(t)=ji(t) F(u)=F(u)
4 f(t)=ji(t) R(u)=R(u),I(u)=I(u)
^ F ˇ
5 f(t)R F F(u)C
6 f(t)C F F(u)C
7 f(t)C F F(u)C
8 f(t)R, 且f(t)=f(t) F F(u)R, 且满足F(u)=F(u)
9 f(t)R, 且f(t)=f(t) F F(u)=jI(u)C, 且F(u)=F(u)
10 f(t)=ji(t)C, 且f(t)=f(t) F F(u)=jI(u)C, 且F(u)=F(u)
11 f(t)=ji(t)C, 且f(t)=f(t) F F(u)R, 且满足F(u)=F(u)
12 f(t)C, 且f(t)=f(t) F F(u)C, 且满足F(u)=F(u)
13 f(t)C, 且f(t)=f(t) F F(u)C, 且满足F(u)=F(u)
  1. real ->(采用反证法即可)

    F(u)=[f(t)ej2πutdt]=f(t)ej2πutdt=f(t)ej2π(u)tdtf(t)=r(t)=r(t)=F(u).

  2. 由1易证.

  3. imaginary ->

    F(u)=[f(t)ej2πutdt]=f(t)ej2πutdt=f(t)ej2πutdtf(t)=ji(t)=f(t)=F(u).

  4. 由3易证.

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

  6. 由性质6可知(f(t))^=F(u).

  7. f(t)ej2πutdt=[f(t)ej2πutdt]=F(u).

  8. F(u)=(f(t))^=(f(t))^=F(u)=F(u).

  9. F(u)=(f(t))^=(f(t))^=F(u)=F(u).

  10. F(u)=(f(t))^=(f(t))^=F(u)=F(u).

  11. F(u)=(f(t))^=(f(t))^=F(u)=F(u).

  12. F(u)=(f(t))^=(f(t))^=F(u).

  13. F(u)=(f(t))^=(f(t))^=F(u).

卷积

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

hf(n)=k=0N1h(nk)f(k)=anTf,a(n)=[h(0),h(n1),,h(nN+1)],

A=[a0,a1,,aN1]=[h(0)h(1)h(N1)h(1)h(0)h(N2)h(1N)h(2N)h(0),][hf]=ATf.

定义

h(n)=h(n),

则有

[hf]=Af.

FFT

考虑离散傅里叶变换:

Fm=n=0N1fnej2πnm/N,m=0,1,,N1.

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

下面假设N=PQ,P,QN+, 则

m=uQ+v,u=0,1,,P1,v=0,1,,Q1,n=sP+t,s=0,1,,Q1,t=0,1,,P1.

注意到:

nm=(sP+t)(uQ+v)=suN+svP+tm.

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

(1)Fm=n=0N1fnej2πnm/N(2)=n=0N1fnej2π(sP+t)(uP+v)/N(3)=n=0N1fnej2π(suN+svP+tm)/N(4)=n=0N1fnej2π(svP+tm)/N(5)=t=0P1ej2πtm/Ns=0Q1fsP+tej2πsv/Q

Fvt:=s=0Q1fsP+tej2πsv/Q,v=0,1,,Q1,t=0,1,,P1.

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

Fm=t=0P1ej2πtm/NFvt,m=0,1,,N1,FuQ+v=t=0P1ej2πtv/NFvtej2πtu/P.

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

PJN=PNlogPN,

特别的, 常常N=2J, 则计算量是Nlog2N量级的.

注: 卷积运算[fg]n,n=0,,N1, 计算量也是N2级别的, 但是通过FFT, 应当是(PNlogP+1)N​乘法次数, 也是可以降低计算量的.

逆傅里叶变换实际上就是

F^=[m=0N1Fmej2π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 @   馒头and花卷  阅读(375)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示