【问题标题】:STFT not inverted properly without windowing in Tensorflow在 Tensorflow 中没有窗口的情况下,STFT 不能正确反转
【发布时间】:2022-01-03 20:28:58
【问题描述】:

在应用 STFT 后跟反向 STFT 时,Tensorflow 不会重建原始信号。当 STFT 的帧重叠时会出现问题:似乎每个帧的权重为 1,而不管重叠帧的数量N = frame_size / frame_step。结果,信号的中心部分比原始信号大N 倍。这是重现错误的最小代码:

import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf

size = 2048
frame_length = 512
frame_step = 128
waveform = np.sin(np.arange(size) * 1 / 100)

stft = tf.signal.stft(waveform, frame_length, frame_step, window_fn=None)
inverse_stft = tf.signal.inverse_stft(stft, frame_length, frame_step, window_fn=None)

plt.plot(waveform)
plt.plot(inverse_stft)
plt.show()
plt.clf()

请注意,我没有使用任何窗口。如果我放置 Hann 窗口,中心部分运行良好,但边界平滑地变为零,这是一个相关但令人惊讶的不同错误。 scipy 的实现在所有情况下都运行良好。

我错过了什么吗?

【问题讨论】:

  • 对于幅度校正,您可能需要为您的反向 stft 提供inverse_stft_window_fn,但这可能需要一些窗口函数
  • 我找不到合适的inverse_stft_window_fn 没有窗口,所以我只是假设我也不会在反面中放置任何窗口。

标签: python tensorflow signal-processing fft


【解决方案1】:

似乎 Tensorflow 有一些不完美的实现,在信号/stfts 的边界上不能很好地工作。而且frame_rate =/= frame length时没有考虑到账户适当的缩放

这可以作为一个问题发布在他们的 github 上。

对于更长的信号(加上考虑缩放)它看起来“足够好”:

size = 20480
frame_length = 512
frame_step = 256
waveform = np.sin(np.arange(size) * 1 / 100)

stft = tf.signal.stft(waveform, frame_length, frame_step, window_fn=None, pad_end=True)
inverse_stft = tf.signal.inverse_stft(stft, frame_length, frame_step, window_fn=None) / (frame_length / frame_step)

plt.plot(waveform)
plt.plot(inverse_stft)
plt.show()
plt.clf()

【讨论】:

  • For longer signals (plus taking into account scaling) it looks "good enough": 这个说法不太准确。即使对于较短的信号,您也会在信号的开始和结束附近观察到相同的结果。如果您减少样本量,您将获得相同的结果。这很可能与填充以及其他模块(如scipy)默认处理填充有关。
  • @NebiyouYismaw 我写的重点是查看更长的信号,而不是更短的信号 - 对于长信号,边界处的微小差异 可以 被忽略 - 结果可能被视为对某人来说“足够好”,当然不完美。
  • 我已将其发布在 Tensorflow 的 github 上,他们承认存在问题:github.com/tensorflow/tensorflow/issues/53205。我认为没有比例因子只是他们代码中的一个错误。并且一旦您将比例因子放回原处,边界处的行为就会与使用其他窗口发生的情况一致,并且可以手动在两端用零填充数据来解决,如此处所示github.com/tensorflow/tensorflow/issues/36616。 (我还是相信至少应该有自动填充的选项)
猜你喜欢
  • 2011-04-29
  • 2022-11-22
  • 1970-01-01
  • 2016-09-24
  • 2016-03-24
  • 1970-01-01
  • 2012-09-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多