Funpack5-3 - 基于 MAX32690EVKIT 实现音频频谱分析与显示
该项目使用了MAX32690EVKIT,实现了音频频谱分析与显示的设计,它的主要功能为:采用 24kHz、24bit 立体声采样,1024 点 Hann 窗 FFT 完成时频转换,TFT 屏幕同步展示时域波形、对数频谱柱状图与主频幅值,同时通过 Codec 硬件模拟通路提供无失真耳机监听。
标签
Funpack活动
FFT
MAX32690
知足常乐
更新2026-08-12
24

一、项目介绍

本项目基于 ADI MAX32690EVKIT 开发平台,搭配板载 MAX9867 音频编解码器,依托 Analog Devices MSDK 与 VS Code 开发环境,结合 I2S DMA 硬件采集、CMSIS-DSP 库 FFT 数字信号处理与 TFT 液晶显示,搭建一套实时音频频谱分析可视化系统。系统支持电脑、信号发生器等音源通过 AUX 线路输入模拟音频,由 MAX9867 完成模拟信号调理、24bit 模数转换,同时提供独立模拟直通耳机监听通道,实现音频采集与听音互不干扰。

系统设定 24kHz 音频采样率,采用 12.288MHz 主时钟匹配 I2S 时序,通过 I2S Ping-Pong 双缓冲 DMA 实现无 CPU 阻塞的连续音频采样;采集到的音频数据经去直流、Hann 窗函数预处理后,执行 1024 点实数 FFT 运算,频率分辨率约 23.4Hz,并通过抛物线插值算法提升单音主频检测精度。程序将处理得到的时域波形、对数刻度频谱柱状图、信号主频与幅值实时刷新至 TFT 屏幕,画面更新帧率约 11.7fps,可直观展示 20Hz~10kHz 音乐全频段能量分布。

项目针对嵌入式音频开发典型问题完成专项优化:采用 MAX9867 硬件模拟直通替代软件音频回环,解决屏幕刷新、DMA 调度导致的耳机杂音、音频断续问题;优化 I2S 外设初始化时序,提前使能外设时钟,规避冷启动初始化卡死故障;增加显示端独立平滑自动增益,解决小音量频谱辨识度低、大音量耳机过载失真问题。经正弦信号、音乐音源完整测试,系统可稳定完成音频实时采集、FFT 频域分析、波形可视化与同步音频监听,可用于音频信号教学演示、音乐频谱可视化、简易音频频率检测等场景。

二、简短的所有使用到的硬件介绍

1、主控芯片:MAX32690

ADI 32 位 ARM Cortex‑M4 内核微控制器,内置硬件 FPU、丰富 DMA 控制器与 I2S 数字音频外设,依靠 CMSIS‑DSP 库硬件加速 FFT 运算,为本项目音频采集、数字信号处理与屏幕刷新提供算力支撑。

2、音频编解码芯片:MAX9867

通过 I2C 总线完成寄存器配置,负责麦克风模拟音频信号放大、滤波与 ADC 模数转换,以 I2S/PCM 数字音频接口向主控传输采样数据,是音频信号采集的核心外设。

3、MAX32690EVKIT 评估底板

官方开发板载体,引出 I2C、I2S 硬件引脚,集成电源电路、复位电路、调试下载接口,提供麦克风物理输入座与 TFT 液晶屏安装接口。

4、TFT 彩色液晶显示屏

作为输出终端,实时绘制音频时域波形、FFT 频域频谱柱状图,满足不低于 10fps 的画面刷新要求。

三、方案框图和项目设计思路介绍

1、方案框图


exported_image.png

外部音频音源经线路输入送入 MAX9867 音频编解码器,芯片分出两条独立通路:硬件模拟直通通道直接驱动耳机,避免数字处理造成音频卡顿;另一路经过 24kHz 24bit 模数转换,通过 I2S 传输至 MAX32690 主控。主控借助 I2C 完成 Codec 参数配置,采用 I2S 双缓冲 DMA 连续采集音频数据;对采样信号做去直流、汉宁窗抑制频谱泄露,调用 CMSIS-DSP 实现 1024 点 FFT 运算并插值优化频率精度,最终将时域波形、对数频谱、主频幅值信息推送至 TFT 屏幕,画面稳定刷新约 11.7fps。

2、总体设计思路

本项目基于 ADI MAX32690EVKIT 评估套件搭建嵌入式音频频谱分析系统,整体分为音频采集层、数字信号处理层、人机显示层三级架构。首先通过 I2C 总线配置 MAX9867 音频 Codec 芯片,完成麦克风模拟音频信号的放大、滤波与模数转换;采用 I2S 外设配合 DMA 双缓冲中断方式不间断抓取 PCM 音频采样数据,避免 CPU 阻塞丢点;对原始音频数据做去直流、加汉宁窗预处理后调用 CMSIS-DSP 库 FFT 算法完成时频域转换,计算各频率点幅值;最终将时域波形曲线、频域频谱柱状图实时刷新至 TFT 彩色液晶屏,画面刷新率满足≥10fps 要求,实现音频实时波形与频谱可视化。

