傅里叶级数与傅里叶变换

news2024/11/15 23:30:36

一、Games101 中出现的傅里叶变换(FT)的简单推导

到底什么是傅里叶变换:它的物理意义是什么,公式又从何而来?

以下的内容出现在 Games101 中的第八章:光栅化(深度测试与抗锯齿)

 

中,课程中这一部分大致介绍的内容是

任何周期函数 f(x) 都可以分解为无数个不同频率、不同幅值的正、余弦信号。和泰勒展开一样,这也是一种函数展开/逼近方案:即傅里叶级数展开,其中左边那一张 PPT 就是一个简单的例子

右侧则为傅里叶变换及其逆变换:它和傅里叶级数展开的概念是非常相似的

如果不了解傅里叶变换(FT),可能会对视频中右边突如其来的内容非常陌生,只知道它用于将一个函数变成另一个函数,但是这个式子是怎么推导的,具体是什么变成什么可能就没有太多头绪

而这一章的内容,主要就是对上面内容的答疑解惑

1.1 前置1:三角函数系

三角函数系即包含所有不同周期的三角函数的集合

\{0,1, \sin x, \cos x, \sin 2 x, \cos 2 x, \cdots, \sin n x, \cos n x\}

其中三角函数拥有一个非常重要的性质:正交性

  • \int_{-\pi}^\pi \cos n x \cos m x d x=0 \quad n \neq m
  • \int_{-\pi}^\pi \sin n x \sin m x d x=0 \quad n \neq m
  • \int_{-\pi}^\pi \sin n x \cos m x d x=0

和向量垂直内积为0一样,两个函数内积 \int_{x_0}^{x_1} f(x) g(x) d x=0 即两个函数正交,而对于上面的两个特例:即 m = n 的情况,其积分结果为 \pi

通过这个性质,后面可以很轻松的根据傅里叶原变换推导出其逆变换

1.2 前置2:三角函数的指数表示

3Blue1Brown 有一个视频很好的介绍了 e^i 到底表达了什么,如果有兴趣的话可以直接去看:【官方双语】微分方程概论-第五章:在3.14分钟内理解e^iπ,搞懂这个之后,这一部分就可以直接跳过了

虚数 i 这个概念基本上只要上过高中的都知道,只不过大多数人对它的印象只剩下了一个公式 i^2 = -1:其余的就都不记得了,那么乘以虚数的意义又是什么呢?

如上图有三个线段线段,线段 AB 的长度是1:当它乘以2的时候,它的长度发生了变化,拉伸成了线段 EF,而当它乘以 -1 的时候,就变成了线段 CD,或者说代表着原线段在数轴上围绕原点旋转了 180°

既然乘以 -1 相当于旋转 180°,考虑到 i^2 = -1,那么是不是就可以理解为:乘以 i 就是旋转了 90°?

是的,不过到此如果只考虑一维的实数轴就不够用了,因此我们可以加一条垂直的虚数轴已构成一个复平面,这样我们就可以把虚数乘法也表示出来:即乘以实数表拉伸,乘以虚数表旋转

但是到这里还没有结束,要知道本章之所以要提到虚数 i,主要是为了解释后面出现的 e^i,以及经典的欧拉公式 e^{i x}=\cos x+i \sin x,可能就算你理解了虚数乘法,也未必能理解虚数作为指数意味着什么


一个事实是:其实很多时候某些东西单独看是没有意义的,只不过为了实现一些目的,我们后来的人们手动赋予了它意义,尽管你完全理解不了:是的它就是一个定义,数学家就是这么理解它的(当然其一定是有依据的,而不是乱来)

而虚数作为指数就是这么被“定义”出来的,其实它已经和正常我们理解的指数完全不是一个概念了,也就是说我们不能说 e^i 就是连续 i 个 e 相乘,它是错误且没有意义的,事实上,它表达的是下面这个东西:

 e^i 表示为单位线段旋转一定角度,这个角度对应的弧长为1,这个定义是根据复导数 \frac{d}{d t} e^{i t}=i \cdot e^{i t} 反推出来的,当然具体细节就不再展开,有兴趣的话可以本节看上面引用的视频

