数学之美—细数 傅里叶变换 原理

2023-05-16

目录

一、傅里叶级数(Fourier Series、FS)的实数域表示

二、傅里叶级数(Fourier Series、FS)的复数域表示

三、傅里叶变换(FT)的引出

四、DTFT、DFT、FFT的引出


第一次认识傅里叶(Fourier)是在大二那年的《信号与系统》课上,当时学这门课也不知道有啥用,听的也是一愣一愣的。。最后也仅仅是达到了期末前三天记了点公式,能考个试的水平,当初想着以后怎么也不会再接触通信这鬼东西了,,谁曾想,四年后,在读研之后兜兜转转阴差阳错地又搞起了通信,再回过头来仔细品味四年前学的傅里叶变换豁然开朗,突然觉得数学真是理工科最浪漫的一门学科(之一吧)!

世界上可能有很多巧合,但唯一可以将这些巧合完美地结合在一起并组成一个完美的理论的工具可能只有数学了,这可能就是数学的浪漫与深邃吧~

  • 周期连续函数进行三角分解,这个过程称作 FS(傅里叶级数)
  • 当周期趋于无穷大,即函数变为非周期连续时,FS 就变成 FT(傅里叶变换)
  • 工程应用中,对非周期连续函数进行时域离散(抽样),变为非周期离散函数,FT 就变为 DTFT(离散时间傅里叶变换)
  • 非周期离散函数进行时延拓展变为周期离散函数, DTFT 就变为 DFT(离散傅里叶变换)
  • DFT 的计算复杂度较高,对 DFT 的计算方式进行优化, DFT 就变为 FFT(快速傅里叶变换)

可见傅里叶级数(FS)是FT、DTFT、DFT、FFT的基础,后面变换都是在 FS 的基本原理的基础上衍生出来的,因此,清楚地理解 FS 的基本原理至关重要,因此本文重点讲解 FS 的原理。

一、傅里叶级数(Fourier Series、FS)的实数域表示

学过《高等数学》的小伙伴们一定都知道一个叫做 泰勒级数 的东西:

这个东西的原理是使用幂级数的加权组合来表示一个函数在某点 x0 的邻域内的分解。相比傅里叶级数不同的是他只能用来表示函数某个点的邻域内的展开,而且以幂函数为,但两者都涉及了将信号分解成简单信号的线性组合来表示的思想。

与泰勒级数类似,傅里叶级数是一种对周期信号(即周期函数)的分解表示,它通过对一组成谐波关系的三角函数加权相加来表示一个周期信号。具体地,如果一个函数是周期函数,那么他就可以被分解成以正弦函数以及余弦函数为的线性组合。若函数 f(t) 是周期为 T 的周期函数,则其傅里叶级数展开式如下:

 公式中,\omega _{0} 称作基波频率,n\omega _{0} 为谐波频率。特别地,a0为直流分量,可以看作 a0=a0cos(0)。

现在傅里叶级数的公式有了,但问题也来了(快记笔记!):

1、为什么展开式中的函数,不管cos还是sin,都是以\omega _{0}为基波的呐?可以是别的值做基波吗?

 答:这个好说:必须以 \omega _{0} 作为傅里叶级数的基波。你想呀,只有当傅里叶展开式中的函数都是以基波\omega _{0}或者谐波 n\omega _{0} 为角频率时,其每个函数的公共周期才是 T(对于谐波分量,T/n 是其最小周期,但T也是一个周期),这样进行线性组合后的结果的周期才会仍为 T。如果反过来,在众多展开式中加入一个周期为 T1 ≠ T 的分量,显然这样线性组合结果的周期绝对不会是 T 了,也就无法表示 f(t) 了。

2、给定一个周期信号,我怎么选择使用cos还是使用sin还是两者都使用来进行信号的傅里叶级数展开呐?

