
首先,请注意,您的代码最多绘制100个光谱图(if
processBlock)
被多次调用),你只能看到最后一个。
你可能想解决这个问题。此外,我想你知道你为什么要工作
有30毫秒的录音。就我个人而言,我想不出一个切实可行的办法
使用笔记本电脑麦克风录制30毫秒的应用程序可以提供有趣的
洞察力。它取决于你正在录制的内容以及你如何触发
录音,但这个问题与实际问题相切。
否则代码工作得很好。只需要在
processBlock函数,应用一些背景知识,可以得到
信息丰富且美观的光谱图。
我们来谈谈实际的光谱图。我将把SoX的输出作为
参考文献。colorbar注释说它是“dBFS”1,这是一个
对数测度(dB是
f, t, Sxx = signal.spectrogram(snd_block, RATE) dBS = 10 * np.log10(Sxx) # convert to dB plt.pcolormesh(t, f, dBS)
这提高了色阶。现在我们看到了高频段的噪声
那是以前藏起来的。接下来,让我们讨论时间分辨率。光谱图
将信号分成若干段(默认长度为256)并计算
每个的光谱。这意味着我们有很好的频率分辨率,但非常
时间分辨率差,因为只有少数这样的片段适合信号
窗口(约1300个样本长)。两者之间总是有权衡的
时间和频率分辨率。这与[不确定性]有关
原则. 所以让我们
通过分割信号,用频率分辨率换取时间分辨率
分成较短的部分:
f, t, Sxx = signal.spectrogram(snd_block, RATE, nperseg=64)
太好了!现在我们在两个轴上得到了相对平衡的分辨率-但是等等!
为什么结果如此像素化?!实际上,这就是所有的信息
在30毫秒的短时间内。只有这么多方法可以
以二维分布。不过,我们可以作弊一点,用更高的
FFT分辨率和重叠段。这会使结果更平滑
尽管它没有提供额外的信息:
f, t, Sxx = signal.spectrogram(snd_block, RATE, nperseg=64, nfft=256, noverlap=60)
请看漂亮的光谱干涉图。(这些模式取决于
使用了window函数,但我们不要在这里讨论细节。看到了吗
windowspectrogram函数的参数来处理这些结果
看起来不错,但实际上不包含比
上一个图像。
为了使结果更接近SoX-lixe,我们观察到SoX谱图相当复杂
涂抹在时间轴上。你通过使用原始的低时间获得这种效果
分辨率(长线段),但为了平滑,让它们重叠:
f, t, Sxx = signal.spectrogram(snd_block, RATE, noverlap=250)
我个人更喜欢第三种解决方案,但你需要找到自己的解决方案
首选时间/频率权衡。
最后,让我们使用更像SoX的颜色图:
plt.pcolormesh(t, f, dBS, cmap='inferno')
下面一行的简短评论:
THRESHOLD = 40 # dB
将阈值与输入信号的均方根值进行比较,均方根值不是_测量单位为dB,但为原始振幅单位。
1 FS是满标度的缩写。dBFS意味着dB度量是相对于最大范围。0分贝是世界上最响亮的信号
当前表示,因此实际值必须<=0 dB。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)