分析WAV文件中的声音

时间:2011-12-05 08:27:11

标签: java audio wav

我试图分析一个电影文件,将其分成相机镜头,然后尝试确定哪些镜头比其他镜头更重要。我在镜头重要性考虑的因素之一是在电影的这一部分音量有多大。为此,我正在分析相应的声音文件。我无法确定镜头的响亮程度,因为我不认为我完全理解WAV文件中的数据代表什么。

我使用类似this post中描述的方法将文件读入音频缓冲区。

已经将相应的视频文件分割成了镜头,我现在正试图找到哪些镜头比WAV文件中的其他镜头更响亮。我试图通过提取文件中的每个样本来做到这一点:

double amplitude = (double)((audioData[i] & 0xff) | (audioData[i + 1] << 8));

我读过的其他一些帖子似乎表明我需要对此音频数据应用快速傅立叶变换来获得幅度,这让我想知道我提取的值实际上代表什么。我正在做的是什么?我的声音文件格式是16位单声道PCM,采样率为22,050 Hz。当我尝试分析文件的音量时,我应该使用这个22,050值吗? Other posts建议使用均方根来评估响度。这是必需的,还是更准确的做法?

我越是关注这一点,我就越困惑。如果有人能够揭露我的错误和误解,我将不胜感激!

2 个答案:

答案 0 :(得分:3)

FFT与音量无关,与频率无关。要了解场景的平均声音大小,只需平均采样值即可。根据您是否使用您的语言获得有符号或无符号值的数据,您可能必须首先应用绝对函数,以便负振幅不会抵消正数,但这就是它。如果你没有得到你期望的结果,那就必须与第20行中提取单个值的方式有关。

也就是说,有一些改进可能会或可能不会影响您的任务。感知响度,幅度和声功率实际上是以非线性方式相关的,但只要您只是想要粗略估计音频信号中“正在进行”的程度,我怀疑这对您来说是否相关。当然,人类会听到不同的频率更好或更差 - 例如,蝙蝠发出超声波尖叫声,这对我们来说绝对震耳欲聋,但幸运的是我们根本听不到它们。但同样,我怀疑这与你的任务有关,例如, 22kHz以上的频率(或44kHz?不确定哪个)实际上不能用简单的WAV格式表示。

答案 1 :(得分:3)

我不知道你想要的准确度,但是一个简单的RMS(可能是简单的信号过滤)就是许多类似应用所需要的。

RMS将比峰值幅度好得多。使用峰值幅度就像根据最亮的像素确定图像的亮度,而不是平均。

如果您想过滤信号或将其权衡为感知响度,那么您需要采样率。

除非您想进行复杂的频率分析,否则不应要求FFT。耳朵对不同振幅的频率的响应不同 - 耳朵不会对不同频率和线性的声音作出响应。在这种情况下,您可以使用FFT对另一个准确域进行频率分析。