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 int
和 float
输入在写入 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)
结果与原始结果几乎没有区别。谢谢你的帮助。
作为一个简单的实验,我想计算音频文件的 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 int
和 float
输入在写入 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)
结果与原始结果几乎没有区别。谢谢你的帮助。