我正在尝试创建一个测量麦克风输入水平超过五分钟的平均值的函数,然后将计算总和存储在一个变量中。
目前,间隔设置为每五分钟运行一次,但只计算单个最后一个输入值的平均值,而不是随时间推移的值。
function measureLevel() {
average = 0;
for (counter = 0; counter < 75000; counter++) {
average += absoluteLevel / 75000;
}
averageAbsoluteLevel = Math.abs(average);
averageDbLevel = Tone.gainToDb(averageAbsoluteLevel) * scale + offset;
console.log('Counter reached. Average level is: ' + averageDbLevel);
}
window.setInterval(measureLevel, 300000);
提前致谢。
答案 0 :(得分:1)
但只计算单个最后一个输入值的平均值, 而不是随时间推移的值。
您每次都要将平均值设置为0
,您需要记住两件事
最后将总麦克风总和值除以此计时器运行的次数。尝试
(function(){ //create a IIFE so that micSum and timerCounter is localized and don't pollute global namespace
var micSum = 0;
var timerCounter = 0;
window.setInterval(function(){
var absoluteLevel = Math.abs( Tone.Meter.getValue() );
micSum += Tone.gainToDb(absoluteLevel ) * scale + offset; //keep adding to the sum
timerCounter++;
console.log('Counter reached. Average level is: ' + (micSum/timerCounter) ); //take the average by dividing micSum with counter.
}, 300000);
})(); //set the timer
答案 1 :(得分:0)
我想到的方法是收集测量值,直到5分钟过去。您可以使用两个计时器,一个用于收集测量值(间隔,重复),一个超时时间为5分钟以收集平均值(并停止间隔)。
所以这样的事情应该让你开始:
var measurements = []
function collectMeasurement() {
var absoluteLevel = Math.abs( Tone.Meter.getValue() );
measurements.push(absoluteLevel);
}
collectInterval = window.setInterval(collectMeasurement, 100);
function calculateAverage() {
window.clearInterval(collectInterval);
// .. calculate average of all measurements here ..
console.log('Measure for 5 minutes: average level is: ' + calculatedAverage);
}
window.setTimeout(calculateAverage, 300000);
所以要玩的东西: