设图形为时间的函数 f ( t ) = a ( t ) + i b ( t ) f(t) = a(t) + i b(t) f(t)=a(t)+ib(t) (a(t)和b(t)为时间的函数)
f(t)为闭环曲线或者有限的曲线
f(t)为闭环曲线时,随着时间t的增加,f(t)在曲线上转圈圈。
f(t)为有限的曲线时,随着时间t的增加,f(t)会从曲线头部走到尾部,然后跳到头部从新走起
显然以上两种情况下f(t)都是时间t下的周期函数,可以由傅里叶级数表示
设f(t)为周期为1的函数,(0,1)为f(t)的一个周期区间
则傅里叶级数的指数形式:
f ( t ) = c − n e − i 2 π n t + ⋯ + c − 2 e − i 4 π t + c − 1 e − i 2 π t + c 0 + + c 1 e i 2 π t + c 2 e i 4 π t + ⋯ + c n e i 2 π n t f(t)=c_{-n}e^{-i2\pi nt}+\cdots +c_{-2}e^{-i4\pi t}+c_{-1}e^{-i2\pi t}+c_{0}++c_{1}e^{i2\pi t}+c_{2}e^{i4\pi t}+\cdots +c_{n}e^{i2\pi nt} f(t)=c−ne−i2πnt+⋯+c−2e−i4πt+c−1e−i2πt+c0++c1ei2πt+c2ei4πt+⋯+cnei2πnt
其中:
c n = ∫ 0 1 f ( t ) e − i 2 π n t d t c_n=\int_0^1 f(t)e^{-i2\pi nt}dt cn=∫01f(t)e−i2πntdt
c n c_n cn为f(t)傅里叶级数的各项系数,由f(t)可确定唯一一组 c n c_n cn
由于f(t)是复数函数,则 c n c_n cn可以由复数表示 c n = a n + i b n c_n=a_n+ib_n cn=an+ibn ( a n , b n a_n,b_n an,bn为常数)
综上,知道图形的函数表达式就可以求出图形的各项傅里叶系数,然后带入傅里叶级数表达式就可以得到图形的傅里叶级数,只要系数 c n c_n cn求得足够多,傅里叶级数就可以表示任何复杂图形
以下是用傅里叶级数表示一个正方形的python代码:
import numpy as np
import turtle as tl
def f_t(N,l): #定义函数图形,N为取样次数
n=N/4 #这里直接生成一个复平面上的正方形
dl=l/int(n) #边被分的最小单元
f_t=[[0,0] for x in range(4*int(n))] #存储函数坐标的实部与虚部
for i in range(int(n)):
f_t[i]=([i*dl,0])
f_t[i+int(n)]=([l,i*dl])
f_t[i+2*int(n)]=([l-i*dl,l])
f_t[i+3*int(n)]=([0,l-i*dl])
print("函数分割完毕")
return f_t
def c_n(f_t,M): #求出傅里叶级数的系数cn,M为求取傅里叶系数给个数
m=M/2 #正负系数各有m个
N=len(f_t) #f_t的长度,及取样次数
dt=1/N #以1/N代替积分算子0.
c_n=[[0,0] for x in range(2*int(m)+1)] #存储c_n的实部与虚部
for i in range(-int(m),int(m)+1): #加上一个初始系数c0
re=0 #暂存c_n的实部
im=0 #暂存c_n的虚部
for j in range(N):
t=dt*j
re+=(f_t[j][0]*np.cos(2*np.pi*i*t)+f_t[j][1]*np.sin(2*np.pi*i*t))*dt #实部积分
im+=(f_t[j][1]*np.cos(2*np.pi*i*t)-f_t[j][0]*np.sin(2*np.pi*i*t))*dt #虚部积分
c_n[i+int(m)]=[re,im]
print("傅里叶系数生成完毕")
return c_n
if __name__ == '__main__':
N = 10000 #函数份数
l = 500 #正方形边长
M = 200 #系数个数
m = M/2
c_n=c_n(f_t(N,l),M) #获取f_t对应傅里叶级数的系数c_n
tl.setup(2000,1000)
tl.penup()
tl.pensize(2) # 画笔粗细
x = [0] * M
y = [0] * M
for t in range(N+1):
for i in range(-int(m),int(m)+1):
x[i] = c_n[i+int(m)][0] * np.cos(2 * i * np.pi * t / N) - c_n[i+int(m)][1] * np.sin(2 * i * np.pi * t / N)
y[i] = c_n[i+int(m)][0] * np.sin(2 * i * np.pi * t / N) + c_n[i+int(m)][1] * np.cos(2 * i * np.pi * t / N)
tl.goto(int(sum(x))-800,int(sum(y))-400) # 正负可以控制图形的左右镜像,上下镜像,乘除可以控制缩放
tl.pendown()
#直接画出来的图形
tl.penup()
f_t=f_t(N,l)
for t in range(N):
tl.goto(int(f_t[t][0]),int(f_t[t][1])-400)
tl.pendown()
tl.done()