答:这个也好解释。cos 是偶函数,sin 是奇函数。很明显,当 f(t) 是偶函数的时候,只需要使用 cos 函数进行 FS 展开;当 f(t) 是奇函数的时候,只需要使用 sin 函数进行 FS 展开;当 f(t) 非奇非偶时,因为它必然可以被分解成一个奇函数与一个偶函数的和:

因此,此时需要 cos 和 sin 一起进行 FS 展开。 

3、如何计算 FS 的系数 an 及 bn ?

答:这个也不难。通俗点说,an 以及 bn 的值的物理意义就是表征函数 f(x) 与 \cos \left ( n\omega _{0}t \right ) 以及 \sin \left ( n\omega _{0}t \right ) 的相似程度(或者说相关程度)。换句话说,an 以及 bn 的值表征了 \cos \left ( n\omega _{0}t \right ) 以及 \sin \left ( n\omega _{0}t \right ) 在线性组合过程中对结果 f(t) 的贡献度。

可以定性地品味一下这句话:如果 f(x) 的图像与 \cos \left ( n\omega _{0}t \right ) 或者 \sin \left ( n\omega _{0}t \right ) 中的某个函数长得很像,也就意味着其图像的重合部分比较多,那么该 \cos \left ( n\omega _{0}t \right ) 或者 \sin \left ( n\omega _{0}t \right ) 分量的权值就自然会比较大,这点应该很容易理解,反映到 FS 中就是 an 或者 bn 的值比较大。可以想象一个极端的例子,如果 f(t)=cos(\omega_{0}t ) ,那么其傅里叶变换 FS = cos(\omega_{0}t),即除了 a1 = 1 之外,其他值都为0,这也是由三角函数的正交性决定的。

那么如何定量计算具体的值呐?这就需要用到相关的概念啦。

对于信号 f1 与信号 f2 的相关的数学定义如下(注意与卷积的区别):

 为了更直观地理解,可以用下图来做说明。图中是两个函数的图像。

图1 做相关运算的两函数的图像

   对这两个函数做相关运算,结果如下:

图2 带有相位差的相关运算图解

图中两函数绿色区域的值相乘(注意不是相交面积!)即为相关运算的结果,其中,变量 t 可以视为在两函数(原有相位差基础上新增)的相位差,当相位差为0时,相关运算的结果如下:

图3 相位差为0的相关运算图解

不难理解,对于傅里叶级数来说,原信号 f(t) 与 \cos \left ( n\omega _{0}t \right ) 及 \sin \left ( n\omega _{0}t \right ) 的相关运算的方式就是图3中的范式。如果只想了解 FS 的原理,看到这里就行了,如果还想得出最后的具体结果那就接着往下看吧。

我们对原信号 f(t) 在一个周期内对 \cos \left ( n\omega _{0}t \right ) 求积分,并由三角函数的正交性(傅里叶级数的三角函数项其实就是一个正交函数系)可知:

 由此就可以得出:

同理:

特别地,当 n=0 时,sin0=0,cos0=1,此时

这下 an 以及 bn 的值也都解出来了。

上述傅里叶级数的形式含有同频的零相位差的 sin 与 cos 分量,而同频的正弦与余弦分量叠加后频率不变,因此还不能直观地体现出频谱及相位的分布情况。正弦与余弦分量本质是一样的,只是相位差了90°而已。这时,为了将频谱更直观地呈现出来,需要将同频的 cos 与 sin 进行合并:

 而可以看出,n\omega _{0}频率处的幅值及相位由该频率处的正弦份量与余弦分量共同决定,此时 FS 可以改写如下:

这个式子直观的体现了 f(t) 的频谱分量及其所占的比例大小。

至此,傅里叶级数的实数域计算就完成了。

二、傅里叶级数(Fourier Series、FS)的复数域表示

在实际的信号分析问题中,我们遇到的信号表示经常是复数形式的信号(自然界中是不存在复数信号的,但是在运算分析过程中可以使用复信号进行表示以简化计算),但是以上分析只适用于实数域的信号形式。是否有一种 FS 形式可以同时用于实数域与复数域的运算那?答案是肯定的,这下就要先引出一个宇宙最骚公式——欧拉公式:

