Arduino 音频频率检测:基于 FFT 测量最响亮声音峰值
所需元件
- Arduino UNO × 1
- DEVMO 高灵敏度声音检测模块 × 1
- 面包板、跳线、USB 线、电脑
原理简介
模块模拟输出接 A0,Arduino 以 2048 Hz 采样率采集 128 点样本,调用 arduinoFFT 库做汉宁窗 FFT,得到幅度谱,再用 MajorPeak() 找出主频,通过串口打印。
接线
模块 VCC→5V,GND→GND,OUT→A0。
完整代码
#include "arduinoFFT.h"
#define SAMPLES 128
#define SAMPLING_FREQUENCY 2048
arduinoFFT FFT = arduinoFFT();
unsigned int samplingPeriod;
unsigned long microSeconds;
double vReal[SAMPLES];
double vImag[SAMPLES];
void setup() {
Serial.begin(115200);
samplingPeriod = round(1000000 * (1.0 / SAMPLING_FREQUENCY));
}
void loop() {
// 采样
for (int i = 0; i < SAMPLES; i++) {
microSeconds = micros();
vReal[i] = analogRead(0);
vImag[i] = 0;
while (micros() < (microSeconds + samplingPeriod));
}
// FFT
FFT.Windowing(vReal, SAMPLES, FFT_WIN_TYP_HAMMING, FFT_FORWARD);
FFT.Compute(vReal, vImag, SAMPLES, FFT_FORWARD);
FFT.ComplexToMagnitude(vReal, vImag, SAMPLES);
// 主频
double peak = FFT.MajorPeak(vReal, SAMPLES, SAMPLING_FREQUENCY);
Serial.println(peak);
while (1); // 单次运行,复位后重新开始
}
使用提示
- 需在库管理器安装
arduinoFFT。 - 采样率 2048 Hz 可检测最高 ~1 kHz 频率(奈奎斯特定理),如需更高频请提高采样率(受限于 UNO 性能)。
- 模块灵敏度可通过板上电位器调节。
制造工艺
- 用 Arduino 打造绚丽显示器 Ambilight 系统
- 用 Arduino UNO 和 OLED 显示屏制作经典 Pong 游戏:分步教程
- 自制 Arduino 电子宠物「Tamaguino」:复刻经典 Tamagotchi 全攻略
- Arduino UNO 与 DFPlayer Mini 播放音频完整指南
- 智能无线开关控制器:Arduino + 433MHz 远程操控墙壁开关
- Arduino 井字棋游戏:MAX7219 点阵屏 + 纸板外壳 DIY
- 基于 Arduino Nano 的智能运动感应水枪
- 使用 SparkFun 7 段数码管构建可靠的 Arduino 倒计时器
- Arduino 向日葵:制作电子向日葵追踪阳光
- 自制 Arduino 遥控保时捷赛车:从改装底盘到手机 App 控制全攻略
- Arduino 合成乐音:从零实现 88 键钢琴全音域
- 使用 Arduino UNO 和 SR04 超声波传感器构建超声波测距仪