Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从getByteFrequencyData正确确定以dB为单位的音量_Javascript_Web Audio Api - Fatal编程技术网

Javascript 如何从getByteFrequencyData正确确定以dB为单位的音量

Javascript 如何从getByteFrequencyData正确确定以dB为单位的音量,javascript,web-audio-api,Javascript,Web Audio Api,我知道getByteFrequencyData返回每个频带的音量(以dB为单位)。如何确定VU表中显示的信号的总音量(dB) 大多数情况下,我看到的代码只是简单地将每个频带的音量相加,然后根据频带数对总和进行偏差,但这肯定是不正确的。这意味着每个频带都需要达到6dB,整个信号才能达到6dB。当然,情况并非如此 我的问题是: 如何正确确定信号的总音量 如果minDecibels设置为-96,而maxDecibels设置为0,则我假设0的值转换为-96 dB,255的值转换为0 dB。但是:128的

我知道
getByteFrequencyData
返回每个频带的音量(以dB为单位)。如何确定VU表中显示的信号的总音量(dB)

大多数情况下,我看到的代码只是简单地将每个频带的音量相加,然后根据频带数对总和进行偏差,但这肯定是不正确的。这意味着每个频带都需要达到6dB,整个信号才能达到6dB。当然,情况并非如此

我的问题是:

  • 如何正确确定信号的总音量

  • 如果
    minDecibels
    设置为-96,而
    maxDecibels
    设置为0,则我假设0的值转换为-96 dB,255的值转换为0 dB。但是:128的值意味着什么-48分贝

  • 我认为这取决于你所说的“体积”。如果是信号的能量,那么您可以只取
    getFloatFrequencyData
    输出的平均值,但平均值不应取dB值的平均值。在计算平均值之前,需要将其转换为线性。这是昂贵的;你可以只取时域数据,计算平均平方和,得到相同的答案(几乎相同)
  • 是的,FFT数据转换为dB,然后在最小值和最大值之间线性映射。看

  • 我也一直在努力解决这个问题-从
    getByteFrequencyData
    输出的平均值得出的结果看起来并不正确

    一个简单的解决方案是只返回频率数据的峰值

    var array = new Uint8Array( buffer_size );
    
    listenerNode.onaudioprocess = function(){
    
        // Get the audio data and store it in our array.
        volume_analyser.getByteFrequencyData( array );
    
        // Get the peak frequency value.
        var peak_frequency = Math.max.apply( null, array );
    
        // ...
    }
    

    这会产生在VU仪表显示屏上看起来正常的结果。

    谢谢。我所说的“音量”与专业音频软件中的VU表显示的音量相同。我想创建一个类似的VU。VU仪表应显示-96至0 dB的电平。我该怎么做?谷歌是你的朋友。我发现的一个例子是。这应该让你开始,阅读也是。1.您链接到的示例无效。2.它使用了一个不推荐使用的方法:3。阅读我的问题:我知道如何获取通道数据。我不知道的是如何正确计算以dB为单位的音量。那里的代码说它使用RMS值来获得音量,你可以将其转换为dB进行显示。使用AnalyzerNode的问题在于计时不一定一致。ScriptProcessorNode计时是一致的(如果您选择足够大的缓冲区大小)。我不确定这是否起作用,因为这只会为您提供音量最高的频带音量。但是“总”音量是所有频带音量的混合。我同意,我确实觉得有点不舒服。不过,使用这种方法一段时间后,它的行为确实像我习惯的模拟VU电表。如果我们取平均值,那么只有当所有频率都为0dBFS时,我们才能得到最大音量。在现实世界的设置中,如果一个频带被削波,你想知道它!