很多人可能会问:这公式这么写有什么含义呐?其实这个公式在数学应用的角度上只是一个工具,是人为定义的一种形式,公式中 j 的具体意义要在具体的使用环境中做分析,你可以从各种角度来做解析,比如在数学运算中,j 表示的是 -1 的平方根;在信号处理领域中,j就代表复平面中的一个旋转算子。至于这个公式怎么得出来的,答案就是文章开头所说的那样——巧合,恰巧就是这个形式,恰巧用这个规则计算就是对的,恰巧这样计算就是最完美的。。。这就是数学之美吧,不得不佩服欧拉他老人家的想象力。

有了这个公式,就可以使用复数来表示 cos 与 sin 函数了:

 将这个结论带入到上面所讲到的 FS 公式中化简,就可以推导出更普适性的傅里叶级数的展开式:

这里的 c_{n} 就是信号 f(t) 对应的频谱。假设f(t)为实函数,下面进行复数域 FS 的反向推导,这种美丽的巧合带来的惊喜即将呈现(^-^)!

 首先将 c_{n} 代入,得:

 然后为了计算方便,使用以下变量代换:

代换后得:

将变量代换回去得:

 现在在回过头去与第一部分讲的 FS 在实数域得展开比较,就问你神奇不哈哈哈

三、傅里叶变换(FT)的引出

 傅里叶级数是对周期连续函数进行的分解,但是自然界中的信号几乎都是非周期连续信号,因此我们需要对傅里叶级数进行拓展,先看上面傅里叶级数的复数域的频谱计算公式:

 我们可以把非周期函数看作周期无穷大的函数,由于\omega _{0}=2\pi /T,随着 T 的增大,频谱间隔 \omega _{0} 无限减小,最终变成连续的频谱,这时的离散频谱就变成了连续频谱,频谱的包络表达式就变成了:

这个表达式就是傅里叶变换(FT)的表达式。

而原来的 FS 的离散频谱系数可以由该连续频谱来获得:

同理,其逆变换此时就成了:

四、DTFT、DFT、FFT的引出

DTFT、DFT、FFT这三种算法是傅里叶变换在工程应用中的延申。在工程应用中,强行手算信号的频谱肯定是不现实的,一般都需要借助计算机来进行辅助计算。FS 及 FT 都是在模拟域计算信号的频谱,但是计算机只能处理数字域的离散信号,因此必须把连续的模拟域信号通过采样转换到离散的数字域才能为计算机所处理,这就需要使用DFT,但是在 DFT 之前还有一个中间过程,就是 DTFT

DTFT 只对时域进行离散化,其傅里叶变换对公式如下:

可以看出,此时虽然 DTFT 时域是离散的,但其频域(频谱)仍是连续的,而要想计算机顺利计算,频谱必须也是离散的,因此还需要将频域进行离散化,这就是 DFT,DFT 的变换公式如下:

我们将时域离散化为N个点,并进行时延拓展成周期函数,这时进行 N 点的 DFT 计算就会得到 N 点的频谱输出。(这里面涉及一个知识点:时域周期离散 对应着 频域离散周期,由于这篇文章主要涉及到的工程原理的解释,这个就不展开讨论了)

进一步地,由于直接使用计算机计算 DFT 的时间复杂度太高 [ O(n²) ],因此需要对 DFT 的计算进行加速,优化后的 DFT 计算方式 [ O(nlogn) ] 就是快速傅里叶算法,即 FFT

==============================================================

相关连接(以下链接看起来都比较通俗易懂):

https://www.cnblogs.com/abella/articles/9770989.html

https://www.zhihu.com/question/23234701/answer/26017000

