简 介: 介绍了在深度学习框架Paddle下的FFT相关函数。

关键词FFTpaddle

#mermaid-svg-SMNHXdbBEkL4Cs3U {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SMNHXdbBEkL4Cs3U .error-icon{fill:#552222;}#mermaid-svg-SMNHXdbBEkL4Cs3U .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-SMNHXdbBEkL4Cs3U .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-SMNHXdbBEkL4Cs3U .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-SMNHXdbBEkL4Cs3U .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-SMNHXdbBEkL4Cs3U .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-SMNHXdbBEkL4Cs3U .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-SMNHXdbBEkL4Cs3U .marker{fill:#333333;stroke:#333333;}#mermaid-svg-SMNHXdbBEkL4Cs3U .marker.cross{stroke:#333333;}#mermaid-svg-SMNHXdbBEkL4Cs3U svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-SMNHXdbBEkL4Cs3U .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-SMNHXdbBEkL4Cs3U .cluster-label text{fill:#333;}#mermaid-svg-SMNHXdbBEkL4Cs3U .cluster-label span{color:#333;}#mermaid-svg-SMNHXdbBEkL4Cs3U .label text,#mermaid-svg-SMNHXdbBEkL4Cs3U span{fill:#333;color:#333;}#mermaid-svg-SMNHXdbBEkL4Cs3U .node rect,#mermaid-svg-SMNHXdbBEkL4Cs3U .node circle,#mermaid-svg-SMNHXdbBEkL4Cs3U .node ellipse,#mermaid-svg-SMNHXdbBEkL4Cs3U .node polygon,#mermaid-svg-SMNHXdbBEkL4Cs3U .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-SMNHXdbBEkL4Cs3U .node .label{text-align:center;}#mermaid-svg-SMNHXdbBEkL4Cs3U .node.clickable{cursor:pointer;}#mermaid-svg-SMNHXdbBEkL4Cs3U .arrowheadPath{fill:#333333;}#mermaid-svg-SMNHXdbBEkL4Cs3U .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-SMNHXdbBEkL4Cs3U .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-SMNHXdbBEkL4Cs3U .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-SMNHXdbBEkL4Cs3U .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-SMNHXdbBEkL4Cs3U .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-SMNHXdbBEkL4Cs3U .cluster text{fill:#333;}#mermaid-svg-SMNHXdbBEkL4Cs3U .cluster span{color:#333;}#mermaid-svg-SMNHXdbBEkL4Cs3U div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-SMNHXdbBEkL4Cs3U :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

FFT
目 录
Contents
背景
DFT定义
实数傅里叶变换和
厄米特傅里叶变换
自动微分
FFT函数
FFT,IFFT
总 结

§01 FFT


1.1 背景

  FFT 是离散傅里叶变换(DFT)的快速算法。具有很好的计算效率,是数值计算的重要支柱。

1.2 DFT定义

1.2.1 DFT定义

  对于序列xj,j=0,1,⋯,n−1x_j ,j = 0,1, \cdots ,n - 1xj​,j=0,1,⋯,n−1,对应的一维DFT定义如下:

Xk=∑j=0n−1xjeδ⋅j⋅2πjknX_k = \sum\limits_{j = 0}^{n - 1} {x_j e^{\delta \cdot j \cdot 2\pi {{jk} \over n}} }Xk​=j=0∑n−1​xj​eδ⋅j⋅2πnjk​

  对应频率为jjj的频率分量为:xj=ei⋅2πf⋅j⋅Δtx_j = e^{i \cdot 2\pi f \cdot j \cdot \Delta t}xj​=ei⋅2πf⋅j⋅Δt。其中Δt\Delta tΔt为采样时间间隔。

  • nnn为序列长度,也是傅里叶变换后结果的长度。
  • δ\deltaδ是与变换方向有关系:正变换中,取值为-1, 逆变换时曲志伟1。
  • σ\sigmaσ为缩放系数,和变换的方向以及缩放有关系。在paddle.fft中,缩放方案有三种形式:
    • backward: 正向和逆向FFT的缩放系数分别为 1, 1/n;
    • forward:正向和逆向FFT的缩放系数分别为:1/n, 1;
    • ortho:正向和逆向FFT的缩放系数都是:1/sqrt(n);

