mindspore.ops.FFTWithSize
- class mindspore.ops.FFTWithSize(signal_ndim, inverse, real, norm='backward', onesided=True, signal_sizes=())[源代码]
傅里叶变换,可以对参数进行调整,以实现FFT/IFFT/RFFT/IRFFT。
对于FFT,它计算以下表达式:
\[X[\omega_1, \dots, \omega_d] = \sum_{n_1=0}^{N_1-1} \dots \sum_{n_d=0}^{N_d-1} x[n_1, \dots, n_d] e^{-j\ 2 \pi \sum_{i=0}^d \frac{\omega_i n_i}{N_i}},\]其中, \(d\) = signal_ndim 是信号的维度,\(N_i\) 则是信号第 \(i\) 个维度的大小。
对于IFFT,它计算以下表达式:
\[X[\omega_1, \dots, \omega_d] = \frac{1}{\prod_{i=1}^d N_i} \sum_{n_1=0}^{N_1-1} \dots \sum_{n_d=0}^{N_d-1} x[n_1, \dots, n_d] e^{\ j\ 2 \pi \sum_{i=0}^d \frac{\omega_i n_i}{N_i}},\]其中, \(d\) = signal_ndim 是信号的维度,\(N_i\) 则是信号第 \(i\) 维的大小。
说明
FFT/IFFT要求complex64或complex128类型的输入,返回complex64或complex128类型的输出。
RFFT要求bool, uint8, int8, int16, int32, int64, float32或float64类型的输入, 返回complex64或complex128类型的输出。
IRFFT要求complex64或complex128类型的输入,返回float32或float64类型的输出。
警告
这是一个实验性API,后续可能修改或删除。
- 参数:
signal_ndim (int) - 表示每个信号中的维数,控制着傅里叶变换的维数,其值只能为1、2或3。
inverse (bool) - 表示该操作是否为逆变换,用以选择FFT 和 RFFT 或 IFFT 和 IRFFT。
如果为
True
,则为IFFT 和 IRFFT。如果为
False
,FFT 和 RFFT。
real (bool) - 表示该操作是否为实变换,与 inverse 共同决定具体的变换模式:
inverse 为
False
, real 为False
:对应FFT模式。inverse 为
True
, real 为False
:对应IFFT模式。inverse 为
False
, real 为True
:对应RFFT模式。inverse 为
True
, real 为True
:对应IRFFT模式。
norm (str,可选) - 表示该操作的规范化方式,可选值:[
"backward"
,"forward"
,"ortho"
]。默认值:"backward"
。“backward”,正向变换不缩放,逆变换按 \(1/n\) 缩放,其中 n 表示输入 x 的元素数量。。
“ortho”,正向变换与逆变换均按 \(1/\sqrt n\) 缩放。
“forward”,正向变换按 \(1/n\) 缩放,逆变换不缩放。
onesided (bool,可选) - 控制输入是否减半以避免冗余。默认值:
True
。signal_sizes (tuple,可选) - 原始信号的大小(RFFT变换之前的信号,不包含batch这一维),只有在IRFFT模式下和设置 onesided 为True时需要该参数,需要满足 以下条件。默认值:
()
。signal_sizes 的长度等于IRFFT的 signal_ndim : \(len(signal_sizes)=signal_ndim\) 。
signal_sizes 的最后一个维度除以2等于IRFFT输入的最后一个维度: \(signal_size[-1]/2+1=x.shape[-1]\) 。
除了最后一个维度外, signal_sizes 的维度与输入shape完全相同: \(signal_sizes[:-1]=x.shape[:-1]\) 。
- 输入:
x (Tensor) - 输入Tensor的维数必须大于或等于 signal_ndim 。
- 输出:
Tensor,表示复数到复数、实数到复数或复数到实数傅里叶变换的结果。
- 异常:
TypeError - 如果FFT/IFFT/IRFF的输入类型不是以下类型之一:complex64、complex128。
TypeError - 如果输入的类型不是Tensor。
ValueError - 如果输入 x 的维度小于 signal_ndim 。
ValueError - 如果 signal_ndim 大于3或小于1。
ValueError - 如果 norm 取值不是”backward”、”forward”或”ortho”。
- 支持平台:
Ascend
GPU
CPU
样例:
>>> import mindspore >>> import numpy as np >>> from mindspore import Tensor, ops >>> # case FFT: signal_ndim: 1, inverse: False, real: False. >>> fft_in = Tensor(np.array([2, 1, 2]), mindspore.complex64) >>> fft_net = ops.FFTWithSize(signal_ndim=1, inverse=False, real=False) >>> fft_output = fft_net(fft_in) >>> print(fft_output) [5. +0.j 0.5 +0.86602545j 0.50000006-0.8660255j ] >>> # case IFFT: signal_ndim: 1, inverse: True, real: False. >>> ifft_in = fft_output >>> ifft_net = ops.FFTWithSize(signal_ndim=1, inverse=True, real=False) >>> ifft_output = ifft_net(ifft_in) >>> print(ifft_output) [2. -1.9868216e-08j 0.99999994+0.0000000e+00j 1.9999999 +7.9472862e-08j] >>> # case RFFT2D: signal_ndim: 2, inverse: False, real: True. >>> rfft_in = Tensor(np.array([[2, 1, 2], [3, 1, 6]]), mindspore.float32) >>> rfft_net = ops.FFTWithSize(signal_ndim=2, inverse=False, real=True) >>> rfft_output = rfft_net(rfft_in) >>> print(rfft_output) [[ 1.5000000e+01+1.1920929e-07j -2.3841858e-07+5.1961522e+00j] [-5.0000000e+00-2.9802322e-08j 9.9999988e-01-3.4641016e+00j]] >>> # case IRFFT2D: signal_ndim: 2, inverse: True, real: True. >>> irfft_in = rfft_output >>> irfft_net = ops.FFTWithSize(signal_ndim=2, inverse=True, real=True, signal_sizes=rfft_in.shape) >>> irfft_output = irfft_net(irfft_in) >>> print(irfft_output) [[2. 1. 2. ] [3. 0.99999994 5.9999995 ]]