【问题标题】:signal.spectrogram returns too many hzsignal.spectrogram 返回太多 hz
【发布时间】:2019-01-14 06:47:14
【问题描述】:

我刚开始编写一段代码来预处理一些音频数据,以便最近用它来为神经网络提供数据。在更深入地解释我的实际问题之前,请提到我从this site 获取了如何做项目的参考。还使用了来自this post 的一些代码,并在signal.spectogram docthis post 中阅读以了解更多信息。

现在有了前面提到的所有来源,我设法将 wav 音频文件作为一个 numpy 数组和plot both its amplitude and spectrogram 获取。 Theese 代表我用西班牙语说“命令”这个词的录音。

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

所以这将我带到最后一个问题:我在读取音频或生成频谱图的过程中做错了什么,或者我是否有情节问题?

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

这是我实际使用的代码:

def 频谱图(wav): 样本速率,样本 = wavfile.read(wav) 频率,时间,频谱图 = signal.spectrogram(样本,sample_rate,nperseg=320,noverlap=16,缩放='密度') #dBS = 10 * np.log10(spectrogram) # 转换为 dB plt.subplot(2,1,1) plt.plot(样本[0:3100]) plt.subplot(2,1,2) plt.pcolormesh(时间、频率、频谱图) plt.imshow(谱图,aspect='auto',origin='lower',cmap='rainbow') plt.ylim(0,30) plt.ylabel('频率 [kHz]') plt.xlabel('Fragmento[20ms]') plt.colorbar() plt.show()

【问题讨论】:

    标签: python python-3.x signals spectrogram


    【解决方案1】:

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

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

    然后在绘图中使用变量dBS而不是频谱图

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

    【讨论】:

    • 这很奇怪。将其转换为 dB 似乎并没有改变任何东西。事实上,考虑到彩条输出,某些频率的功率似乎达到了 40k dBs,这很荒谬。像这些数字/1000 这样的东西应该更合理,但我还是不明白这些数字是从哪里来的。顺便说一句。
    • 嗯.. 很奇怪,因为我在我拥有的声音文件上尝试了你的代码,当我使用对数刻度时它运行良好......关于你关于大值的第二点:尝试使用声音文件库而不是 scipy.io.wavread 加载您的 wavfile - 这为我解决了问题。 import soundfile as sfsamples, sample_rate = sf.read(pathToFile')
    • 啊,同时删除plt.imshow(spectrogram,aspect='auto',origin='lower',cmap='rainbow') 行,plt.colormesh 已经完成了这项工作。如果您的采样率为 16k,那么您应该真正看到频率轴上升到 8000 Hz,并且您的绘图应该很好。我认为您的代码没有其他问题。
    • 尝试您的建议,使用 sf.readfile 似乎发生了一些变化,因为现在分贝看起来不同了。尽管如此,它们仍然具有奇怪的值,因为它们都是负数。频率没有改变......这很奇怪,因为我查看了本地变量中的值并且频率数组 max val 是 8000 i.imgur.com/zkruQYh.png
    • 另一方面,我发现使用 colormesh 而不是 imshow,我得到了 x 轴上的 ms 而不是 windows 的频谱图,这对我未来的目的不太有用。 i.imgur.com/jbVUvpP.png
    【解决方案2】:

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

    可以测量的最大频率是(采样频率)/2,所以在这种情况下,您的采样频率可能看起来是 60KHz?

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

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

    【讨论】:

    • 首先,谢谢您的快速回答! (没想到这么快)。如果您仔细查看 Audacity 频谱图屏幕截图的左侧,您会发现它表明采样频率为 16k。无论如何,以防万一我在代码中使用断点确认了这一点,并且 sample_rate 确实是 16k,所以我认为这不是实际问题。
    • 我明白了。 I如果是这种情况,由于奈奎斯特频率,您应该无法获得有关超过 8KHz 频率的任何信息
    猜你喜欢
    • 1970-01-01
    • 2018-09-11
    • 2011-12-01
    • 2014-07-23
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多