我刚开始使用代码来预处理一些音频数据,以便最近向它提供神经网络。在更深入地解释我的实际问题之前,请提到我从this site开始参考了如何进行该项目。还使用了一些来自this post的代码,并在signal.spectogram doc和this post中阅读了更多信息。
就目前而言,利用前面提到的所有来源,我都设法将wav音频文件获取为numpy数组和plot both its amplitude and spectrogram。泰斯语代表我在西班牙语中说“命令”一词的录音。
这里一个奇怪的事实是,我在互联网上搜索时发现人的语音频谱在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()
答案 0 :(得分:1)
对我来说,频谱图的计算似乎很好。如果以对数刻度绘制频谱图,则应观察到与您参考的试听图更相似的内容。所以取消注释您的行
#dBS = 10 * np.log10(spectrogram) # convert to dB
,然后使用变量dBS进行绘图,而不是使用光谱图
plt.pcolormesh(times, frequencies, spectrogram)
plt.imshow(spectrogram,aspect='auto',origin='lower',cmap='rainbow')
答案 1 :(得分:0)
频谱图使用傅立叶变换将时间序列数据转换为频域。
可以测量的最大频率是(采样频率)/ 2,因此在这种情况下,您的采样频率似乎是60KHz?
无论如何,关于您的问题。人类语音频谱在此范围内可能是正确的,但傅立叶变换从来都不是完美的。我只需调整您的Y轴以专门查看这些频率即可。
在我看来,至少在正确读取sample_rate和样本的情况下,您才能正确计算频谱图。