基于STM32单片机的音高识别系统
2024-07-23王盼瑞丁一孟庆瑶曹贺
关键词:单片机;STM32;快速傅里叶变换;FFT;频率识别
中图分类号:TP311 文献标识码:A
文章编号:1009-3044(2024)18-0034-03
2023年全国大学生电子设计竞赛K题的赛题要求设计一款辨音识键奏乐系统。如图1所示,系统包含:5个水杯当作琴键,1个演奏用的敲击棒,1个识别控制器,具有拾音、分析识别、显示、音乐发声等功能。演奏过程中,系统根据水杯被敲击时发出的声音识别出琴键(以与位置标号一致的杯号来标识),由识别控制器发出对应音高(声音频率)的声音[1]。
针对系统功能要求进行如下分析。玻璃杯作为刚性物体,在受到外力敲击作用时,会因振动而发声。由于在玻璃杯中添加了液体,对上述振动作用进行缓冲和阻尼,使得发生振动的玻璃杯的有效面积减小。已知振动的频率与共振面积成反比,也就是说,当玻璃杯中液体的液位越高,敲击所产生的声音频率就越低[2]。此外,敲击玻璃杯会产生多种谐音,包括基音和泛音。基音是整个发声体整体振动产生的音,决定音高;泛音是发声体各部分振动产生的音[3]。在识别频率时,我们只须关注基音的频率,通过提取频谱中最大分量的频率值,即可确定玻璃杯发出的基音频率。
本文介绍一种基于STM32单片机的音高识别系统,可满足系统设计需求,并可应用于乐器调音等使用场合,具备一定的实用价值。
1 方案设计
本系统以STM32单片机为核心,包括电源模块、稳压模块、功放模块、声音传感器模块、扬声器模块和显示模块,系统框图如图2所示。系统使用3.7V锂电池进行供电,通过升压模块升压至5V供给其他部分使用。显示部分采用2.4寸触摸串口屏,仅需使用两条通讯线即可实现屏幕与单片机的输入输出交互。单片机通过对LM386声音传感器模块接收到的声音模拟信号进行采样率为10kHz的模数转换采样后,输入至单片机中的FFT快速傅里叶变换算法模块,遍历整个频谱值,并筛除明显不符合敲击水杯产生声音音高频率范围的分量后(小于2000Hz) ,检测出当前敲击水杯所发出的声音中幅值最大的频率,作为学习特征存储至单片机中[4]。识别时进行特征比较,满足条件即将杯子敲击结果显示在LCD 屏幕上,并发出PWM 波驱动功放模块,使扬声器发出对应音高的声音[5]。
2 系统电路设计
系统硬件主要包含单片机最小系统、电源、显示屏、声音传感器模块、扬声器及其功放电路等模块。以下对单片机最小系统、声音传感器模块和功放电路模块的实物图作简要介绍,其他模块电路功能不再赘述。
2.1 单片机最小系统设计
STM32 是意法半导体推出的一款32 位ARMCortex-M系列单片机。由于其高性能、低功耗以及丰富的外设资源特点,它在嵌入式系统开发中被广泛应用。STM32单片机系列包括多个系列和型号,以满足不同应用需求。它们提供了丰富的外设接口,如通用输入输出口、定时器、串口、SPI、I2C、ADC等,可用于连接各种外部设备。此外,STM32还提供了丰富的开发工具和软件库,方便开发者进行软硬件开发和调试。在本文所设计的系统中,综合考虑单片机性能和成本,选择了LQFP-48封装的STM32F103C8T6型号。该型号单片机的引脚排列如图3所示。
2.2 声音传感器模块电路设计
本文使用LM386声音传感器模块进行声音采样,如图4所示。此模块具有模拟量输出AO和数字量输出DO两个端口。AO端口直接输出模拟电压信号,连接至单片机的PA0引脚进行采样。由于该模块使用3.3V电源供电,输出模拟信号的范围为0~3.3V,与单片机的采样引脚可接收的信号电压范围一致,因此不需要对信号范围进行调整,可以直接进行采样。
当外部的声音信号超过一定强度时,DO 端口变为低电平,因此可以作为是否采集到声音的判断依据。DO 引脚连接到单片机的PB3引脚。
2.3 扬声器及功放电路设计
本文使用0.5W/8Ω 的扬声器进行声音播放。由于单片机引脚没有能力直接驱动扬声器,因此使用PAM8406 功放模块对信号进行放大,如图4 所示。PAM8406 模块为立体声功放模块,本文中只使用了其中的左声道,其输入引脚LIN接至单片机的PWM波形输出引脚PA8上。
3 系统软件设计
系统要求首先对水杯的音高进行学习。学习完成后,随机敲击某个水杯进行测试,系统应能识别出当前敲击的水杯编号。学习部分和测试部分的程序流程图如图5所示。
在学习过程中,当有超过一定强度的声音发出后,系统通过声音传感器模块的DO引脚输出低电平,触发单片机的外部中断,通知单片机当前有声音产生。然后单片机开始以10kHz的频率对声音传感器模块AO输出的模拟电压量进行采样。由于STM32官方提供的FFT库最多支持1024个点,因此采样1024 个点即可停止采样。采样完成后可进行FFT计算以获得声音信号的频率。
进入学习状态后,除了敲击玻璃杯的声音外,其他噪声(如说话声、脚步声等)也会触发声音信号的学习,使得单片机获得错误的声音频率信息。因此,每次FFT运算完成后,都要判断计算得到的频率是否与敲击玻璃杯的频率范围相符,如不相符则丢弃。为了进一步提高学习的精度,每个玻璃杯需要学习三次,取平均值作为最终的输出结果。
当单片机接收到测试指令后,通过外部中断判断声音信号的到来,并通过ADC对声音信号进行采样,然后通过FFT获取测得的声音频率。测试部分与学习部分的区别在于测试时将测得的声音频率与之前学习到的5个水杯的频率进行比对。当测得的声音频率接近已学习的某个水杯的频率(±10Hz) 时,测试成功,输出水杯编号,并驱动扬声器发出对应音调的声音;若比对不成功,则输出0。
4 实验结果
根据上述电路设计和软件设计,搭建了如图6所示的实验平台。按照要求敲击不同水量的水杯,测试结果如表1所示。由测试结果可见,在敲击不同水量的水杯时,本文设计的音高识别系统可以正确识别敲击水杯的频率,并且可以辨别水杯编号,满足设计要求。
5 结束语
本文设计了一种基于STM32单片机的音高识别系统,采用快速傅里叶变换(FFT) 技术对测得的声音信号进行分析识别,获取声音的频率。本文设计的系统可以对敲击不同水位的玻璃杯产生的声音进行在线学习,并可在测试阶段依据学习到的信息进行比对,识别水杯的编号。本文介绍了系统的工作原理、硬件设计、软件设计等,并搭建了实验平台进行测试。测试结果表明,该系统可以正常识别音高,满足设计需要,具备一定的实用价值。