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')
我刚刚开始编写代码来预处理一些音频数据,以便最近将其提供给神经网络。在更深入地解释我的实际问题之前,请提及我从 this site. Also used some code taken from
现在,使用前面提到的所有资源,我设法将 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')