知道这个后,两个著名的公式其实就不难理解了,你也可以瞬间化为数屑家去把它们推出来:

  1. e^{i \pi}+1=0
  2. e^{i x}=\cos x+i \sin x

后面主要会用到的,其实就是的下面的公式

1.3 傅里叶级数的推导

好了,可以回来了前面的内容:任何周期函数 f(x) 都可以分解为无数个不同频率、不同幅值的正、余弦信号,不妨可以先考虑最简单的情况,也就是先保证 f(x) 周期 T = 2\pi,即 f(x)=f(x+2 \pi)

那么对于上面部分的数学表示,就有:f(x)=\sum_{n=0}^{\infty} a_n \cos n x+\sum_{n=0}^{\infty} b_n \sin n x

,其中 a_nb_n 都为常数项,然后有意思的就来了:有了这个级数表示,我们能不能得到一个左侧为 a_n 的等式呢? 

当然是可以的,就利用上面的三角函数的正交性求积分即可:

先计算最简单的 a_0

f(x)=\sum_{n=0}^{\infty} a_n \cos n x+\sum_{n=0}^{\infty} b_n \sin n x = a_0+\sum_{n=1}^{\infty} a_n \cos n x+\sum_{n=1}^{\infty} b_n \sin n x

两边积分有:

\int_{-\pi}^\pi f(x) d x=\int_{-\pi}^\pi a_0 d x+\int_{-\pi}^\pi \sum_{n=1}^{\infty} a_n \cos n x d x+\int_{-\pi}^\pi \sum_{n=1}^{\infty} b_n \sin n x d x

根据三角函数的正交性,可以知道后面两项看上去复杂,其实都为0,也就有:

\int_{-\pi}^\pi f(x) d x=a_0 \int_{-\pi}^\pi d x=\left.a_0 x\right|_{-\pi} ^\pi=2 \pi a_0

好了,到此结果显而易见了

接下来用同样的方法计算 a_n:不过这一次我们在两边同时积分之前,先全部乘上 cosmx

\int_{-\pi}^\pi f(x) \cos m x d x= \\ \int_{-\pi}^\pi \frac{a_0}{2} \cos m x d x+\int_{-\pi}^\pi \sum_{n=1}^{\infty} a_n \cos n x \cos m x d x+\int_{-\pi }^{\pi} \sum_{n=1}^{\infty} b_n \sin n x \cos mx d x \\

一样根据三角函数的正交性,第一项和第三项为0:就有

\int_{-\pi}^\pi f(x) \cos m x d x=\int_{-\pi}^\pi \sum_{n=1}^{\infty} a_n \cos n x \cos m x d x

并且当前仅当 n = m 时,右侧的积分结果不为0,也就是说

\int_{-\pi}^\pi f(n) \cos n x d x=\int_{-\pi}^\pi \operatorname{a_ncos} n x \cos n x d x=\operatorname{a_n} \int_{-\pi}^\pi \cos ^2 nx d x

a_n=\frac{1}{\pi} \int_{-\pi}^\pi f(x) \cos n x d x

游戏结束,关于 b_n 的计算同理


好了,到此就可以得到一个最基础的傅里叶级数形式

对于满足周期 T = 2\pi 的 f(x)f(x)=f(x+2 \pi),有:

f(x)=\frac{a_0}{2}+\sum_{n=1}^{\infty}\left(a_n \cos n x+b_n \sin n x\right)

其中:

\begin{aligned} &a_n=\frac{1}{\pi} \int_{-\pi}^\pi f(x) \cos n x d x \\ &b_n=\frac{1}{\pi} \int_{-\pi}^\pi f(x) \sin n x d x \end{aligned}

1.3.1 任意周期函数的傅里叶级数

前面考虑的 f(x) 周期满足最简单的 T = 2\pi,现在在理解了上面内容的基础值之上,可以考虑去推导任意周期的通式

考虑周期 T = 2L,L 为任意值,也就是 f(x)=f(x+2L),那么就可以用换元法:

