signal.spectrogram returns 太多赫兹

signal.spectrogram returns too many hz

我刚刚开始编写代码来预处理一些音频数据,以便最近将其提供给神经网络。在更深入地解释我的实际问题之前,请提及我从 this site. Also used some code taken from and read for more info in the signal.spectogram doc and .

获取了如何做项目的参考

现在,使用前面提到的所有资源,我设法将 wav 音频文件作为一个 numpy 数组和 plot both its amplitude and spectrogram。 Theese 代表我用西班牙语说单词 "command" 的录音。

奇怪的是我在互联网上搜索发现人声频谱在 80 到 8k Hz 之间移动,所以为了确定我将此输出与 Audacity spectrogram returned 进行了比较。如您所见,这似乎与找到的信息更加一致,因为频率范围应该是人类的频率范围。

所以我要问最后一个问题:我是不是在读取音频或生成频谱图的过程中做错了什么,或者我是否遇到了绘图问题?

顺便说一下,我对 python 和信号处理都是新手,所以提前感谢您的耐心等待。

这是我实际使用的代码:

def espectrograma(wav):
    sample_rate, samples = wavfile.read(wav)
    frequencies, times, spectrogram = signal.spectrogram(samples, sample_rate, nperseg=320, noverlap=16, scaling='density')
    #dBS = 10 * np.log10(spectrogram)  # convert to dB

    plt.subplot(2,1,1)
    plt.plot(samples[0:3100])

    plt.subplot(2,1,2)
    plt.pcolormesh(times, frequencies, spectrogram)
    plt.imshow(spectrogram,aspect='auto',origin='lower',cmap='rainbow')
    plt.ylim(0,30)
    plt.ylabel('Frecuencia [kHz]')
    plt.xlabel('Fragmento[20ms]')
    plt.colorbar()
    plt.show()

频谱图使用傅里叶变换将您的时间序列数据转换为频域。

可以测量的最大频率是(采样频率)/2,所以在这种情况下你的采样频率似乎是60KHz?

无论如何,关于你的问题。人声频谱位于这个范围内可能是正确的,但傅立叶变换从来都不是完美的。我会简单地调整您的 Y 轴以专门查看这些频率。

在我看来,您正在正确计算频谱图,至少只要您正确阅读 sample_rate 和样本..

频谱图的计算对我来说似乎很好。如果您以对数刻度绘制频谱图,您应该观察到与您引用的试听图更相似的东西。所以取消注释你的行

#dBS = 10 * np.log10(spectrogram) # convert to dB

然后在

中使用变量 dBS 代替频谱图进行绘图

plt.pcolormesh(times, frequencies, spectrogram) plt.imshow(spectrogram,aspect='auto',origin='lower',cmap='rainbow')