Python:从 STFT 重建音频文件

Python: Reconstruct audio file from STFT

作为一个简单的实验,我想计算音频文件的 stft

sample_rate, samples = wav.read(file)

f, t, Zxx = stft(samples, sample_rate)
_, reconstructed = istft(Zxx, sample_rate)
padded_samples = np.zeros_like(reconstructed)
padded_samples[:len(samples)] = samples
print (np.sum(padded_samples - reconstructed))

输出:-1.37309940428。很小,不是吗?鉴于 samples 的形状为 (9218368,).

test_file = os.path.join(temp_folder, 'reconstructed.wav')
wav.write(test_file, sample_rate, reconstructed)

重建的文件听起来很糟糕。在噪音下几乎听不到原件。是我弄错了,还是根本不可能从 STFT 恢复音频文件?

关于如何将音频文件转换为某种可处理的数据,然后从中重建它,您还有其他建议吗?还有哪些数据结构可以用来处理音频文件?

谢谢。

编辑:

正如沃伦所建议的那样:

print (samples.shape)
print (samples.dtype)
print (reconstructed.dtype)

输出:

(9218368,)
int16
float64

根据 scipy 文档,int 和 float 输入在写入 wav 文件时具有不同的含义。我尝试将重建投射到 np.int16:

rounded_reconstructed = np.rint(reconstructed).astype(np.int16)

test_file = os.path.join(temp_folder, 'reconstructed.wav')
wav.write(test_file, sample_rate, rounded_reconstructed)

结果与原始结果几乎没有区别。谢谢你的帮助。

根据Warren的建议:

print (samples.shape)
print (samples.dtype)
print (reconstructed.dtype)

输出:

(9218368,)
int16
float64

根据the scipy docs intfloat 输入在写入 wav 文件时具有不同的含义。我尝试将 reconstructed 转换为 np.int16:

rounded_reconstructed = np.rint(reconstructed).astype(np.int16)

test_file = os.path.join(temp_folder, 'reconstructed.wav')
wav.write(test_file, sample_rate, rounded_reconstructed)

结果与原始结果几乎没有区别。谢谢你的帮助。