基本的定义
严格来说, 傅里叶变换是Schwartz space 上的一一映射, 对于L1, 即可积函数我们都可以找到其对应的傅里叶变换.
符号 |
定义 |
傅里叶变换: ^f(u) |
∫+∞−∞f(t)e−j2πutdt |
逆傅里叶变换: ˇF(t) |
∫+∞−∞F(u)ej2πtudu |
离散傅里叶变换: Fm=^fm |
∑N−1n=0fne−j2πnm/N |
离散逆傅里叶变换: fn=ˇFn |
1N∑N−1m=0Fmej2πmn/N |
卷积: f⋆g(t) |
∫+∞−∞f(τ)g(t−τ)dτ |
correlation: f∙g(t) |
∫+∞−∞f∗(τ)g(τ+t)dτ |
二元傅里叶变换: ^f(u,v) |
∫+∞−∞∫+∞−∞f(t,z)e−j2πute−j2πvzdtdz |
二元傅里叶逆变换: ˇF(t,z) |
∫+∞−∞∫+∞−∞F(u,v)ej2πtue−j2πzvdtdz |
二元卷积: f⋆g(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 |
f⋆g(t) |
F⇔ |
F(u)⋅G(u) |
3 |
f∙g(t) |
F⇔ |
F∗(u)⋅G(u) |
4 |
f(t)⋅g(t) |
F⇔ |
F⋆G(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外都是用了标量, 但是实际上对于一般的傅里叶变换也是成立的.
-
pass
-
卷积:
(f⋆g)^(u)=∫f⋆g(t)e−j2πutdt=∫∫f(t−τ)g(τ)dτe−j2πutdt=∫∫f(t−τ)g(τ)e−j2πutdtdτ→Fubini=∫∫f(t−τ)e−j2πu(t−τ)dtg(τ)e−j2πuτdτ=F(u)⋅G(u).
⇐是类似的证明.
-
correlation:
(f∙g)^(u)=∫f∗g(t)e−j2πutdt=∫∫f∗(τ)g(τ+t)dτe−j2πutdt=∫f∗(τ)∫g(τ+t)e−j2πutdtdτ=G(u)∫f∗(τ)ej2πuτdτ=G(u)[∫f(τ)e−j2πuτdτ]∗=F∗(u)G(u)
-
乘积的证明和上面是一样的, 无非是作用于ˇ上.
-
pass
-
平移:
(f(t+t0))^=∫f(t+t0)e−j2πutdt=ej2πut0∫f(t+t0)e−j2πu(t+t0)dt=ej2πt0uF(u).
-
逆:
(f(−t))^=∫f(−t)e−j2πutdt=∫f(t)ej2πutdt=F(−u).
-
^F(t)=∫F(u)ej2πtudu=(F(−u))ˇ(t)=f(−t).
-
scaling:
(f(at))^(u)=∫+∞−∞f(at)e−j2πutdt=1|a|∫+∞−∞f(z)e−j2πuazdz=1|a|F(ua).
-
导函数:
f′(t)=ddt∫+∞−∞F(u)ej2πtudu=∫+∞−∞F(u)ddtej2πtudu=∫+∞−∞F(u)(j2πu)ej2πtudu=(j2πuF(u))ˇ.
-
同上
-
这个性质说明了, 对原图像加以旋转, 等价地在频域上加以同样的旋转.
G(u)=∫f(Rt)e−j2πuTtdt=∫f(x)e−j2π(Ru)Tx|R−1|dx=∫f(x)e−j2π(Ru)Txdx=F(Ru)
对称性
主要指的:
-
奇函数
f(x)=−f(−x).
-
偶函数
f(x)=f(−x).
-
共轭对称
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) |
-
real ->(⇐采用反证法即可)
F∗(u)=[∫f(t)e−j2πutdt]∗=∫f∗(t)ej2πutdt=∫f(t)e−j2π(−u)tdt→f∗(t)=r∗(t)=r(t)=F(−u).
-
由1易证.
-
imaginary ->
F∗(−u)=[∫f(t)ej2πutdt]∗=∫f∗(t)e−j2πutdt=∫−f(t)e−j2πutdt→f∗(t)=−ji(t)=−f(t)=−F(u).
-
由3易证.
-
由性质6以及上述的对称性3可知(f(−t))^=F(−u)=F∗(u).
-
由性质6可知(f(−t))^=F(−u).
-
∫f∗(t)e−j2πutdt=[∫f(t)ej2πutdt]∗=F∗(−u).
-
F(u)=(f(t))^=(f(−t))^=F(−u)=F∗(u).
-
F(u)=(f(t))^=−(f(−t))^=−F(−u)=−F∗(u).
-
F(u)=(f(t))^=(f(−t))^=F(−u)=−F∗(u).
-
F(u)=(f(t))^=−(f(−t))^=−F(−u)=F∗(u).
-
F(u)=(f(t))^=(f(−t))^=F(−u).
-
F(u)=(f(t))^=−(f(−t))^=−F(−u).
卷积
这里特别说明离散卷积的一个重要性质:
注意到
h⋆f(n)=N−1∑k=0h(n−k)f(k)=aTnf,a(n)=[h(0),h(n−1),⋯,h(n−N+1)],
则
A=[a0,a1,⋯,aN−1]=⎡⎢
⎢
⎢
⎢
⎢⎣h(0)h(1)⋯h(N−1)h(−1)h(0)⋯h(N−2)⋮⋮⋱⋮h(1−N)h(2−N)⋯h(0),⎤⎥
⎥
⎥
⎥
⎥⎦[h⋆f]=ATf.
定义
h′(n)=h(−n),
则有
[h′⋆f]=Af.
FFT
考虑离散傅里叶变换:
Fm=N−1∑n=0fne−j2πnm/N,m=0,1,⋯,N−1.
每次计算包含N个乘法, 故傅里叶变换的计算量是N2级别的.
下面假设N=P∗Q,P,Q∈N+, 则
m=uQ+v,u=0,1,⋯,P−1,v=0,1,⋯,Q−1,n=sP+t,s=0,1,⋯,Q−1,t=0,1,⋯,P−1.
注意到:
nm=(sP+t)(uQ+v)=suN+svP+tm.
此时, m,n与唯一的(u,v),(s,t)匹配, 则傅里叶变换可以表示为:
Fm=N−1∑n=0fne−j2πnm/N=N−1∑n=0fne−j2π(sP+t)(uP+v)/N=N−1∑n=0fne−j2π(suN+svP+tm)/N=N−1∑n=0fne−j2π(svP+tm)/N=P−1∑t=0e−j2πtm/NQ−1∑s=0fsP+te−j2πsv/Q(1)(2)(3)(4)(5)
令
Ftv:=Q−1∑s=0fsP+te−j2πsv/Q,v=0,1,⋯,Q−1,t=0,1,⋯,P−1.
显然总共需要QN次乘法, 而
Fm=P−1∑t=0e−j2πtm/NFtv,m=0,1,⋯,N−1,FuQ+v=P−1∑t=0e−j2πtv/NFtve−j2πtu/P.
总共有PN次乘法, 故总共有(P+Q)N次乘法运算.
由于每个Ft都是一个独立的傅里叶变换过程, 故倘若Q能够进一步分解, 计算量可以进一步降低.
甚至, 若假设N=PJ, 则可以证明最后的计算量可以分解为
PJN=PNlogPN,
特别的, 常常N=2J, 则计算量是Nlog2N量级的.
注: 卷积运算[f⋆g]n,n=0,⋯,N−1, 计算量也是N2级别的, 但是通过FFT, 应当是(PNlogP+1)N乘法次数, 也是可以降低计算量的.
逆傅里叶变换实际上就是
^F∗∗=[N−1∑m=0F∗me−j2π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
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
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()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· 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