按体积标准化getByteFrequencyData的音频数据

时间:2016-07-22 18:46:25

标签: javascript web-audio

我已在Web Audio API的分析器节点上使用getSpectrum方法创建了getByteFrequencyData方法。返回的音频数据数组是相对于音频源(el或Audio()实例)volume,从0到1的值。

使用音频源的音量我试图规范化从getByteFrequencyData接收的每个值,以便getSpectrum的用户在他们可视化音频时不必担心音量数据

这是getSpectrum的条纹版本

var audioData = new Uint8Array(analyser.binCount);
var spectrum = [];

analyser.getByteFrequencyData(audioData);

for (var i = 0; i < audioData.length; i++) {
  var value = audioData[i];

  //Where I'm trying to calculate the value independent of volume
  value = ((value / audioEl.volume) / 255);

  spectrum.push(value);
}

return spectrum;

W3C spec引用用于计算maxDecibels和minDecibels的返回值的等式。基于我的基本理解,我试图反算数学,所以我得到一个标准化的值,但我不能让它正常工作。我只是通过0到1的音量值来完成此操作时遇到了麻烦。

任何煽动都将不胜感激!这是问题的working example。更改音量滑块将说明问题。

更新7/22/16:感谢@ raymond-toy的回答,我想出了如何将0到1的音量值转换为分贝。

volumeDB = Math.abs((Math.log(volume)/Math.LN10)*20);

获得数据库后,我在W3C规范中反转了等式,

value = ((audioDataValue * volumeDB) / 255) - volumeDB

不幸的是,value仍以某种方式相对于volume结束。有没有人看到我失踪的东西?

2 个答案:

答案 0 :(得分:1)

import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; public class ConnectMSSQLServer { private static final String db_connect_string = "jdbc:sqlserver://Cdsx\\SQxxs"; private static final String db_userid = "aa"; private static final String db_password = "bb"; private Connection controlTableConnection = null; public void dbConnect() { try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); Connection controlTableConnection = DriverManager.getConnection(db_connect_string, db_userid, db_password); } catch (Exception e) { e.printStackTrace(); } } public void dbDisconnect() { try { if (controlTableConnection != null && !controlTableConnection.isClosed()) { controlTableConnection.close(); } } catch (Exception e) { e.printStackTrace(); } } public void createstatement() { Statement statement = controlTableConnection.createStatement(); } } 以dB为单位返回值。您不希望通过audioE1.volume划分这些值。您想要(以某种方式!)audioE1.volume转换为dB值,并从getByteFrequencyData

的值中添加(或减去)

如果您先使用getByteFrequencyData来查看正在发生的事情,可能会更容易理解。

答案 1 :(得分:1)

显然我是个傻瓜的差事。正如@raymond-toy指出的那样,Spectrum值隐含地与体积相关。规范化意味着丢失一部分数据&#34;离开频谱的底部&#34;,这不是我的目标。

如果有人好奇,我最后将audioDataValue除以255,得到一个从0到1的浮点数。