写在最前:我发现我在学新东西的时候有个特点:必须要能有感性认识,才能真正了解一个东西。之前学四元数就是这样,翻来覆去看了好久,才初步了解了四元数是什么原理。这次学傅里叶变换也是这样。之前学习四元数的时候没有记录笔记,感觉有点可惜,这次学习傅里叶变换要记下来。
傅里叶变换非常之神奇,可以把时域数据转换到频域,对于信号分析非常有用。之前也专门看过一次,但是不知为什么当初没有认真去看懂。这次趁着搞loopshaping需要辨识对象模型,又学了一下傅里叶变换,这才对它有了比较感性的认识。
上学时搞的非线性控制什么的,越搞到后面越感觉远离实际应用,因为太过理想化,都是各种参数自适应,要么就是观测器,反正证明已经稳定了,但是没办法去评价控制器稳定裕度,以及是不是增益已经调到了极限。经典控制学是学了,但是没有落地应用过,感觉还是很有用的。
扯远了,下面简单写一下这两天学傅里叶变换的一些心得:
可以从傅里叶级数入手,先了解傅里叶级数的含义,以及推导过程,这对于理解傅里叶变换很有用。
这里是尝试通过理解傅里叶级数来理解 傅里叶变换的含义
比如傅里叶级数就是把一个周期函数分解成很多个频率的正弦波叠加的形式。
f ( x ) = a 0 2 + ∑ n = 1 ∞ [ a n c o s ( n w t ) + b n s i n ( n w t ) ] f(x)=\frac{a_0}{2}+\sum_{n=1}^\infty[a_ncos(nwt)+b_nsin(nwt)] f(x)=2a0+∑n=1∞[ancos(nwt)+bnsin(nwt)] \quad\quad (1)
或者换个形式:
f ( x ) = a 0 2 + ∑ n = 1 ∞ [ a n s i n ( n w t + ψ n ) ] f(x)=\frac{a_0}{2}+\sum_{n=1}^\infty[a_nsin(nwt+\psi_n)] f(x)=2a0+∑n=1∞[ansin(nwt+ψn)] \quad\quad (2)
那么这里傅里叶级数就可以理解成是函数 f ( x ) f(x) f(x)在不同频率 n w nw nw处的分量之和( a 0 2 \frac{a_0}{2} 2a0是常值分量),不同频率的分量主要由两个参数描述:幅值 a n a_n an和相位 ψ n \psi_n ψn。说到这里,大概应该就能联想到伯德图里的幅频特性和相频特性曲线。没错,其实是一个意思!如果要将一个时域信号用傅里叶变换的方法变化到频域,其实就是分解成各个频率的分量,每个频率分量都由幅值和相位两个参数来描述,幅频特性和相频特性就组成了这个信号的频率特性。
推导这里不想展开,但是可以说说大概的思路。同样是从傅里叶级数出发
先说傅里叶级数的推导:主要是用到了三角函数系的正交性,就是说对于一个三角函数系:1, c o s x cosx cosx, s i n x sinx sinx, c o s 2 x cos2x cos2x, s i n 2 x sin2x sin2x,…, c o s n x cosnx cosnx, s i n n x sinnx sinnx,其中任何两个不同函数的乘积在 [ − π , π ] [-\pi,\pi] [−π,π]上的积分等于0。这样在求某频率分量的系数的时候,可以在两边都乘上这个频率的三角函数,然后再在 [ − π , π ] [-\pi,\pi] [−π,π]积分,然后等式右边会可以得到一大堆的0(正交性),然后就很容易求出该系数了。举个例子:
如果要求公式 (1) 中的 a n a_n an,只需要在公式 (1) 等号两边同乘 c o s ( n w t ) cos(nwt) cos(nwt),然后在 [ − π , π ] [-\pi,\pi] [−π,π]上积分一下,得到:
∫ − π π c o s ( n w t ) ⋅ f ( t ) d t = a n π \int_{-\pi}^{\pi}cos(nwt)\cdot{}f(t)dt=a_n\pi ∫−ππcos(nwt)⋅f(t)dt=anπ \quad\quad (3)
得到: a n = 1 π ∫ − π π c o s ( n w t ) ⋅ f ( t ) d t a_n=\frac{1}{\pi}\int_{-\pi}^{\pi}cos(nwt)\cdot{}f(t)dt an=π1∫−ππcos(nwt)⋅f(t)dt \quad\quad
没错, c o s 2 ( n w x ) cos^2(nwx) cos2(nwx) 或 s i n 2 ( n w x ) sin^2(nwx) sin2(nwx) 在 [ − π , π ] [-\pi,\pi] [−π,π]上的积分就是 π \pi π(当然这里nw ≠ \neq = 0),如果是1的话在 [ − π , π ] [-\pi,\pi] [−π,π] 积一下肯定就是 2 π 2\pi 2π了,求 a 0 a_0 a0的时候就直接对公式 (1) 两边积分即可。
以上就是傅里叶级数的系数的推导过程:
而傅里叶变换其实就是把周期函数 [ − π , π ] [-\pi,\pi] [−π,π] 的区间推广到 [ − ∞ , ∞ ] [-\infty,\infty] [−∞,∞] 。具体的推导见某乎大佬的回答:https://zhuanlan.zhihu.com/p/23739221(我理解的傅里叶变换)
最终得到:
f ( x ) = 1 2 π ∫ − ∞ ∞ ( 1 2 π ∫ − ∞ ∞ f ( t ) e − i w t d t ) e i w x d w f(x)=\frac{1}{\sqrt{2\pi}}\int_{-\infty}^{\infty}\big(\frac{1}{\sqrt{2\pi}}\int_{-\infty}^{\infty}f(t)e^{-iwt}dt\big)e^{iwx}dw f(x)=2π1∫−∞∞(2π1∫−∞∞f(t)e−iwtdt)eiwxdw \quad\quad (4)
(其中 e i w x e^{iwx} eiwx只是表示正弦+余弦的另一种方式)
这个公式其实是把 f ( x ) f(x) f(x) 表示成了 e i w x d w e^{iwx}dw eiwxdw的线性组合。
也就是说 e i w x d w e^{iwx}dw eiwxdw是这个函数的“基”,
而这个“基”的系数,
f ( w ) ^ = 1 2 π ∫ − ∞ ∞ f ( t ) e − i w t d t \hat{f(w)}=\frac{1}{\sqrt{2\pi}}\int_{-\infty}^{\infty}f(t)e^{-iwt}dt f(w)^=2π1∫−∞∞f(t)e−iwtdt
就是该函数( f ( x ) f(x) f(x))的傅里叶变换!
help 一下 matlab 的 fft 函数
拉氏变换可以理解成是傅里叶变换的增强版(或者说傅里叶变换是拉普拉斯变换的特殊情况),因为傅里叶变换的条件比较苛刻,经常用的很多函数都变换不过去(因为不满足迪利克雷条件),所以就有了拉普拉斯变换,拉普拉斯变换就是将原函数乘上了一个衰减因子 e − k t e^{-kt} e−kt ,就能满足傅里叶变换的条件了。
拉氏变换是把一个实变函数转换成一个复变函数,这样做的好处是可以把常微分方程转换成代数方程,更容易求解。比如一个控制系统里,肯定会有各种的积分微分环节,如果用微分方程描述会非常的难解,但如果用拉氏变换转换到复域,就成了传递函数,这样描述起来就很方便了,求解也很方便。解出来之后再变换回去,美滋滋。