STM32音乐频谱分析要点
- 格式:doc
- 大小:1.87 MB
- 文档页数:13
(纯干货)使用STM32测量频率和占空比的几种方法
使用平台:官方STM32F429DISCOVERY开发板,180MHz的主频,定时器频率90MHz。
相关题目:
(1)测量脉冲信号频率f_O,频率范围为10Hz~2MHz,测量误差的绝对值不大于0.1%。
(15分)
(2)测量脉冲信号占空比D,测量范围为10%~90%,测量误差的绝对值不大于2%。
(15分)
思路一:外部中断
思路:这种方法是很容易想到的,而且对几乎所有MCU都适用(连51都可以)。
方法也很简单,声明一个计数变量TIM_cnt,每次一个上升沿/下降沿就进入一次中断,对TIM_cnt++,然后定时统计即可。
如果需要占空比,那么就另外用一个定时器统计上升沿、下降沿之间的时间即可。
缺点:缺陷显而易见,当频率提高,将会频繁进入中断,占用大量时间。
而当频率超过100kHz时,中断程序时间甚至将超过脉冲周期,产生巨大误差。
同时更重要的是,想要测量的占空比由于受到中断程序影响,误差将越来越大。
总结:我们当时第一时间就把这个方案PASS了,没有相关代码(这个代码也很简单)。
不过,该方法在频率较低(10K以下)时,可以拿来测量频率。
在频率更低的情况下,可以拿来测占空比。
思路二:PWM输入模式
思路:翻遍ST的参考手册,在定时器当中有这样一种模式:
简而言之,理论上,通过这种模式,可以用硬件直接测量出频率和占空比。
当时我们发现这一模式时欢欣鼓舞,以为可以一步解决这一问题。
2020年软 件2020, V ol. 41, No. 4一种基于STM32F103C8T6单片机DSP 库的音乐频谱谢志平(广东省技师学院,广东 惠州 516100)摘 要: 利用STM32单片机内部的DSP 库功能,将外部输入的音乐信号放大后再送入单片机内部的A/D 转换器,运用STM32内部DSP 库功能进行FFT 运算,采用中断扫描技术,将音乐信号的频谱在32X64全彩点阵屏进行显示,能对音乐信号的频谱进行简单的分析,实现多种随音乐节奏舞动的视觉效果。
关键词: 单片机;DSP 库;FFT ;中断扫描技术中图分类号: TP3 文献标识码: A DOI :10.3969/j.issn.1003-6970.2020.04.042本文著录格式:谢志平. 一种基于STM32F103C8T6单片机DSP 库的音乐频谱[J]. 软件,2020,41(04):200 202+228A Music Spectrum Based on DSP Library of STM32F103C8T6 MicrocontrollerXIE Zhi-ping(Guangdong technician college, huizhou 516100, China )【Abstract 】: Use of STM32 MCU internal DSP library function, the music of external input signal amplification and then sent into single chip microcomputer internal A/D converter, use STM32 internal DSP library functions for FFT arithmetic, using interrupt scanning technology, the music signal spectrum in 32 x64 lattice screen for display, full-color to simple music signal spectrum analysis, realize the visual effect of A variety of dance with the music rhythm.【Key words 】: Single chip microcomputer; DSP library; FFT; Interrupt scanning technique0 引言任何周期函数,都可以看作是不同振幅,不同相位正弦波的叠加。
基于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倍。
STM32官方DSP的FFT库使用STMicroelectronics提供了用于STM32系列微控制器的官方DSP库,其中包括了快速傅里叶变换(FFT)的实现。
FFT是一种将时域信号转换为频域信号的算法,常用于音频处理、图像处理、通信系统等领域。
使用STM32官方DSP库中的FFT功能,需要以下几个步骤:2. 配置工程:在工程的编译选项中,确保已启用浮点运算支持。
这可以通过设置编译器选项“-u _printf_float”来实现。
3.初始化FFT配置:在使用FFT之前,需要初始化FFT的配置,包括长度、窗函数、比例缩放系数等。
例如,对于一个长度为N的FFT,可以使用arm_cfft_radix4_init_f32函数来初始化:```arm_cfft_radix4_instance_f32 S;arm_cfft_radix4_init_f32(&S, N, 0, 1);```4.执行FFT变换:在进行FFT变换之前,需要准备好输入缓冲区,并确保输出缓冲区具有足够的大小来存储FFT的结果。
例如,如果要对一个长度为N的实数序列进行FFT变换,可以使用arm_cfft_radix4_f32函数:```float32_t input[N];float32_t output[N*2];//将输入数据复制到输入缓冲区arm_cfft_radix4_f32(&S, input);//处理输出数据```注意,为了存储FFT结果中的实部和虚部,输出缓冲区的大小应为FFT长度的两倍(N*2)。
5.访问FFT结果:FFT变换的结果保存在输出缓冲区中。
对于每个频率分量,实部和虚部分别存储在相邻的位置上。
例如,要获取第n个频率分量的实部和虚部,可以使用以下代码:```float32_t re = output[2*n];float32_t im = output[2*n+1];```以上是使用STM32官方DSP库进行FFT的基本步骤。
• 123•基于STM32的多功能音乐播放器设计绵阳职业技术学院 罗金生 王荣海 李 岷 刘 成以音乐播放器为研究对象,提出一种基于STM32的音乐播放器的硬件和软件的设计方法,系统以STM32F103ZET6为控制核心,音频解码芯片VS1053B实现音频数据解码,挂载FATFS文件系统实现对SD卡中的音频文件进行读取,利用FFT快速傅里叶变换将音频信号转为频谱,加入了一个小型GUI显示界面配合OLED显示屏,实时的将界面、播放状态以及频谱生动的展示出来,此外还加入了蓝牙音频功能,通过手机蓝牙即可连接播放器播放音乐。
实验表明,该音乐播放器连接耳机能流畅播放多种格式的音乐文件,具有多功能、高性能、低功耗、操作方便、稳定可靠等特点。
引言:音乐可能是人类史上最古老、最具普遍性以及感染力的艺术形式之一。
音乐能提高人的审美能力,净化人们的心灵,树立崇高的理想。
不论时代怎么发展,人们的生活娱乐都离不开音乐。
因此,设计一款简单实用,多功能化的音乐播放器完全可以符合人们的爱好及需求。
本文介绍一种基于STM32F103处理器的SDIO接口模块及外围音频解码芯片实现一个SD卡的音乐播放器,它读取存储在SD卡里的音频格式文件,并通过立体声音解码芯片输出,能进行频谱显示,还可以通过手机蓝牙与其连接播放音乐等功能。
1.系统硬件电路设计基于STM32F103VET6微控制器所设计的MP3播放器,主要包括:存储模块、蓝牙音频模块、音频解码模块、显示模块。
系统方案设计的系统框图如图1所示。
主控制器芯片,利用其SDIO接口不断读取SD卡音频文件送入缓存区;使用了三组SPI接口,第一组SPI接口将读取的音频数据流送至音频解码芯片VS1053进行解码,第二组SPI接口连接了字库存储芯片,用于显示歌曲名等,第三组SPI接口连接OLED显示屏幕实现人机交互以及显示歌曲信息和频谱等;使用了一个定时器、一个DMA以及一个ADC通道实时快速采集音频输出,并利用FFT将其从时域转换为频域;使用通用IO控制蓝牙以及音频切换芯片和键盘。
stm32的傅里叶变换库傅里叶变换(Fourier Transform)是数字信号处理(DSP)中一种重要的技术,可以将一个信号从时域转换为频域。
STMicroelectronics公司的STM32系列微控制器是业界广泛使用的ARM Cortex-M内核的产品之一,它在硬件和软件方面都提供了强大的处理能力和丰富的资源。
对于使用STM32进行傅里叶变换的应用,STMicroelectronics公司也提供了一些相关的软件库和驱动。
在STM32的傅里叶变换库中,一种常见的实现是通过使用Fast Fourier Transform(FFT)算法来进行傅里叶变换。
FFT是一种快速且高效的计算离散傅里叶变换(DFT)的算法,它将原本需要O(N^2)次乘法运算的DFT算法降低到仅需要O(NlogN)次运算。
在STM32的傅里叶变换库中,提供了一系列用于不同数据类型和长度的FFT函数。
一个常见的应用是在音频处理中对音频信号进行频谱分析。
例如,我们可以将音频信号采样后进行FFT处理,得到频谱数据,从而实现音频频谱的可视化。
在STM32的傅里叶变换库中,有一些函数可用于将采样的音频信号进行FFT处理,并获得频谱信息。
另一个常见的应用是图像处理中的频域滤波,可以通过傅里叶变换将图像从空域转换到频域,然后对图像在频域中进行滤波处理,最后再通过逆傅里叶变换将图像恢复到空域。
在STM32的傅里叶变换库中,也提供了一些函数用于实现频域滤波。
除了FFT算法,STM32的傅里叶变换库中还包括其他相关算法和函数,例如卷积、相关、自相关等。
这些函数可以用于实现一些其他信号处理应用中的功能。
在使用STM32的傅里叶变换库时,我们需要了解一些基本的使用方法。
首先,我们需要初始化相应的库,并配置好相关的参数,例如采样频率、采样点数和数据类型。
然后,我们可以使用提供的函数对输入数据进行处理,并获得相应的输出结果。
最后,我们可以根据输出结果进行相应的应用。
基于STM32的PWM音乐播放器应用设计摘要:PWM(脉冲宽度调制)音乐播放器是一种利用STM32系列微控制器的PWM输出来生成音频信号实现音乐播放的应用。
本文将介绍一个基于STM32的PWM音乐播放器的应用设计,包括硬件设计和软件设计。
1.引言PWM音乐播放器是一种简单且成本低廉的方式来实现音乐播放。
由于STM32系列微控制器具有PWM输出功能,并且具备足够的计算能力,因此非常适合用来设计PWM音乐播放器。
本文将介绍如何设计一个基于STM32的PWM音乐播放器的应用。
2.硬件设计硬件设计包括STM32微控制器的选择和PWM输出电路的设计。
2.1STM32微控制器的选择选择合适的STM32微控制器是设计PWM音乐播放器的关键。
首先要考虑到音频数据的存储和处理能力,可以选择具有足够存储空间和计算能力的STM32微控制器。
另外,PWM输出的质量也非常重要,因此要选择具有高分辨率PWM输出的STM32微控制器。
推荐选择STM32F4系列微控制器,例如STM32F4072.2PWM输出电路的设计PWM输出电路的设计是为了保证音频信号的质量和输出功率。
可以使用一个低通滤波器来过滤PWM输出信号,以消除高频成分,然后将滤波后的信号放大,以增加输出功率。
在PWM输出电路中,还可以添加一些保护电路,以预防意外的电压过冲或过电流等情况。
3.软件设计软件设计包括音频数据的处理和PWM输出的控制。
3.1音频数据的处理音频数据可以从存储器或外部设备中读取,然后进行解码和处理。
可以使用一些常见的音频格式,如MP3或WAV,来存储音频数据。
可以使用适当的库或算法来解码音频数据,并将其转换为适合PWM输出的格式。
在将音频数据转换为PWM输出格式之前,可以应用一些音效或滤波器,以改变音频的音效或调整音频的频率等。
3.2PWM输出的控制PWM输出可以通过设置定时器和占空比来控制。
可以根据音频数据的采样率和音频输出的所需频率来设置定时器的频率。
STM32 音乐频谱分析2011-12-11 03:06:03| 分类:制作类| 标签:|举报|字号大中小订阅呵呵,在昨天的基础上,进行了改进。
采样频率为12.3Khz,256点FFT。
视频:其实这玩意不难做,音频信号采集,我的方法是将电脑出来的信号用TDA2822放大,然后给单片机AD口,剩下就是软件上的了。
说起TDA2822,还是挺不错的一款功率放大芯片,本只想用来做信号放大用的,但baidu了下它和看它的数据手册,都多用来做小功率功放。
呵呵,那就也做一个吧。
TDA2822的典型应用电路如下:这电路很普通,没什么特别,参数也不用调整,直接搭出来,就正常的工作。
接下来就是将放大后的信号给单片机,这里问题就来了,电路中C4,C5是干什么,给单片机的话要不要加?于是开始baidu,google,但没找到合适解答,于是翻了翻模电书,里面还真讲到功率放大器,,TDA2822是OTL功放,输出电容起耦合作用,因为OTL功放在在静态时输出端都会有Vcc/2伏的输出,这样会搞坏喇叭,所以需要加个电容,隔离。
单片机处理的话就不用输出电容了。
如果用示波器一看,结果就很明显,如下图,下面的信号是加了电容,上面是没加。
做好电路后理所当然的准备将功放输出端接到单片机上,但突然一想,不对啊,功放我给11.1V供电,那输出不就有5V左右电压?而STM32是3.3V!不烧了才怪!幸好TDA2822工作电压范围在1.8~12V间,所以就给它3.3V行了。
这样一来基本就没问题了。
第二个的输出电容还是保留,作个对比。
好了,接下来就是程序了。
首先就得确定采样率,就是间隔多久采一个点。
刚开始不是很懂,用的40kHz,也成,但要是做音频频谱分析没必要那么高了。
这里有些资料:音频的频率范围及表现力度音频的频率范围、音质的评价标准一般认为20Hz-20kHz是人耳听觉频带,称为“声频”。
这个频段的声音称为“可闻声”,高于20kHz的称为“超声”,低于20Hz的称为“次声“。
所谓声音的质量,是指经传输、处理后音频信号的保真度。
目前,业界公认的声音质量标准分为4级,即:数字激光唱盘CD-DA质量,其信号带宽为10Hz~20kHz;调频广播FM质量,其信号带宽为20Hz~15kHz;调幅广播AM质量,其信号带宽为50Hz~7kHz;电话的话音质量,其信号带宽为200Hz~3400Hz。
可见,数字激光唱盘的声音质量最高,电话的话音质量最低。
除了频率范围外,人们往往还用其它方法和指标来进一步描述不同用途的音质标准。
音频频率范围一般可以分为四个频段,即:低频段(30—150HZ);中低频段(30—150HZ);中低频(150—500HZ);中高频段(500—5000HZ);高频段(5000—20kHZ)。
30—150HZ频段:能够表现音乐的低频成分,使欣赏者感受到强劲有力的动感。
150—500HZ频段:能够表现单个打击乐器在音乐中的表现力,是低频中表达力度的部分。
500—5000HZ频段:主要表达演唱者或语言的清淅度及弦乐的表现力。
5000—20kHZ频段:主要表达音乐的明亮度,但过多会使声音发破。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 所以我选则12kHz左右的采样率。
下面的DSP_Lib文件夹就是ST公司提供的DSP库。
FFT,PID等都是用汇编写的。
将ST提供的FFT表加载到内存中,速度是快一些,1024点只需1.7ms左右,我觉得效率算是蛮高了。
接下来就是代码了:#include <stm32f10x_lib.h>#include <math.h>#include "stm32_dsp.h"#include "table_fft.h"#include "sys.h"#include "usart.h"#include "delay.h"#include "timer.h"#include "LED.h"#include "ADC.h"#include "3264LED.h"#define NPT 256 // FFT point#define FAST 1 //指示条下落速度#define SLOW 50 //绿点下落速度#define STOP 35 //绿点停顿速度u16 TableFFT[];u16 AD_Count=0;u16 time,time2;void powerMag(void); //计算幅值u32 Data_IN[NPT]; /* Complex input vector */u32 Data_OUT[NPT]; /* Complex output vector */u32 lBUFMAG[NPT/2]; /* 保存幅值*/u16 Result[64]; //最终结果u8 Pos[64]={0}; //绿点位置u8 Dot[64]={0}; //记录每点停顿时间u32 TMP;int main(void){u16 i,k;s16 tmp;Stm32_Clock_Init(9); //系统时钟设置72Mhzdelay_init(72); //延时初始化Timer3_Init(5,7199); //0.6ms中断一次 LED显示Timer4_Init(7,760); //约74us中断一次, AD采集LED_Init();LEDs_Init(); //点阵初始化Adc_Init();time=time2=0;AD_Count=0;while(1){cr4_fft_256_stm32(Data_OUT, Data_IN, NPT); //做256点fft运算powerMag(); //算幅值for(i=1;i<65;i++) //点平移,去除静态波动{tmp=lBUFMAG[i]/2-5; //显示幅值为实际幅值的一半并减去5,这样效果较好if(tmp<0)tmp=0;else if(tmp>31)tmp=31;if(tmp>=Result[i-1]){Result[i-1]=tmp; //得到每列上绿点的高度if(Result[i-1]>=Pos[i-1]){Dot[i-1]=0;Pos[i-1]=Result[i-1];} //更新绿点高度}for(i=0;i<64;i++){for(k=0;k<32;k++) //画红点{if(k<Result[i]) Draw_Point(i,k,RED,2);else Draw_Point(i,k,0,0);}Draw_Point(i,Pos[i],GREEN,2); //画绿点if(time2>FAST&&Result[i]>=1) Result[i]--;if(Dot[i]>=STOP) //停顿判断{ if(time>SLOW&&Pos[i]>=1) Pos[i]--; }Dot[i]++;if(Dot[i]>=250)Dot[i]=250;}if(time>SLOW) time=0;if(time2>FAST) time2=0;else time2++;}}/********************************************************************************************************** * Calculate powermag* 计算各次谐波幅值* 先将lBUFOUT分解成实部(X)和虚部(Y),然后计算幅值(sqrt(X*X+Y*Y)********************************************************************************************************* */void powerMag(void){s32 lX,lY;u32 i;float X,Y,Mag;for(i=0;i<65;i++) //只显示64个点,所以计算得到前面65个点的幅值就行了。
{lX = (Data_OUT[i] << 16) >> 16;lY = (Data_OUT[i] >> 16);X = ((float)lX) /64;Y = ((float)lY) /64;Mag = sqrt(X*X + Y*Y)/NPT;lBUFMAG[i] = (u32)(Mag * 65536);}}void TIM4_IRQHandler(void) //定时器4中断服务程序约74us中断一次{ADC1->SQR3&=0XFFFFFFE0; //规则序列1ADC1->SQR3|=2; //通道2采集ADC1->CR2|=1<<22; //启动规则转换通道TMP=ADC1->DR;Data_IN[AD_Count]=TMP<<16;AD_Count++;if(AD_Count>255) AD_Count=0;TIM4->SR&=~(1<<0); //清除中断标志位}void TIM3_IRQHandler(void) //定时器3中断服务程序{u16 i;if(TIM3->SR&0X0001) //溢出中断{oe=0; //关显示for(i=0;i<64;i++) //移出缓存区的上半屏一行数据wr_595(SBF[Line][i]);for(i=0;i<64;i++) //移出缓存区的下半屏一行数据wr_595(SBF[Line+16][i]);out_595(); //锁存数据GPIOC->ODR&=0x00FF;GPIOC->ODR|=(15-Line)<<10;oe=1; //开显示Line++;if(Line>15) Line=0;time++;}TIM3->SR&=~(1<<0); //清除中断标志位}OK,程序也不复杂,这样一来就可以实现音乐频谱分析了,呵呵。