我希望更好地理解在短时傅立叶变换(STFT)中设置窗口和 fft 长度的后果。我的目标是增加简短发声(话语)的聚类,并且我正在尝试提高频率分辨率并压缩时间成分。
设置
window frame > fft length
、window frame == fft
长度和window frame < fft length
有什么影响?
为了清楚起见,我参考:
frame_length
,在librosa中为win_length
,有时在其他包中称为fft_size
)fft_length
,在 librosa 中为 n_fft
)背景
[1] https://stackoverflow.com/a/29866550/305883 我知道 STFT 最适合被认为是稳定的声音,因此对于语音来说,一个不错的选择是选择声音被认为是稳定的时间。
就我而言,我正在与动物一起工作,我只能做出“明智的”猜测:我选择以毫秒为单位的时间跨度,并根据采样率选择一个窗口(例如,假设 250000 采样率下的稳定性为 40 毫秒 = > 10000 帧,8192 窗口是最接近的 2 次方)
[3] https://support.ircam.fr/docs/AudioSculpt/3.0/co/FFT%20Size.html
我知道窗口是主要参数,我可以通过增加窗口和ftt长度来提高频率分辨率。
主要参数是窗口。我还可以通过零填充对帧进行过采样和插值,即设置 fft 长度比窗口更短:fft 长度< window
但是,该消息来源还明确指出 ftt 独立于窗口,并且我也可以设置更宽。
[4] 事实上,在 Tensorflow 中我可以设置所有选项 -
window frame > fft length
、window frame == fft
长度和 window frame < fft length
。
但是*不在Librosa中,其中必须是“fft length >= window”示例:
librosa.pyin(y,
sr=250000,
frame_length=4096,
win_length=8192,
)
# ParameterError: win_length=8192 must be less than frame_length=4096
librosa.stft(y, n_fft=2048, hop_length=None, win_length=8192)
# ParameterError: Target size (2048) must be at least input size (8192)
我对术语和错误感到困惑。
window frame > fft length
、window frame == fft
长度和window frame < fft length
的效果是什么?为什么 FTT 独立于窗口,但 librosa 强制至少等于或更长的大小,但 Tensorflow 允许任何选择?
感谢您帮助我理解并可能为我的挑战提供一些实用的建议。
设置
fft_size == window_length
- FFT 在窗口上执行,仅此而已。
设置
fft_size > window_length
- 在应用 FFT 之前,零被附加到窗口,以匹配所需的 fft_size。此操作不会添加任何更多信息,但提高了结果频谱的频率分辨率。
设置fft_size < window_length
好像不太好。它只是裁剪窗口以匹配 fft_size (根据rfft 的文档。