我创建了一个函数来获取输入信号随时间的平均值。最终目标是每五分钟从麦克风信号中获得一个奇数平均数,但我在setInterval部分放了两秒钟来加速测试过程。我已经使用RMS方程式尝试了一些代码,但我似乎无法弄清楚出了什么问题。
absoluteLevel是介于0和1之间的线性级别,它是在上面的函数中生成的。 absoluteLevel变量是全局变量。采样率设置为44100。
提前致谢。
function measureLevel() {
rmsTotal = Math.pow(absoluteLevel, 2) / sampleRate;
counter++;
if (counter === sampleRate) {
rmsAverage = rmsTotal / counter;
counter = 0;
rmsTotal = 0;
}
console.log(rmsTotal);
}
window.setInterval(measureLevel, 2000);
答案 0 :(得分:0)
我假设你的所有变量都已初始化,并且像absoluteLevel一样可用。从我所看到的可能有两个问题:
所以我建议:
function measureLevel() {
meanSquare += Math.pow(absoluteLevel, 2) / sampleRate;
counter++;
if (counter === sampleRate) {
rootMeanSquare = Math.pow(meanSquare, 0.5);
console.log('Counter reached. RMS: ' + rootMeanSquare);
counter = 0;
meanSquare = 0;
}
console.log(meanSquare);
}
window.setInterval(measureLevel, 2000);
我确实为你担心。如果你每2秒运行一次这个功能,并且需要44100个样本用于有效值,那么你需要88200秒才能得到你的RMS输出!!
如果你可以非常快速地获得你的absoluteLevel,你可以通过循环获得更快的测试:
function measureLevel() {
counter = 0;
meanSquare = 0;
while counter < sampleRate {
//RUN A SET ABSOLUTE LEVEL FUNC
meanSquare += Math.pow(absoluteLevel, 2) / sampleRate;
counter++;
console.log(meanSquare);
}
rootMeanSquare = Math.pow(meanSquare, 0.5);
console.log('Counter reached. RMS: ' + rootMeanSquare);
}
window.setInterval(measureLevel, 2000);