【发布时间】: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