paddle.fft¶
paddle.fft 目录下包含飞桨框架支持的快速傅里叶变换的相关 API。具体如下:
标准快速傅里叶变换¶
API 名称 |
API 功能 |
---|---|
|
一维离散傅里叶变换 |
|
一维逆向离散傅里叶变换 |
|
二维离散傅里叶变换 |
|
二维逆向离散傅里叶变换 |
|
N 维离散傅里叶变换 |
|
N 维逆向离散傅里叶变换 |
实数傅里叶变换¶
API 名称 |
API 功能 |
---|---|
|
一维离散实数傅里叶变换 |
|
一维离散实数傅里叶变换的逆变换 |
|
二维离散实数傅里叶变换 |
|
二维离散实数傅里叶变换的逆变换 |
|
N 维离散实数傅里叶变换 |
|
N 维离散实数傅里叶变换的逆变换 |
厄米特傅里叶变换¶
API 名称 |
API 功能 |
---|---|
|
一维离散厄米特傅里叶变换 |
|
一维离散厄米特傅里叶变换的逆变换 |
|
二维离散厄米特傅里叶变换 |
|
二维离散厄米特傅里叶变换的逆变换 |
|
N 维离散厄米特傅里叶变换 |
|
N 维离散厄米特傅里叶变换的逆变换 |
辅助函数¶
API 名称 |
API 功能 |
---|---|
|
计算傅里叶变换采样频率 |
|
计算傅里叶变换采样频率,用于 |
|
移动零频率项至频谱中心 |
|
fftshift 的逆变换 |
背景¶
傅里叶分析是将信号表示为一系列周期性成分,并且从这些周期性成分中还原信号的方法。当信号和傅里叶 变换都被替换成离散化的,这个过程称为离散傅里叶变换 (Discrete Fourier Transform, DFT). 因为快速傅里叶变换算法的高效性,傅里叶变换称为数值计算的一个重要支柱。
离散傅里叶变换将离散的输入表示为离散频率的周期性成分之和,在数字信号处理上有广泛的应用,比如滤 波。在数字信号处理的语境中,离散傅里叶变换的输入一般是定义在时域上的,称为信号(signal),其输出 定义在频域上的,称为频谱(spectrum).
实现细节¶
一维离散傅里叶变换¶
paddle.fft 的离散傅里叶变换中,一维离散傅里叶变换定义如下:
其中频率为 f (单位:循环每采样间隔)的分量被表示为一个复指数函数 \(\exp (i 2\pi fj \Delta t)\), \(\Delta t\) 为采样间隔。
n 为傅里叶变换点数,亦即傅里叶变换轴的长度。
\(\delta\) 和变换的方向有关,正向变换中,取值为 -1, 逆向变换中,取值为 1.
\(\sigma\) 为缩放系数,和变换的方向以及缩放方案有关。paddle.fft 中缩放方案有三种: "forward","backward","ortho" 之一,默认值为 "backward"。三种缩放模式对应的行为如下:
"backward": 正向和逆向变换的缩放系数分别为
1
和1/n
;"forward": 正向和逆向变换的缩放系数分别为
1/n
和1
;"ortho": 正向和逆向变换的缩放系数均为
1/sqrt(n)
;
输出的结果遵循“标准”排布:
如果 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)
则是这个变换的逆变 换。
多维离散傅里叶变换¶
多维离散傅里叶变换的定义如下:
d 是傅里叶变换维数。 \(n_{1}, n_{2}, \cdots, n_{d}\) 是每个傅里叶变换轴的长度。
\(\delta\) 和变换的方向有关,正向变换中,取值为 -1, 逆向变换中,取值为 1.
\(\sigma\) 为缩放系数,和变换的方向以及缩放方案有关。paddle.fft 中缩放方案有三种: "forward","backward","ortho" 之一,默认值为 "backward"。三种缩放模式对应的行为如下:
"backward": 正向和逆向变换的缩放系数分别为
1
和1/n
;"forward": 正向和逆向变换的缩放系数分别为
1/n
和1
;"ortho": 正向和逆向变换的缩放系数均为
1/sqrt(n)
;
其中
实数傅里叶变换和厄米特傅里叶变换¶
当输入信号为实数信号时,傅里叶变换的结果具有厄米特对称性,亦即频率 \(f_{k}\) 上的分量和 \(-f_{k}\) 上的分量互为共轭。因此可以利用对称性来减少计算量。实数傅里叶变换 (rfft
) 系列的函数是用于实数输入的,并且利用了对称性,只计算正频率项,直到奈奎斯特频率项。 因此,对于实数傅里叶变换,n
个复数输入点只产生 n//2 + 1
个实数输出点。这一系列变换 的逆变换也预设了输入数据具有厄米特对称性,要产生 n
个实数输出点,只需要使用 n//2 + 1
个复数输入点。
与此相对应,当频谱是纯实数时,输入信号具有厄米特对称性。厄米特傅里叶变换(hfft
)系列同样 利用对称性,产生 n
个实数输出点,只需要使用 n//2 + 1
个复数输入点。
自动微分与 Wertinger Calculus¶
paddle.fft 中的傅里叶变换函数支持自动微分,使用的方法是维廷格微积分(Wertinger Calculus)。 对于复函数 \(f: \mathbb{C} \rightarrow \mathbb{C}\),paddle 中的惯例是使用 \(f(z)\) 对其输入的共轭的偏导数 \(\frac{\partial f}{\partial z^{*}}\).