Loading [MathJax]/jax/element/mml/optable/GreekAndCoptic.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >傅里叶变换理论与应用

傅里叶变换理论与应用

作者头像
为为为什么
发布于 2022-12-17 03:00:10
发布于 2022-12-17 03:00:10
1.2K0
举报
文章被收录于专栏:又见苍岚又见苍岚

本文简要总结之前傅里叶变换系列文章,梳理脉络,总结应用场景。

课件展示

理论基础

傅里叶级数

  • 对周期信号进行分解的方式
a02+n=1(ancosnπxl+bnsinnπxl),l>0,n=1,2,

a02 直流分量,n 为使用的正弦波的下标, an,bn 为幅度

傅里叶级数正交性

a02+n=1(ancosnπxl+bnsinnπxl),l>0,n=1,2,
  • 不同频率的正弦波在任意 2l 周期内积分为 0
  • 证明:需要证明 cos sin 两两之间的积分为零,因为道理相同,这里以 cos cos 为例:

$$ \begin{array}{l} \int_{-l}^{l} \cos \frac{n \pi x}{l} \cos \frac{m \pi x}{l} \mathrm{~d} x &=&\frac{1}{2} \int_{-l}^{l} \cos \frac{(n+m) \pi x}{l}+\cos \frac{(n-m) \pi x}{l} \mathrm{~d} x \ &=&\left.\left(\frac{l}{2(n+m) \pi} \sin \frac{(n+m) \pi x}{l}+\frac{l}{2(n-m) \pi} \sin \frac{(n-m) \pi x}{l}\right)\right|_{-l} ^{l} \&=&0 \end{array} $$

时域信号基

  • 对于自然界存在的信号,在时域时可以理解为此信号的基为不同时刻的冲击函数,基是一族冲击激信号 δ(xn)

傅立叶变换

  • 傅立叶变换是一种基于傅里叶级数的分析信号的方法, 用正弦波作为信号的成分。
  • 当选择无限个不同频率不同振幅的正弦、余弦波的集合作为信号的基时, 信号就转换到了频域。
  • 在频域中,基是 {ejwx} ,而且这组基是正交基(基于傅里叶级数)

一维傅里叶变换

  • f(x) 为时域信号,一维傅里叶变换的定义为:
F(w)=+f(x)ejwxdx
  • F(ω) 叫做 f(t) 的象函数, f(t) 叫做F(ω) 的象原函数。 的象, 原象。
  • 一维傅里叶变换是将一个一维的信号分解成若干个复指数波 。而由于 ,所以可以将每一个复指数波 都视为是 的组合。

一维傅里叶反变换

  • 傅里叶变换可以通过逆变换将象函数变换为象原函数
  • 证明:

$$ \begin{array}{c} \int_{-\infty}^{\infty} F(\omega) e^{i w t} d \omega &=&\int_{-\infty}^{\infty}\left\int_{-\infty}^{\infty} f(x) e^{-j w x} d x\right e^{j w t} d w\ &=& \int_{-\infty}^{\infty}\left\int_{-\infty}^{\infty} e^{-j w(x-t)} d w\right f(x) d x \ &=& \int_{-\infty}^{\infty}2 \pi \delta(x-t) f(x) d x \ &=& 2 \pi f(t) \end{array} $$

一维傅里叶变换中的正弦波表示

  • 对于一个正弦波而言,需要三个参数来确定它: 频率 ,幅度 ,相位
  • 因此在频域中,一维坐标代表频率,而每个坐标对应的函数值也就是 是一个复数,其中它的幅度 就是这个频率正弦波的幅度 ,相位 就是
  • 右侧展现的是幅度图,在信号处理中用到更多的也是幅度图。

一维离散傅里叶变换

  • 是一个长度为 的有限长序列,则定义 点离散傅里叶变换为
  • 的离散傅里叶逆变换(Inverse Discrete Fourier Transform, IDFT)为

式中, 称为 变换区间长度, 通常称上述两式为离散傅里叶变换对。

