单片机音乐频谱_第1页
单片机音乐频谱_第2页
单片机音乐频谱_第3页
单片机音乐频谱_第4页
单片机音乐频谱_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、题 目: 单片机 LED音乐频谱的设计院 (系):专业:学生姓名:学号:指导教师:2011 年 07 月 07 日摘要该系统采用增强型8051 单片机 STC12C5A60S2 为主控制器,通过单片机内置的ADC 对音频信号进行采样、量化,然后通过快速傅里叶变换运算,在频域计算出音频信号各个频率分量的功率,最后通过双基色LED 单元板进行显示。该方案具有电路结构简洁,开发、生产成本低的优点。关键词: 单片机;傅里叶;LED;1. 引言12. 方案设计22 1 设计要求23 2 总体方案设计34 3 总体方案组成63. 系统电路设计63 1 单片机主控电路设计主控制器64 2 LED显示模块电路

2、设计74. 软件设计84 1 软件设计流程图85系统的测试86结论97参考文献118. 附录141. 引言本文介绍的音乐频谱显示器可对mp3、 手机、 计算机输出的音乐信号进行实时的频谱显示。系统采用增强型8051 单片机 STC12C5A60S2 为主控制芯片,通过单片机内置的 ADC 对音频信号进行采样,把连续信号离散化,然后通过快速傅里叶变换( FFT)运算,在频域计算出音频信号各个频率分量的功率,最后通过双基色LED 单元板进行显示。在显示的频率点不多的情况下,本系统比采用DSP 或 ARM 作为主控制芯片的设计方案具有电路结构简洁,开发、生产成本低的优点。112. 方案设计2.1 设

3、计要求1. 单片机自带AD转换,这样省去外围AD电路。2. 控制LED随着音乐跳动,需要理解傅里叶原理。2.2 总体方案设计经分析,将系统分为两个部分,一个是由单片机组成的主控。另一部分是LED显示部分,单片机对接收到的音频进行处理经过傅里叶换算后在LED显示,5V稳压电源给各个部分供电。该系统实现的方法有很多种,下面将列出大家最经常用到的实现方案。系统框图如图1所示音频信号图 1 音乐频谱总体系统框图该系统由音频信号预处理电路、单片机STC12C5A60S2 控制电路、LED 频谱显示电路等部分组成。图l 为系统整体设计原理框图。图 1 系统整体设计原理框图系统各组部分的功能:( 1 )音频

4、信号预处理电路主要对输入的音频进行电压放大和电平提升。( 2) 单片机 STC12C5A60S2 控制电路采用内置的ADC 对音频信号进行采样量化,然后对量化后的音频数据采用FFT 算法计算其频谱值,再将各频谱值进行32 级量化。 ( 3) LED 频谱显示电路在单片机的控制下,负责将FFT 计算得到的音频信号的各个频点的大小进行直观显示。1. 音频信号预处理电路图 2 音频信号预处理电路音频信号预处理电路见图2 所示, 对输入的音频进行电压放大和电平提升。手机、计算机输出的音频信号Vin 经过 RP1 进行电压调节后,经集成运放LMV358 反相放大 10 倍( Av=-R3/R2=-10

5、) ,提高系统的灵敏度。选用单电源供电的运放LMV358 ,一方面可以简化系统电源电路的设计,直接采用系统的+5V 供电即可;另一方面其输出端静态电压为VCC/2 ,即2.5V。放大后的音频信号和这2.5V 叠加后变为直流电压信号,满足后面单片机内置的ADC 对输入电压量程的要求。另外,LMV358 为轨到轨输出运放,它可在+5V 单电源供电条件下仍具有较大的动态输出范围。2. 单片机 STC12C5A60S2 控制电路STC12C5A60S2 单片机是宏晶科技生产的新一代单时钟/机器周期(1T) 8051单片机,具有高速、低功耗及超强抗干扰等特点,指令代码完全兼容传统8051 ,但速度快 8

6、-12 倍 ;内部集成MAX810 专用复位电路,2 路 PWM , 8 路高速 10 位 A/D 转换( 250K/S )等资源1。特别是它带硬件乘法/除法指令,使乘法指令执行时间从传统8051 的 48 个晶振周期减少到4 个晶振周期,使需要大量乘法运算的FFT 运算速度得到大幅度提高。在本系统中,STC12C5A60S2 单片机负责完成对音频信号进行A/D变换,然后采用FFT 算法计算音频信号频谱,并将计算结果输出到LED 频谱显示电路。( 1 )音频信号的A/D 变换根据香农采样定理,一般采样频率至少应为所采样音频信号最高频率的2 倍。由于人耳能够感受的频率为20Hz-20kHz ,所

