【问题标题】:Analyzing Sound in a WAV file分析 WAV 文件中的声音
【发布时间】:2012-01-13 00:51:22
【问题描述】:

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

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

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

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

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

我研究得越多,我就越困惑。如果有人能解释我的错误和误解,我将不胜感激!

【问题讨论】:

    标签: java audio wav


    【解决方案1】:

    FFT 与 volume 无关,而与 frequencies 无关。要了解场景的平均音量,只需对采样值进行平均即可。根据您在语言中将数据作为有符号值还是无符号值获取,您可能必须首先应用绝对函数,以便负幅度不会抵消正幅度,但仅此而已。如果您没有得到您期望的结果,那一定与您在第 20 行中提取单个值的方式有关。

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

    【讨论】:

    • 好的,太好了。我只是担心我没有正确提取振幅。但这听起来像我。出于好奇,如果我确实关心幅度和声功率之间的非线性关系,那会是我应用 FFT 的时候吗?
    • 由该格式表示的幅度峰值处的平线值听起来与平线值 0 完全一样。完全无声。平均价值不是要走的路。要么使用 RMS(我的首选),要么计算 dB 级别,以获得更准确的“音量”值。
    • @AndrewThompson - 好吧,所以我开始相信 RMS 是一个好主意。如果我还想考虑耳朵对频率和幅度的响应方式的非线性(即,如果我想使用 FFT),我该如何结合 RMS 来做到这一点?还是我必须这样做而不是 RMS?
    • 这超出了我的经验水平。我已经在 RMS 上做了一些工作(计算起来非常简单,一旦你有 int 或 float 值)但除此之外什么都没有。
    【解决方案2】:

    我不知道您想要的准确度级别,但一个简单的 RMS(可能还有简单的信号过滤)是许多类似应用程序所需要的。

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

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

    除非您还想进行复杂的频率分析,否则不需要 FFT。耳朵对不同幅度的频率有不同的反应——耳朵对不同频率和幅度的声音的反应不是线性的。在这种情况下,您可以使用 FFT 对另一个精度域执行频率分析。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-17
      • 1970-01-01
      • 2019-07-04
      • 1970-01-01
      相关资源
      最近更新 更多