f(t)=f\left(\frac{L}{\pi} x\right) \triangleq g(x),其中 g(x)=g(x+2 \pi),满足前面的傅里叶变换的级数形式

那么此时就只需要把 x=\frac{\pi}{L} t = wt 带入到前面的级数推导中,就可以得出任意周期函数的傅里叶级数形式

f(t)=\frac{a_0}{2}+\sum_{n=1}^{\infty}\left(a_n \cos n \omega t+b_n \sin n \omega t\right)

其中:

\begin{aligned} &a_n=\frac{2}{T} \int_0^T f(t) \cos n \omega dt \\ &b_n=\frac{2}{T} \int_0^T f(t) \sin n \omega dt \end{aligned}

1.3.2 傅里叶级数的复数形式

好了转折点来了,现在我们把前面第二节的欧拉公式拿过来:e^{i x}=\cos x+i \sin x

这个依旧是可以逆推得到(因为离本章的主题比较远,这一部分的详细推导就略了)

  • \cos \theta=\frac{1}{2}\left(e^{i \theta}+e^{-i \theta}\right)
  • \sin \theta=-\frac{1}{2} i\left(e^{i \theta}-e^{-i \theta}\right)

将其带入前面的傅里叶级数 f(t)=\frac{a_0}{2}+\sum_{n=1}^{\infty}\left(a_n \cos n \omega t+b_n \sin n \omega t\right) 有

f(t)=\frac{a_0}{2}+\sum_{n=1}^{\infty}\left[\frac{1}{2}a_n\left(e^{i n \omega t}+e^{-i nw t}\right)-\frac{1}{2} ib_n\left(e^{i n \omega t}-e^{-i n \omega t}\right)\right] \\ =\frac{a_0}{2}+\sum_{n=1}^{\infty}\left[\frac{a_n-i b_n}{2} e^{i n \omega t}+\frac{a_n+i b_n}{2} e^{-i n \omega t}\right] \\ =\sum_{n=0}^0 \frac{a_0}{2} e^{i n \omega t}+\sum_{n=1}^{\infty} \frac{a_{n} -ib_n}{2} e^{i n \omega t} + \sum_{n=-\infty}^{-1} \frac{a_{-n} + ib_{-n}}{2} e^{i n \omega t} \\

到这你会发现,其实这三个求和公式对应的区间加在一起正是负无穷到正无穷,并且它们的项都是 e^{i n \omega t},只是系数不同而已,因此可以直接将这三项整合起来得到:

f(t)=\sum_{-\infty}^{\infty} c_n e^{i n \omega t}

其中:

c_n= \begin{cases}\frac{a_0}{2}, & n=0 \\ \frac{a_n-i b_n}{2}, & n=1,2,3,4 \cdots \\ \frac{a_{-n}+ib_{-n}}{2} & n=-1,-2,-3,-4 \cdots\end{cases}

好了,到此就只剩下最后一步了:那就是把前面 a_n 和 b_n 的结果代进去,就有

c_n=\frac{a_{n}-ib_{n}}{2} =\frac{1}{2}\left(\frac{2}{T} \int_0^T f(t) \cos n \omega t-i\frac{2}{T} \int_0^T f(t) \sin n \omega t\right) \\ =\frac{1}{T} \int_0^T f(t)(\cos n \omega t-i \sin n \omega t) d t

仔细看,右边像不像欧拉公式 e^{i x}=\cos x+i \sin x?此时配合奇函数偶函数的积分性质,就可以得出 c_n =\frac{1}{T} \int_0^T f(t) e^{-i n \omega t} d t

而对于其它情况例如 c_n =\frac{a_{-n}+ib_{-n}}{2} 的推导,你也会得到一个完全相同的结果,可以说是非常的妙,到此为止,我们就得到了一个完美的傅里叶级数复数形式

对于周期为 T 的函数 f(t),有:

  • c_n =\frac{1}{T} \int_0^T f(t) e^{-i n \omega t} d tw_0 = \frac{2\pi}{T}
  • f(t)=\sum_{-\infty}^{\infty} c_n e^{i n \omega t}