3、分层详细设计逻辑

1)音频采集环节

主控通过 I2C 对 MAX9867 寄存器配置,设定 8kHz~16kHz 采样率、单声道麦克风输入模式,Codec 将模拟声音转为 I2S 串行数字流;MCU 开启 I2S DMA 循环采集,利用半传输 / 全传输中断批量搬运采样数据,保障连续数据流不中断。

2)信号处理环节

对一帧采样数据去除直流分量降低 FFT 频谱泄露,叠加汉宁窗函数优化频谱旁瓣抑制;执行 N 点实数快速傅里叶变换,对复数结果求取模值并做对数压缩,换算为对应频率点能量幅值,提取主频分量与幅度信息。

3)屏幕可视化环节

TFT 显示屏分区绘制:上半区域绘制音频时域连续波形,下半区域绘制频率分段频谱柱状图;采用动态刷新局部刷屏方式降低算力占用,保证整体帧率稳定在 10fps 以上,完成音频频谱直观展示。

四、调试软件介绍、软件流程图及关键代码介绍

本项目软件开发与调试整套工具基于 ADI MSDK 生态,配套 VS Code 完成全流程开发、编译、下载调试,工具清单及作用如下:

1、VS Code(代码编辑器)

核心开发环境,安装 ADI 官方 CodeFusion Studio 扩展、微软 C/C++ 扩展,提供代码高亮、语法补全、工程管理、编译一键操作、GDB 在线调试一体化功能,所有源码、寄存器配置、FFT 算法均在此编写修改。

2、ADI MSDK(Maxim Microcontroller SDK)

MAX32690 底层驱动库,提供 I2C、I2S、DMA、TFT、系统时钟标准化驱动 API,内置 CMSIS-DSP 数字信号处理函数库,直接调用 FFT、窗函数、向量运算接口,无需从零编写底层外设与算法。

3、软件流程图

4、关键代码介绍

MAX9867 寄存器配置代码(模拟直通耳机,无数字回环杂音)

// I2C写入MAX9867寄存器,线路输入直通耳机,DAC静音避免数字回放干扰
uint8_t codec_cfg[][2] = {
{0x0E, 0x0C}, // 左线路输入增益0dB
{0x0F, 0x0C}, // 右线路输入增益0dB
{0x0C, 0x40}, // DAC静音,关闭数字音频回放通路
{0x10, 0x0F}, // 左耳机监听衰减-6dB
{0x11, 0x0F}, // 右耳机监听衰减-6dB
{0x17, 0xEF} // 开启ADC、线路输入、数字音频通路
};
// 循环通过I2C写入全部配置
for(uint8_t i=0; i<sizeof(codec_cfg)/2; i++){
MXC_I2C_WriteReg(MXC_I2C2, 0x18, codec_cfg[i][0], codec_cfg[i][1]);
}

功能说明:舍弃软件 I2S 收发回环,使用 Codec 硬件模拟直通输出耳机,彻底解决屏幕刷新、DMA 调度带来的音频断续、杂音问题;耳机衰减设置 - 6dB,防止大音量音源造成音频过载失真。


I2S 冷启动时序优化代码(解决初始化卡死)

// 先开启时钟,再初始化I2S,规避时钟门控下Flush阻塞卡死
MXC_SYS_ClockSourceEnable(MXC_SYS_CLOCK_ERFO);
MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_I2S);

mxc_i2s_req_t i2s_req;
memset(&i2s_req, 0, sizeof(i2s_req));
// 填充I2S 24kHz、24bit立体声配置参数
i2s_req.word_size = MXC_I2S_WSIZE_24BIT;
i2s_req.sample_rate = 24000;
MXC_I2S_Init(&i2s_req);

功能说明:原程序直接初始化 I2S 会因外设时钟未打开,内部 Flush 函数无限等待导致程序卡死;提前使能 ERFO 高速时钟与 I2S 外设时钟,保证冷启动上电稳定初始化。


FFT 预处理与频谱运算核心代码

float mean = arm_mean_f32(time_samples, FFT_LEN);
// 去直流 + 叠加汉宁窗
for(uint16_t i = 0; i < FFT_LEN; i++){
fft_input[i] = (time_samples[i] - mean) * hann_window[i];
}
// 执行1024点实数FFT
arm_rfft_fast_f32(&rfft_inst, fft_input, fft_output, 0);

// 根据音频RMS幅值动态调整显示增益,限制区间8~96
float rms = arm_rms_f32(fft_input, FFT_LEN);
float target_gain = 0.25f / rms;
target_gain = clamp(target_gain, 8.0f, 96.0f);

功能说明:去除采样直流分量消除频谱基线偏移;Hann 窗大幅降低 FFT 频谱泄露;动态平滑自动增益仅作用于 TFT 频谱柱状图显示,不改变 ADC 原始采样与耳机音量,解决小音量频谱看不清、大音量显示溢出问题。


