基于STM32 DSP库的音乐频谱设计.docx
《基于STM32 DSP库的音乐频谱设计.docx》由会员分享,可在线阅读,更多相关《基于STM32 DSP库的音乐频谱设计.docx(13页珍藏版)》请在冰豆网上搜索。
基于STM32DSP库的音乐频谱设计
基于STM32DSP库的音乐频谱设计
成员:
游政园刘亚东彭誉
黄文卓程剑张琼燕
班级:
电子信息科学与技术1211班
*******
基于STM32DSP库的音乐频谱设计报告
摘要:
本作品是基于STM32和DSP库的音乐频谱的设计,能够对采集的音频信号进行分频处理并显示在液晶屏上。
本设计主控芯片采用的是大容量增强型ARMCortex-M3内核STM32F103ZET6芯片,其运行频率高,运算速度快,主频为72MHZ,可超频至128MHZ,在移植了ST官方的DSP库后运算能力非常强,音频采样使用的是其内部12位逐次逼近型的模拟数字转换器,采样速度快,转换时间短,精度高,同时显示用的是用FSMC控制的TFT液晶屏,可以达到非常好的显示效果。
关键字:
STM32;DSP库,音乐频谱
一、设计任务和性能指标
1.1设计任务
设计一个音乐频谱,带有FFT-64点和FFT-256点的音乐柱状显示。
用AltiumDesigner画出原理图,绘出程序流程图,规范化程序设计。
实现基本功能。
1.2性能指标
1、音乐频谱显示柱状更新速度快,能实时显示当前音乐频谱分布。
2、整体抗干扰能力强,功能稳定,精度高。
二、设计方案
2.1系统总体方案设计
本系统有如下部分:
STM32F103ZET6单片机核心控制模块、按键输入模块、电阻触摸屏输入模块、ADC音频采样输入模块,Ili9325主控TFT液晶屏显示输出模块。
硬件原理模块框图如下图:
2.2硬件设计
2.2.1主控MCU模块
此模块为核心控制模块,采用的芯片是ST公司大容量增强型ARMCortex-M3内核STM32F103ZET6芯片为主控,其供电可直接采用锂电池进行供电,其接口电路如下图所示;
2.2.2电阻触摸液晶显示模块
显示模块采用的是ili9325控制的256色TFT电阻触摸液晶屏,通过STM32的FSMC控制器接口控制。
其接口电路如下图所示;
为了节省资源就把用XPT2046控制的电阻触摸屏和TFT液晶显示屏设计在一起,触摸屏是通过SPI和STM32进行通讯,触摸屏是可以当作按键来使用实现物理按键的功能,其内部结构如下图所示;
2.2.3音频采集模块
音频采集模块是通过电脑音频输出口的音频传输线直接将音频信号接入STM32的PA2口,由其内部12位逐次逼近型的模拟数字转换器进行转换,基准电压源VREF+采用的是AMS1117-3.3输出的3.3V,VREF-采用的是接地的方式。
2.2.3按键输入模块
按键输入可以实现多功能复用,既可以当普通按键使用实现功能切换,也可以作为STM32的待机唤醒键。
2.2.4整体电路布局
三、系统软件介绍
3.1软件实现思路
整个软件设计共有五个部分,分别是硬件初始化,ADC音频信号采集,读取ADC采样结果并进行转换(数据采样处理),对采集的数据进行分频处理(用的是DSP库函数,快速傅立叶变换64点FFT或256点FFT)、将处理过的数据转换成在液晶屏上显示的点数进行显示。
为了保证对音频信号采样的有效性必须使采样频率是信号频率的两倍以上。
3.2各部分软件实现思路
软件设计流程图如下图所示;
等待转换完成
转换完成
3.2.1硬件初始化
首先配置STM32的时钟,使能外部8MHZ晶振9倍频作为时钟源,使其工作在最大频率72MHZ,并开启其内部RCC功能,即对STM32的RCC进行初始化,STM32在进行数据处理和运算时需要用到,初始化按键,初始化TFT触摸液晶屏并清屏,初始化ADC选择PA2作为ADC音频采样通道。
硬件初始化函数如下;
voidDSPDemoInit(void)
{
SysTick->CTRL&=~(1<<2);//SYSTICK使用外部8MHZ晶振9倍72MHz
ErrorStatusHSEStartUpStatus=ERROR;//定义时钟状态标志
/*SYSCLK,HCLK,PCLK2andPCLK1configuration-----------------------------*/
/*RCCsystemreset(fordebugpurpose)*/
RCC_DeInit();//开启RCC并复位
/*EnableHSE*/
RCC_HSEConfig(RCC_HSE_ON);//RCC时钟配置为HSE
/*WaittillHSEisready*/
HSEStartUpStatus=RCC_WaitForHSEStartUp();//等待时钟稳定
if(HSEStartUpStatus==SUCCESS)//RCC内部寄存器相关配置
{
/*EnablePrefetchBuffer*/
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
/*Flash2waitstate*/
FLASH_SetLatency(FLASH_Latency_2);
/*HCLK=SYSCLK*/
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/*PCLK2=HCLK*/
RCC_PCLK2Config(RCC_HCLK_Div1);
/*PCLK1=HCLK/2*/
RCC_PCLK1Config(RCC_HCLK_Div2);
/*PLLCLK=8MHz*9=72MHz*/
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
/*EnablePLL*/
RCC_PLLCmd(ENABLE);
/*WaittillPLLisready*/
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);
/*SelectPLLassystemclocksource*/
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/*WaittillPLLisusedassystemclocksource*/
while(RCC_GetSYSCLKSource()!
=0x08);
}
/*-------------------DriversInitialization-------------------------------*/
/*InitializetheLCD*/
STM3210E_LCD_Init();//初始化液晶屏
Adc_Init();//初始化ADC;
/*CleartheLCD*/
LCD_Clear(Black);//液晶屏清屏
}
3.2.2音频信号的采集
1,采样信号处理函数如以下代码
voidMygSin(longnfill,longAmpli)//nfill采样点数,Ampli数据处理是的放大倍数
{
uint32_ti;
for(i=0;ilBUFIN[i]=Ampli*(Get_Adc_Average(2,1));//将PA2通道采集的AD值放大后写入输入缓存
}
2,计算各次谐波幅值,此部分为固定模版,只需改动运算点数nfill的值
先将lBUFOUT分解成实部(X)和虚部(Y),然后计算幅值(sqrt(X*X+Y*Y)
voidpowerMag(longnfill)
{
int32_tlX,lY;
uint32_ti;
for(i=0;i{
lX=(lBUFOUT[i]<<16)>>16;//将lBUFOUT分解成实部(X)
lY=(lBUFOUT[i]>>16);//将lBUFOUT分解成虚部(Y)
{
floatX=nfill*((float)lX)/32768;
floatY=nfill*((float)lY)/32768;
floatMag=sqrt(X*X+Y*Y)/nfill;计算幅值(sqrt(X*X+Y*Y)
lBUFMAG[i]=(uint32_t)(Mag*65536);//使得数据符合浮点运算规律
}
}
}
3,进行快速傅立叶变换
voidMyFFT_NPT(uint32_tfreqinc1)//freqinc1为采样分辨率,N=256,Fs=47.619khz(STM32的//AD的采样率)Fs/N=180Hz,
{
u32freq;
for(freq=20;freq<20000;freq+=freqinc1)//对音频信号频率扫描;音频信号:
20-20KHZ;
{
MygSin(NPT,6.6);//音频信号最大值为1V,最小值为0V,振幅为(1+0)/2=0.5,放大倍//数为3.3/0.5=6.6
cr4_fft_256_stm32(lBUFOUT,lBUFIN,NPT);//DSP库函数基4-256点FFT,输入lBUFIN,输//出lBUFOUT,点数NPT
powerMag(NPT);//幅值计算;
displayPowerMag();//幅值显示
}
}
4,幅值显示
voiddisplayPowerMag()
{
uint16_taScale;//扫秒高度即要显示的幅值
uint16_tcln;//扫秒宽度即要显示的柱状宽度
for(cln=NPT/2;cln{
aScale=lBUFMAG[cln];//获取幅值;
LCD_SetTextColor(Black);//设置显示颜色
if(aScale>=232)aScale=232;//当大于232时显示232,防止满屏
LCD_DrawLine(aScale,(2*cln)+32-256,240-aScale,Vertical);//清除以前的柱状点;
LCD_DrawLine(aScale+2,(2*cln)+32-256,1,Vertical);//清除柱状上的漂浮物;
LCD_SetTextColor(Red);//设置柱状显示颜色
LCD_DrawLine(0,(2*cln)+32-256,aScale,Vertical);//以柱状形式显示幅值
LCD_SetTextColor(Green);//设置漂浮物显示颜色
LCD_DrawLine(aScale+2,(2*cln)+32-256,1,Vertical);//显示柱状上的漂浮物
}
四、测试结果
4.164分频,即64点基4-FFT频谱与电脑对比测试
可能是因为电脑对数据的处理的和我们不一样所以图中频谱有些不一样
4.2256分频,即256点基4-FFT频谱与电脑对比测试
4.364分频,即64点基4-FFT频谱与电脑对比测试
此次测试是64点全显示,由此可看出音频信号经FFT变换后具有对称性如下图所示;
五、结束语
本系统由于硬件接线原因导致音频信号有波动,对信号采集产生干扰,还有就是虽然移植的是DSP库,但由于代码优化不够导致运算一次FFT时间稍有延迟,另外系统的功能有点单一只有频谱显示,本来是做智能家居系统的,但由于带操作系统和图像界面设计到软件各模块之间的兼容性问题还没解决,所以只是单独的使用了这一功能,以后会努力改进的。
参考文献
[1]Cortex-M3权威指南(中文)[J]JosephYiu著宋岩译
[2]何均,杨明.适合于单片机实现的极值搜索算法[J].单片机与嵌入式系统应用,2004,24.
[3]STM32F10xxxDSPlibraryfirmware&FFT_Demo[J]STMicroelectronics(意法半导体)Copyright.2009