如何在JS中使用RMS对信号进行平均?

时间:2018-04-05 17:52:48

标签: javascript

我创建了一个函数来获取输入信号随时间的平均值。最终目标是每五分钟从麦克风信号中获得一个奇数平均数,但我在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);

1 个答案:

答案 0 :(得分:0)

我假设你的所有变量都已初始化,并且像absoluteLevel一样可用。从我所看到的可能有两个问题:

  1. rmsTotal每次重置而不是累积。
    • 我将名称改为'meanSquare'
  2. 您需要该均方的平方根(平方的平均值)
    • 我将rmsAverage重命名为'rootMeanSquare'
  3. 所以我建议:

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