2009-04-12 118 views
2

我正在研究一个项目,我需要知道从计算机上的麦克风进入的声音的幅度。获取声音文件中给定时间的幅度?

我目前正在使用Python与Snack Sound Toolkit,我可以录制从麦克风进来的音频,但我需要知道音频有多大。我可以将记录保存到一个文件中,并使用另一个工具包从音频文件中读取给定时间点的振幅,或者尝试在音频进入时获取振幅(这可能更容易出错)。

是否有任何库或示例代码可以帮助我解决这个问题?我一直在寻找,到目前为止,Snack Sound Toolkit似乎是我最大的希望,但似乎没有办法直接获得振幅。

回答

3

看一下Snack Sound Toolkit的例子,似乎有一个dbPowerSpectrum函数。

从参考:

dBPowerSpectrum()

计算的声音(在开始选项给定的样品数)的对数FFT功率谱,并返回分贝值的列表。有关其余选项的说明,请参阅部分项目。可选地,可以使用结束选项给出终点。在这种情况下,结果是指定范围内的连续FFT的平均值。它们的默认间隔取自fftlength,但可以使用跳过选项来更改,该选项可指示每步移动FFT窗口的点数。选项:

编辑:我假设当你说幅度,你的意思是多么“响亮”的声音出现在人类,而不是时域电压(这可能是整个长度为0,因为积分例如:10 * sin(t)大于5 * sin(t),但它们的平均值随时间变化为0.(您不想将非交流电压发送给扬声器无论如何))。

要得到多大的声音,您需要确定每个频率分量的幅度。这是通过傅立叶变换(FFT)完成的,该变换将声音分解为频率分量。 dbPowerSpectrum函数似乎给出了每个频率的幅度列表(请原谅,如果这与功率谱的确切定义不同)。要获得总音量,您可以对整个列表进行求和(这将会接近,因为人耳本身具有频率响应,因此它可能会与放大的响度不同)。

1

我完全不同意CookieOfFortune的这个“答案”。

被授予,这个问题很糟糕......但这个答案使事情变得比必要的复杂得多。我假设“振幅”意味着感觉响度。因为技术上(PCM)音频流中的每个采样代表给定时间片上信号的幅度。获得响度表示尝试一个简单的有效值计算:

RMS

| K <

+0

该库没有提供RMS功能。我相信所有频率上的功率谱的积分应该与数学上的RMS成比例(如果不是直接等效的话)。 (功率谱以W/hz为单位,RMS以W为单位。在所有hz上积分,并且剩下W)。 – CookieOfFortune 2009-04-28 20:41:45

0

我不知道这是否会帮助,但 skimpygimpy 提供了用于解析WAVE文件到蟒蛇 序列并返回 - 您可以使用此 直接检查波形样本,并按照您的喜好执行 。你将不得不阅读一些资料, 这些子组件没有记录。