7、以理论上采样频率最高取40kHz 。本设计采用单片机STC12C5A60S2 内置的 ADC 对音频信号进行采样、量化。STC12C5A60S2 单片机的A/D 转换口在P1 口 ( P1.0-P1.7 ) , 有 8路 10位的高速ADC,其输入电压量程为0-Vcc ,转换速度可通过ADC_CONTR 特殊功能寄存器的SPEED1 , SPEED0 位进行控制,速度最快可设置为每90 个时钟周期转换一次。在外接晶振为24MHz 时, ADC 的转换速度可达到330KHZ ,完全可满足对音频信号的采样需要。( 2)音频信号频谱值的计算我们采用快速傅里叶算法( FFT) 来计算音频信号的频谱值。

8、根据 FFT 运算规律,如 ADC 以 fs 的采样频率取N 个采样点,经过FFT 运算之后,就可以得到N 个点的复数序列。通常为了方便进行FFT 运算,通常N 取 2 的整数次方:N=2L ( L 为正整数) 。这 N 个点的 FFT 结果,每一个点就对应着原始信号的一个频率点,即第n 点所表示的频率为f=n×fs/N , n=0, 1 , , ( N-1 ) ;该点的模值除以N/2 就是对应该频率下原始信号的幅度(对于第1 个点则是除以N) ;该点的相位即是对应该频率下原始信号的相位。由于FFT 结果的对称性,通常只使用FFT 运算后的前N/2 个点的数值。本系统每隔10ms 采

9、样一次128 个点,经过FFT 运算后将得到128 个频率点。由于FFT 结果的对称性,我们选取前64 个点进行显示。现在 FFT 算法已发展出多种形式,本系统采用按时间抽选(DIT)的基 -2FFT 算法,这种算法程序相对较简单,节省存储单元,运行效率较高,比较适合用单片机编程实现。DIT 基 -2FFT 算法主要由倒位序运算和多级蝶形运算实现。a. 倒位序运算的实现DIT 基 -2FFT 算法通常将原始数据序列倒位序存储,运算后的结果则按正常顺序输出。一般的数字信号处理的教材都介绍雷德(Rader )算法,通过“反向进位加法 ”将原始数据序列进行倒位序存储2。雷德算法的灵活性较大,但在本系

10、统中,参与运算的数据点数只有128 个,通过预先编制倒位序查询表,采用查表方式实现倒位序操作速度会更快。b. 蝶形运算的实现根据 DIT 基 -2 FFT 算法原理,N 点 FFT 运算由 log2N 级, 每级 N/2 个蝶形运算,共( N/2) log2N 个蝶形运算构成。每个蝶形运算结构见图3 所示 2。图 3 按时间抽选蝶形运算结构蝶形运算结构图中,m 表示第 m 级的蝶形运算,k 为蝶形运算第一节点所在行数,b 为蝶形运算两节点距离,b=2m-1 , WNr 为旋转因子,WNr=cos( 2 r/N) -jsin( 2 r/N) 。每个蝶形结构完成下述基本迭代运算2:设 Xm=Rm+

11、jIm , 将式 ( 1) 转变为实部和虚部的表示形式,得到: 由上面式 ( 1 ) 、式( 2)可见,一个蝶形运算需要一次复数乘法Xm-1 ( k+b) WNr 及两次复数加(减)法。在单片机系统中编程实现时,需把复数运算转变为实数运算。同理,将式(2)转变为:将 sin、 cos 函数做成表格sin_tab128 、 cos_tab128 ,直接查表可提高运算速度。3. 频谱值的显示系统中采用5*11 个不同颜色的草帽LED 进行显示,每列显示音频信号的一个频率点, 每列 LED 点亮的高度表示该频率点幅度的大小。整个显示板一共有5 列, 工作的时候,可以看到每列根据频率幅度的大小在跳动。

12、2.3 整体系统组成本 系统硬件部分由单片机主控电路、LED显示部分、音频采集等部分组成,其中单片机主控电路有外接晶振,电源供电电路阻等部分组成。软件部分详细见下文。单片机全系统如下图2 所示。3. 系统电路设计3.1 单片机主控电路设计单片机主控模块包括了振落电路、音频采集电路,同时接入了各个模块的接口,保证了整个系统的灵活性。单片机是整个系统的控制中枢,它指挥外围器件协调工作,从而完成特定的功能。硬件实现上采用模块化设计,每一模块只实现一个特定功能,最后再将各个模块搭接在一起。这种设计方法可以降低系统设计的复杂性。控制电路的核心器件是由美国Atmel 公司生产的AT89S52单片机,属于M

13、CS-51系列。AT89S52是一种低功耗、高性能的CMOS位微控制器,具有88K在系统可编程Flash 存储器,采用的工艺是Atmel 公司的高密度非易失存储器技术;片上Flash 允许程序存储器在系统可编程,亦适于常规编程器;在单芯片上,拥有灵巧的8 位 CPU和在系统可编程Flash ,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案;价格低廉、性能可靠、抗干扰能力强。因此广泛应用于工业控制和嵌入式系统中。单片机主控电路原理图如下所示:4.1 单片机主控电路原理图3.2 LED 显示模块电路设计4. 软件设计134.1 软件设计流程图FFT倒序流程图FFT计算流程图

14、5. 系统测试制作的过程中首先遇到的问题是LED如何组装,经过查阅资料发现,可以利用LED的管脚互相按照电路图连接起来,这个时候主要是利用万用表来测试,LED灯到底有无坏掉的。通电后,在无音频输入时,LED应该无闪烁跳动现象。在制作完成的时候,发现LED灯闪烁,这个时候,在音频输入端接入了47p 的电容,这样就解决了这个问题。186. 结论本系统采用增强型8051 单片机STC12C5A60S实现音乐频谱显示,该方案硬件电路设计2简单、成本低,并具有较高的实用价值。本方案是通过ADC采样输入的音频信号,ADC采样完成以后,将数据进行倒序排列并进行FFT运算,结果通过TFT液晶显示出来。由于采用

15、的处理器的处理能力的原因,不能做到很高的采样频率和很精细的频率分辨率,要提高系统的频率分辨率,就需要增加采样点数。可以借助PC的强大处理能力,将采样的数据通过预留的串口传送给PC,在PC上完成FFT运算以及显示,这就是虚拟仪器的方式,实际工作中应用前景也非常大。谢辞感谢老师对我们的指导。完成了这个实训任务,虽然结果差强人意,但是还是有进步的, 有收获的。希望以后在学习生活中能继续好好学习。7. 参考文献1宏晶科技.STC12C5A60S2 系列单片机器件手册M.2010.2程佩青 .数字信号处理教程(第二版)M.北京:清华大学出版社,2001.3靳桅,等.基于51 系列单片机的LED 显示屏开

16、关技术(第2 版) M. 北京:北京航空航天大学出版社,2011.作者简介:吴永德(1980 ) ,男,讲师,从事电子技术专业教学及研究。罗萍(1979 ) ,女,讲师,从事计算机技术专业教学及研究。1925程序 :#include <stc12c5a60s2.h>/"stc12c5620ad.h"#include<intrins.h>#define LongToBin(n)(n>>21)&0x80)|(n>>18)&0x40)|(n>>15)&0x20)|(n>>12)&

17、;0x10)|(n>>9)&0x08)|(n>> 6)&0x04)|(n>>3)&0x02)|(n)&0x01)#define BIN(n) LongToBin(0x#n#)#define uchar unsigned char#define uint unsigned int# define SAMPLE_NUM 64# define NUM_2_LOG 6# define FFT_OUT_MIN 3uchar code BRTableSAMPLE_NUM = 0, 32, 16, 48, 8, 40, 24, 56,4,

18、36, 20, 52, 12, 44, 28, 60, 2, 34, 18, 50, 10, 42, 26, 58, 6, 38, 22, 54, 14, 46, 30, 62, 1, 33, 17, 49, 9, 41, 25, 57,5, 37, 21, 53, 13, 45, 29, 61,3, 35, 19, 51, 11, 43, 27, 59,7, 39, 23, 55, 15, 47, 31, 63;char code sin_tabbSAMPLE_NUM = 0 ,12 ,25 ,37 ,49 ,60 ,71 ,81 ,90 ,98 ,106 ,112 ,117 ,122 ,1

19、25 ,126 ,127 ,126 ,125 ,122 ,117 ,112 ,106 ,98 ,90 ,81 ,71 ,60 ,49 ,37 ,25 ,12 ,0 ,-12 ,-25 ,-37 , -49 ,-60 ,-71 ,-81 ,-90 ,-98 ,-106 ,-112 ,-117 ,-122 ,-125 ,-126 ,-127 ,-126 ,-1 25 ,-122 ,-117 ,-112 ,-106 ,-98 ,-90 ,-81 ,-71 ,-60 ,-49 ,-37 ,-25 ,-12 ;char code cos_tabbSAMPLE_NUM =127 ,126 ,125 ,12

