torch.stft
- torch.stft(input, n_fft, hop_length=None, win_length=None, window=None, center=True, pad_mode='reflect', normalized=False, onesided=None, return_complex=None)[源代码]
-
短时傅里叶变换(STFT)。
警告
从版本 1.8.0 开始,对于实数输入,必须始终显式指定
return_complex
参数,并且 return_complex=False 已被弃用。强烈建议使用 return_complex=True,因为在未来的 PyTorch 版本中,此函数将仅返回复数张量。注意,可以使用
torch.view_as_real()
来恢复一个带有额外的最后一维(表示实部和虚部)的实数张量。警告
从版本 2.1 开始,如果未指定
window
参数,将会发出警告。在未来版本中,此参数将是必需的。当前不提供窗口默认使用矩形窗口,这可能会导致不希望出现的伪像。建议使用如torch.hann_window()
这样的窗函数。STFT 计算输入信号短时重叠窗口的傅里叶变换,从而得出信号随时间变化的频率成分。该函数的接口与 librosa 的 stft 函数类似(但并非直接替代)。
忽略可选的批处理维度,该方法计算以下表达式:
$X[\omega, m] = \sum_{k = 0}^{\text{win\_length-1}}% \text{window}[k]\ \text{input}[m \times \text{hop\_length} + k]\ % \exp\left(- j \frac{2 \pi \cdot \omega k}{\text{n\_fft}}\right),$其中$m$是滑动窗口的索引,而$\omega$表示频率。当
onesided=False
时,频率范围为$0 \leq \omega < \text{n\_fft}$;当onesided=True
时,频率范围为$0 \leq \omega < \lfloor \text{n\_fft} / 2 \rfloor + 1$。-
input
必须是一维的时间序列或二维的时间序列批处理。 -
如果
hop_length
为None
(默认情况),则其值会被设置为floor(n_fft / 4)
。 -
如果
win_length
未指定(默认情况下为None
),则将其视为等于n_fft
。 -
window
可以是一个大小为win_length
的一维张量,例如来自torch.hann_window()
。如果window
为None
(默认值),则将其视为窗口中的每个位置都为$1$。如果 $\text{win\_length} < \text{n\_fft}$,window
将在应用之前填充到长度为n_fft
。 -
如果
center
是True
(默认值),input
将在两侧填充,使得第 $t$ 帧在时间 $t \times \text{hop\_length}$ 时居中。否则,第 $t$ 帧从时间 $t \times \text{hop\_length}$ 开始。 -
pad_mode
确定当center
为True
时,input
的填充方法。有关所有可用选项,请参见torch.nn.functional.pad()
。默认值为"reflect"
。 -
当
onesided
为True
(实数输入的默认值)时,只会返回 $\omega$ 在 $\left[0, 1, 2, \dots, \left\lfloor \frac{\text{n\_fft}}{2} \right\rfloor + 1\right]$ 范围内的值,因为实数到复数的傅里叶变换满足共轭对称性,即 $X[m, \omega] = X[m, \text{n\_fft} - \omega]^*$。需要注意的是,如果输入或窗口张量是复数,则无法生成onesided
结果。 -
如果
normalized
为True
(默认为False
),该函数将返回归一化的 STFT 结果,即乘以$(\text{frame\_length})^{-0.5}$。 -
如果
return_complex
为True
(默认值,当输入是复数时),则返回一个维度为input.dim() + 1
的复数张量。如果False
,则输出是一个维度为input.dim() + 2
的实数张量,其中最后一维分别表示实部和虚部。
如果
return_complex
为真,则返回一个大小为 $(* \times N \times T)$ 的复数张量,否则返回一个大小为 $(* \times N \times T \times 2)$ 的实数张量。其中 $*$ 表示输入的可选批次大小,$N$ 是 STFT 应用到的频率数量,而 $T$ 则表示总的帧数。警告
从版本 0.4.1 开始,此函数的签名发生了变化。继续使用旧签名可能引发错误或导致结果不准确。
- 参数
-
-
输入 (Tensor) – 形状为 (B?, L) 的输入张量,其中 B? 是可选的批次维度。
-
n_fft (int) – 指定傅里叶变换的大小
-
hop_length (int, 可选) – 相邻滑动窗口帧之间的距离。默认值:若未指定,默认为
floor(n_fft / 4)
-
win_length (int, 可选) – 窗口帧和STFT滤波器的大小。默认值:如果为
n_fft
,则使用该值;若未指定(即为None
),则默认等于n_fft
-
window (Tensor, 可选) – 可选的窗口函数。形状必须为一维且小于等于 n_fft。默认值:
None
(表示所有元素均为$1$ 的窗口) -
center (bool, 可选) – 是否在
input
的两侧填充,使得第$t$帧在时间$t \times \text{hop\_length}$处居中。默认值:True
-
pad_mode (str, 可选) – 当
center
为True
时,控制使用的填充方法。默认值:"reflect"
-
normalized (bool, 可选) – 控制是否返回归一化的短时傅里叶变换 (STFT) 结果 默认值:
False
-
onesided (bool, optional) – 控制是否返回一半的结果以避免实数输入的冗余。默认值:对于实数 input 和 window,为
True
;否则为False
。 -
return_complex (bool, 可选) –
是否返回一个复数张量,或者一个带有额外一维分别表示实部和虚部的实数张量。
从版本 2.0 开始:
return_complex
现已成为实数输入的必需参数,因为其默认值将过渡为True
。自版本 2.0 起已弃用:
return_complex=False
已被弃用,建议使用return_complex=True
。需要注意的是,调用torch.view_as_real()
可以恢复原来的输出格式。
-
- 返回值
-
- 包含STFT结果的张量,其形状为(B?, N, T, C?),
-
-
B? 是输入中一个可选的批次维度。
-
N 表示频率样本的数量。如果 onesided=True,则 N 的值为 (n_fft // 2) + 1;否则,N 的值为 n_fft。
-
T 表示帧数。当 center=True 时,T 的值为 1 + L // hop_length;否则,其值为 1 + (L - n_fft) // hop_length。
-
C? 是一个可选的长度为 2 的维度,用于表示实部和虚部组件,在 return_complex=False 时出现。
-
- 返回类型
-