为什么 stft(istft(x)) ≠ x?

Why is stft(istft(x)) ≠ x?

为什么 stft(istft(x)) ≠ x?

我使用 PyTorch 计算了张量的逆短时傅里叶变换的短时傅里叶变换。 我已经这样做了,如下所示,给定一个张量 x。 对于x,实部和虚部相等,或者虚部设置为零——两者都会产生同样的问题。

torch.stft(torchaudio.functional.istft(x, n_fft), n_fft)

如图所示,在应用 stft(istft(x)) 后,张量中只剩下一条条纹——所有其他条纹都消失了。 如果 stft(istft(x))(底部)等于 x(顶部),则两个图像看起来相似。 为什么它们如此不同? 似乎 stft(istft(x)) 只能拾取 x.

的特定频率

x (top) and stft of istft of x (bottom)

我也对 scipy.signal.istftscipy.signal.stft 进行了相同的尝试,这导致了同样的问题。 此外,我已经尝试使用各种张量 x,例如不同的随机分布、图像和其他条纹。 另外,我已经为 stft/istft 尝试了多种超参数。 仅对 x 由声波的短时傅里叶变换生成的有效。

短时傅里叶变换产生的数据比原始信号中的数据多。如果一个信号有 N 个真实样本,那么 STFT 可能有 4N 个复杂样本——多 8 倍的数据。

因此,ISTFT 操作必须丢弃您提供的数据的 7/8。

STFT 中的大部分数据都是冗余的,如果您只是为所有数据编值,则不太可能对应到真实信号。

在那种情况下,ISTFT 的实现可能会使用最小二乘法拟合或其他方法来产生与您的数据尽可能匹配的 STFT 信号,但它并不总是接近。