paddle.fft

paddle.fft 目录下包含飞桨框架支持的快速傅里叶变换的相关 API。具体如下:

标准快速傅里叶变换

API 名称

API 功能

一维离散傅里叶变换

一维逆向离散傅里叶变换

二维离散傅里叶变换

二维逆向离散傅里叶变换

N 维离散傅里叶变换

N 维逆向离散傅里叶变换

实数傅里叶变换

API 名称

API 功能

一维离散实数傅里叶变换

一维离散实数傅里叶变换的逆变换

二维离散实数傅里叶变换

二维离散实数傅里叶变换的逆变换

N 维离散实数傅里叶变换

N 维离散实数傅里叶变换的逆变换

厄米特傅里叶变换

API 名称

API 功能

一维离散厄米特傅里叶变换

一维离散厄米特傅里叶变换的逆变换

二维离散厄米特傅里叶变换

二维离散厄米特傅里叶变换的逆变换

N 维离散厄米特傅里叶变换

N 维离散厄米特傅里叶变换的逆变换

辅助函数

API 名称

API 功能

计算傅里叶变换采样频率

计算傅里叶变换采样频率,用于 rfft, irfft

移动零频率项至频谱中心

fftshift 的逆变换

背景

傅里叶分析是将信号表示为一系列周期性成分,并且从这些周期性成分中还原信号的方法。当信号和傅里叶 变换都被替换成离散化的,这个过程称为离散傅里叶变换 (Discrete Fourier Transform, DFT). 因为快速傅里叶变换算法的高效性,傅里叶变换称为数值计算的一个重要支柱。

离散傅里叶变换将离散的输入表示为离散频率的周期性成分之和,在数字信号处理上有广泛的应用,比如滤 波。在数字信号处理的语境中,离散傅里叶变换的输入一般是定义在时域上的,称为信号(signal),其输出 定义在频域上的,称为频谱(spectrum).

实现细节

一维离散傅里叶变换

paddle.fft 的离散傅里叶变换中,一维离散傅里叶变换定义如下:

\[X_{k} = \sigma \sum_{j=0}^{n-1} x_{j} \exp (\delta i 2 \pi \frac{jk}{n})\]

其中频率为 f (单位:循环每采样间隔)的分量被表示为一个复指数函数 \(\exp (i 2\pi fj \Delta t)\), \(\Delta t\) 为采样间隔。

n 为傅里叶变换点数,亦即傅里叶变换轴的长度。

\(\delta\) 和变换的方向有关,正向变换中,取值为 -1, 逆向变换中,取值为 1.

\(\sigma\) 为缩放系数,和变换的方向以及缩放方案有关。paddle.fft 中缩放方案有三种: "forward","backward","ortho" 之一,默认值为 "backward"。三种缩放模式对应的行为如下:

  • "backward": 正向和逆向变换的缩放系数分别为 11/n;

  • "forward": 正向和逆向变换的缩放系数分别为 1/n1;

  • "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) 则是这个变换的逆变 换。

多维离散傅里叶变换

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

\[X_{k_{1}, k_{2}, \cdots, k_{d}} = \sigma \sum_{j_{d}=0}^{n_{d}-1} \cdots \sum_{j_{2}=0}^{n_{2}-1} \sum_{j_{d}=0}^{n_{1}-1} x_{j_{1}, j_{2}, \cdots ,j_{d}} \exp (\delta i 2 \pi \sum_{l=1}^{d} \frac{j_{l}k_{l}}{n_{l}})\]

d 是傅里叶变换维数。 \(n_{1}, n_{2}, \cdots, n_{d}\) 是每个傅里叶变换轴的长度。

\(\delta\) 和变换的方向有关,正向变换中,取值为 -1, 逆向变换中,取值为 1.

\(\sigma\) 为缩放系数,和变换的方向以及缩放方案有关。paddle.fft 中缩放方案有三种: "forward","backward","ortho" 之一,默认值为 "backward"。三种缩放模式对应的行为如下:

  • "backward": 正向和逆向变换的缩放系数分别为 11/n;

  • "forward": 正向和逆向变换的缩放系数分别为 1/n1;

  • "ortho": 正向和逆向变换的缩放系数均为 1/sqrt(n);

其中

\[n = \prod_{i=1}^{d} n_{i}\]

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

当输入信号为实数信号时,傅里叶变换的结果具有厄米特对称性,亦即频率 \(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^{*}}\).