如何运行一个随时间推移对数字求和的函数,并将总和记录在一个变量中?

时间:2018-04-09 09:32:13

标签: javascript

我正在尝试创建一个测量麦克风输入水平超过五分钟的平均值的函数,然后将计算总和存储在一个变量中。

目前,间隔设置为每五分钟运行一次,但只计算单个最后一个输入值的平均值,而不是随时间推移的值。

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);

提前致谢。

2 个答案:

答案 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); 

所以要玩的东西:

  • 改变测量之间的超时? (您能多快获得可靠的测量结果,需要多少次测量,......)
  • 而不是使用设定的时间进行测量,您也可以使用一定量的测量值,这样可以更容易,但可能不太理想?