为什么stft(istft(x))≠x?
使用PyTorch,我计算了张量的逆短时傅立叶变换的短时傅立叶变换。
给定张量x
,如下所示。
对于x
,实部和虚部相等,或者虚部设置为零-都产生相同的问题。
torch.stft(torchaudio.functional.istft(x, n_fft), n_fft)
如图中所示,在应用
stft(istft(x))
后,张量中的 strip 仅保留一个,其他所有 strip 都消失了。如果
stft(istft(x))
(底部)等于x
(顶部),则两个图像看起来相似。他们为什么如此不同?
似乎
stft(istft(x))
只能选择某些特定频率的x
。x (top) and stft of istft of x (bottom)
我也尝试过使用
scipy.signal.istft
和scipy.signal.stft
导致相同的问题。此外,我已经尝试了多种张量
x
,例如不同的随机分布,图像和其他条纹。另外,我已经尝试了各种针对stft / istft的超参数。
仅适用于通过声波的短时傅立叶变换生成的
x
,它可以工作。 最佳答案
短时傅立叶变换所产生的数据要多于原始信号中的数据。如果信号具有N个真实样本,则STFT可能具有4N个复杂样本-数据多8倍。
因此,ISTFT操作必须丢弃您提供的7/8数据。
STFT中的大多数数据都是冗余的,如果仅对所有数据进行补全,就不可能与真实信号相对应。
在这种情况下,ISTFT的实现可能会使用最小二乘拟合或其他方法来产生具有与您的数据尽可能紧密匹配的STFT的信号,但它并不总是紧密的。