基于STM32 DSP库的音乐频谱设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于STM32 DSP库的音乐频谱设计
成员:游政园刘亚东彭誉
黄文卓程剑张琼燕
班级:电子信息科学与技术1211班
指导老师:***
目录
一、设计任务和性能指标 (2)
1.1 设计任务 (2)
1.2 性能指标 (2)
二、设计方案 (2)
2.1 系统总体方案设计 (2)
2.2 硬件设计 (3)
2.2.1主控MCU模块 (3)
2.2.2电阻触摸液晶显示模块 (4)
2.2.3音频采集模块 (6)
2.2.3按键输入模块 (6)
2.2.4 整体电路布局 (7)
三、系统软件介绍 (7)
3.1 软件实现思路 (7)
3.2 各部分软件实现思路 (8)
3.2.1 硬件初始化 (8)
3.2.2 音频信号的采集 (9)
四、测试结果 (11)
4.1 64分频,即64点基4-FFT频谱与电脑对比测试 (11)
4.2 256分频,即256点基4-FFT频谱与电脑对比测试 (12)
4.3 64分频,即64点基4-FFT频谱与电脑对比测试 (12)
五、结束语 (13)
参考文献 (13)
基于STM32 DSP库的音乐频谱设计报告
摘要:本作品是基于STM32和DSP库的音乐频谱的设计,能够对采集的音频信号进行分频处理并显示在液晶屏上。
本设计主控芯片采用的是大容量增强型ARM Cortex-M3 内核STM32F103ZET6芯片,其运行频率高,运算速度快,主频为72MHZ,可超频至128MHZ,在移植了ST官方的DSP库后运算能力非常强,音频采样使用的是其内部12 位逐次逼近型的模拟数字转换器,采样速度快,转换时间短,精度高,同时显示用的是用FSMC控制的TFT 液晶屏,可以达到非常好的显示效果。
关键字:STM32;DSP库,音乐频谱
一、设计任务和性能指标
1.1 设计任务
设计一个音乐频谱,带有FFT-64点和FFT-256点的音乐柱状显示。
用Altium Designer画出原理图,绘出程序流程图,规范化程序设计。
实现基本功能。
1.2 性能指标
1、音乐频谱显示柱状更新速度快,能实时显示当前音乐频谱分布。
2、整体抗干扰能力强,功能稳定,精度高。
二、设计方案
2.1 系统总体方案设计
本系统有如下部分:STM32F103ZET6单片机核心控制模块、按键输入模块、电阻触摸屏输入模块、ADC音频采样输入模块,Ili9325主控TFT液晶屏显示输出模块。
硬件原理模块框图如下图:
2.2 硬件设计
2.2.1主控MCU模块
此模块为核心控制模块,采用的芯片是ST公司大容量增强型ARM Cortex-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音频采样通道。
硬件初始化函数如下;
void DSPDemoInit(void)
{
SysTick->CTRL&=~(1<<2);//SYSTICK使用外部8MHZ晶振9倍72MHz
ErrorStatus HSEStartUpStatus = ERROR;//定义时钟状态标志
/* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/
/* RCC system reset(for debug purpose) */
RCC_DeInit();//开启RCC并复位
/* Enable HSE */
RCC_HSEConfig(RCC_HSE_ON);//RCC时钟配置为HSE
/* Wait till HSE is ready */
HSEStartUpStatus = RCC_WaitForHSEStartUp();//等待时钟稳定
if(HSEStartUpStatus == SUCCESS)//RCC内部寄存器相关配置
{
/* Enable Prefetch Buffer */
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
/* Flash 2 wait state */
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 = 72 MHz */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
/* Enable PLL */
RCC_PLLCmd(ENABLE);
/* Wait till PLL is ready */
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
/* Select PLL as system clock source */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/* Wait till PLL is used as system clock source */
while(RCC_GetSYSCLKSource() != 0x08);
}
/*------------------- Drivers Initialization -------------------------------*/
/* Initialize the LCD */
STM3210E_LCD_Init();//初始化液晶屏
Adc_Init();//初始化ADC;
/* Clear the LCD */
LCD_Clear(Black);//液晶屏清屏
}
3.2.2 音频信号的采集
1,采样信号处理函数如以下代码
void MygSin(long nfill, long Ampli)// nfill 采样点数,Ampli数据处理是的放大倍数
{
uint32_t i;
for (i=0; i < nfill; i++)//²采样数据填充输入缓存
lBUFIN[i]=Ampli*(Get_Adc_Average(2,1));//将PA2通道采集的AD值放大后写入输入缓存}
2,计算各次谐波幅值,此部分为固定模版,只需改动运算点数nfill的值
先将lBUFOUT分解成实部(X)和虚部(Y),然后计算幅值(sqrt(X*X+Y*Y)
void powerMag(long nfill)
{
int32_t lX,lY;
uint32_t i;
for (i=0; i < nfill; i++)// nfill 采样点数
{
lX= (lBUFOUT[i]<<16)>>16; // 将lBUFOUT分解成实部(X)
lY= (lBUFOUT[i] >> 16); // 将lBUFOUT分解成虚部(Y)
{
float X = nfill *((float)lX)/32768;
float Y = nfill *((float)lY)/32768;
float Mag = sqrt(X*X+ Y*Y)/nfill; 计算幅值(sqrt(X*X+Y*Y)
lBUFMAG[i] = (uint32_t)(Mag*65536);//使得数据符合浮点运算规律
}
}
}
3,进行快速傅立叶变换
void MyFFT_NPT(uint32_t freqinc1) //freqinc1为采样分辨率,N=256, Fs = 47.619khz(STM32的
//AD的采样率)Fs/N=180Hz,
{
u32 freq;
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,幅值显示
void displayPowerMag( )
{
uint16_t aScale;//扫秒高度即要显示的幅值
uint16_t cln; //扫秒宽度即要显示的柱状宽度
for (cln=NPT/2; cln <NPT; cln++)//由于FFT变换后虚部实部对称故只需显示一半
{
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.1 64分频,即64点基4-FFT频谱与电脑对比测试
可能是因为电脑对数据的处理的和我们不一样所以图中频谱有些不一样
4.2 256分频,即256点基4-FFT频谱与电脑对比测试
4.3 64分频,即64点基4-FFT频谱与电脑对比测试
此次测试是64点全显示,由此可看出音频信号经FFT变换后具有对称性如下图所示;
五、结束语
本系统由于硬件接线原因导致音频信号有波动,对信号采集产生干扰,还有就是虽然移植的是DSP库,但由于代码优化不够导致运算一次FFT时间稍有延迟,另外系统的功能有点单一只有频谱显示,本来是做智能家居系统的,但由于带操作系统和图像界面设计到软件各模块之间的兼容性问题还没解决,所以只是单独的使用了这一功能,以后会努力改进的。
参考文献
[1] Cortex-M3权威指南(中文)[J] Joseph Yiu 著宋岩译
[2] 何均,杨明.适合于单片机实现的极值搜索算法[J].单片机与嵌入式系统应用,2004,24.
[3] STM32F10xxx DSP library firmware & FFT_Demo[J] STMicroelectronics (意法半导体) Copyright.2009。