https://www.bilibili.com/video/BV1Tb41187i1

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数学之美—细数 傅里叶变换 原理 的相关文章

  • Arduino学习笔记:FreeRTOS——ESP32多任务处理

    Arduino学习笔记 xff1a FreeRTOS ESP32多任务处理 Demo span class token comment 创建任务一和任务二的句柄 xff0c 并初始化 span TaskHandle t TASK Handl
  • JAVA-信号量

    信号量 xff1a 信号量一般都有以下几个变量 xff1a count xff1a 记录可以使用的资源数wait list xff1a 等待信号量的队列 获取信号量需要判断count是否大于零 xff0c 即if count gt 0 若c
  • (程序猿专属)1024-我用代码写成浪漫情话表白你

    今天1024 xff0c 程序员节 xff01 不祝你们节日快乐了 xff0c 祝你们穿着拖鞋和裤衩去相亲吧 xff01 祝你们和甜蜜的爱情撞个满怀 xff01 一 我是你的什么啊 xff1f 你是我的bug啊 因为 xff0c 我每时每刻
  • C++中构造函数后的冒号

    C 43 43 中构造函数后的冒号 在C 43 43 中离不开类的定义 xff0c 而构造函数则是类的定义中很重要的一环 我们在构造函数中常常见到如下定义 xff1a span class token keyword class span
  • 论C语言没有输出的可能问题

    论C语言没有输出的可能问题 1 今天帮别人找bug xff0c 说是程序没有输出 题目如下 xff1a 错误代码如下 xff1a span class token macro property span class token direct
  • 【VS2019】报错:E0349没有与这些操作数匹配的运算符

    报错 xff1a E0349没有与这些操作数匹配的运算符 调试程序遇到该错误 xff0c 特此记录 span class token macro property span class token directive keyword inc
  • 基于docker技术搭建hadoop与mapreduce分布式环境

    基于docker技术搭建hadoop与mapreduce分布式环境 一 安装doker 1 宿主环境确认 如果没有的话 安装lsb relaease工具 apt install lsb release 检查版本 lsb release a
  • GNU Radio3.8创建OOT的详细过程(进阶/C++)

    GNU Radio 学习使用 OOT 系列教程 xff1a GNU Radio3 8创建OOT的详细过程 基础 C 43 43 GNU Radio3 8创建OOT的详细过程 进阶 C 43 43 GNU Radio3 8创建OOT的详细过程
  • 基于docker构建spark运行环境

    基于docker构建spark运行环境 一 安装docker与docker compose 参考之前的实验进行docker和docker compose的安装 二 系统构架图 xff1a 三 安装相关镜像 使用docker hub查找我们需
  • HDFS基本操作

    HDFS基本操作 HDFS的基本命令格式 hdfs dfs cmd lt args gt 注意 xff1a 需要事先将HADOOP HOME bin目录配置进入环境变量 列出当前目录下的文件 hdfs dfs ls 在HDFS创建文件夹 h
  • 使用mllib完成mnist手写识别任务

    使用mllib完成mnist手写识别任务 小提示 xff0c 通过restart命令重启已经退出了的容器 sudo docker restart lt contain id gt 完成识别任务准备工作 从以下网站下载数据集 MNIST手写数
  • npm install 报错 Error: EPERM: operation not permitted, rename

    报错的解决方案 原因1 xff1a 权限不足原因2 xff1a 缓存出错方法1方法2 原因3 xff1a npm版本不够原因4 xff1a 网络不稳定方法1方法2 原因5 xff1a 杀毒软件问题方法1方法2 其他 xff1a 待补充 原因
  • 马原复习知识点背诵-《马克思主义基本原理概论》

    马概复习重点 绪论 1 什么是马克思主义 1 从创造者 继承者的角度讲 马克思主义是由马克思恩格 斯创立的 而由其后各个时代 各个民族的马克思主义者 不断丰富和发展的观点和学说的体系 2 从阶级属性讲 马克思主义是无产阶级争取自身解放和整
  • 深度学习 | 三个概念:Epoch, Batch, Iteration

    转自 xff1a https www jianshu com p 22c50ded4cf7 写在前面 xff1a 在训练神经网络的时候 xff0c 我们难免会看到Batch Epoch和Iteration这几个概念 曾对这几个概念感到模糊
  • OpenStack — Nova

    文章目录 NovaNova架构Nava组件nova apinova computenova conductornova schedulernova novncproxy 创建虚拟机流程 Nova Nova是OpenStack最核心的服务模块
  • 使用Object.key和delete来将对象中值为空的属性删除。

    有些时候 xff0c 我们在接口传值时 xff0c 不需要把值为空的属性传过去 xff0c 即可使用该方法来快速的删除属性 span class token comment 深拷贝对象 xff0c 避免影响页面显示 span span cl
  • docker启动关闭删除所有的容器命令

    1 启动所有容器 docker start docker ps a awk 39 print 1 39 tail n 43 2 2 关闭所有容器 docker stop docker ps a awk 39 print 1 39 tail
  • GNU Radio3.8创建OOT的详细过程(python)

    GNU Radio 学习使用 OOT 系列教程 xff1a GNU Radio3 8创建OOT的详细过程 基础 C 43 43 GNU Radio3 8创建OOT的详细过程 进阶 C 43 43 GNU Radio3 8创建OOT的详细过程
  • 面试必问:从输入URL到页面展示,这中间发生了什么?(详细易懂,条理好记)

    导航流程 xff1a 从输入URL到页面展示 xff0c 这中间发生了什么 xff1f 一 进程介绍 整个过程需要各个进程之间的配合 进程与线程是两个概念 xff0c 程序启动时 xff0c 操作系统为程序创建内存 xff0c 用以存放代码
  • MATLAB神经网络工具箱函数各种图的解释

    Neural Network 该部分展示了神经网络的结构 xff0c 从结构图中可以看出该网络有三个隐含层 xff0c 神经元个数分别为9个 8个 7个 Algorithms 该部分展示了该网络所使用的训练算法 xff0c 可以看出 Dat

