specgram()
中的matplotlib
函数在Python中生成语音波文件的声谱图,但是输出的质量始终比我的普通转录软件Praat生成的质量差很多。例如,以下调用:specgram(
fromstring(spf.readframes(-1), 'Int16'),
Fs=framerate,
cmap=cm.gray_r,
)
生成此代码:
具有以下设置的相同音频样本:
查看范围:0-8000Hz
窗口长度:0.005s
动态范围:70dB
时间步长: 1000
频率步长:250
窗口形状:高斯
我在做什么错?我尝试摆弄所有
specgram()
参数,但似乎没有任何方法可以改善分辨率。我几乎没有FFT的经验。#1 楼
这是matplotlib.specgram参数matplotlib.mlab.specgram(x,
NFFT=256,
Fs=2,
detrend=<function detrend_none at 0x1dd6410>,
window=<function window_hanning at 0x1e0b1b8>,
noverlap=128,
pad_to=None,
sides='default',
scale_by_freq=None)
问题描述中提供的参数需要转换为可比的mpl.specgram
参数。以下是映射的示例:如果使用8ms,将获得2 FFT的幂(128)。以下是从其网站上的Praat设置的说明
查看范围(Hz):
要显示的频率范围。标准在底部为0 Hz,在顶部为5000 Hz。如果此最大频率高于声音的奈奎斯特频率(是采样频率的一半),则频谱图中的某些值将为零,而较高的频率将用白色绘制。如果以44100 Hz的频率录制
声音并将查看范围设置为0 Hz至25000 Hz,则可以看到此内容。如果这是0.005秒(标准),则
Praat为每个帧使用位于该帧中心之前0.0025秒
和之后0.0025秒之间的声音部分(对于高斯窗口, /> Praat实际上使用的还不止于此。窗口长度决定了频谱分析的带宽,即纯正弦波频谱图中水平线的宽度(请参见下文)。对于高斯窗口,-3 dB
带宽为2 * sqrt(6 * ln(2))/(π*窗口长度)或1.2982804 /窗口长度。
要获取
broad-band' spectrogram (bandwidth 260 Hz), keep the standard window
length of 5 ms; to get a
窄带频谱图(带宽43 Hz),请将其设置为30 ms(0.03秒)。其他窗口形状给出的值会稍有不同。高级频谱图设置...)将以白色绘制。
中间的值具有适当的灰色阴影。因此,如果
的最高峰频谱图的高度为30 dB / Hz,动态范围为50 dB(
是标准值),则低于-20 dB / Hz的值将用白色绘制,而
值在-20 dB / Hz和30 dB / Hz之间将以各种灰色阴影绘制。 Praat频谱图和mpl(matplotlib)频谱图之间的对比度差异。 Praat的动态范围设置
会影响对比度。 mpl功能没有相似的设置/参数。 mpl.specgram确实返回了功率电平的2D数组(频谱图),动态范围可以应用于返回数组并重新绘制。
以下是创建下面的图的代码段。例如,语音约为20赫兹至8000赫兹,声音约为1分15秒。
View range: 0-8000Hz Fs=16000
Window length: 0.005s NFFT = int(Fs*0.005) = 80
noverlap = int(Fs*0.0025) = 40
Dynamic range: 70dB n/a
Time steps: 1000 n/a
Frequency steps: 250
Window shape: Gaussian default window is hanning change to gaussian
评论
$ \ begingroup $
再想一想,Praat的“动态范围”参数可能是造成绘图外观差异的主要因素。 Praat的“动态范围”可能会限制范围(压缩),以便在绘图中获得更大的对比度。 BOMK MPL没有类似的功能,但可以添加一个。
$ \ endgroup $
–克里斯托弗·费尔顿(Christopher Felton)
2012年2月29日在4:03
评论
您能否提供您尝试过的matplotlib.specgram参数配置的示例?您给出了一个非常具体的Praat参数示例,但没有显示matplotlib.specgram的相同配置?