paddle深度学习框架中的FFT
简 介: 介绍了在深度学习框架Paddle下的FFT相关函数。
关键词
: FFT,paddle
Contents
厄米特傅里叶变换
§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−1xjeδ⋅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−1j1=0∑nl−1xj1,j2,⋯,jdeδi⋅i⋅2π⋅l=1∑dn⋅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∏dni
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相关推荐
- Keras 深度学习框架中文文档
2019独角兽企业重金招聘Python工程师标准>>> Keras深度学习框架中文文档 Keras官网:http://keras.io/ Github项目:https://githu ...
- 深度学习框架中的魔鬼:探究人工智能系统中的安全问题
ISC 2017中国互联网安全大会举办了人工智能安全论坛. 我们把论坛总结成为一系列文章,本文为系列中的第一篇. 深度学习引领着新一轮的人工智能浪潮,受到工业界以及全社会的广泛关注. 虽然大家对人工智 ...
- forward函数——浅学深度学习框架中的forward
1.什么是forward函数 (本应该出一篇贯穿神经网络的文章的,但是由于时间关系,就先浅浅记录一下,加深自己的理解吧吧). forward 函数是深度学习框架中常见的一个函数,用于定义神经网络的前向 ...
- 百度Paddle深度学习框架学习
学习心得(个人心得): 学习到目前感觉百度的paddle框架总体来说还是很不错的,paddle可以使用静态和动态图的方式可以很好的适合tensorflow和pytorch的童鞋门入手,并且可以快速部署 ...
- 快速了解深度学习框架--tensorflow(更新中)
深度学习框架(工具)简单来说即库,需要import,比如tensorflow,Caffe- 深度学习框架提供了一系列的深度学习的组件(对于通用的算法,里面会有实现),当需要使用新的算法的时候就需要用户 ...
- DL-5 深度学习框架的对比
在深度学习领域的五大巨头里,它们都各自力挺一种深度学习框架:像谷歌有自家的TensorFlow.Facebook有Torch.百度有Paddle Paddle.微软有CNTK.而亚马逊的AWS则有MX ...
- 支撑千万规模类别分类技术,百度飞桨定义工业级深度学习框架
2016 年,AlphaGo 横空出世,人工智能时代到来.同年,百度开源自研的深度学习框架 PaddlePaddle(飞桨),成为中国首个开源深度学习框架. 然而,这波由深度学习推动的技术和产业浪潮, ...
- 【机器学习】深度学习框架是什么?有哪些?如何选择?
本文适合新入门小白了解深度学习框架基础,也适合刚入门选手思考各种深度学习框架. 文章目录 一.深度学习框架是什么? 二.深度学习框架有哪些? 三.如何选择合适的框架? 1. TensorFlow 2. ...
- 深度学习框架简史 (A Brief History of Deep Learning Frameworks)
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 过去⼗年,机器学习(尤其是深度学习领域)涌现了⼤量算法和应⽤.在这 ...
最新文章
- 初识java-循环结构(二):6
- 基于TextRank的关键词提取算法
- 快速开发平台业务表字段设置的用法
- java语言实验报告,Java语言 实验报告(二)
- ubuntu declare
- python多线程读取数据库数据_Python基于多线程操作数据库相关知识点详解
- 深度学习笔记-卷积神经网络CNN与循环神经网络RNN有什么区别?
- 看了新闻,思科研发中心 没有成都的。。。
- mysql选中一行数据_获取table选中一行数据库
- not found for dependency: expected at least 1 bean which qualifies as autowire
- Tensorflow 2 Auto-Encoder
- win7升级的神秘KEY
- Linux下安装Solr7.2.1以及配置Solr(CentOS7)
- c语言 t跳几个字节,int占几个字节(c语言)
- sizeof运算符来获取各种数据类型在内存中所占字节数--gyy整理
- 单亲家庭父子的理财通信
- android psensor测试,android传感器Gsensor和Psensor的使用举例
- JavaScript中的数据类型判断
- c语言int 转bool_深入理解C语言中的类型转换
- 整理 node-sass 安装失败的原因及解决办法
热门文章
- mybaits if判断进入不了
- 前端面试经历(持续更新)
- MyBatis框架使用(一)
- [C++基础]001_iostream和iostream.h的区别
- Iphone4涨到2万,相对VERTU有里子,面子也便宜
- lzg_ad:使用OPENROWSET函数连接并访问远程数据库数据
- 在用虚拟机做Windows Server 2008 R2实验时应注意的问题
- MySQL复制经常使用拓扑结构具体解释
- Hadoop(十二):从源码角度分析Hadoo是如何将作业提交给集群的
- FTP同步的另类解决办法——NetDrive