【ESP32-LLM项目】计算音频信号RMS值的函数

下面这个函数是什么作用
float calculateRMS(uint8_t *buffer, int bufferSize)
{
    float sum = 0;
    int16_t sample;

    for (int i = 0; i < bufferSize; i += 2)
    {

        sample = (buffer[i + 1] << 8) | buffer[i];
        sum += sample * sample;
    }

    sum /= (bufferSize / 2);

    return sqrt(sum);
}
 

这个函数用于计算音频信号的RMS(Root Mean Square,均方根)值,这是一种衡量信号幅度的方法。

函数功能详解:

1. 参数说明

  • buffer: 指向音频数据缓冲区的指针

  • bufferSize: 缓冲区总大小(字节数)

2. 数据处理流程

步骤1:提取16位音频样本

sample = (buffer[i + 1] << 8) | buffer[i];
  • 将每2个字节组合成一个16位有符号整数

  • 假设是小端字节序(低位在前,高位在后)

  • buffer[i] 是低字节,buffer[i + 1] 是高字节

步骤2:计算平方和

sum += sample * sample;
  • 对每个样本值求平方并累加

步骤3:计算平均值

sum /= (bufferSize / 2);
  • 除以样本数量(bufferSize/2 因为每2字节一个样本)

  • 得到均方值(Mean Square)

步骤4:开方得到RMS

return sqrt(sum);
  • 对均方值开方,得到RMS值

3. 应用场景

  • 音频电平测量:RMS能准确反映音频信号的平均功率

  • 音量检测:比峰值检测更能代表人耳感知的音量

  • 信号强度分析:在音频处理、语音识别中常用

4. 示例

如果输入是16位PCM音频数据,这个函数会返回一个表示音频信号"平均音量"的浮点数值,数值越大表示音量越大

 
 
 
 

对应的数学公式

这个函数对应的数学公式是:

RMS(均方根)计算公式:

RMS=1N∑i=0N−1xi2

其中:

公式分解:

1. 平方和(对应代码中的循环):


$$\sum_{i=0}^{N-1} x_i^2 = x_0^2 + x_1^2 + \cdots + x_{N-1}^2$$

2. 求平均值(对应 sum /= (bufferSize / 2)):

$$
\text{Mean Square} = \frac{1}{N} \sum_{i=0}^{N-1} x_i^2
$$

3. 开平方根(对应 sqrt(sum)):

RMS=1N∑i=0N−1xi2

具体到代码中的变量:

  • N=bufferSize2 (样本数量)

  • xi = sample (第i个16位音频样本)

  • ∑xi2 = sum (平方累加和)

完整计算过程:

RMS=∑i=0(bufferSize/2)−1samplei2bufferSize/2

这个公式衡量的是信号的有效值,对于音频信号来说,RMS值反映了信号的平均功率水平。

posted @ 2025-10-22 01:54  FBshark  阅读(4)  评论(0)    收藏  举报