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

标签 audio signal-processing pytorch

为什么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.istftscipy.signal.stft导致相同的问题。
此外,我已经尝试了多种张量x,例如不同的随机分布,图像和其他条纹。
另外,我已经尝试了各种针对stft / istft的超参数。
仅适用于通过声波的短时傅立叶变换生成的x,它可以工作。

最佳答案

短时傅立叶变换所产生的数据要多于原始信号中的数据。如果信号具有N个真实样本,则STFT可能具有4N个复杂样本-数据多8倍。

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

STFT中的大多数数据都是冗余的,如果仅对所有数据进行补全,就不可能与真实信号相对应。

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

关于audio - 为什么stft(istft(x))≠x?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58348493/

相关文章:

python - python 中的 fft 带通滤波器

matlab - 使用 fft 和 ifft 改变频率不使用整数

python - `images, labels = dataiter.next() ` 在 PyTorch 教程中如何工作?

pytorch - 无法导入 pytorch-lightning

javascript - 如何在同一个声音上播放不同的声音?

python - 从声音文件中获取帧

c - 在矩阵中映射相邻子区域并计算每个子区域的质心

c++ - 音频编程数据类型

swift 4 : Detecting strongest frequency or presence of frequency in audio stream.

python - 如何在 PyTorch 中保存经过训练的模型?