从麦克风产生光谱图

从麦克风产生光谱图,第1张

从麦克风产生光谱

首先,请注意,您的代码最多绘制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函数,但我们不要在这里讨论细节。看到了吗

window
spectrogram函数的参数来处理这些结果
看起来不错,但实际上不包含比
上一个图像。
为了使结果更接近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。



欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5661610.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-16
下一篇2022-12-16

发表评论

登录后才能评论

评论列表(0条)

    保存