通过等式①,我们可以对一段函数进行滤波,把指定频率的波段/信号给筛出来

1.4 非周期函数傅里叶变换推导

休息一会再来,前面对于 f(t),我们求得了他为周期函数情况下的傅里叶级数展开,现在尝试求出真正的“通解”:即任意 f(t) 的傅里叶变换

照应开头,主角要登场了!

1.4.1 时域与频域

这里强烈推荐一篇文章:傅里叶分析之掐死教程(完整版),里面关于频域与时域的介绍非常形象,并且和本文长篇的公式推导不同,里面基本不含任何复杂的数学公式,如果看多了 LaTex 换个心情也是可以的

还是那个周期为 T 的函数 f(t),如果我们画出对应的函数图像,横轴为 t,纵轴为 f(t),那么这个图像就是标准的时域图像,其中横轴变量 t 就代表着时间(Time)

 

然后就是傅里叶级数:

  1. c_n =\frac{1}{T} \int_0^T f(t) e^{-i n \omega t} d tw_0 = \frac{2\pi}{T}
  2. f(t)=\sum_{-\infty}^{\infty} c_n e^{i n \omega t}

对于第②个式子,真正能决定最终函数结果的其实是其中的系数 c_n,而后面的 e^{i n \omega t} 其实是一种规则,代表着不同频率的波

因此,有另一个函数图像也可以用于表示 f(t),其横轴为 n \omega,纵轴为对应的常量 c_n,这便是  f(t) 的标准频域图像该函数也被称为频谱函数,正好是上面的第①个式子,其中横轴 n \omega 对应着频率,而纵轴 c_n 就对应着该频率的波的幅值

如果要更准确的说法,常量系数 c_n 应该是一个复数,因为不止考虑幅值,还应考虑相位,不过我觉得这篇文章作为科普性质的话,讲这个稍微有点超纲了,所以只需要尝试去理解下就好,后面就默认只考量幅值

对于周期 T 有限的情况下,n \omega 的结果是离散的,因此对于周期函数的频域图像,其更像是一个冲激函数图像,即只可能会在横轴坐标为 \{0,w, 2w, 3w, \cdots, nw\} 的位置下出现非0的 c_n 结果

将频域图像和时域图像联系起来,就是下面这个样子(该图片来源于维基百科):

 

从频域图中也可以看出,周期函数 T 越大,对应的 w 越小,冲激函数的图像就越加密集,而对于非周期函数 T,其实也可以理解为 T 无穷大,此时对应的频率 w 无穷小,频域图像就看上去是连续的了:

同理,如果拉伸 f(t) 的时域图像,那么其频域图像则会被压扁

1.4.2 傅里叶变换的最终形式

基频 w_0 = \frac{2\pi}{T} 相当于周期函数的傅里叶级数中两个相邻频率的差值 (n+1) \omega_0-n \omega_0,当周期 T 无穷大时,我们可以把它记作 d\omega 或 \Delta \omega,这样就得到了针对非周期函数的频谱函数:

c_n=\frac{\Delta \omega}{2 \pi} \int_{-\infty}^{+\infty} f(t) e^{-i w t} d t

此时 c_n 趋近于0,意义不大,但是我们可以将其带入到上面②式 f(t)=\sum_{-\infty}^{\infty} c_n e^{i n \omega t} 就有

f(t)=\sum_{n=-\infty}^{+\infty}\left(\frac{\Delta \omega}{2 \pi} \int_{-\infty}^{+\infty} f(t) e^{-i \omega t} d t\right) e^{in \omega t}= \frac{1}{2 \pi}\int_{-\infty}^{+\infty}\left(\int_{-\infty}^{+\infty} f(t) e^{-i \omega t} d t\right) e^{i \omega t} d \omega

其中,傅里叶变换(FT) 即

F(\omega)=\int_{-\infty}^{+\infty} f(t) e^{-i \omega t} d t,其中 w 为可变频率 2\pi f

对于 f(t)=\frac{1}{2 \pi} \int_{-\infty}^{+\infty} F(\omega) e^{i \omega t} d \omega,则为傅里叶变换的逆变换

