【问题标题】:How to get sound amplitude of my wav file with respect to time?如何获得我的 wav 文件相对于时间的声音幅度?
【发布时间】:2012-05-05 10:45:21
【问题描述】:

我有一个 wav 文件,我只需要在播放非常强烈的声音时执行一项功能。

例如:如果正在播放强度级别 10(假设)的声音,那么我希望当声音强度级别从 10 增加时,应该触发一个事件来告诉我有一个非凡的声音。

我尝试谷歌它,发现如果我们读取 wav 文件的字节并读取数据块(第 44 个字节之后),我们会得到用户数据(声音数据)。但是当我分析这些数据时,我感到很困惑,因为也有相同的数据没有声音。

我希望我的问题很清楚。 所以请我需要你的建议/想法和参考。

【问题讨论】:

    标签: c# audio fft


    【解决方案1】:

    您不需要 FFT - 您只需计算短期 RMS 功率,当它超过预定阈值时,您就会听到“响亮”的声音。

    power_RMS = sqrt(sum(x^2) / N)
    

    其中 x 是样本值,N 是要计算 RMS 功率的样本数 - 我建议使用 10 ms 的周期,在 44.1 kHz 的采样率下给出 N = 441 个样本。

    【讨论】:

    • 您能否详细说明这一行“我建议在 44.1 kHz 采样率下使用 10 ms = 441 个样本。”
    • 简单 - 您只需计算波形中每个 N 个样本块的 power_RMS。如果您的采样率为 441 kHz,我建议使用 N = 441,但您可能需要根据您的特定应用尝试块大小。
    • :: 将wav文件的字节数组转换成INT16数组后的样本值能否为负数???
    • byte[] data = File.ReadAllBytes(File_textBox.Text); var samples=new int[data.Length];诠释 x = 0; for (int i = 44; i
    • 样本应该是正数和负数,大致对称,平均值约为零。请注意,8 位样本值通常是偏移二进制,而 16 位样本通常是 2s 补码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    相关资源
    最近更新 更多