AI数学基础 - 如何理解傅里叶变换

techbrood 发表于 2019-07-09 23:01:26

标签: ai, math, 傅里叶, Fourier Transform

- +

傅里叶变换是信号分析的基础数学方法,其本质是把信号做分析(analysis)以及合成(synthetise),和把白光分解为彩色光谱原理类似。

傅里叶变换的基本思想是:符合一定条件下,任意周期信号可以分解为直流分量和一组不同幅值、频率、相位的正弦波。

分解的方法就是傅里叶变换。这些正弦波的频率符合一个规律:是某个频率的整数倍。这个频率,就称为基波频率,而其它频率称为谐波频率。如果谐波的频率是基波频率的N倍,就称为N次谐波。直流分量的频率为零,是基波频率的零倍,也可称零次谐波。

通过傅里叶变换,我们可以提取出一个信号的特征值(比如信号的频率组成,以及相位信息)。比如对于语音来将,可以通过低频部分获取男声,稍高频部分获取女声,而过滤掉高频噪音,对于图像(也可以当作是一种光学信号)来讲,低频部分表征物体的轮廓,而高频部分表征细节,我们人类大脑能够快速对所见所闻做傅里叶变换,从而辨识对象。

正弦函数有一个特点,叫做正交性,所谓正交性,是指任意两个不同频率的正弦波的乘积,在两者的公共周期内的积分等于零。

我们可以利用这个特性设计一个如下的检波器(下称检波器A)

image.png

检波器A由一个乘法器和一个积分器构成,乘法器的一个输入为已知频率f的单位幅值正弦波(下称标准正弦信号f),另一个输入为待变换的信号。检波器A的输出只与待变换信号中的频率为f的正弦分量的幅值和相位有关(其余频率分量的积分为0)。

结果非0表明有f频率分量,但结果为0并不一定表示不存在f频率分量,因为正弦波还有下述的特性:

相同频率的正弦波,当相位差为90°时(正交),在一个周期内的乘积的积分值等于零;当相位相同时,积分值达到最大,等于两者的有效值的乘积,当相位相反时,积分值达到最小,等于两者的有效值的乘积取反。

我们知道标准正弦信号f的初始相位为零,但是,我们不知道f分量的初始相位!如果f分量与标准正弦信号f的相位刚好差90°(或270°),检波器A输出也等于零!为此,我们再设计一个检波器B。

检波器B与检波器A的不同之处在于检波器B用一个标准余弦信号f(与标准正弦信号A相位差90°)替代滤波器A中的标准正弦信号f。如果待变换信号中包含f分量,检波器A和检波器B至少有一个输出不等于零。

image.png

利用三角函数的基础知识可以证明,不论f分量的初始相位如何,检波器A和检波器B输出信号的幅值的方和根就等于f分量的幅值;而检波器B和检波器A的幅值的比值等于f分量初始相位的正切如此即可求出f分量的相位。

我们再把标准正弦信号f和标准余弦信号f的频率替换成我们关心的任意频率,就可以得到输入信号的各种频率成分。如果知道输入信号的频率,把这个频率作为基波频率f,用f、2f、3f依次替代标准正弦信号f和标准余弦信号f的频率,就可以得到输入信号的基波、2次谐波和3次谐波。如此等等,就是傅里叶变换。

理解了背后的概念,我们再来看傅里叶变换公式:

image.png

其中e-iwt是欧拉公式cos(wt)+isin(wt),刚好是上述的两个标准正交基,F(w)是一个复平面的向量,其模长|F(w)|非0就表示信号存在f频率分量。

possitive(1) negative(0) views1423 comments0

发送私信

最新评论

请先 登录 再评论.
相关文章
  • 如何使用BabylonJS加载OBJ或STL模型

    BabylonJS(也就是babylon.js,这是一个和three.js类似的WebGL开发框架),更多的用在游戏领域。
    本文说明和演示如何使用babylon.js来加载一个标准3d模型文...

  • A-Frame WebVR(网页虚拟现实)快速开发入门教程

    WebVR和WebGL应用程序接口使得我们已经可以在浏览器上创建虚拟现实(VR)体验,但从工程化的角度而言,开发社区还需要更多方便强大的开发库来简化编程,Mozilla的

  • CSS3原生变量(Native Variables)新特性简介

    对Web开发者来说,一个盼望已久的特性是CSS终于支持原生变量了!
    变量是程序语言中用来解决代码重复和进行表达式计算的关键概念(想想数学方程式中的x)。...

  • ES6小知识:动态对象键(Dynamic Object Keys)语法简介

    在ES5,对象的键(key)总是被解释为字符串。ES6允许我们使用计算的值作为对象的键,使用方括号:[myKey]const

  • Web界面编程状态变化和JS开发框架(React/Angular/Ember)

    UI编程中的一个关键课题就是界面组件化(可复用)以及组件状态管理。稍早一些的windows程序员可能接触过MFC,其界面编程中有一个DDX(DoDataExchange)的机制,...

  • 深入理解CSS3滤镜(filter)功能和实例详解

    CSS3滤镜功能源自SVG滤镜规范,SVG滤镜最早用来给矢量图添加类似PS中像素图的一些特效。
    把这个滤镜功能引入到普通HTML元素中可以带来很有趣的效果(模糊、...

  • Babylon.js入门教程和开发实例

    Babylon.js是一款WebGL开发框架。和Three.js类似。主要的技术区别是Three.js还试图回退兼容CSS 3D。Three.js是完全社区推动的,比Babylon.js要成熟些,而Babylon...

  • 学习使用CSS制作进度条

    进度条是基础的界面控件,可用于多种场合,比如任务完成进度,手机充电状态等。本文介绍一个简单实用的进度条制作方法。预期效果如下图所示:直观上,我们可以把该进度条控件分为2个部分,外部的边界用来表示固定的目标范围,里面的条形部分用来表示当前进度。外部目标范围元素的CSS代码编写如下:.pb-scope

  • Blender2.7 快捷键一览表

    通用操作
    停止当前操作:ESC
    快捷搜索:SPACE撤销:ctrl+z重做:ctrl+shift+z渲染:F12
    单选:鼠标右键(RMB)全选:A
    框选:B
    刷选:...

  • S3TC(S3 Texture Compression)纹理压缩格式详解

    使用S3TC格式存储的压缩纹理是以4X4的纹理单元块(texel blocks)为基本单位存储的,每纹理单元块(texel blocks)有64bit或者128bit的纹理单元数据(texel data)。这...

  • WebGL入门教程4 - 使用纹理贴图(Texture Map)

    3D建模和纹理贴图的关系就好比人体和皮肤(或着装)的关系,3D建模用来处理空间属性,而贴图适合用来处理细腻的表面属性。如果不使用贴图,而想在表面达到足够的...

  • 如何使用WebGL创建一个逼真的下雨动画

    之前写过文章来分别讲解如何使用CSS3和Canvas2D实现过雨滴和下雨动画。通过背景处理看起来也有视觉上的3D效果,但并非真正的3D场景,如果要加入用户交互,进行36...

  • 使用CSS3实现流星雨动画教程

    很多营销页面中需要实现类似流星雨的动画背景,营造节日浪漫的气氛。要实现这样的效果,有两种方法,一个是使用Canvas,一个是使用纯CSS3,我们这里介绍第2种方...

  • 在PHP网页程序中执行Sass/Compass命令

    我们需要在wow云开发平台支持sass/compass等预编译样式语言,为此我们首先尝试了scssphp扩展,但是在支持最新语法上,经常会出现异常。所以我们采用了代理的方式...

  • 更多...