一种基于STM32F103C8T6单片机DSP库的音乐频谱
2020-05-16谢志平
谢志平
(广东省技师学院,广东 惠州 516100)
0 引言
任何周期函数,都可以看作是不同振幅,不同相位正弦波的叠加。利用C语言编程的FFT算法[2]可以把对波形采样回来的数据进行转换,一个模拟信号,假设对其以某个采样率采样了N个数据,经过FFT换算以后,就可以获得这段波形里面含有的不同频率的特征,这就是频谱。
对于音频信号的采集转换,传统的51单片机的ADC转换速度虽然可以满足要求,C语言编程的FFT算法比较容易编写,但带来的缺点就是执行效率低。而且同时要满足ADC转换、FFT运算及LED屏幕的数据刷新显示和其他附加功能时会非常困难了。使用 STM32F103单片机官方的 DSP库[2],采用里面的256位FFT变换,用汇编语言编写,代码执行效率高,使用时只要调用接口函数即可,能同时满足多种任务运行功能。
整个系统分为音频采集与信号处理,红外按键和显示输出部分,系统结构如图1所示。
图1 系统结构框图Fig. 1 System structure diagram
1 硬件电路
1.1 音频选择与音频处理
通过选择开关可以对外置麦克风和外部输入音源进行采集放大。外部话筒信号采集到声音后,经过三极管放大后,经过选择开关可进入集成运放进行 10倍的反相放大。经过放大后输入到单片机的A/D转换端口。外部音频输入J1同样可以经过选择开关接入到10倍的反相放大电路进行放大。该反相放大采用的是轨至轨运算放大器[3]GS8551。该芯片是一种微功率,低零点漂移的CMOS运算放大器,放大器有着1.8 MHz的带宽,轨对轨输入和输出,单电源提电从1.8 V到5.5 V。静态电流低至180 μA,电路见图2。
图2 音频选择与音频处理电路Fig.2 Audio selection and audio processing circuits
1.2 单片机外围与显示屏接口电路
外部输入电源经过稳压芯片进行稳压,得到3.3 V电压给单片机、红外接收头、ISP程序下载供电。采集到的音频信号通过PA0口输入到单片机内部进行转换。一体化红外接收头采用普通的通用接收头,用来接收来自遥控器的信号,方便对频谱显示效果进行切换。全彩点阵屏采用的是HUB-75B接口的室内全彩屏。
图3 单片机外围与显示屏接口电路Fig.3 MCU peripheral interface with the display circuit
该类型显示屏接口定义如下:
表1 全彩HUB-75B接口定义Tab.1 Full color hub-75b interface definition
2 编程算法
如果要进行256点的转换。首先使用定时器进行定时(设置40 KHZ采样率,最高能捕捉20 KHZ的信号),设置每次定时器溢出的时候自动触发一次ADC转换。转换完成后的数据由 DMA[4]自动搬运到内存指定位置,这个采样过程无需CPU干预,提高了效率。在完成256次频率的转换后,等256点全部传输完才会进入到 DMA的中断,这样保证了每个采样点的间隔时间一致。在中断里面将处理完成标志置为1后再继续转换。
每次转换完成的数据用 DSP进行 FFT换算,DSP换算成的FFT输出结果相当于一个复数,将该复数进行求模/2处理后,就代表了该频率点对应上的幅度值了,然后分别送入两个数组,一个用来做柱形效果,一个用来做漂浮点效果。
2.1 ADC采集
单片机通过ADC接口读取音频信号的电压值,音乐信号的频率范围为 20-20 KHz。由采样定理:为采样频率,为频率分辨率,N为采样点,所以一般情况给定了和F0时也就限制了N范围:,信号的最高频率为20 KHz。则FS= 4 0 KHz。为如果对信号进行128点的采样,分辩率为312 Hz。如果采样点改为256,则F0= 1 56 Hz。即设置定时器溢出为0.025 ms,采样点N通过宏定义即可在 DSP库函数里 cr4_fft_256_stm32(FFT_OUT,FFT_IN,NPT)来实现。使用stm32cubemx[5]去配置这些硬件,生成基础代码即可完成相应的功能。
图4 ADC转换流程图Fig.4 ADC conversion flow chart
2.2 FFT算法
ADC采集到的数据产生中断后,就可以直接转换了,通过单片机内部的DSP进行运算处理,运行DSP库里的FFT算法函数[6]即可完成转换。DSP官方库里的FFT算法有三个函数库分别为:
cr4_fft_64_stm32.s/cr4_fft_256_stm32.s/cr4_fft_1024_stm32.s。
以256点为例,FFT算法的过程为:首先STM32库中给出的FFT函数格式如下:
Void cr4_fft_1024_stm32(FFT_OUT, FFT_IN, NPT);
其中,NPT为采样点,通过修改宏定义来修改NPT代表的值,此处为256;FFT_OUT和FFT_IN均是长度为NPT的32位长整型的数组,高16位为实部,低 16位为虚部,FFT_OUT [NPT]用于保存FFT之后的输出值;FFT_IN[NPT]用于保存输入的数值。
对原始数据进行FFT之后,需要对输出数据进行处理。设置一个循环语句,将要采集的频率范围包含在里面,去掉直流分量。将FFT_OUT [NPT]32位的值分别赋予两个变量,一个是实部,一个是虚部。再将其求均方根后除以2就是该频率点对应的信号幅度值。
2.3 LED数据刷新显示
得到了信号的幅度值后,再将这个幅度值进行转换成LED适合的显示方式就形成了频谱效果。点阵的分辨率比较高时,为了提高系统的运行效率,采用定时器中断扫描显示的方法来完成频谱的刷新显示。
3 系统测试
利用函数信号发生器,输出接上扬声器,将函数信号发生器产生正弦波,幅度调到合适的值,从0 Hz到20 KHz开始测试,利用MIC输入采集声音,调节音量电位器,达到合适的灵敏度,显示屏频谱显示基本可以做到准确地跟踪,在 LED显示模式上,改变显示刷新方式,通过红外遥控器上的功能按键做相应的设置,可以进行不同的显示方式,增加多种效果。
4 结语
通过使用 STC8系列单片机单周期指令的速度优势和内部强大的ADC转换功能并结合FFT算法。完成对音乐信号的频谱采集并通过 LED全彩显示屏进行显示,能对普通的声音信号进行简单的频谱分析。同时,对日常生活音影设备增加了美感。