You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从ESP32获取噪声数据:M5StickC麦克风采集振幅数据问询

实现方法

1. 前置准备

首先在setup()函数中调用你写的InitI2SMicroPhone()完成麦克风初始化,同时保留你已经调试好的WiFi连接逻辑。

  • 注意需要在代码头部引入依赖头文件:
#include <driver/i2s.h>
#include <math.h>

如果你的代码中PIN_CLK、PIN_DATA定义报错,可以直接替换为M5StickC麦克风对应的物理引脚:PIN_CLK = 0、PIN_DATA = 34。

2. Loop函数核心逻辑

核心流程是读取I2S原始采样数据→计算噪声振幅→通过WiFi传输数据,具体实现如下:
首先定义全局常量和变量:

// 和I2S配置的dma_buf_len保持一致即可
#define SAMPLE_SIZE 128
// 存储采样数据的buffer
int16_t s_buffer[SAMPLE_SIZE];
// 噪声强度数值,可直接用于WiFi传输
float noise_rms;

Loop函数实现:

void loop() {
    size_t bytes_read = 0;
    // 读取I2S采样数据,超时时间设为100ms
    esp_err_t res = i2s_read(I2S_NUM_0, s_buffer, sizeof(s_buffer), &bytes_read, 100 / portTICK_PERIOD_MS);
    if (res != ESP_OK || bytes_read != sizeof(s_buffer)) {
        // 读取失败延时重试即可
        delay(10);
        return;
    }

    // 计算噪声振幅(RMS均方根,业界通用的噪声强度衡量标准)
    int32_t sum = 0;
    for (int i = 0; i < SAMPLE_SIZE; i++) {
        // 16位带符号采样值,先平方再累加
        sum += (int32_t)s_buffer[i] * s_buffer[i];
    }
    // 计算均方根得到振幅值,数值越大噪声越高
    noise_rms = sqrt(sum / SAMPLE_SIZE);

    // 这里插入你自己的WiFi发送逻辑,把noise_rms作为数据发送即可
    // 串口测试可加下行代码看输出:Serial.printf("Noise RMS: %.2f\n", noise_rms);

    // 控制采样频率,比如每秒采1次就加delay(1000),按需调整
    delay(1000);
}

3. 可选简化方案

如果不需要高精度的噪声衡量,也可以直接取采样值的绝对值最大值作为峰值振幅,计算速度更快:

int16_t peak_amp = 0;
for (int i = 0; i < SAMPLE_SIZE; i++) {
    int16_t abs_val = abs(s_buffer[i]);
    if (abs_val > peak_amp) {
        peak_amp = abs_val;
    }
}
// peak_amp就是噪声峰值振幅,范围0~32767,可直接作为噪声数值传输

内容的提问来源于stack exchange,提问作者Brotchu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 13:09:03