1.2.2 输出结果

  输出的结果遵循“标准”排布:

  如果 X = fft(x, n), 那么 X[0] 包含 0 频率项(亦即直流分量),对于实数输入来说, 这一项总是实数。X[1: n//2] 包含正频率项,频率以递增顺序排列。X[n//2 + 1:] 包含负 频率项,频率以绝对值从大到小排列。对于傅里叶变换点数为偶数的情况,X[n//2] 同时包含了正和 负的奈奎斯特(Nyquist)频率项,对于实数输入来说,这一项也总是实数。X[(n-1)//2] 为频率最 大的正频率项,X[(n+1)//2]为频率绝对值最大的负频率项。

  paddle.fft.fftfreq(n) 可以返回频谱中每一项对应的频率值。paddle.fft.fftshift(X) 可以对频谱进行偏移,将零频率移动到中心位置,paddle.fft.fftshift(X) 则是这个变换的逆变 换。

1.2.3 多维离散傅里叶变换

  多维离散傅里叶变换的定义如下:

Xk1,k2,⋯,kd=σ∑jd=0nd−1⋯∑j2=0n2−1∑j1=0nl−1xj1,j2,⋯,jdeδi⋅i⋅2π⋅∑l=1djl⋅kln⋅lX_{k_1 ,k_2 , \cdots ,k_d } = \sigma \sum\limits_{j_d = 0}^{n_d - 1} { \cdots \sum\limits_{j_2 = 0}^{n_2 - 1} {\sum\limits_{j_1 = 0}^{n_l - 1} {x_{j_1 ,j_2 , \cdots ,j_d } e^{\delta _i \cdot i \cdot 2\pi \cdot \sum\limits_{l = 1}^d {{{j_l \cdot k_l } \over {n \cdot l}}} } } } }Xk1​,k2​,⋯,kd​​=σjd​=0∑nd​−1​⋯j2​=0∑n2​−1​j1​=0∑nl​−1​xj1​,j2​,⋯,jd​​eδi​⋅i⋅2π⋅l=1∑d​n⋅ljl​⋅kl​​

ddd是傅里叶变换的维数, n1,n2,⋯,ndn_1 ,n_2 , \cdots ,n_dn1​,n2​,⋯,nd​是每个傅里叶变换周的长度。
δ\deltaδ和变换的方向有关系,正变换中取-1, 逆变换中取1。
σ\sigmaσ为缩放系数,和变换的很像 以及缩放方案有关系。这一点与前面一维的方案相同。只是其中的:

n=∏i=1dnin = \prod\limits_{i = 1}^d {n_i }n=i=1∏d​ni​

1.3 实数傅里叶变换和厄米特傅里叶变换

  当输入信号为实数信号时,傅里叶变换的结果具有厄米特对称性,亦即频率 fk 上的分量和 −fk 上的分量互为共轭。因此可以利用对称性来减少计算量。实数傅里叶变换 (rfft) 系列的函数是用于实数输入的,并且利用了对称性,只计算正频率项,直到奈奎斯特频率项。 因此,对于实数傅里叶变换,n 个复数输入点只产生 n//2 + 1 个实数输出点。这一系列变换 的逆变换也预设了输入数据具有厄米特对称性,要产生 n 个实数输出点,只需要使用 n//2 + 1 个复数输入点。

  与此相对应,当频谱是纯实数时,输入信号具有厄米特对称性。厄米特傅里叶变换(hfft)系列同样 利用对称性,产生 n 个实数输出点,只需要使用 n//2 + 1 个复数输入点。

1.4 自动微分

  paddle.fft 中的傅里叶变换函数支持自动微分,使用的方法是维廷格微积分(Wertinger Calculus)。 对于复函数 f:C→C,paddle 中的惯例是使用 f(z) 对其输入的共轭的偏导数 ∂f∂z∗{{\partial f} \over {\partial z^* }}∂z∗∂f​。

§02 FFT函数


2.1 FFT,IFFT

2.1.1 基本变换

x = exp(3j*pi*arange(7)/7)
xp = paddle.to_tensor(x)
fft_xp = paddle.fft.fft(xp).numpy()
print('fft_xp: {}'.format(fft_xp))
fft_xp: [1.+1.25396034e+00j 1.+4.38128627e+00j 1.-4.38128627e+00j1.-1.25396034e+00j 1.-4.81574619e-01j 1.+8.88178420e-16j1.+4.81574619e-01j]
ifft_xp = paddle.fft.ifft(paddle.to_tensor(fft_xp))
print('ifft_xp = {}'.format(ifft_xp))
ifft_xp = Tensor(shape=[7], dtype=complex128, place=CPUPlace, stop_gradient=True,[(0.9999999999999998-6.344131569286608e-17j),(0.22252093395631445+0.9749279121818237j) ,(-0.900968867902419+0.4338837391175582j)   ,(-0.6234898018587337-0.7818314824680295j)  ,(0.6234898018587335-0.7818314824680297j)  ,(0.9009688679024195+0.433883739117557j)   ,(-0.2225209339563142+0.9749279121818237j)  ])

2.1.2 图象

x = [1]*10 +[0]* 100
print('x: {}'.format(x))
x: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
xp = paddle.fft.fft(TT(x))
print('xp: {}'.format(xp))
absxp = abs(xp.numpy())plt.figure(figsize=(10,5))
plt.plot(absxp)
plt.xlabel("n")
plt.ylabel("FFT")
plt.grid(True)
plt.tight_layout()
plt.show()

▲ 图2.1.1 FFT结果

xpp = paddle.fft.fftshift(xp)
absxp = abs(xpp.numpy())

▲ 图2.1.2 FFT FFTshift后的结果

rfft

rxp = paddle.fft.rfft(TT([1,0,0,0]))
print('rxp: {}'.format(rxp))
rxp: Tensor(shape=[3], dtype=complex64, place=CPUPlace, stop_gradient=True,[(1+0j), (1+0j), (1+0j)])
rxp = paddle.fft.rfft(TT(x))
absrxp = abs(rxp.numpy())plt.figure(figsize=(10,5))
plt.plot(absrxp)
plt.xlabel("n")
plt.ylabel("FFT")
plt.grid(True)
plt.tight_layout()
plt.show()

▲ 图2.2.1 rfftjxgo

※ 总  结 ※


  介绍了在深度学习框架Paddle下的FFT相关函数。


● 相关图表链接:

  • 图2.1.1 FFT结果
  • 图2.1.2 FFT FFTshift后的结果
  • 图2.2.1 rfftjxgo

paddle深度学习框架中的FFT相关推荐

  1. Keras 深度学习框架中文文档

    2019独角兽企业重金招聘Python工程师标准>>> Keras深度学习框架中文文档 Keras官网:http://keras.io/ Github项目:https://githu ...

  2. 深度学习框架中的魔鬼:探究人工智能系统中的安全问题

    ISC 2017中国互联网安全大会举办了人工智能安全论坛. 我们把论坛总结成为一系列文章,本文为系列中的第一篇. 深度学习引领着新一轮的人工智能浪潮,受到工业界以及全社会的广泛关注. 虽然大家对人工智 ...

  3. forward函数——浅学深度学习框架中的forward

    1.什么是forward函数 (本应该出一篇贯穿神经网络的文章的,但是由于时间关系,就先浅浅记录一下,加深自己的理解吧吧). forward 函数是深度学习框架中常见的一个函数,用于定义神经网络的前向 ...

  4. 百度Paddle深度学习框架学习

    学习心得(个人心得): 学习到目前感觉百度的paddle框架总体来说还是很不错的,paddle可以使用静态和动态图的方式可以很好的适合tensorflow和pytorch的童鞋门入手,并且可以快速部署 ...

  5. 快速了解深度学习框架--tensorflow(更新中)

    深度学习框架(工具)简单来说即库,需要import,比如tensorflow,Caffe- 深度学习框架提供了一系列的深度学习的组件(对于通用的算法,里面会有实现),当需要使用新的算法的时候就需要用户 ...

  6. DL-5 深度学习框架的对比

    在深度学习领域的五大巨头里,它们都各自力挺一种深度学习框架:像谷歌有自家的TensorFlow.Facebook有Torch.百度有Paddle Paddle.微软有CNTK.而亚马逊的AWS则有MX ...

  7. 支撑千万规模类别分类技术,百度飞桨定义工业级深度学习框架

    2016 年,AlphaGo 横空出世,人工智能时代到来.同年,百度开源自研的深度学习框架 PaddlePaddle(飞桨),成为中国首个开源深度学习框架. 然而,这波由深度学习推动的技术和产业浪潮, ...

  8. 【机器学习】深度学习框架是什么?有哪些?如何选择?

    本文适合新入门小白了解深度学习框架基础,也适合刚入门选手思考各种深度学习框架. 文章目录 一.深度学习框架是什么? 二.深度学习框架有哪些? 三.如何选择合适的框架? 1. TensorFlow 2. ...

  9. 深度学习框架简史 (A Brief History of Deep Learning Frameworks)

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 过去⼗年,机器学习(尤其是深度学习领域)涌现了⼤量算法和应⽤.在这 ...

最新文章

  1. 初识java-循环结构(二):6
  2. 基于TextRank的关键词提取算法
  3. 快速开发平台业务表字段设置的用法
  4. java语言实验报告,Java语言 实验报告(二)
  5. ubuntu declare
  6. python多线程读取数据库数据_Python基于多线程操作数据库相关知识点详解
  7. 深度学习笔记-卷积神经网络CNN与循环神经网络RNN有什么区别?
  8. 看了新闻,思科研发中心 没有成都的。。。
  9. mysql选中一行数据_获取table选中一行数据库
  10. not found for dependency: expected at least 1 bean which qualifies as autowire
  11. Tensorflow 2 Auto-Encoder
  12. win7升级的神秘KEY
  13. Linux下安装Solr7.2.1以及配置Solr(CentOS7)
  14. c语言 t跳几个字节,int占几个字节(c语言)
  15. sizeof运算符来获取各种数据类型在内存中所占字节数--gyy整理
  16. 单亲家庭父子的理财通信
  17. android psensor测试,android传感器Gsensor和Psensor的使用举例
  18. JavaScript中的数据类型判断
  19. c语言int 转bool_深入理解C语言中的类型转换
  20. 整理 node-sass 安装失败的原因及解决办法

热门文章

  1. mybaits if判断进入不了
  2. 前端面试经历(持续更新)
  3. MyBatis框架使用(一)
  4. [C++基础]001_iostream和iostream.h的区别
  5. Iphone4涨到2万,相对VERTU有里子,面子也便宜
  6. lzg_ad:使用OPENROWSET函数连接并访问远程数据库数据
  7. 在用虚拟机做Windows Server 2008 R2实验时应注意的问题
  8. MySQL复制经常使用拓扑结构具体解释
  9. Hadoop(十二):从源码角度分析Hadoo是如何将作业提交给集群的
  10. FTP同步的另类解决办法——NetDrive