paddle深度学习框架中的FFT
Posted 卓晴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了paddle深度学习框架中的FFT相关的知识,希望对你有一定的参考价值。
简 介: 介绍了在深度学习框架Paddle下的FFT相关函数。
关键词
: FFT,paddle
§01 FFT
1.1 背景
FFT 是离散傅里叶变换(DFT)的快速算法。具有很好的计算效率,是数值计算的重要支柱。
1.2 DFT定义
1.2.1 DFT定义
对于序列 x j , j = 0 , 1 , ⋯ , n − 1 x_j ,j = 0,1, \\cdots ,n - 1 xj,j=0,1,⋯,n−1,对应的一维DFT定义如下:
X k = ∑ j = 0 n − 1 x j e δ ⋅ j ⋅ 2 π j k n X_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
对应频率为 j j j的频率分量为: x j = e i ⋅ 2 π f ⋅ j ⋅ Δ t x_j = e^i \\cdot 2\\pi f \\cdot j \\cdot \\Delta t xj=ei⋅2πf⋅j⋅Δt。其中 Δ t \\Delta t Δt为采样时间间隔。
- n n n为序列长度,也是傅里叶变换后结果的长度。
- δ \\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 多维离散傅里叶变换
多维离散傅里叶变换的定义如下:
X k 1 , k 2 , ⋯ , k d = σ ∑ j d = 0 n d − 1 ⋯ ∑ j 2 = 0 n 2 − 1 ∑ j 1 = 0 n l − 1 x j 1 , j 2 , ⋯ , j d e δ i ⋅ i ⋅ 2 π ⋅ ∑ l = 1 d j l ⋅ k l n ⋅ l X_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
d
d
d是傅里叶变换的维数,
n
1
,
以上是关于paddle深度学习框架中的FFT的主要内容,如果未能解决你的问题,请参考以下文章