20、2 ,117 ,112 ,106 ,98 ,90 ,81 ,71 ,60 ,49 ,37 ,25 ,12 ,0 ,-12 , -25 ,-37 ,-49 ,-60 ,-71 ,-81 ,-90 ,-98 ,-106 ,-112 ,-117 ,-122 ,-125 ,-126 ,-127,-126 ,-125 ,-122 ,-117 ,-112 ,-106 ,-98 ,-90 ,-81 ,-71 ,-60 ,-49 ,-37 ,-25 ,-12 ,0 ,12 ,25 ,37 ,49 ,60 ,71 ,81 ,90 ,98 ,106 ,112 ,117 ,122 ,125 ,126 ;uchar

21、a21;uchar keep,keepnum,anum,timernum,timernum2,lednum3,Ltime;/ 用于分离/* 加入数组用于显示相应led 灯数目 */uchar lednum=0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff;/0-7的显示数组P2组控制int xdata FftRealSAMPLE_NUM;int xdata FftImageSAMPLE_NUM;sbit p30=P30;sbit p31=P31;sbit p32=P32;sbit p33=P33;sbit p34=P34;sbit p35=P35;/9-

22、11 的 led 控制sbit p36=P36;sbit p37=P37;void timerinit()/ 定时器 初始化函数 TMOD=0x01;TH0=(65536-6000)/256;TL0=(65536-6000)%256;EA=1;ET0=1;TR0=1;void disp()timernum+;if(timernum=6) timernum=1;P2=0;/ 显示前先关闭P3=P3&0x1f;switch(timernum) case 1:anum=a0;p34=0;p33=1;p32=1;p31=1;p30=1;break;case 2:anum=a1;p34=1;p3

23、3=0;p32=1;p31=1;p30=1;break;case 3:anum=a2;p34=1;p33=1;p32=0;p31=1;p30=1;break;case 4:anum=a3;p34=1;p33=1;p32=1;p31=0;p30=1;break;case 5:anum=a4;p34=1;p33=1;p32=1;p31=1;p30=0;break;/anum=a10;/* 修改可以改变光柱高度( anum值分开几个部分用定时器区分显示)(a内逐加 ) */if(anum<=8)P2=lednumanum;P3=P3&0xff;/ 屏蔽高三位1f/else P2=0xf

24、f;P3=lednum2anum-9; if(anum=9)P2=0xff;p35=1;p36=0;p37=0; if(anum=10)P2=0xff;p35=1;p36=1;p37=0;if(anum=11)P2=0xff;p35=1;p36=1;p37=1;uchar STC_ADC() / !根据数据手册写一个ad读取函数uchar i;ADC_RES = 0;ADC_RESL = 0;ADC_CONTR = BIN(10001000);i=3;while(i-);while (1)if (ADC_CONTR & BIN(10000) break;ADC_CONTR = BIN(

25、10000000);return( ADC_RESL<<2) ;short sqrt_16( unsigned long M)unsigned int N, i;unsigned long tmp, ttp;if( M = 0 ) return 0;N = 0;tmp = ( M >> 30 );M <<= 2;if( tmp > 1 )N +;tmp -= N;for( i=15; i>0; i- ) N <<= 1;tmp <<= 2;tmp += (M >> 30);ttp = N;ttp = (ttp&

26、lt;<1)+1;M <<= 2;if( tmp >= ttp )tmp -= ttp;N +;return N;void FFT()register uchar i,bb,j,k,p,max;register short TR,TI,temp;unsigned long ulReal;unsigned long ulImage;for(i=0; i<SAMPLE_NUM;i+) / 此处可以加入自动增益 FftRealBRTablei = STC_ADC()<<keep;/ 使显示保持在一定范围内FftImagei = 0; keepnum=FftR

27、eal2/32;/ 提取等级数if(7<keepnum)&&(keepnum<=8) keep=1;else if(4<keepnum)&&(keepnum<=6) keep=2;else if(2<keepnum)&&(keepnum<=4) keep=3;else keep=5;for( i=1; i<=NUM_2_LOG; i+)bb=1;bb <<= (i-1);for( j=0; j<=bb-1; j+)p=1;p <<= (NUM_2_LOG-i);p = p*j;for( k=j; k<SAMPLE_NUM; k=k+2*bb)TR = FftRealk; TI = FftImagek; temp = FftRealk+bb;FftRealk = FftRealk + (FftRealk+bb*cos_tabbp)>>7) + (FftImagek+bb*sin_tabbp)>>7);FftImagek = FftImagek - (FftRealk+bb*sin_tabbp

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论