350|1

6483

帖子

9

TA的资源

版主

楼主
 

【Follow me第二季第4期】任务三:调试PDM麦克风,通过串口打印收音数据和音频波形 [复制链接]

 
一、任务简介
        本任务旨在调试PDM(Pulse Density Modulation)麦克风,并通过串口打印收音数据以及在上位机上展示音频波形。PDM麦克风作为一种数字音频输入设备,具有信号抗干扰能力强、传输效率高等优点,广泛应用于智能音箱、蓝牙耳机等音频设备中。本项目通过Arduino Nano RP2040开发板板载的PDM麦克风,实现音频信号的采集、处理与展示,为后续的音频分析与应用提供基础。
二、物料介绍
        Arduino Nano RP2040开发板(板载数字麦克风)
        USB数据线
        上位机软件:Arduino IDE(串口绘图仪)
三、设计思路
        使用Arduino Nano RP2040开发板进行程序调试,使用的是板载的数字麦克风,通过Arduino IDE进行开发,通过其串口进行输出打印,并可以通过软件自带的串口绘图仪进行波形查看
四、软件流程图
        PDM作为一款专为音频设计的接口,已被Arduino巧妙地封装为PDM库。用户仅需轻松安装此库,即可便捷地实现PDM数据的读取功能。
各任务对应的主要代码片段、功能展示及图文说明
1、硬件接口初始化
#include <WiFiNINA.h>
#include <PDM.h>
bool LED_SWITCH = false;
// default number of output channels
static const char channels = 1;
// default PCM output frequency
static const int frequency = 20000;
// Buffer to read samples into, each sample is 16-bits
short sampleBuffer[512];
// Number of audio samples read
volatile int samplesRead;
void setup() {
  Serial.begin(9600);
  pinMode(LEDB, OUTPUT);
  while (!Serial);
  // Configure the data receive callback
  PDM.onReceive(onPDMdata);
  // Optionally set the gain
  // Defaults to 20 on the BLE Sense and -10 on the Portenta Vision Shields
  // PDM.setGain(30);
  // Initialize PDM with:
  // - one channel (mono mode)
  // - a 16 kHz sample rate for the Arduino Nano 33 BLE Sense
  // - a 32 kHz or 64 kHz sample rate for the Arduino Portenta Vision Shields
  if (!PDM.begin(channels, frequency)) {
    Serial.println("Failed to start PDM!");
    while (1);
  }
}

        初始化串口通信与PDM库,设置PDM参数,并启动PDM接收。

2、数据采集与串口打印
void loop() {
  // Wait for samples to be read
  if (samplesRead) {
    // Print samples to the serial monitor or plotter
    for (int i = 0; i < samplesRead; i++) {
      if (channels == 2) {
        Serial.print("L:");
        Serial.print(sampleBuffer[i]);
        Serial.print(" R:");
        i++;
      }
      Serial.println(sampleBuffer[i]);
    // Clear the read count
    samplesRead = 0;
    }
  }
}
/**
   Callback function to process the data from the PDM microphone.
   NOTE: This callback is executed as part of an ISR.
   Therefore using `Serial` to print messages inside this function isn't supported.
 * */
void onPDMdata() {
  // Query the number of available bytes
  int bytesAvailable = PDM.available();
  // Read into the sample buffer
  PDM.read(sampleBuffer, bytesAvailable);
  // 16-bit, 2 bytes per sample
  samplesRead = bytesAvailable / 2;
}

        接收PDM数据,存储到缓冲区,并通过串口发送数据到上位机。

3、波形绘制
        使用Arduino IDE自带的串口监视器接收数据并绘制波形图:
五、本任务的心得体会
        通过本次调试PDM麦克风的任务,掌握PDM库的使用以及串口通信的原理对于实现音频数据的采集与传输至关重要。还有一点就是对数字麦克风的波形有了更加清楚的认识,在此期间可以看到一些信号的不稳定,杂波的存在。学会了如何利用上位机软件对串口数据进行可视化处理,这对于后续的音频分析与应用提供了极大的便利。不过显示的波形比较短。
代码下载:
test3.zip (1.1 KB, 下载次数: 1)
视频讲解:
任务三

 

最新回复

nice!   详情 回复 发表于 2024-12-15 19:38
点赞(1) 关注(1)
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 

回复
举报

175

帖子

0

TA的资源

一粒金砂(中级)

沙发
 

nice!

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表