当傅里叶拿起画笔
0 说明
希望大家都有所收获,能手执傅里叶画笔,写了这篇文稿,由于时间和精力有限采用文本形式
个人对傅里叶级数展开的绘图与原理的简单理解,希望能有所收获
文稿写的可能不够完善,比较粗糙,欢迎批评指正
拜读了 3Blue1Brown 和 [OUTDATED] ManimCairo tutorial - Fourier Scene - YouTube 视频相关大佬给出的相关程序,是基于 ManimCairo,我对其进行了简单的适配,适配到社区版的 ManimCE
原程序:
https://gitlab.com/zavden/manim-backup/-/raw/master/fourier.py
svg文件:music_svg - Google 云端硬盘
适配后的程序(含原程序):
https://github.com/JermainLiu/Manim_Fourier
链接到:
当傅里叶拿起画笔——manim_fourier 程序分享、、、_哔哩哔哩_bilibili
1 傅里叶级数展开
1.1 狄利赫里条件
对于周期信号:
(1) 在一个周期内,如果有间断点,则间断点的数目应该为有限个;
(2) 在一个周期内,极大值和极小值的数目应是有限个;
(3) 在一个周期内,信号是绝对可积的。
1.2 傅里叶级数展开
满足狄利赫里条件的周期函数可以展开成傅里叶级数形式
对于有限区间(时域有限)函数(信号)可以通过周期延拓得到周期函数,展开为傅里叶级数
周期为$T_1$函数 $f(t)$展开成傅里叶级数指数形式,如下
傅里叶级数系数 $F_n$ 计算公式:
当 $T_1 = 1 $ 时,
2 复数系引入
当我们把一个矢量图像放到直角坐标系中,点 $(x,y)$ 的轨迹显然无法写出显性函数 $y=f(x) $
然而我们可以想象一下,我们自己描图的时候怎样进行的,定义第一笔为时刻 $t = 0$,笔尖落在了开头位置,随着时刻的变化,笔尖的位置不断变化,最终在 $t=1$ 时笔尖落地到轨迹的末端,于是我们得到一个映射
也即点的位置是 $t$ 的一元函数,那么我们需要一种方式来表达点的位置关系,于是我们引入复数系来解决这个问题
通过下列欧拉公式将点的直角坐标与复数坐标联系
其中
于是我们有了复数函数
那么我们将 $f(t)$ 进行周期 $T_1=1$ 延拓,便可将 $f(t)$ 展开成傅里叶级数,可求得傅里叶级数系数 $F_n$
我们分别看各个分量的情况,以 $n=2, \; F_2e^{jw_2t}$为例
其中傅里叶级数的系数 $F_2=re^{j\theta}$ 为一个复数的定值,$e^{jw_2t}$ 只改变整体的相位,而不改变幅度,于是随着 $t$ 的连续变化,整体向量将会绕着自身的起点进行旋转
两个向量相加,三个相加,四个相加……相当于将向量进行首位依次相接
而把 $n=0$ 作为第一个向量,其相位始终为0,故是固定不动的
3 傅里叶展开系数的求解
在之前我们已经介绍了傅里叶级数展开系数为
定积分定义,函数在区间 $[0,1]$ 上的积分为
故
取 $m=10000$ ,对 $f(t)$ 在 $t\in [0,1]$ 进行均匀采样取值,根据上式进行计算近似得到 $F_n$ ,我们取有限次谐波频率,带入到傅里叶级数展开式中得到 $f(t)$ 的近似值
4 程序中一些参数
当 $T_1 = 1 $ 时,
n_vectors
:取谐波频率的个数,决定傅里叶级数中的 $n$ ,取 $n\in [\frac{-n_vectors}{2}, \frac{n_vectors}{2}]$ 的整数
slow_factor
:速度因子,决定绘制一周的时间为 $\frac{1}{slow_factor}$
start_drawn
:是否需要提前绘制好路径
interpolate_config
:默认值为 $[0,1]$ ,设置当前傅里叶画笔点与之前路径线的粗细比例,渐变设置
n_cycles 、 run_time
:均用于设置运行的时间,分别表示 绘制图像的周数和运行时间,其默认值分别为 None
和 10
,在适配的程序中,设置了 n_cycles
取较高的优先级,同时设置时,采用 n_cycles
wait_before_start
:绘制前的等待时间
center_point
:设置绘图的向量第一个向量的起点位置