STM32音乐频谱分析报告

上传人:汽*** 文档编号:460181567 上传时间:2023-05-04 格式:DOC 页数:7 大小:1.85MB
返回 下载 相关 举报
STM32音乐频谱分析报告_第1页
第1页 / 共7页
STM32音乐频谱分析报告_第2页
第2页 / 共7页
STM32音乐频谱分析报告_第3页
第3页 / 共7页
STM32音乐频谱分析报告_第4页
第4页 / 共7页
STM32音乐频谱分析报告_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《STM32音乐频谱分析报告》由会员分享,可在线阅读,更多相关《STM32音乐频谱分析报告(7页珍藏版)》请在金锄头文库上搜索。

1、wordSTM32 音乐频谱分析2011-12-11 03:06:03|分类: 制作类 |标签: |举报|字号大中小订阅呵呵,在昨天的根底上,进展了改良。采样频率为12.3Khz,256点FFT。视频: 其实这玩意不难做,音频信号采集,我的方法是将电脑出来的信号用TDA2822放大,然后给单片机AD口,剩下就是软件上的了。 说起TDA2822,还是挺不错的一款功率放大芯片,本只想用来做信号放大用的,但baidu了下它和看它的数据手册,都多用来做小功率功放。 呵呵,那就也做一个吧。 TDA2822的典型应用电路如下: 这电路很普通,没什么特别,参数也不用调整,直接搭出来,就正常的工作。 接下来就

2、是将放大后的信号给单片机,这里问题就来了,电路中C4,C5是干什么,给单片机的话要不要加? 于是开始baidu,google,但没找到适宜解答,于是翻了翻模电书,里面还真讲到功率放大器, TDA2822是OTL功放,输出电容起耦合作用,因为OTL功放在在静态时输出端都会有Vcc/2伏的输出,这样会搞坏喇叭,所以需要加个电容,隔离。单片机处理的话就不用输出电容了。 如果用示波器一看,结果就很明显,如如下图,下面的信号是加了电容,上面是没加。 做好电路后理所当然的准备将功放输出端接到单片机上,但突然一想,不对啊,功放我给11.1V供电,那输出不就有5V左右电压?而STM32是3.3V! 不烧了才怪

3、! 幸好TDA2822工作电压X围在1.812V间,所以就给它3.3V行了。 这样一来根本就没问题了。 第二个的输出电容还是保存,作个比照。 好了,接下来就是程序了。 首先就得确定采样率,就是间隔多久采一个点。 刚开始不是很懂,用的40kHz,也成,但要是做音频频谱分析没必要那么高了。 这里有些资料:音频的频率X围与表现力度音频的频率X围、音质的评价标准一般认为20Hz20kHz是人耳听觉频带,称为“声频。这个频段的声音称为“可闻声,高于20kHz的称为“超声,低于20Hz的称为“次声“。 所谓声音的质量,是指经传输、处理后音频信号的保真度。目前,业界公认的声音质量标准分为4级,即: 数字激光

4、唱盘CD-DA质量,其信号带宽为10Hz20kHz; 调频广播FM质量,其信号带宽为20Hz15kHz; 调幅广播AM质量,其信号带宽为50Hz7kHz; 的话音质量,其信号带宽为200Hz3400Hz。可见,数字激光唱盘的声音质量最高, 的话音质量最低。 除了频率X围外,人们往往还用其它方法和指标来进一步描述不同用途的音质标准。 音频频率X围一般可以分为四个频段,即: 低频段30150HZ; 中低频段30150HZ; 中低频150500HZ; 中高频段5005000HZ; 高频段500020kHZ。30150HZ频段:能够表现音乐的低频成分,使欣赏者感受到强劲有力的动感。150500HZ频段

5、:能够表现单个打击乐器在音乐中的表现力,是低频中表达力度的局部。5005000HZ频段:主要表达演唱者或语言的清淅度与弦乐的表现力。500020kHZ频段:主要表达音乐的明亮度,但过多会使声音发破。- 所以我选如此12kHz左右的采样率。下面的DSP_Lib文件夹就是ST公司提供的DSP库。FFT,PID等都是用汇编写的。 将ST提供的FFT表加载到内存中,速度是快一些,1024点只需1.7ms左右,我觉得效率算是蛮高了。接下来就是代码了:#include #include #include stm32_dsp.h#include table_fft.h#include sys.h#inclu

6、de 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_INNPT; /* plex input vector */u32 Dat

7、a_OUTNPT; /* plex output vector */u32 lBUFMAGNPT/2; /* 保存幅值 */u16 Result64; /最终结果u8 Pos64=0; /绿点位置u8 Dot64=0; /记录每点停顿时间u32 TMP;int main(void)u16 i,k;s16 tmp; Stm32_Clock_Init(9); /系统时钟设置72Mhz delay_init(72); /延时初始化 Timer3_Init(5,7199); /0.6ms中断一次 LED显示 Timer4_Init(7,760); /约74us中断一次, AD采集 LED_Init()

8、; 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;i65;i+) /点平移,去除静态波动 tmp=lBUFMAGi/2-5; /显示幅值为实际幅值的一半并减去5,这样效果较好 if(tmp31)tmp=31; if(tmp=Resulti-1) Resulti-1=tmp; /得到每列上绿点的高度 if(Resulti-1=Posi-1) Doti-

9、1=0;Posi-1=Resulti-1; /更新绿点高度 for(i=0;i64;i+) for(k=0;k32;k+) /画红点 if(kFAST&Resulti=1) Resulti-; if(Doti=STOP) /停顿判断 if(timeSLOW&Posi=1) Posi-; Doti+; if(Doti=250)Doti=250; if(timeSLOW) time=0; if(time2FAST) time2=0; else time2+; /* Calculate powermag* 计算各次谐波幅值* 先将lBUFOUT分解成实部(X)和虚部(Y),然后计算幅值(sqrt(X

10、*X+Y*Y)*/void powerMag(void)s32 lX,lY;u32 i;float X,Y,Mag;for(i=0;i65;i+) /只显示64个点,所以计算得到前面65个点的幅值就行了。 lX = (Data_OUTi 16; lY = (Data_OUTi 16); X = (float)lX) /64; Y = (float)lY) /64; Mag = sqrt(X*X + Y*Y)/NPT; lBUFMAGi = (u32)(Mag * 65536);void TIM4_IRQHandler(void) /定时器4中断服务程序 约74us中断一次 ADC1-SQR3&=0XFFFFFFE0; /规如此序列1ADC1-SQR3|=2; /通道2采集ADC1-CR2|=1DR;Data_INAD_Count=TMP255) AD_Count=0;TIM4-SR&=(10);

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号