请注意 sox 生成的图中颜色条的比例。单位是dBFS:相对于满量程的分贝。要使用 SciPy 和 Matplotlib 重现该图,您需要缩放这些值以使最大值为 1,然后取这些值的对数以转换为 dB。
这是脚本的修改版本,其中包括对参数的各种调整spectrogram
and pcolormesh
创建一个类似于 sox 输出的图。
import numpy as np
from scipy.io import wavfile
from scipy import signal
import matplotlib.pyplot as plt
input_file = 'romance_gt.wav'
fs, x = wavfile.read(input_file)
print('fs', fs)
print('x.shape', x.shape)
nperseg = 1025
noverlap = nperseg - 1
f, t, Sxx = signal.spectrogram(x, fs,
nperseg=nperseg,
noverlap=noverlap,
window='hann')
print('f.shape', f.shape)
print('t.shape', t.shape)
print('Sxx.shape', Sxx.shape)
plt.pcolormesh(1000*t, f/1000, 10*np.log10(Sxx/Sxx.max()),
vmin=-120, vmax=0, cmap='inferno')
plt.ylabel('Frequency [kHz]')
plt.xlabel('Time [ms]')
plt.colorbar()
plt.savefig('spectrogram_scipy.png')
我分了Sxx
by Sxx.max()
考虑 dBFS 的“全面”方面。我调整了nperseg
and noverlap
的论点spectrogram
沿频率和时间轴提供高于默认值的分辨率。我用了window='hann'
以匹配 sox 的默认行为。 (您可以在以下位置找到 sox 频谱图的详细信息:http://sox.sourceforge.net/sox.html.)我也用过vmin=-120
and vmax=0
in pcolormesh
,以匹配 sox 频谱图使用的默认范围。
情节如下:
“地狱”色彩图并不像红袜图中使用的色彩图那么强烈。请参阅教程“在 Matplotlib 中选择颜色图”用于替代颜色图。