DMA 双缓冲中断回调逻辑

void I2S_RX_Callback(void)
{
if(MXC_I2S_GetDMAStatus(MXC_I2S_DMA_RX) & MXC_DMA_INT_DONE){
// 当前缓冲采集完成,切换Ping/Pong缓存
swap_audio_buffer();
// 重新配置DMA接收下一帧音频
MXC_I2S_DMAStartRX(MXC_I2S_DMA_RX, next_buf, BUF_LEN);
// 标记一帧数据就绪,触发FFT处理
frame_ready_flag = 1;
}
}

功能说明:采用 Ping-Pong 双缓冲 DMA 不间断采集音频,中断完成后切换缓存,CPU 无需等待采样,保证音频数据流无丢失;帧就绪标志位通知主循环执行 FFT 运算与屏幕刷新,实现采集、运算、显示并行运行。

五、功能展示图及说明

1、静音

2、播放音乐

3、1KHZ特定频率

4、10KHZ特定频率

六、项目中遇到的难题及解决方法

1. I2C2 初始化失败,无法识别 MAX9867 音频芯片

现象:上电后 I2C 总线通信异常,程序探测不到地址 0x18 的 MAX9867,无法读取芯片版本寄存器 0x42,音频采集功能完全失效。

原因:开发板 I2C 跳线未匹配、上电初期总线电平异常,直接读取寄存器会造成总线锁死。

解决方法:核对硬件 I2C 跳线与供电电压;采用异步 I2C 探测机制,多次重试读取芯片版本,只有成功读到 Revision=0x42 后,再写入 Codec 配置寄存器,保证 I2C 通信稳定建立。

2. 采集单音信号时,屏幕显示频率数值翻倍(1kHz 输入显示约 2kHz)

现象:信号发生器输出标准 1kHz 正弦波,频谱识别主频接近 2kHz,频率计算存在固定倍值误差。

原因:软件采样率宏定义与硬件实际 I2S LRCLK 频率不匹配,程序按 48kHz 计算频点,硬件实际为 24kHz 采样。

解决方法:统一修改采样率宏SAMPLE_RATE_HZ = 24000,匹配 12.288MHz 主时钟对应的 24kHz 采样时序;校准后实测 1kHz 显示 1003Hz、5kHz 显示 4997Hz,频率计算误差满足使用要求。

3. 耳机播放存在吱声、音频断续卡顿

现象:音频一边采集一边软件回环播放至耳机,屏幕刷新、FFT 运算时耳机出现杂音、声音断断续续。

原因:软件 I2S RX→TX 数字回环占用 CPU 资源,TFT 绘图、DMA 调度造成音频缓冲欠载,数据流中断。

解决方法:放弃数字软件回环,启用 MAX9867 硬件模拟直通通路,音频监听完全走模拟电路;I2S TX 仅发送静音波形维持 I2S 接收时序,数字处理不再干扰耳机音频输出,播放全程流畅无杂音。

4. I2S 外设冷启动初始化卡死,程序停留在 I2S 初始化阶段

现象:设备冷上电后串口卡死,程序阻塞在MXC_I2S_Init函数内部,无法进入音频采集流程。

原因:I2S 初始化函数内部存在 Flush 清空操作,若外设时钟未提前开启,时钟门控会导致 Flush 无限等待。

解决方法:在调用 I2S 初始化函数前,手动开启 ERFO 高速时钟源与 I2S 外设总线时钟,保证硬件时钟提前就绪,彻底解决冷启动卡死问题。

5. 时域波形显示失真,正弦信号波形严重混叠变形

现象:输入 1kHz 标准正弦波,屏幕绘制的时域波形周期数量过少、曲线畸变,看不出标准正弦形态。

原因:原始 1024 点采样帧直接压缩至极少像素点绘制,采样点压缩比例过大引发时域混叠。

解决方法:波形显示改用 128 点滑动窗口截取绘制,降低压缩倍率,1kHz 信号可正常显示 5 个以上平滑正弦周期,波形还原度大幅提升。

6. 小音量频谱柱状图高度过低看不清,大音量音源耳机容易过载失真

现象:低音量音乐频谱线条微弱难以分辨;音源输入音量较大时,耳机输出破音失真。

原因:频谱显示标尺固定不变,耳机 Codec 默认增益偏高(+6dB),无动态调节机制。

解决方法:

软件增加独立平滑自动增益模块,仅对频谱显示幅值缩放,增益限制在 8~96 区间,不改动 ADC 采样与耳机音量;

修改 MAX9867 寄存器配置,将耳机监听增益设置为 - 6dB,降低模拟通路输出幅度,避免大音量过载破音。

七、心得体会

本次项目打通了音频采集、DSP 运算、人机显示全流程,不仅熟悉了 ADI MSDK 开发环境、FFT 频谱实现等实用技能,更培养了软硬件协同设计、故障分层排查的工程思维,为后续其他嵌入式项目开发打下扎实基础。

附件下载
GPIO.7z
团队介绍
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号