【问题标题】:Why is stft(istft(x)) ≠ x?为什么 stft(istft(x)) ≠ x?
【发布时间】:2020-02-09 09:48:42
【问题描述】:

为什么 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 有效。

【问题讨论】:

  • 我正在对音频信号进行同样的尝试,但问题仍然存在。无法从 istft 重建音频。输出是简单的破裂噪声。任何帮助或建议将不胜感激。
  • 发表此评论后。我查看了这个博客 link 并发现它有效。他们确实在那里也给出了很好的解释。我在音频文件上试过了。它可以工作,尽管重建后的输出并不完全相同。

标签: audio signal-processing pytorch


【解决方案1】:

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

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

STFT 中的大部分数据都是冗余的,如果只是对所有数据进行取值,则不太可能对应于真实信号。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 2015-05-07
    • 1970-01-01
    • 2013-08-29
    • 1970-01-01
    • 2018-09-25
    • 2013-07-10
    相关资源
    最近更新 更多