python写短时傅里叶变换
调用“ torch.stft ”函数
torch.stft()
是 PyTorch 中用于计算短时傅里叶变换 (STFT) 的函数, 它的主要功能是将一个 1D/2D/3D 张量组成的时间序列 (time series) 转化为 STFT 值。该函数通过在时间域上对信号进行滑动窗口并执行 FFT 来计算 STFT。它的函数原型如下:
torch.stft(input, n_fft, hop_length=None, win_length=None, window=None, center=True, pad_mode='reflect', normalized=False, onesided=True, return_complex=True)
其中比较重要的参数有:
input
: 需要进行 STFT 的输入张量,其支持形状为 [batch_size, n_channels, time_steps] 或 [batch_size, time_steps]。n_fft
: FFT 窗口的大小,默认是 2048。常用的数值有 1024,2048 和 4096。hop_length
: STFT 滑动窗口的步长,默认是n_fft // 4
。常用的数值有 256 和 512。win_length
: 每个窗口的大小。如果未指定,则默认win_length = n_fft
。window
: 可以手动定义窗体函数,默认使用汉明窗(Hann Window)。normalized
: 指定是否进行归一化。默认不归一化。return_complex
: 是否返回复数张量,默认返回。
附带说明,使用汉明窗的示例如下:
import torch
import numpy as np
x = torch.from_numpy(np.random.randn(1, 44100).astype(np.float32))
mag_spec, phase = torch.stft(x, n_fft=2048, hop_length=512, window=torch.hann_window(2048))
其中 window
参数传入了汉明窗函数,大小为2048,也可以使用其他窗口函数;n_fft
和 hop_length
也可以自由定义,而 return_complex=True
是默认值。
更新逆变换,还原
短时傅里叶变换的逆变换调用:“ torch.istft ”
torch.istft(input, n_fft, hop_length=None, win_length=None, window=None, center=True, normalized=False, onesided=True, length=None)
下面是函数的一些主要参数及含义:
input
:输入的 STFT 数据,形状为(batch, channels, freq, time, complex=2)
,其中complex=2
表示使用实部和虚部表示复数;n_fft
:傅里叶变换的窗口大小,通常应该与 STFT 使用的 n_fft 参数保持一致;hop_length
:帧移的大小,通常应该与 STFT 使用的 hop_length 参数保持一致;win_length
:窗口长度,通常应该与 STFT 使用的 win_length 参数保持一致;window
:窗口类型,可以是一个长度为 win_length 的张量;center
:是否基于中心点进行傅里叶变换,默认为 True;normalized
:是否进行归一化,默认为 False,建议与 STFT 保持一致;onesided
:是否只保留正频率部分,默认为 True,即只保留频谱的左半部分;length
:输出信号的长度,如果未指定,则会从输入 STFT 数据计算得到。
返回输出的 ISTFT 数据,形状为 (batch, channels, time)
。
需要注意的是,ISTFT 并不总是能够完全恢复原始的信号,这取决于 STFT 中所使用的窗口类型、帧移大小和信号本身的特性等因素。因此,在具体使用过程中,需要根据实际情况进行调参和优化。