二维傅里叶变换

  • 一维信号是一个序列,傅里叶变换将其分解成若干个一维的正弦函数之和。
  • 二维傅里叶变换将一个图像分解成若干个复平面波 之和。
  • 对于正弦平面波,可以这样理解,在一个方向上存在一个正弦函数,在法线方向上将其拉伸。前面 说过三个参数可以确定一个一维的正弦波。哪几个参数可以确定一个二维的正弦平面波呢?
  • 答案是 四个,其中三个和一维的情况一样 (频率 , 幅度 ,相位 ),但是具有相同这些参数的平面波 却可以有不同的方向

二维连续傅里叶变换

  • 为二维时域信号,二维连续傅里叶变换公式为:
  • 通过公式,我们可以计算出,每个平面波在图像中成分是多少。
  • 从公式也可以看到,二维傅里叶变换就是将图像与每个不同频率的不同方向的复平面波做内积,也就是一个求在基 上的投影的过程。

二维离散傅里叶变换

  • 表示一幅大小为 像素的数字图像,其中
  • 其二维离散傅里叶变换(DFT)为:
  • 离散傅里叶反变换(IDFT)为:

频域乘法代替空域卷积

  • 频域是时域整体的表达,频域上信号的一个点,对应的是整个时域信号该对应频率的信息
  • 因此,在频域中的乘法,自然就对应了时域整段所有不同频率信号乘法的叠加,这就相当于计算了时域卷积
  • 频域乘法理论上可以代替空域卷积运算

卷积 与 互相关 (概念澄清)

  • 神经网络的卷积介绍中经常可以看到这样的示意图,称之为卷积
  • 在信号处理中的卷积定义为:

也就是说 的二维信号是左右、上下翻转后再平移求向量点积的,与神经网络中表示的卷积概念有一点出入,只是在不同场合的说法不同。

  • 这样设计的好处是使得卷积操作拥有了可交换性,即上式可以等价地写作:
  • 在信号处理中有一个概念叫互相关, 定义为:
  • 互相关操作的定义和神经网络中的卷积相同。
  • 该操作不可交换,但其物理含义在图像处理中很重要,由于是向量直接平移后的点积计算,正好可以表示图像的相关性。

频域乘法代替空域卷积

  • 频域乘法理论上可以代替空域卷积运算
  • 设两时域信号 , 对于卷积有:
  • 其傅里叶变换为:

$$ \begin{array}{c} Ff(t) * g(t)&=&\int_{-\infty}^{\infty}\left\int_{-\infty}^{\infty} f(\tau) g(t-\tau) d \tau\right e^{-j w t} d t \ &=&\int_{-\infty}^{\infty} f(\tau)\left\int_{-\infty}^{\infty} g(t-\tau) e^{-j w t} d t\right d \tau \ &=& \int_{-\infty}^{\infty} f(\tau) e^{-j u \tau} d \tau\left\int_{-\infty}^{\infty} g(t-\tau) e^{-j w(t-\tau)} d(t-\tau)\right \ &=&Ff(\tau) Fg(t-\tau) \ &=&F(w) G(w) \end{array} $$

  • 因此卷积可以通过下式计算:

事实上也有空域乘法相当于频域卷积的结论

频域乘法代替空域互相关

  • 设两时域信号 , 对于互相关有:
  • 按照同样方法推导其在频域的样子:

$$ \begin{array}{c} Ff(t) \otimes g(t)&=&\int_{-\infty}^{\infty}\left\int_{-\infty}^{\infty} f(\tau) g(t+\tau) d \tau\right e^{-j w t} d t \ &=&\int_{-\infty}^{\infty} f(\tau)\left\int_{-\infty}^{\infty} g(t+\tau) e^{-j w t} d t\right d \tau \ &=& \int_{-\infty}^{\infty} f(\tau) e^{j u \tau} d \tau\left\int_{-\infty}^{\infty} g(t+\tau) e^{-j w(t+\tau)} d(t+\tau)\right \ &=&F^*f(\tau) Fg(t-\tau) \ &=&F^*(w) G(w) \end{array} $$

  • 因此互相关可以通过下式计算:

$$ f(t) \otimes g(t)=F^{-1}(Ff(t) \otimes g(t))=F^{-1}(F^*(w) G(w)) $$

  • 在离散傅里叶变换中也有相同结论

快速计算空域互相关/卷积

  • 卷积结果的傅里叶变换为信号傅里叶变换乘积 这一结论为空域卷积快速计算提供了可能。
  • 考虑 维数据 , 卷积核 ,我们需要计算二者的互相关结果
  • 在空域计算时时间复杂度为
  • 运用频域乘法计算时 频域乘法要求尺寸相同,因此需要将小卷积核 pad 到和 同样大小 ( ) 空域转换为频域,可以使用 FFT 加速,时间复杂度为 ,得到两组 的频域信号 频域数据相乘,运算复杂度为
  • 因此复杂度为
  • 因此若

循环卷积

  • 对于 维数据 ,当利用傅里叶变换计算互相关/卷积时,输出结果维度仍为
  • 那么在时域该卷积是如何 pad 的?

相位相关

  • 对于两个互为循环平移的一维信号 ,维度为
  • 信号的离散傅里叶变换将相对移位:

$$ \mathbf{G}_{b}(u)=\mathbf{G}_{a}(u) e^{-2 \pi i\left(\frac{u \Delta x}{M}\right)} $$

  • 然后可以通过计算,得出相位差:
  • 该频谱表示的就是时域信号中 的傅里叶变换,因此其反变换就可以得到位移的位置了。

一维傅里叶变换的应用

计算一维周期信号的周期/频率

  • 可以应用在一维周期信号的特征提取
  • 给出一幅图像,我们求出图像中圆形的周期和相位

  • 去均值一维信号
  • 离散傅里叶变换,计算模长

其中能量最大的就是信号的频率 12,与实际相符

  • 通过计算频域复数在 12 这一点的角度,可以得到周期信号的起始相位

计算图像旋转角度

Halcon 实例: determine grid rotation fft

  • 对于图像对
  • 统计二者的梯度方向累计直方图,可以发现由于旋转产生的位移偏差
  • 这样我们得到了两个循环移位的一维信号
  • 此时可以用傅里叶变换求得互相关结果,选择相关性最高的点作为角度变换结果
  • 也可以利用相位相关,求得信号位移在时域上的冲击相应位置,求得旋转角度

二维傅里叶变换的应用

图像压缩

  • 自然图像往往有邻域强相关的特性,因此低频分量承载了更多的图像信息
  • 可以运用此性质在保存图像数据时适当丢弃部分高频数据,以实现图像压缩(JPEG)

旋转和平移

  • 如果旋转时域图像,由于旋转没有改变平面波的幅度相位,只是将所有的平面波都旋转了一个角度,那么频域图像也会旋转相应的角度。
  • 平移时域图像,相当于周期信号没有变,仅是相位发生了变化,因此在频域中的表示是相位变化,而能量谱不变。

去掉周期性噪声

  • 对于周期的背景信号,在频域空间中就会产生规律的亮点,如果将这些亮点去掉则可以起到去噪的效果

快速计算互相关

  • 假设要求两幅图像 的互相关结果 ,如果二者尺寸接近,可以通过傅里叶变换的方法加速计算互相关:

$$ S=IFFT(FFT(I)*FFT^*(T)) $$

相位相关计算平移参数

  • 该应用常用于平移图像的平移距离搜索,通过相位相关可以计算得到平移距离:

互相关和相位相关

  • 维基百科上说: This result could have been obtained by calculating the cross correlation directly. The advantage of this method is that the discrete Fourier transform and its inverse can be performed using the fast Fourier transform, which is much faster than correlation for large images.
  • 但是事实上相位相关和互相关在时域的表现差异很大,而且二者都可以通过 FFT 加速:
  • 一个是冲击信号,一个是相关度计算的结果,在实际应用中相位相关在处理位移搜索时表现也更加鲁棒。
  • 但是相位相关的问题是最大值的含义并不明确,讲道理最大值应该是 1(理想情况),但实际应用时忽大忽小,不如互相关能给出分值可解释
  • 因此可以采用使用相位相关计算出的位置,定位后计算两幅图像的相关度,结合鲁棒性和可解释性给出结果。

参考资料

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年12月3日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
《C++计算引擎:驱动高效计算的强大动力》
在当今数字化时代,高效的计算能力是推动科技进步和创新的关键。而 C++作为一种强大的编程语言,在构建高性能计算引擎方面发挥着重要作用。本文将深入探讨 C++计算引擎的特点、优势以及在不同领域的应用,带您领略 C++在计算领域的独特魅力。
程序员阿伟
2024/12/09
1280
Unity的物理系统
Unity的物理系统是游戏开发中不可或缺的一部分,它通过模拟现实世界的物理规则(如重力、碰撞、摩擦等)来增强游戏的真实感和互动性。Unity提供了两个独立的物理引擎:一个用于3D物理系统,另一个用于2D物理系统。
用户11315985
2024/10/16
3150
Unity的物理系统
Dynamics
V-REP的动态模块目前支持四种不同的物理引擎:Bullet物理库、Open dynamics引擎、Vortex Studio引擎和Newton dynamics引擎。在任何时候,用户都可以根据自己的模拟需要自由地快速地从一个引擎切换到另一个引擎。物理引擎支持的多样性的原因是,物理模拟是一项复杂的任务,可以通过不同程度的精度、速度或支持不同的特性来实现:
六四零
2020/08/04
1.2K0
一篇上手LayaAir的3D物理引擎
昨天,我们分享了一篇2D物理文档《LayaAirIDE的可视化2D物理使用文档》。
Layabox Charley
2021/01/12
5K0
一篇上手LayaAir的3D物理引擎
Unity引擎基础知识
Unity引擎是一款由Unity Technologies公司开发的跨平台游戏开发工具,广泛应用于2D和3D游戏的创建。它提供了丰富的API和工具,使得开发者能够轻松地创建交互式的3D场景和应用程序。
用户11315985
2024/10/16
3080
Unity引擎基础知识
【一统江湖的大前端(8)】matter.js 经典物理
在前端开发领域,物理引擎是一个相对小众的话题,它通常都是作为游戏开发引擎的附属工具而出现的,独立的功能演示作品常常给人好玩但是无处可用的感觉。仿真就是在计算机的虚拟世界中模拟物体在真实世界的表现(动力学仿真最为常见)。仿真能让画面中物体的运动表现更符合玩家对现实世界的认知,比如在《愤怒的小鸟》游戏中被弹弓发射出去小鸟或是因为被撞击而坍塌的物体堆,还有在《割绳子》小游戏中割断绳子后物体所发生的单摆或是坠落运动,都和现实世界的表现近乎相同,游戏体验通常也会更好。
大史不说话
2020/03/12
3.5K1
GPT-4+物理引擎加持扩散模型,生成视频逼真、连贯、合理
扩散模型的出现推动了文本生成视频技术的发展,但这类方法的计算成本通常不菲,并且往往难以制作连贯的物体运动视频。
机器之心
2023/11/27
3920
GPT-4+物理引擎加持扩散模型,生成视频逼真、连贯、合理
【漫谈C++】基于C++的虚幻4:代码创建生活(旧题新说)
要想了解使用一门编程语言,首先要知道的就是它的语言特点以及语法,这里不在仔细写关于C++的语法,只是简单回顾一下它的特点。C++语言,1979年在著名的贝尔实验室研发,它是基于C语言扩展升级而来的,它的三大特性:继承、封装、多态;C++不仅可以面向对象,也可以面向过程,通过它可以创建任何类型的程序,如:游戏、嵌入式、移动应用、桌面、设备驱动程序等等。
三掌柜
2023/12/24
4032
【漫谈C++】基于C++的虚幻4:代码创建生活(旧题新说)
今日软荐:4.1K Star!NVIDIA 打造的高性能计算框架:Warp!
随着高性能计算需求的不断增长,尤其在人工智能、科学计算、游戏开发、物理仿真等领域,GPU 的并行计算能力成为了开发者的强大工具。
Python兴趣圈
2024/09/29
2250
今日软荐:4.1K Star!NVIDIA 打造的高性能计算框架:Warp!
Unity 3D 游戏引擎
Unity 3D 也称 Unity,是由 Unity Technologies 公司开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具。
全栈程序员站长
2022/08/25
3K0
Unity 3D 游戏引擎
创建可微物理引擎Nimble,开源SOTA人体骨骼模型,斯坦福腿疾博士生用AI「助跑」人生
有一位研究者,他身患残疾,出生时便患有退行性神经疾病,该疾病一直攻击着他的外周运动神经元(进行性神经性腓骨肌萎缩症, 2A 型)。他就是来自斯坦福大学的博士生 Keenon Werling。
机器之心
2021/09/06
7530
《引领潮流还是跟随步伐?国产游戏技术的全球影响力深度剖析》
随着科技的飞速发展,国产游戏技术已经呈现出显著的进步与变革,其在全球游戏市场中的影响力也逐渐显现。探究国产游戏技术是否具有全球引领力,不仅有助于理解当前游戏产业的发展现状,还能为国产游戏的未来发展方向提供重要参考。
小白的大数据之旅
2024/11/20
2760
《引领潮流还是跟随步伐?国产游戏技术的全球影响力深度剖析》
最高提速20亿倍!AI引爆物理模拟引擎革命
新智元报道 来源:Reddit 编辑:David 【新智元导读】牛津大学一项研究表明,与传统物理求解器相比,机器学习模型可将物理模拟速度提升至最高20亿倍,距离解决困扰狄拉克的模拟计算难题可能向着成功更近了一步。 1929年,英国著名量子物理学家保罗·狄拉克曾说过,“大部分物理学和整个化学的数学理论所需的基本物理定律是完全已知的,困难只是这些定律的确切应用导致方程太复杂而无法解决”。狄拉克认为,所有物理现象都可以模拟到量子,从蛋白质折叠到材料失效和气候变化都是如此。唯一的问题是控制方程太复杂,无法在现实的时间尺度上得到解决。 这是否意味着我们永远无法实现实时的物理模拟?随着研究、软件和硬件技术的进步,实时模拟在经典极限下成为可能,这在视频游戏的物理模拟中最为明显。 对碰撞、变形、断裂和流体流动等物理现象进行需要大量的计算,但目前已经开发出可以在游戏中实时模拟此类现象的模型。当然,为了实现这一目标,需要对不同算法进行了大量简化和优化。其中最快的方法是刚体物理学。 为此假设,大多数游戏中的物理模型所基于的对象可以碰撞和反弹而不变形。物体由围绕物体的凸碰撞框表示,当两个物体发生碰撞时,系统实时检测碰撞并施加适当的力来加以模拟。此类表示中不发生变形或断裂。视频游戏“Teardown”可能是刚体物理学的巅峰之作。 Teardown 是一款完全交互式的基于体素的游戏,使用刚体物理解算器来模拟破坏 不过,刚体物理虽然有利于模拟不可变形的碰撞,但不适用于头发和衣服等可变形的材料。在这些场景中,需要应用柔体动力学。以下是4种按复杂性顺序模拟可变形对象的方法: 弹簧质量模型 顾名思义,这类对象由通过弹簧相互连接的质点系表示。可以将其视为 3D 设置中的一维胡克定律网络。该模型的主要缺点是,在设置质量弹簧网络时需要大量手动工作,且材料属性和模型参数之间没有严格的关系。尽管如此,该模型在“BeamNG.Drive”中得到了很好的实现,这是一种基于弹簧质量模型来模拟车辆变形的实时车辆模拟器。 BeamNG.Drive 使用弹簧质量模型来模拟车祸中的车辆变形 基于位置的动力学 (PBD):更适合柔体形变 模拟运动学的方法通常基于力的模型,在基于位置的动力学中,位置是通过求解涉及一组包含约束方程的准静态问题来直接计算的。PBD 速度更快,非常适合游戏、动画电影和视觉效果中的应用。游戏中头发和衣服的运动一般都是通过这个模型来模拟的。PBD 不仅限于可变形固体,还可以用于模拟刚体系统和流体。
新智元
2021/09/17
1K0
PhysX SDK物理引擎开发包使用及获取c++源码教程
PS: 社区目前正在预演MMO类型的大型3D 服务器架构(Go实现),PX首选作为物理引擎使用。
李海彬
2018/07/26
2.7K0
PhysX SDK物理引擎开发包使用及获取c++源码教程
《C++开发 AR 游戏:开启未来娱乐新潮流》
在当今科技飞速发展的时代,增强现实(AR)技术正以惊人的速度改变着我们的生活和娱乐方式。从智能手机上的 AR 滤镜到沉浸式的 AR 游戏,这项技术的应用越来越广泛。而在众多编程语言中,C++以其高效、强大的性能在 AR 游戏开发领域占据着重要地位。本文将深入探讨 C++开发 AR 游戏的热门趋势,带你领略这一创新领域的魅力。
程序员阿伟
2024/12/09
1610
MuJoCo要开源! DeepMind收购物理引擎MuJoCo,将推动全球机器人研发
昨天,DeepMind发帖,称已经收购了用于机器人研发的MuJoCo物理引擎,目前正致力于开源MuJoCo,并打算在2022年对所有人免费开放!
AI科技评论
2021/10/21
1.2K0
物理引擎
物理引擎: motor2 基于Box2d的AS3(Player 10)刚体引擎 作者主页:http://lab.polygonal.de/motor_physics/ APE  最简单 http://www.cove.org/ape/ FOAM - 2D Rigid Body Physics Engine http://code.google.com/p/foam-as3 glaze - 2D Rigid Body Dynamics & Game Engine for Actionsctipt 3 ht
用户1172164
2018/03/01
1.8K0
LayaAirIDE的可视化2D物理使用文档
今天,又摘了一篇官网的文档,献给对2D物理还未入门或刚刚上手的开发者,已经熟悉的朋友们欢迎转发到微信朋友圈,让有需要的开发者看到。
Layabox Charley
2021/01/12
2.5K0
LayaAirIDE的可视化2D物理使用文档
[学习笔记]unity3d-物理引擎(一)
刚体 简介 带有刚体组件的游戏物体。 add Compoment-physics-Rigidbody 刚体组件可使游戏对象受物理引擎控制,在受到外力时产生真实世界中的运动。 物理引擎:模拟真实世界中物体物理特性的引擎。 属性 质量 Mass:物体的质量。 阻力 Drag:当受力移动时物体受到的空气阻力。 0表示没有空气阻力。极大时可使物体停止运动,通常砖头0.001,羽毛设置为10。 角阻力 Angular Drag:当受扭力旋转时物体受到的空气阻力。 0表示没有空气阻力,极大时使物体停止旋转。
六月丶
2022/12/26
1.7K0
[学习笔记]unity3d-物理引擎(一)
Babylon.js 开发框架的主要特点
Babylon.js 是一个功能强大且专注于 3D 渲染和游戏开发的 WebGL 框架。它由微软团队开发和维护,旨在为开发者提供高性能、易用且功能丰富的工具,用于创建复杂的 3D 场景和交互式应用。以下是 Babylon.js 的主要特点。
数字孪生开发者
2025/01/16
1780
推荐阅读
相关推荐
《C++计算引擎:驱动高效计算的强大动力》
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档