是的,其实本质上 c_n=\frac{\Delta \omega}{2 \pi} F(\omega)F(\omega) 即信号幅值 c_n 在频域中的分布密度

如果文字和公式不好理解,那就上图:

对于 f(t) 的图像如上,那么转成复数形式的 f(t) e^{-i \omega t} 图像就为下(其中 w=5,其取值越大,整体复平面下的图像就越“拥挤”)

而很明显,我们最后对上面结果求得的积分,就是对这张图像中无数个点对应的向量做加和,想象一下最终加和结果是什么样子的:

由于 w=5,只有频率刚好和其一致的波形,最终得出的傅里叶变换结果不为0(随着积分上下限的提高,得出的结果也会越来越大,如左下图),其余波形成的缠绕图像都会在复平面上均匀展开,从而得出0或者接近0的结果(右下图),从这也可以看出傅里叶变换滤波的特性

好了,到此就完成了最前面右边那张 PPT 中的内容的推导,是不是还是挺简单的

当然也有可能看懂了推导过程,最后还是有疑问:折腾了这么久,傅立叶变换到底有什么意义和实际应用呢?不着急,到这里还只是一个开始,路还很长很长

其它参考:

  • 快速理解FFT算法(完整无废话)
  • 一小时学会快速傅里叶变换
  • 【官方双语】形象展示傅里叶变换
  • 快速傅里叶变换(FFT)超详解

​​​​​​​​​​​​​​​​​​​​​​​​​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/12352.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenAI Whisper论文笔记

OpenAI Whisper论文笔记 OpenAI 收集了 68 万小时的有标签的语音数据,通过多任务、多语言的方式训练了一个 seq2seq (语音到文本)的 Transformer 模型,自动语音识别(ASR)能力达到商用水准。本文为李沐老师…

Spring源码-doCreateBean

