基于STM32的音频信号分析设计与实现
作者:梁方舟李金泉黄训磊王玉花
来源:《现代电子技术》2014年第01期
摘要:基于ARM Cortex⁃M3内核的32位处理器STM32F103和快速傅里叶变换(FFT)算法实现了音频信号频谱的分析。
整个系统由前级信号调理、A/D采样电路、CPU运算电路和LCD显示电路等组成。
实验表明,系统能够检测20 Hz~10 kHz范围内的频率成份并显示音频信号频谱,该方案成本低,具有一定的应用价值。
关键词:音频信号; FFT; STM32;基⁃4时间抽取
中图分类号: TN911.7⁃34 文献标识码: A 文章编号: 1004⁃373X(2014)01⁃0019⁃03
音频信号分析应用于音频制作、信号分析等领域,如音频设备的研发与生产、低频信号的综合分析等。
本设计利用频谱分析原理来分析被测音频信号的频率、频谱,传统的频谱分析方法有扫频法、数字滤波法。
采用STM32实现快速傅里叶变换(FFT)设计方案,通过FFT把被测的音频信号由时域信号转换为频域信号,将其分解成分立的频率分量。
1 系统设计
音频信号通过前级信号处理电路放大和滤波及模数转换,经STM32进行FFT运算后获得信号的频谱,单片机控制A/D转换器实时采集信号,频谱在液晶屏扫描显示。
单片机采用ST 公司的低功耗STM32F103ZET6 32位单片机,其内部含有3个12位16通道A/D转换模块和2个12位D/A转换模块。
系统框图如图1所示。
1.1 信号调理与采集
设计思想:为满足输入信号较大的动态范围,必须在信号进行A/D转换前进行合理的处理,使其在A/D量化范围内达到量化精度最高,该方法相当于AD位数的增加。
本设计要求输入信号幅度范围(峰⁃峰值)为0.01 mV~10 V,即100 dB的输入信号动态范围。
设定ADC 芯片的最小输入信号峰⁃峰值为500 mV,再设定ADC的输入动态范围为20lg(10 V/500 mV),即26 dB,故需要5路放大电路,每一路放大倍数固定,分别为62 400,8 000,400,20,1倍。
由于设计小信号放大的增益较大,放大器的选择尤为关键,根据影响放大器输出的主要参数:运放的增益带宽积、噪声电压密度、噪声电流密度、失调电流和失调电压等,选择TI公司生产的运放OPA637,该运放增益带宽积约800 MHz,输入换算电压噪声密度为[4.5 nVHz,]输入偏置电流2 pA,输入失调电压130 μV。
具体电路如图2所示。
图1 系统框图
抗混叠滤波器设计:信号送到ADC之前要对信号进行抗混叠低通滤波器处理,防止高频分量信号被采样,产生频谱混叠,而影响给定较低频率信号的幅值分析。
为此设计了一个截止频率为15 kHz的四阶巴特沃斯低通滤波器作为抗混叠滤波器。
1.2 基⁃4时间抽取FFT
基⁃4时间抽取(Radix⁃4 Decimation In Time,DIT4)的FFT 算法思想是将长序列逐次分解为4个短序列,最后由短序列的DFT逐次合成长序列的DFT。
基⁃4时间抽取相比于基⁃2时间抽取,复数乘法的运算量减少,随之而来运算速度加快,因此这里采用基⁃4时间抽取。
基⁃4时间抽取FFT是将时域序列[x[k]]以前后两部分按奇偶顺序逐级抽取重新排列形成4个短序列,由此4个短序列的DFT合成的频域序列[X[k]]按自然顺序排列,故称为基⁃4时间抽取FFT。
设序列[x[k]]的长度为[N=4M,][M]为正整数。
则基⁃4时间抽取FFT计算公式为:
[Xm=X1m+WmNX2m+W2mNX3m+W3mNX4mXm+N4=X1m-jWmNX2m-
W2mNX3m+jW3mNX4mXm+2N4=X1m-WmNX2m+W2mNX3m-
W3mNX4mXm+3N4=X1m+jWmNX2m-W2mNX3m-jW3mNX4m]
式中:[m=0,1,2,…,N4-1;][X1m,X2m,X3m和X4m]分别是与[x[k]]按对4的余数顺序重新排列后的序列[x1k,][x2k,x3k]和[x4k]对应的[N4]点DFT。
由此可以得出DIT4⁃FFT的蝶形运算的信号流图,如图3所示。
图3 基⁃4时间抽取蝶形运算的信号流图
设采样率为[fs,]则第[fi=ifsN]频率点[Xi=ai+jbi,][i=0,1,2,…,N2-1],则原信号所含该频率的分量[Si]为:
[Si=ai2+bi2N,i=0Si=Aicos2πfit+θi=2ai2+bi2Ncos2πifsNt+arctanbia i,]
[i=1,2,…,N2-1]
通过上式,可从采集的信号中提取出各频率点的幅度值,作为音频信号的分析结果。
1.3 软件设计和流程图
系统软件设计分为采样、量化、基⁃4 FFT、各频率分量幅值计算和液晶屏显示共5个部分。
其中片上ADC完成采样与量化,MCU完成基⁃4 FFT及幅值计算,液晶屏完成最终显示。
软件流程图如图4所示。
图4 软件流程图
软件采用“STM32F10xxx DSP Lib”的1 024点基⁃4 时间抽取FFT,该库的核心FFT算法采用的是汇编语言,速度快、效率高,一次1 024点FFT最快运算时间能达到1.768 ms,因此对整个系统影响很小,故采用之。
通过对基⁃4 FFT的分析,便可设计出幅值计算的算法。
模块代码如下:
ADC_Sample[count_flag++]=ADC_GetConversionValue(ADC1); //转换结果存储
ft_asm_test(ADC_FFT_Out,ADC_Sample);
//调用基⁃4 FFT 变换和幅值计算函数
void fft_asm_test(vu32 *OUT,vu32*IN)
{
cr4_fft_1024_stm32(OUT, IN, NPT); //DSP LIB 1 024点FFT
fft_asm_powerMag(OUT); //计算幅值
}
void fft_asm_powerMag(vu32*p)
{
for(i=0;i
{
AX=(*(p+i)>16; //复数实部
AY=(*(p+i)>>16); //复数虚部
float X=NPT*((float)AX)/32768;
float Y=NPT*((float)AY)/32768;
float Mag=sqrt(X*X+Y*Y)/NPT; //取模
*(p+i)=(u32)(Mag*65535);
//2*模值=对应频率真实幅值的量化值,因只需取前512有效点
}
}
2 系统测试
通过Matlab仿真测试与实际硬件电路测试比较,进而验证系统设计是否符合设计标准。
测试信号为单频信号和方波信号。
Matlab仿真结果和实际测试结果如图5,图6所示。
通过对比图5,图6看出,实际测试结果与仿真结果一致。
图5 Matlab仿真频谱
3 结语
本设计采用数字信号处理技术,在STM32内部完成了1 024点浮点型FFT计算,利用STM32运算速度快,功耗低的优势,实现了对音频信号的频谱分析。
由实验调试结果及测试数据可知,本设计能准确判断频率成分在20 Hz~10 kHz、幅值范围为0.1 mV~10 V 的输入信号的频谱,频率分辨力最高可达10 Hz。
系统对待测量信号2 s刷新一次并可实时显示。
不仅达到设计要求,还进一步提高了频率分辨力,增加了掉电存储回放显示及信号频谱显示的功能,扩展了数据的掉电存储与频谱显示的功能。
图6 实际观察到的频谱
参考文献
[1] 陈后金,薛健,胡健.数字信号处理[M].2版.北京:高等教育出版社,2008.
[2] 王旭东,潘明海.数字信号处理的FPGA实现[M].北京:清华大学出版社,2011.
[3] MEYER⁃BAESE U. Digital signal processing with field programmable gate arrays[M]. 3rd ed. Germany: Springer, 2007.
[4] 全国大学生电子设计竞赛组委会.全国大学生电子设计竞赛获奖作品选编(2007)[M].北京:北京理工大学出版社,2008.
[5] 童诗白,华成英.模拟电子技术基础[M].3版.北京:高等教育出版社,2003.
[6] 黄根春,陈小桥,张望先.电子设计教程[M].北京:电子工业出版社,2007.
[7] Sanjit K Mitra.数字信号处理:基于计算机的方法[M].2版.北京:清华大学出版社,2006.
[8] 刘军.例说STM32[M].北京:北京航空航天大学出版社,2011.
[9] 刘火良,杨森.STM32库开发实战指南[M].北京:机械工业出版社,2013.
[10] 刘保柱,苏彦华.Matlab 7.0从入门到精通[M].北京:人民邮电出版社,2010.。