STM32音乐频谱分析要点

合集下载

关于STM32在程序中间修改PWM值的总结(原创)

关于STM32在程序中间修改PWM值的总结(原创)
请您及时更换请请请您正在使用的模版将于2周后被下线请您及时更换
关于 STM32在程序中间修改 PWM值的总结(原创)
首先在STM32库函数里有这样一个函数 void TIM3_PWM_Init(u16 arr,u16 psc)
若TIM3_PWM_Init(7200,100)//设置频谱7200.分频100
若想要在程序进程中修改频率需要函数TIM_SetAutoreload(TIM3,arr); 这个函数就是手动更改 TIMx->ARR 的意思 使能预装载ARPE 可以保证ARR在 更新事件到来时(或者你说的周期结束) 被 送到影子寄存器 如果不使能ARPE, 写入的ARR值立即生效;
所以最终在程序进程中修改我们的pwm需要通过 TIM_SetCompare2(TIM3,pwmval); TIM_SetAutoreload(TIM3,arr); 两个函数实现。
我们初始化定时器得到得频率为PWM频率=72000000/7200=10000hz 10000/100=100hz; TIM_SetCompare2(TIM3,pwmval);函数调节占空比; 占空比为arr/pwmval;
占空比在3,pwmval);

频谱分析原理与实现方法

频谱分析原理与实现方法

未来随着技术的不断发展,我们将有更多高效的算法和工具用于频谱分析,以 更好地服务于科学研究和实际应用。
谢谢观看
F(ω) = ∫f(t)e^(-iωt) dt
其中,F(ω)是信号的频谱,f(t)是信号的时域表示,ω是角频率,i是虚数 单位。
3、快速傅里叶变换
快速傅里叶变换(FFT)是一种高效计算傅里叶变换的算法。与直接计算傅里 叶变换相比,FFT算法能够大大减少计算时间和内存占用。FFT算法基于对称 性和周期性将信号分解成多个子信号,然后对每个子信号进行傅里叶变换。在 实际应用中,我们通常使用FFT算法来进行频谱分析。
MATLAB的优势在于其强大的矩阵计算能力和图形界面,使得频谱分析和可视 化变得简单直观。然而,MATLAB的缺点是运算速度相对较慢,对于大规模数 据集的处理有一定限制。
Python的SciPy库在处理大规模数据集时具有优势,它的并行计算功能可以大 大提高运算速度。此外,SciPy库还提供了许多高级的信号处理函数和算法, 使用户能够更加灵活地进行频谱分析。但是,Python相对于MATLAB来说,其 图形界面和易用性稍逊一筹。
(3)噪声信号:噪声信号的频谱分析有助于我们了解噪声的来源和特性。例如, 通过分析环境噪声的频谱分布,我们可以评估噪声对人类生活和健康的影响。
对比分析不同工具箱的优缺点, 总结实践经验。
在频谱分析实践中,除了MATLAB之外,还有其他工具箱或软件可以用于频谱 分析,如Python的SciPy库、R语言的signal包等。这些工具箱或软件都提供 了傅里叶变换和FFT算法的实现,但各具特点。
R语言的signal包功能全面,提供了丰富的信号处理函数和分析工具。然而, R语言在处理大规模数据集时的速度不如Python和MATLAB,且其图形界面不如 MATLAB直观。

使用STM32测量频率和占空比的几种方法

使用STM32测量频率和占空比的几种方法

(纯干货)使用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的参考手册,在定时器当中有这样一种模式:
简而言之,理论上,通过这种模式,可以用硬件直接测量出频率和占空比。

当时我们发现这一模式时欢欣鼓舞,以为可以一步解决这一问题。

一种基于STM32F103C8T6单片机DSP库的音乐频谱

一种基于STM32F103C8T6单片机DSP库的音乐频谱

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的音频信号分析设计与实现

基于STM32的音频信号分析设计与实现

基于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库使用

STM32官方DSP的FFT库使用

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的基本步骤。

单片机实现音乐频谱

单片机实现音乐频谱
还省去了部分限流电阻,食人鱼 LED 有四个引脚,便于手工焊接,大量减少跳线。
图二 MCU 部分的原理图
) ( 灯 吸呼 键摸触
色 : :: 颜
图三 点阵驱动电路图 (三) 编程思路
1) 在主函数中,单片机通过 AD 对音频数据采样,然后存放到数据缓存区进行预处理,完成 AD 滤波 处理,自动增益控制信息扫描以及其他信息处理。接着,将缓存区数据送入 快速傅立叶变换(FFT) 处理子函数进行运算。处理完后,从缓存区取出运算结果,根据得到幅值计算出点阵的显示数据, 并存储到显示缓存区。
a) 采用 USB 接口供电,并且对 USB 接口进行了扩展。在没有额外占用电脑主机 USB 接口情况下, 随时随地给系统供电;
b) 加入了触摸键设计,以及震动反馈。当触摸键响应时有震动反馈,及声光提示,如今很多触屏手 机也有这种时尚设计;
c) 加入 ThinkPad 笔记本上的经典呼吸灯指示设计。如夏日里的萤火虫,一闪一闪亮晶晶,不仅有趣 还能指示系统工作状态;
好的声音效果,其各段频率成分应该有一定的比例,录音的时候,录音师操作调音台就可以使各 段频率的成分得到调整。由于各种乐器的基频高低是不同的,所以,也可以使各种乐器之间的声音比 例得到调整,常见的是把频率由低至高分成 5 段或 7 段、10 段或 15 段,有经验的录音师或音乐家能听 出哪里(哪个频率段)“空”了,即这个频段弱。哪里“鼓了个包”,即这个频段过强。通过均衡器可 以把这些予以弥补。又因为每个人对音乐中频率分布的欣赏标准是不同的,因此,各位录音师掌握的 尺度也不同,显示出各自的风格。
小贴士(1): 根据 STC12A32S2 单片机的资源情况,最多只有 1280B RAM,我们取 64 点的 FFT 就可以满足要求,还

基于STM32的多功能音乐播放器设计

基于STM32的多功能音乐播放器设计

• 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控制蓝牙以及音频切换芯片和键盘。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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,程序也不复杂,这样一来就可以实现音乐频谱分析了,呵呵。

相关文档
最新文档