先看段代码: Overrideprotected Object createBean(String beanName, RootBeanDefinition mbd, Nullable Object[] args)throws BeanCreationException {if (logger.isDebugEnabled()) {logger.debug("Creating instance of bean " beanName "&qu…

Yolov5(v5.0) + pyqt5界面设计

1.下载安装pyqt5工具包以及配置ui界面开发环境 pip install PyQt5 pip install PyQt5-tools 2.点击File->Settings->External Tools进行工具添加,依次进行Qt Designer、PyUIC环境配置. 2.1 添加QtDesigner Qt Designer 是通过拖拽的方式放置控件&#xff0c…

GUI编程--PyQt5--QWidget2

文章目录事件事件传递父子关系扩展Z轴的层级关系事件 自定义控件类(QWidget),然后重写对应的事件方法即可。 控件显示时触发,showEvent(QShowEvent) 控件关闭时触发,closeEvent(QCloseEvent) 事件传递 案例&#xff1…

MYSQL -- Binlog数据还原

对表误删或执行缺少条件的修改 SQL 导致修改了表内其他数据时,我们需要想办法将数据恢复回来。 先创建两个测试表 table_1 CREATE TABLE table_1 (id int(0) NOT NULL AUTO_INCREMENT,name varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL D…

SpringBoot自定义注解+AOP+redis实现防接口幂等性重复提交,从概念到实战

一、前言 在面试中,经常会有一道经典面试题,那就是:怎么防止接口重复提交? 小编也是背过的,好几种方式,但是一直没有实战过,做多了管理系统,发现这个事情真的没有过多的重视。 最近…

[附源码]java毕业设计酒店管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

K8s为何需要Pod

Pod是K8s中的最小API对象,更专业的表述是,Pod是K8s项目的原子调度单位,Pod可以看做是一个进程组,K8s则是操作系统 一, 问题 现在有三个服务需要部署在同一个节点上,A占用1G内存,B ,…

【Maven】使用maven profile 动态激活不同环境、依赖打包部署

使用maven profile 动态激活不同环境、依赖打包部署前言一、配置二、激活Profile三、动态依赖 示例一些其他参考:前言 在开发过程中,我们的软件会面对不同的运行环境,比如开发环境、测试环境、生产环境,而我们的软件在不同的环境中…

Java方法与方法重载

目录 如何使用带参数的方法 综合案例 常见错误2-1 常见错误2-2 方法传参 构造方法 构造方法重载 this的用法 方法重载 成员变量和局部变量 成员变量和局部变量的区别 如何使用带参数的方法 1、定义带参数的方法 语法&#xff1a;<访问修饰符> 返回类型 <方…

网络 IO 演变过程

在互联网中提起网络&#xff0c;我们都会避免不了讨论高并发、百万连接。而此处的百万连接的实现&#xff0c;脱离不了网络 IO 的选择&#xff0c;因此本文作为一篇个人学习的笔记&#xff0c;特此进行记录一下整个网络 IO 的发展演变过程。以及目前广泛使用的网络模型。 1.网…

服务端Skynet(一)——源码浅析

服务端Skynet(一)——源码浅析 文章目录服务端Skynet(一)——源码浅析1、skynet的本质2、skynet基本的数据结构1、skynet_modules管理模块2、skynet_context模块3、skynet_message模块3、skynet启动服务步骤4、启动服务例子(logger)参考文献&#xff1a;skynet设计综述 skynet…

实战Netty!基于私有协议,怎样快速开发网络通信服务?

前言 今天我们一起来来聊聊怎么使用netty。 在工作中&#xff0c;我经常使用netty开发一些服务&#xff0c;掌握netty的工作原理&#xff0c;开发一些服务端以及客户端是非常简单&#xff0c;本篇文章&#xff0c;我们就以具体的协议来进行一个简单的服务的开发。 正文 私有…

一键汇总报告模型可能会需要修改的地方

文章目录如何修改文件夹地址为指定地址?如何取消清除提醒, 避免每次点击弹窗选择?如何取消完成弹窗提醒?如果觉得反复打开工作簿太闪怎么办?如果有些报告的内容页不在第一个Sheet怎么办?如果想修改字段怎么办?运行程序前不想清除原有内容怎么办?报告页有内容但是没有被抓…

混合整数规划的机组组合附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

Redis常见面试题(2022)

Redis基础 什么是 Redis&#xff1f; Redis 是一个开源&#xff08;BSD 许可&#xff09;、基于内存、支持多种数据结构的存储系统&#xff0c;可以作为数据库、缓存和消息中间件。它支持的数据结构有字符串&#xff08;strings&#xff09;、哈希&#xff08;hashes&#xf…

多分类交叉熵理解

多分类交叉熵有多种不同的表示形式&#xff0c;如下图所示&#xff1a; 但是&#xff0c;有时候我们读论文会深陷其中不能自拔。 也有很多读者、观众会纠正其他作者的文章、视频的交叉熵形式。 实际上&#xff0c;上述三种形式都是没有问题的。 这里&#xff0c;我们就要了解…

多媒体内容理解在美图社区的应用实践

导读&#xff1a;移动互联网时代&#xff0c;图像和短视频等多媒体内容爆发&#xff0c;基于计算机视觉的AI算法是多媒体内容分析的基础。在美图社区智能化发展的过程中&#xff0c;视频和图像分类打标、去重以及质量评估的结果&#xff0c;在推荐、搜索以及人工审核等多个场景…

【R语言数据科学】:变量选择(三)主成分回归和偏最小二乘回归

变量选择(三)主成分回归和偏最小二乘回归 🌸个人主页:JOJO数据科学📝个人介绍:统计学top3高校统计学硕士在读💌如果文章对你有帮助,欢迎✌关注、👍点赞、✌收藏、👍订阅专栏✨本文收录于【R语言数据科学】本系列主要介绍R语言在数据科学领域的应用包括: R语言编…

多分类问题的precision和recall以及F1 scores的计算

对于多分类问题&#xff0c;首先&#xff0c;对于每一个类的精准率&#xff08;Precision&#xff09;和召回率&#xff08;Recall&#xff09;&#xff0c;定义和二分类问题一致&#xff0c;但是计算上不再需要TP,FP,FN等量了&#xff1a;&#xff09; 比如对A, B, C三类有如…