随机推荐

  • gazebo加载world模型

    使用launch文件启动gazebo加载world模型 xff0c 或者说是将world模型加入gazebo仿真器中作为环境 first xff0c 我们应该告诉gazebo 要加载的world文件放在哪里 并通过arg标签 xff0c 设
  • px4无人机报avionics power low

    px4无人机报avionics power low xff0c 将无人机连接qgc中 xff0c 将CBRK SUPPLY参数设为最大值即可
  • QGC地面站PC桥接px4(QGC+wifi+机载计算机+px4)

    QGC地面站PC桥接px4 xff08 QGC 43 wifi 43 机载计算机 43 px4 xff09 1 在机载计算机上安装ubuntu2 安装ros3 机载计算机上安装mavros1安装mavros2 安装安装mavros相关的 g
  • 消除Gazebo模型抖动

    自己创建的模型导入到gazebo中往往会不停的跳动 xff0c 一般是由于转动惯量设置不正确导致的 xff0c 可以将转动惯量注释掉 如果注释点后还是有这种情况 xff0c 需要设置非零的min depth xff0c 模型通常会稳定 将其
  • px4报dangerously low battery! shutting system down.

    这两天用px4突然开始报dangerously low battery shutting system down xff0c 从px4 github项目上看到是因为telem接口中的tx和rx相连了 xff0c mavlink的消息从px4
  • realsense t265测试中的一些小问题

    realsense t265测试中出现的一些小问题 环境 xff1a Ubuntu18 04 内核 xff1a 5 4 官方教程 xff1a https github com IntelRealSense realsense ros 测试过
  • 查看T265配置信息及参数

    查看T265配置信息及参数 1 验证SDK安装成功 安装完sdk后 xff0c 终端里运行 realsense viewer 查看相机输出的图像和imu信息 xff0c 可以验证sdk是否安装成功 2 查看T265配置信息 rs enume
  • 修改vins-fusion中T265的相机模型文件

    修改vins fusion中T265的相机模型文件 在使用T265跑vins fusion的过程中 xff0c 首先需要设置相机相关的配置文件 xff0c 网上给出的相关测试教程都没有很明白的说明这一部分 xff0c 都将T265作为了ME
  • GNU Radio3.8:创建自定义的QPSK块(C++)

    GNU Radio 学习使用 OOT 系列教程 xff1a GNU Radio3 8创建OOT的详细过程 基础 C 43 43 GNU Radio3 8创建OOT的详细过程 进阶 C 43 43 GNU Radio3 8创建OOT的详细过程
  • NUC主机部署px4+T265

    NUC主机部署px4 43 T265 安装T265驱动及realsense ros安装mavros安装VIO测试 px4使用T265做视觉定位在官方指导手册上给出了相关的教程 xff0c 但有些细节部分比较蛋疼 xff0c 需要修改 xff
  • 安装evo出现import any qt binding错误

    安装evo出现error Failed to import any qt binding 需要测评无人机轨迹精度 xff0c 使用evo工具 xff0c 安装可以参考github上给出的流程 xff0c 我选的是从源文件安装 xff0c 在
  • rosbag2csv

    1 record bag rosbag record O topic name group 2 rosbag to csv rostopic echo b bag name bag p topic name gt csv name csv
  • ubuntu18.04使用anaconda3配置yolov5

    ubuntu18 04使用anaconda3配置yolov5 1 anaconda官网下载相关的sh文件 在sh文件所在的文件夹里打开终端 使用bash命令 运行sh文件安装anaconda 在安装的过程中首先有一个确定anaconda的安
  • 无人机仿真搭建:ROS,Gazebo,SITL,MAVROS,PX4

    写在前面 最近一直在搭建无人机仿真的环境 xff0c 系统都卸载安装了很多次才安装好 xff0c 所以写下这篇博客来记录一下 xff0c 万一以后还要再搭也可以有个参考 xff0c 也可以给大家做个参考 这个是结合我自己系统来安装的 xff
  • C++ 类的构造函数之冒号初始化语法

    在实现类的时候往往需要写一个构造函数用于初始化对象 xff0c 出去一般的函数语法之外 xff0c 还有一种冒号语法 比如 xff0c 下面两种构造函数的写法近似相同 xff1a 常规方法 class A private int index
  • educoder--MapReduce基础实战各关卡通关答案

    第1关 xff1a 成绩统计 任务描述 相关知识 什么是MapReduce 如何使用MapReduce进行运算 代码解释 编程要求 测试说明 任务描述 本关任务 xff1a 使用Map Reduce计算班级中年龄最大的学生 相关知识 为了完
  • Could NOT find ddynamic_reconfigure

    下载ddynamic reconfigure的package 链接https github com pal robotics ddynamic reconfigure tree kinetic devel 解压到catkin ws src空
  • 一位工作了10年的C++程序员总结出这些忠告

    1 可以考虑先学习C 大多数时候 xff0c 我们学习语言的目的 xff0c 不是为了成为一个语言专家 xff0c 而是希望成为一个解决问题的专家 做一个有用的程序员 xff0c 做一个赚钱的程序员 我们的价值 xff0c 将体现在客户价值
  • 新手程序员必学的代码编程技巧

    程序员往往渴望加入的是一支 30 的时间在写代码 xff0c 而70 的时间在喝着咖啡讨论着如何将产品做好 的团队 软件工作应该成为一项技术和艺术融合的高智力活动 xff0c 而项目经理应该是一个高度理解质量 范围和进度客观规律的明白人 x
  • 数学之美—细数 傅里叶变换 原理

    目录 一 傅里叶级数 xff08 Fourier Series FS xff09 的实数域表示 二 傅里叶级数 xff08 Fourier Series FS xff09 的复数域表示 三 傅里叶变换 xff08 FT xff09 的引出