短时傅里叶变换的torch函数调用

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_ffthop_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 中所使用的窗口类型、帧移大小和信号本身的特性等因素。因此,在具体使用过程中,需要根据实际情况进行调参和优化。

猜你喜欢

转载自blog.csdn.net/weixin_43681559/article/details/130714548
今日推荐