Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.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 Web音频API使用AnalyzerNode创建峰值计_Javascript_Audio_Web Audio Api - Fatal编程技术网

Javascript Web音频API使用AnalyzerNode创建峰值计

Javascript Web音频API使用AnalyzerNode创建峰值计,javascript,audio,web-audio-api,Javascript,Audio,Web Audio Api,使用Web Audio API实现类似中的功能的正确方法是什么 我知道返回的是分贝值,但如何组合这些值以获得仪表中显示的分贝值?您是否像下面的代码示例中那样获取最大值(其中analyserData来自getFloatFrequencyData(): let peak=-无穷大; for(设i=0;i峰值){ 峰值=x; } } 检查一些只取最大值的输出结果会让人觉得这不是正确的方法。我错了吗 或者,使用ScriptProcessorNode会更好吗?这种方法有什么不同 你只取最大值吗 对于峰值

使用Web Audio API实现类似中的功能的正确方法是什么

我知道返回的是分贝值,但如何组合这些值以获得仪表中显示的分贝值?您是否像下面的代码示例中那样获取最大值(其中
analyserData
来自
getFloatFrequencyData()

let peak=-无穷大;
for(设i=0;i峰值){
峰值=x;
}
}
检查一些只取最大值的输出结果会让人觉得这不是正确的方法。我错了吗

或者,使用
ScriptProcessorNode
会更好吗?这种方法有什么不同

你只取最大值吗

对于峰值电表,是的。对于VU电表,在测量功率以及模拟电表的弹道时需要考虑各种因素。还有RMS功率测量

在数字土地上,你会发现峰值测量仪对于许多任务来说是最有用的,也是最容易计算的

任何给定样本集的峰值都是该集合中的最高绝对值。不过,首先,您需要该样本集。如果调用
getFloatFrequencyData()
,你没有得到样本值,你得到的是光谱。你想要的是。这些数据是样本的低分辨率表示。也就是说,你的窗口中可能有4096个样本,但你的分析仪可能配置了256个桶……因此这些4096个样本将被重采样到256个样本。这是一般的对于计量任务来说是可以接受的

从这里开始,只需
Math.max(-Math.min(samples),Math.max(samples))
即可获得绝对值的最大值

假设您需要一个更高分辨率的峰值测量仪。为此,您需要能够获得的所有原始样本。这就是ScriptProcessorNode的用武之地。您可以访问实际样本数据


基本上,对于此任务,AnalyzerNode速度更快,但分辨率略低。ScriptProcessorNode速度更慢,但分辨率略高。

如果在一帧中获取最大值
getFloatFrequencyData()
,则测量的是单个频率下的音频功率(以功率最大的为准)。您实际要测量的是任何频率下的峰值-换句话说,您不希望使用频率数据,而是希望未处理的样本不被分离到频率箱中

问题是,你必须自己计算分贝功率。这是一个相当简单的算法:你采集一些样本(一个或多个),将它们平方,然后取平均值。请注意,即使是“峰值”米也可能在进行平均——只是在更短的时间尺度上

下面是一个完整的示例。(警告:产生声音。)

document.getElementById('start').addEventListener('click',()=>{
const context=new(window.AudioContext | | window.webkitadiocontext)();
常量振荡器=context.create振荡器();
振荡器类型='square';
振荡器.frequency.value=440;
start();
const gain1=context.createGain();
常量分析器=context.createAnalyzer();
//降低输出电平,以免伤害您的耳朵。
const gain2=context.createGain();
增益2.gain.value=0.01;
振荡器连接(gain1);
连接(分析仪);
分析仪。连接(gain2);
gain2.connect(context.destination);
函数displayNumber(id、值){
const meter=document.getElementById(id+'-level');
const text=document.getElementById(id+'-level text');
text.textContent=value.toFixed(2);
meter.value=isFinite(value)?值:meter.min;
}
//时域样本始终具有以下计数:
//即使不涉及FFT,也要调整FFT大小。
//(请注意,fftSize只能有特定的值,而不能有
//任意整数。)
Analyzer.fftSize=2048;
const sampleBuffer=新的Float32Array(analyzer.fftSize);
函数循环(){
//改变分析仪的输入功率。振幅线性,因此
//非线性分贝功率。
gain1.gain.value=0.5*(1+Math.sin(Date.now()/4e2));
Analyzer.getFloatTimeDomainData(采样缓冲区);
//计算间隔内的平均功率。
设sumOfSquares=0;
for(设i=0;i
开始

短均线
-分贝

瞬间的 -分贝

@Kaido AudioWorkers现在已经实现了吗?根据MDN,它们不是……同时,ScriptProcessorNode也没有问题。“因此这些4096个样本将被重采样到256个样本。”-这是不正确的。您将以相同的速率获得代表更短时间段的更少样本,而不是重采样。
let peak = -Infinity;
for (let i = 0; i < analyserData.length; i++) {
  const x = analyserData[i];
  if (x > peak) {
    peak = x;
  }
}