单片机音乐频谱..

合集下载

基于单片机的音频频谱显示器的研究与开发

基于单片机的音频频谱显示器的研究与开发

1
音频信号,这个音频信号再经功放模块由扬声器驱动播放音乐。

同时,音频信号又作为输入信号接到另外一个单片机系统,此单片机系统主要是完成音频信号的模数转换,并由内部软件通过快速傅里叶算法,实现音频信号在频域上的分析,最后量化输出,由LED点阵显示出频谱变化。

三、研究指向内容与过程
(一)研究指向
1. 降低设计、制作以及成品的成本;
2. 提高音频频谱与音乐的匹配度;
3. 开发电子产品专业课程的实训资源,使实训资源与生活相结合,便于电子专业学生的
学习与研究。

(二)研究内容
1、硬件设计
单片机我们选用STC12C5A60S2。

STC 公司的单片机不但和8051指令、管脚完全兼容,而且其片内的具有大容量程序存储器且是FLASH工艺的,其中STC12C5A60S2单片机内部就自带高达60K FLASHROM,这种工艺的存储器用户可以用电的方式瞬间擦除、改写。

而且STC 系列单片机支持串口程序烧写。

本设计系统由单片机模块、音频采集模块、滤波模块、按键模块、功放模块和显示模块六部分组成,如图1所示。

图1 音频频谱显示器的系统结构图
硬件电路图如图2所示,使用音频采集模块对输入的音频信号进行采样,经过FFT变换,然后取某些频率项的幅值,量化显示,驱动LED点阵,点亮相应的LED灯,其中显示模块即LED频谱显示电路。

图2左上方是滤波模块以及功放模块的设计,左下方是单片机模块的电路设计,右侧是LED频谱显示电路的设计。

其中,音频功放芯片选用8002,它是两个OTL电路桥式连接为BTL工作方式的音频功放。

2
3。

单片机实现音乐频谱

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

基于单片机的音频频谱程序

基于单片机的音频频谱程序

此程序用的单片机是ATMEGA16L单片机#include "avr/io.h"#include "util/delay.h"#include "avr/interrupt.h"#include "FFT1.h"#define uchar unsigned char#define uint unsigned int#define RED1_H PORTB|=(1<<PB0)#define RED1_L PORTB&=~(1<<PB0) //上屏红#define GREEN1_H PORTB|=(1<<PB1)#define GREEN1_L PORTB&=~(1<<PB1) //上屏绿#define GREEN2_H PORTB|=(1<<PB2)#define GREEN2_L PORTB&=~(1<<PB2) //下屏绿#define RED2_H PORTB|=(1<<PB3)#define RED2_L PORTB&=~(1<<PB3) //下屏红#define SCL1_H PORTB|=(1<<PB4)#define SCL1_L PORTB&=~(1<<PB4) //#define RCL1_H PORTB|=(1<<PB5)#define RCL1_L PORTB&=~(1<<PB5) // 上屏595SCL和RCL #define RCL2_H PORTB|=(1<<PB6)#define RCL2_L PORTB&=~(1<<PB6) //#define SCL2_H PORTB|=(1<<PB7)#define SCL2_L PORTB&=~(1<<PB7) //下屏595scl和rcl#define E_H PORTD|=(1<<PD3)#define E_L PORTD&=~(1<<PD3) //#define SDA_H PORTD|=(1<<PD4)#define SDA_L PORTD&=~(1<<PD4) //#define CK_H PORTD|=(1<<PD5)#define CK_L PORTD&=~(1<<PD5) //行控制信号uchar adc_count;uchar count,count1=0;/********************初始化行*********************/void init_line (void){uchar i=0;for (i=0;i<16;i++){SDA_L;CK_L;_delay_us(8);//8个nopCK_H; //上升沿有效_delay_us(10);//10个nopCK_L;}}void send_mov(void)//容易出错的地方送行数据{CK_L;_delay_us(8);//8CK_H;_delay_us(10);//10CK_L;}/*********************ad中断程序******************/SIGNAL (SIG_ADC){uint temp1,temp2;temp1=ADCL;temp2=ADCH;Fft_Real[pgm_read_byte(&LIST_TAB[adc_count])]=(temp1+(temp2<<8));//存储在int类型,if(adc_count<32)adc_count++;elseadc_count=0;}/********************显示部分******************/void display (void){uchar LINE =16,i,er; //一共是32行init_line ();//行初始化,全送零SDA_H;for (LINE =16;LINE>0;LINE--){ if(adc_count>=32)//每采样32个点进行一次fft{ E_L;//一定要关行显示,不然会有一行的亮度特别突出adc_count=0;// ADCSRA&=~(1<<ADEN);//关adc// ADCSRA&=(1<<ADIE);//开adcprocessfft();// ADCSRA|=(1<<ADEN);//开adc// ADCSRA|=(1<<ADSC);// E_H;count1=0;}for (i=0;i<16;i++) //判断16个数,因为要显示16个柱{if (led_buf[i]>LINE+16) //上屏柱的数据判断{GREEN1_H;RED1_L;} //else{GREEN1_L;RED1_L;}if (led_buf[i]>LINE) //下屏柱的数据判断{GREEN2_H;RED2_L;}else{GREEN2_L;RED2_L;}if (led_buf1[i]==LINE+16)//浮点数据红色数据(上屏){ RED1_H;GREEN1_L;}elseif (led_buf1[i]==LINE) //浮点数据红色数据(下屏){ RED2_H;GREEN2_L;}for (er=0;er<2;er++) //连续送两次因为两列为一柱(容易出错) {SCL1_L;_delay_us(1);SCL1_H; //上升沿有效(送上一屏595的数据)_delay_us(1);SCL1_L;SCL2_L;_delay_us(1);SCL2_H; //上升沿有效(送下一屏的595数据)_delay_us(1);SCL2_L;} //送两列采样点数RED1_L; //送两列的不显数据GREEN1_L;RED2_L;GREEN2_L;for (er=0;er<2;er++) //连续送两次因为两列为一柱(容易出错) {SCL1_L;_delay_us(1);SCL1_H; //上升沿有效(送上一屏595的数据)_delay_us(1);SCL1_L;SCL2_L;_delay_us(1);SCL2_H; //上升沿有效(送下一屏的595数据)_delay_us(1);SCL2_L;}} //送完64个数据// E =0;//关闭行显示// E_L;RCL1_L; //上屏595显示数据_delay_us(1);RCL1_H; //上升沿输出_delay_us(1);RCL1_L; //RCL2_L; //下屏595显示数据_delay_us(1);RCL2_H; //上升沿输出_delay_us(1);RCL2_L; // 595整体输出send_mov();//行脉冲上升沿,促使行移位E_H; //扫描行显示_delay_us(400);//50ms延时程序?//_delay_ms(1000);SDA_L;//数据位变0}for (count=0;count<16;count++)//绿色柱状递减{if(led_buf[count]>1)led_buf[count]--;}count1++;//红色浮点下滑速度if (count1>5){for (count=0;count<16;count++)//红色浮点递减{if(led_buf1[count]>1)led_buf1[count]--;}}}int main (void){ adc_count=0;RED1_L; //显示屏控制端口GREEN1_L;RED2_L;GREEN2_L;CK_L;E_H;DDRB =0XFF;DDRD =0XFF;PORTB=0XFF;PORTD=0XFF;ADMUX=0X40;//5V的基准电压设置,A0口为输入口ad转换寄存器设置//ADCSRA=_BV(ADEN)|_BV(ADA TE)|_BV(ADIE)|_BV(ADPS2);//连续准换模式,开中断,16分频,采样频率为35khz//ADCSRA=_BV(ADSC);//启动ad变换ADCSRA=0XED;//连续准换模式,开中断,16分频,采样频率为35khz (16分频是EC) (应该是ec) (32分频ed),(64分频ee) (128分频ef)sei();while (1){display ();}return 0;}下面是fft子程序#include "avr/pgmspace.h"#define progmem __ATTR_PROGMEM__#define uchar unsigned char#define uint unsigned intuchar led_buf [16];//显示缓存单元; //显示缓存单元uchar led_buf1[16];//浮点数据存储单元int Fft_Real[32]; //fft实部int Fft_Image[32]; // fft的虚部uchar i,j,k,b,p;int Temp_Real,Temp_Imag,temp; // 中间临时变量uint TEMP1;//放大128倍后的sin整数表(128)占用flashprogmem char SIN_TAB[16] = { 0x00, 0x18, 0x30, 0x46,0x59, 0x69, 0x75, 0x7c,0x7f, 0x7c, 0x75, 0x69,0x59, 0x46, 0x30, 0x18,};//放大128倍后的cos整数表(128)//32个就可以了啊progmem char COS_TAB[16] = { 0x7f, 0x7c, 0x75, 0x69,0x59, 0x46, 0x30, 0x18,0x00, -0x18, -0x30, -0x46,-0x59, -0x69, -0x75, -0x7c,};//采样存储序列表progmem char LIST_TAB[32] = { 0, 16, 8, 24,4, 20, 12, 28,2, 18, 10, 26,6, 22, 14, 30,1, 17, 9, 25,5, 21, 13, 29,3, 19, 11, 27,7, 23, 15, 31,};/******************快速傅立叶变换**********************/void FFT(void){for( i=1; i<=5; i++) //没有倒叙计算一共是6级i表示第几级/* for(1) */{b=1;b <<=(i-1); //2(L-1) //碟式运算,用于计算隔多少行计算例如第一极1和2行计算,,第二级for( j=0; j<=b-1; j++) //求旋转因子/* for (2) */{p=1;p <<= (5-i); //p = p*j;//求pfor( k=j; k<32; k=k+2*b) /* for (3) 基二fft */{Temp_Real = Fft_Real[k];Temp_Imag = Fft_Image[k];temp = Fft_Real[k+b];Fft_Real[k] = Fft_Real[k] + ((Fft_Real[k+b]*pgm_read_byte(&COS_TAB[p]))>>7) + ((Fft_Image[k+b]*pgm_read_byte(&SIN_TAB[p]))>>7);Fft_Image[k] = Fft_Image[k] - ((Fft_Real[k+b]*pgm_read_byte(&SIN_TAB[p]))>>7) + ((Fft_Image[k+b]*pgm_read_byte(&COS_TAB[p]))>>7);Fft_Real[k+b] = Temp_Real - ((Fft_Real[k+b]*pgm_read_byte(&COS_TAB[p]))>>7) - ((Fft_Image[k+b]*pgm_read_byte(&SIN_TAB[p]))>>7);Fft_Image[k+b] = Temp_Imag + ((temp*pgm_read_byte(&SIN_TAB[p]))>>7) - ((Fft_Image[k+b]*pgm_read_byte(&COS_TAB[p]))>>7);// 移位.防止溢出. 结果已经是本值的1/64Fft_Real[k] >>= 1;Fft_Image[k] >>= 1;Fft_Real[k+b] >>= 1;Fft_Image[k+b] >>= 1;}}}}/***************量化数据函数*************/void processfft(void ){for(i=0;i<32;i++){Fft_Image[i]=0; //虚部清0 进行fft之前,虚部要进行清零}FFT();//32点fftfor(j=0;j<32;j++) //取各个频率点的模值{TEMP1=(Fft_Real[j]* Fft_Real[j])+(Fft_Image[j]*Fft_Image[j]);//求功率if(TEMP1<4)TEMP1=1;else if(TEMP1<9)TEMP1=2;else if(TEMP1<16)TEMP1=3;else if(TEMP1<25)TEMP1=4;else if(TEMP1<36)TEMP1=5;else if(TEMP1<49)TEMP1=6;else if(TEMP1<55)TEMP1=7;else if(TEMP1<60)TEMP1=8;else if(TEMP1<65)TEMP1=9;else if(TEMP1<70)TEMP1=10;else if(TEMP1<75)TEMP1=11;else if(TEMP1<80)TEMP1=12;else if(TEMP1<96)TEMP1=13;else if(TEMP1<125)TEMP1=14;else if(TEMP1<156)TEMP1=15;else if(TEMP1<189)TEMP1=16;else if(TEMP1<224)TEMP1=17;else if(TEMP1<261)TEMP1=18;else if(TEMP1<300)TEMP1=19;else if(TEMP1<341)TEMP1=20;else if(TEMP1<384)TEMP1=21;else if(TEMP1<429)TEMP1=22;else if(TEMP1<476)TEMP1=23;else if(TEMP1<525)TEMP1=24;else if(TEMP1<576)TEMP1=25;else if(TEMP1<629)TEMP1=26;else if(TEMP1<684)TEMP1=27;else if(TEMP1<741)TEMP1=28;else if(TEMP1<800)TEMP1=29;else if(TEMP1<861)TEMP1=30;else if(TEMP1<1024)TEMP1=31;elseTEMP1=32;if (TEMP1>led_buf[j])led_buf[j]=TEMP1; //送显示单元if (TEMP1>led_buf1[j])led_buf1[j]=led_buf[j];//浮点显示单元}}。

单片机音乐频谱..

单片机音乐频谱..

单片机音乐频谱::正文:章节一、介绍本文档旨在提供关于单片机音乐频谱的详细说明和操作指南。

单片机音乐频谱是一种将音频信号转化为可视化频谱图的技术,可以实现音乐可视化效果。

章节二、材料准备2.1 单片机:我们可以选择一款适用于音频处理的单片机,如Arduino、Raspberry Pi等。

2.2 音频输入设备:需要一个音频输入设备,如麦克风或音频输入接口。

2.3 LED灯带:选择适合的LED灯带作为频谱图的显示器件。

2.4 电路连接线材:用于连接单片机、音频输入设备和LED灯带的电路连接线材。

章节三、电路连接3.1 连接麦克风:将麦克风的输出端与单片机的音频输入引脚相连接。

3.2 连接LED灯带:将LED灯带的信号输入端与单片机的数字输出引脚相连接。

3.3 连接电源:根据LED灯带的电源要求,将LED灯带与适当的电源连接。

章节四、软件配置4.1 安装开发环境:根据所选单片机的要求,安装相应的开发环境,如Arduino IDE或树莓派操作系统。

4.2 配置音频输入:在开发环境中配置音频输入设备的参数,如选择麦克风作为输入源,设置采样率等。

4.3 编写程序:使用合适的编程语言,编写程序以获取音频输入并将其转化为频谱图的形式。

章节五、运行和测试5.1 程序:将编写好的程序到单片机中。

5.2 运行程序:通过单片机的开发环境,运行程序并开始监测音频输入。

5.3 测试频谱图:播放音乐或其他音频源,观察LED灯带上显示的频谱图效果,进行调试和测试。

章节六、附件本文档的附件包括:1)电路连接图:展示单片机、音频输入设备和LED灯带之间的连接关系。

2)程序代码:提供编写好的单片机程序代码,方便读者参考和使用。

章节七、法律名词及注释1)单片机:单片机是一种集成了中央处理器、内存和输入/输出接口等功能的微型计算机芯片。

2)音频输入设备:音频输入设备是用于将声音信号转化为电信号的设备,如麦克风、音频输入接口等。

3)LED灯带:LED灯带是一种由多个发光二极管组成的灯带,可实现各种颜色的发光效果。

用51单片机实现音频信号的频谱显示(在LCD上显示)

用51单片机实现音频信号的频谱显示(在LCD上显示)

用51单片机实现音频信号的频谱显示(在LCD上显示)思路:外来音频信号经过51单片机,在单片机中进行频谱分析,并将结果显示在LCD(12864或1602)上要求:频谱显示如同千千静听播放音乐时的频谱显示希望各位高手能给出详细的解决方案,感激。

51做FFT有些困难,可以使用增强型(RAM)的51机子进行参考程序:#include<STC12C5A.H>#define uchar unsigned char#define uint unsigned int#define channel 0x01 //设置AD通道为 P1.1//---------------------------------------------------------------------sbit SDA_R=P1^2;sbit SDA_R_TOP=P1^3;sbit SDA_G=P1^4;sbit SDA_G_TOP=P1^5;sbit STCP=P1^6;sbit SHCP=P1^7;//---------------------------------------------------------------------//----------------------------------------------------------------------------------------------------------------------//放大128倍后的sin整数表(128)code char SIN_TAB[128] = { 0, 6, 12, 18, 24, 30, 36, 42, 48, 54, 59, 65, 70, 75, 80, 85, 89, 94, 98, 102,105, 108, 112, 114, 117, 119, 121, 123, 124, 125, 126, 126, 126, 126, 126, 125, 124, 123, 121, 119, 117, 114, 112,108, 105, 102, 98, 94, 89, 85, 80, 75, 70, 65, 59, 54, 48, 42, 36,30, 24, 18, 12, 6, 0, -6, -12, -18, -24, -30,-36, -42, -48, -54, -59, -65, -70, -75, -80, -85, -89, -94, -98, -102, -105, -108, -112, -114, -117, -119, -121,-123, -124, -125, -126, -126, -126, -126, -126, -125, -124, -123, -121, -119, -117, -114, -112, -108, -105, -102,-98, -94, -89, -85, -80, -75, -70, -65, -59, -54, -48, -42, -36, -30, -24, -18, -12, -6 };//放大128倍后的cos整数表(128)code char COS_TAB[128] = { 127, 126, 126, 125, 124, 123, 121, 119, 117, 114, 112, 108, 105, 102, 98, 94,89, 85, 80, 75, 70, 65, 59, 54, 48, 42, 36, 30, 24, 18, 12, 6, 0, -6, -12, -18, -24, -30, -36, -42, -48, -54, -59,-65, -70, -75, -80, -85, -89, -94, -98, -102, -105, -108, -112, -114, -117, -119, -121, -123, -124, -125, -126, -126, -126, -126, -126, -125, -124, -123, -121, -119, -117, -114, -112, -108, -105, -102, -98, -94, -89, -85, -80,-75, -70, -65, -59, -54, -48, -42, -36, -30, -24, -18, -12, -6, 0, 6, 12, 18, 24, 30, 36, 42, 48, 54, 59, 65, 70,75, 80, 85, 89, 94, 98, 102, 105, 108, 112, 114, 117, 119, 121, 123, 124, 125, 126, 126 };//采样存储序列表code char LIST_TAB[128] = { 0, 64, 32, 96, 16, 80, 48, 112,8, 72, 40, 104, 24, 88, 56, 120,4, 68, 36, 100, 20, 84, 52, 116,12, 76, 44, 108, 28, 92, 60, 124,2, 66, 34, 98, 18, 82, 50, 114,10, 74, 42, 106, 26, 90, 58, 122,6, 70, 38, 102, 22, 86, 54, 118,14, 78, 46, 110, 30, 94, 62, 126,1, 65, 33, 97, 17, 81, 49, 113,9, 73, 41, 105, 25, 89, 57, 121,5, 69, 37, 101, 21, 85, 53, 117,13, 77, 45, 109, 29, 93, 61, 125,3, 67, 35, 99, 19, 83, 51, 115,11, 75, 43, 107, 27, 91, 59, 123,7, 71, 39, 103, 23, 87, 55, 119,15, 79, 47, 111, 31, 95, 63, 127};uchar COUNT=0,COUNT1=0,ADC_Count=0,LINE=15,G,T;uchar i,j,k,b,p;int Temp_Real,Temp_Imag,temp; // 中间临时变量uint TEMP1;int xdata Fft_Real[128];int xdata Fft_Image[128]; // fft的虚部uchar xdata LED_TAB2[64]; //记录漂浮物是否需要停顿一下uchar xdata LED_TAB[64]; //记录红色柱状uchar xdata LED_TAB1[64]; //记录漂浮点void Delay(uint a){while(a--);}void FFT(){ //uchar X;for( i=1; i<=7; i++) /* for(1) */{b=1;b <<=(i-1); //碟式运算,用于计算隔多少行计算例如第一极 1和2行计算,,第二级for( j=0; j<=b-1; j++) /* for (2) */{p=1;p <<= (7-i);p = p*j;for( k=j; k<128; k=k+2*b) /* for (3) 基二fft */{Temp_Real = Fft_Real[k]; Temp_Imag = Fft_Image[k]; temp = Fft_Real[k+b];Fft_Real[k] = Fft_Real[k] + ((Fft_Real[k+b]*COS_TAB[p])>>7) + ((Fft_Image[k+b]*SIN_TAB[p])>>7);Fft_Image[k] = Fft_Image[k] - ((Fft_Real[k+b]*SIN_TAB[p])>>7) + ((Fft_Image[k+b]*COS_TAB[p])>>7);Fft_Real[k+b] = Temp_Real - ((Fft_Real[k+b]*COS_TAB[p])>>7) - ((Fft_Image[k+b]*SIN_TAB[p])>>7);Fft_Image[k+b] = Temp_Imag + ((temp*SIN_TAB[p])>>7) - ((Fft_Image[k+b]*COS_TAB[p])>>7);// 移位.防止溢出. 结果已经是本值的 1/64Fft_Real[k] >>= 1;Fft_Image[k] >>= 1;Fft_Real[k+b] >>= 1;Fft_Image[k+b] >>= 1;}}}// X=((((Fft_Real[1]* Fft_Real[1]))+((Fft_Image[1]*Fft_Image[1])))>>7);Fft_Real[0]=Fft_Image[0]=0; //去掉直流分量// Fft_Real[63]=Fft_Image[63]=0;for(j=0;j<64;j++){TEMP1=((((Fft_Real[j]*Fft_Real[j]))+((Fft_Image[j]*Fft_Image[j])))>>1);//求功率if(TEMP1>1)TEMP1--;else TEMP1=0;if(TEMP1>31)TEMP1=31;if(TEMP1>(LED_TAB[j]))LED_TAB[j]=TEMP1;if(TEMP1>(LED_TAB1[j])){ LED_TAB1[j]=TEMP1;LED_TAB2[j]=18; //提顿速度=12}}}void Init(){//-----------------------------------------------------------------------------------P1ASF = 0x02; //0000,0010, 将 P1.1 置成模拟口AUXR1 &=0xFB; //1111,1011, 令 ADRJ=0EADC=1; //AD中断打开ADC_CONTR = ADC_POWER | ADC_SPEEDHH | ADC_START | channel;//1110 1001 1打开 A/D (ADC_POWER)转换电源;11速度为70周期一次;//0中断标志清零;1启动adc(ADC_START);001AD通道打开(这里为P1.1);//-----------------------------------------------------------------------------------P2M0=1;P0M0=1;TMOD=0X12;TH0=0x30; //大约20K的采样率(要完整频段需40K以上。

用单片机实现电子音乐曲调

用单片机实现电子音乐曲调

功能扩展:用单片机实现电子音乐曲调一、程序功能用keil编制c程序,利用P0输出不同频率的脉冲,产生方波,通过扬声器发出不同频率音调。

二、音调、节拍以及编码的确定方法一般说来,单片机演奏音乐基本都是单音频率,它不包含相应幅度的谐波频率,也就是说不能像电子琴那样能奏出多种音色的声音。

因此单片机奏乐只需弄清楚两个概念即可,也就是“音调”和节拍表示一个音符唱多长的时间。

1、音调的确定1)要产生音频脉冲,只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间。

利用定时器计时这半个周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O反相,就可在I/O脚上得到此频率的脉冲。

2)利用A T89C51的内部定时器使其工作在计数器模式下,改变计数值TH0及TL0以产生不同频率的方法。

此外结束符和休止符可以分别用代码00H和FFH来表示,若查表结果为00H,则表示曲子终了;若查表结果为FFH,则产生相应的停顿效果。

3)计数脉冲值与频率的关系公式如下:N=Fi÷2÷FrN:计算值;Fi:内部计时一次为1us,故其频率为1MHz;4)其计数值的求法如下:T=65536-N=65536-Fi÷2÷Fr例如:设K=65536,F=1000000=Fi=1MHz,球低音DO(261Hz)。

中音DO(523Hz)。

高音的DO(1046Hz)的计算值T=65536-N=65536-Fi÷2÷Fr=65536-1000000÷2÷Fr=65536-500000/Fr低音DO的T=65536-500000/262=63627低音DO的T=65536-500000/523=64580低音DO的T=65536-500000/1047=650595)C调各音符频率与计数值T的对照表如表4.1所示。

表4.1 C调各音符频率与计数值T的对照表低音频率T 参数中音频率T 参数高音频率T 参数Do 262 1908 229 Do 523 956 115 Do 1046 57 57 Do﹟277 1805 217 Do﹟554 903 108 Do﹟1109 54 54 Re 294 1701 204 Re 587 852 102 Re 1175 51 51 Re﹟311 1608 193 Re﹟622 804 97 Re﹟1245 48 48 Mi 330 1515 182 Mi 659 759 91 Mi 1318 45 45 Fa 349 1433 172 Fa 698 716 86 Fa 1397 43 43 Fa﹟370 1351 162 Fa﹟740 676 81 Fa﹟1480 41 41 So 392 1276 153 So 784 638 77 So 1568 38 38 So﹟415 1205 145 So﹟831 602 72 So﹟1661 36 36 La 440 1136 136 La 880 568 68 La 1760 34 34 La﹟464 1078 129 La﹟932 536 64 La﹟1865 32 32Si 494 1012 121 Si 988 506 61 Si 1976 30 302、节拍的确定对于单片机来说,产生不同频率的脉冲是非常方便的,利用单片机的定时/计数器来产生这样的方波频率信号。

单片机音乐频谱程序

单片机音乐频谱程序
case 6:L7=1;break;
case 7:L8=1;break;
case 8:L9=1;break;
case 9:L10=1;break;
case 10:L11=1;break;
case 11:L12=1;break;
case 12:L13=1;break;
-123, -124, -125, -126, -126, -126, -126, -126, -125, -124, -123, -121, -119, -117, -114, -112, -108, -105, -102,
-98, -94, -89, -85, -80, -75, -70, -65, -59, -54, -48, -42, -36, -30, -24, -18, -12, -6};
char code sin_tabb[SAMPLE_NUM] = {0, 6, 12, 18, 24, 30, 36, 42, 48, 54, 59, 65, 70, 75, 80, 85, 89, 94, 98, 102,
105, 108, 112, 114, 117, 119, 121, 123, 124, 125, 126, 126, 126, 126, 126, 125, 124, 123, 121, 119, 117, 114, 112,
#include <STC12C5A60S2.h>
#include<intrins.h>
sbit L1=P0^0; sbit L9=P3^0;
sbit L2=P0^1; sbit L10=P3^1;
sbit L3=P0^2; sbit L11=P3^2;
sbit L4=P0^3; sbit L12=P3^3;

手把手教你用51单片机DIY音乐频谱显示_稿件 - V3

手把手教你用51单片机DIY音乐频谱显示_稿件 - V3








图二

MCU 部分的原理图





图三 (三) 编程思路 1)
点阵驱动电路图
在主函数中,单片机通过 AD 对音频数据采样,然后存放到数据缓存区进行预处理,完成 AD 滤波 处理, 自动增益控制信息扫描以及其他信息处理。 接着, 将缓存区数据送入 快速傅立叶变换 (FFT) 处理子函数进行运算。 处理完后, 从缓存区取出运算结果, 根据得到幅值计算出点阵的显示数据, 并存储到显示缓存区。 在中断函数中,根据显示缓冲区的内容对点阵显示屏进行实时刷新点亮。
根据傅立叶分析,任何声音可以分解为数个甚至无限个正弦波,而它们往往又包含有无数多的谐 波分量。而它们又往往是时刻在变化着。所以一个声音的构成其实是很复杂的。将声音的频率分量绘 制成曲线,就形成了频谱。 对频谱进行分析的仪器就是频谱分析仪,早期频谱仪都是模拟分析的。频谱仪的原理就是将声音
信号通过一系列不同中心频率的模拟带通滤波器。每个带通滤波器相当于一个共振电路,其特性由中 心频率(步进的) 、频带宽度及响应时间表示。在声音信号通过滤波器后,经过平方检波器,并进行平 均之后,在每个频率上测定所传输的功率,从而得到信号的频谱。然而,传统的频谱仪受到滤波器性 能的制约,因为模拟电路本身的特性所局限,滤波器的带宽和响应时间成反比,也就是说模拟滤波器 的频率分辨力与时间分解能力之间存在矛盾。因为频谱仪所测量的往往都是非稳态声,一般来说,都 是使用若干个滤波器来覆盖整个频率范围,并将信号同时并联地输入到这些滤波器上去。或者使用中 心频率能够从低到高连续变化的滤波器。 随着科学技术的不断进步,现在我们所使用的基本不再是那些笨重而不准确的模拟仪器的频谱仪, 取而代之的是基于处理器的软件分析法。它分析的数据来源其实是经过了 ADC(模数转换器件)转换 后得出的数字信号,所以频谱仪软件所测量的信号准确度,很大程度取决于数模转换电路的性能。比 起模拟滤波器,数字滤波器应该要更加迅速和精确。 2) 你问:那什么是均衡器和音乐频谱显示?在我们欣赏音乐的过程中有什么样的作用? 我答:对于录音棚等专业级别的音乐制作来说,通常都需要对录制的音频信号进行频谱分析来辅助音 频的加工制作。当然对于我们普通的爱好者来说,不需要那么精确的频谱分析,我们更多的是用来略 显音乐节奏,美化环境,增添气氛。于是,大多数的音乐播放软件(如图一),手机,mp3,高档的音箱 设备等,都有了音乐频谱显示。

单片机 fft频谱

单片机 fft频谱

单片机 fft频谱
单片机FFT频谱是指使用单片机(Microcontroller)进行快速傅里叶变换(Fast Four单片机FFT频谱是指使用单片机(Microcontroller)进行快速傅里叶变换(Fast Fourier Transform,FFT)以获取信号的频谱信息。

FFT是一种高效的计算离散傅里叶变换(Discrete Fourier Transform,DFT)的方法,可以将时域信号转换为频域信号。

在单片机上实现FFT频谱分析可以用于各种应用,例如音频处理、通信系统、传感器信号处理等。

通过将采集到的时域信号进行FFT变换,可以得到信号的频率分量和幅度信息,从而进行频谱分析和信号处理。

单片机FFT频谱的实现通常需要使用特定的FFT算法库或自行编写FFT算法。

常见的FFT算法有直接计算法(Direct Compute)、蝶形运算法(Butterfly Operation)和混合基2-基16 FFT算法等。

根据具体的需求和资源限制,可以选择适合的FFT算法来实现频谱分析功能。

单片机FFT频谱的优点是可以在低功耗、低成本的硬件平台上实时进行频谱分析,适用于嵌入式系统和物联网应用。

然而,由于单片机的处理能力和存储容量有限,对于大规模的信号处理可能存在一定的限制。

因此,在实际应用中需要综合考虑性能、成本和资源等因素来选择合适的FFT算法和单片机平台。

s。

手把手教你用51单片机DIY音乐频谱显示器

手把手教你用51单片机DIY音乐频谱显示器

手把手教你用51单片机DIY音乐频谱显示器说起。

我们知道,一切声音都是由振动产生的。

声音之所以千变万化各不相同,是因为它们的振动各不相同。

看看琵琶,吉他或者其他的弦类乐器,可以发现它的每一根琴弦的直径都是不一样的。

琴弦越细,音调也就越高。

反之则越低。

显然粗的弦就不如细的弦振动得快或者说是振动的频率高。

产生音调高低的不同,就是由于振动的频率不同。

很显然频率越高,音高也就越高。

频率的单位是赫兹(简写为Hz),赫兹(1857-1894),是德国物理学家,他发现了电磁波,为了纪念他,人们用它的名字来做为频率的单位。

所谓的一赫兹,就是一秒钟振动一次。

那么440Hz 呢,当然就是每秒振动440 次,这个声音就是音乐中的标准A 音,是乐器定音的标准。

而钢琴中央C 的频率则是261.63Hz。

我们人的耳朵能够听到的频率范围,是20Hz 到20000Hz。

低于这个频率范围的声音叫次声波,而高于这个频率范围的声音叫做超声波。

所以我们能听到的音乐的频率,即都在人耳可听到的这个范围之内,约从20Hz 到20KHz。

比如,下面的表格中是我们常见的一些人声的基频范围男低音80-320Hz男中音96-387Hz男高音122-488Hz女低音145-580Hz女高音259-1034Hz根据傅立叶分析,任何声音可以分解为数个甚至无限个正弦波,而它们往往又包含有无数多的谐波分量。

而它们又往往是时刻在变化着。

所以一个声音的构成其实是很复杂的。

将声音的频率分量绘制成曲线,就形成了频谱。

对频谱进行分析的仪器就是频谱分析仪,早期频谱仪都是模拟分析的。

单片机音乐频谱

单片机音乐频谱

单片机音乐频谱一、概述在单片机应用领域中,音乐频谱的设计与实现是一项常见且有趣的任务。

音乐频谱是指将音频信号的频率内容进行可视化展示的一种方法,通过频谱图可以直观地观察到音频信号的频谱特性。

本文档将详细介绍如何利用单片机实现音乐频谱的设计与实现。

二、硬件设计1.选择合适的单片机:根据实际需求选择适用的单片机,考虑到处理速度和存储容量等因素。

2.音频输入:通过选择合适的音频输入模块,将音频信号输入到单片机中。

可以选择模拟输入或数字输入方式。

3.FFT转换器:使用FFT(Fast Fourier Transform)转换器将音频信号从时域转换为频域,并计算频谱数据。

4.LED显示屏/柱形图显示模块:使用LED显示屏或柱形图显示模块,将频谱数据转化为可视化的频谱图展示。

三、软件设计1.ADC采样:在单片机中配置ADC模块,以一定的采样频率对音频信号进行采样,将其转换为数字信号。

2.数据处理:对采样得到的音频数据进行预处理,例如进行加窗处理,以减小频谱泄漏的影响。

3.FFT计算:通过调用FFT算法库,对预处理后的音频数据进行FFT计算,得到频谱数据。

4.数据显示:将计算得到的频谱数据通过LED显示屏或柱形图模块进行可视化展示。

四、调试与优化1.验证硬件连接:确保单片机与音频输入模块、显示模块等硬件连接正确。

2.调试采样频率:根据实际需求,调整ADC采样频率,以确保采样频率能够满足音频信号的频率范围。

3.调试FFT参数:根据实际需求,调整FFT参数,例如采样点数、窗函数类型等,以优化频谱分辨率和计算速度。

4.优化显示效果:通过调整频谱数据的灵敏度、颜色映射等参数,优化频谱图的展示效果。

五、附件1.单片机音乐频谱原理图:附带单片机音乐频谱的硬件连接图,方便实际搭建与调试过程中的参考和理解。

2.单片机音乐频谱代码示例:提供一个完整的单片机音乐频谱的软件代码示例,包括初始化配置、FFT计算、数据显示等部分。

六、法律名词及注释1.单片机:也称为微控制器,是一种包含处理器核心、存储器和外设功能的集成电路芯片,用于控制电子设备的工作。

单片机音乐频谱

单片机音乐频谱

单片机音乐频谱在我们的日常生活中,音乐无处不在。

从街头巷尾的广播,到个人耳机里的旋律,音乐以其独特的魅力丰富着我们的生活。

而在科技的世界里,有一种神奇的技术叫做单片机音乐频谱,它为我们呈现了音乐的另一种奇妙展现方式。

首先,让我们来了解一下什么是单片机。

单片机,简单来说,就是一个集成了微处理器、存储器、输入输出接口等功能于一体的芯片。

它体积小、功耗低,但功能却十分强大,可以按照我们编写的程序来执行各种任务。

那么,什么是音乐频谱呢?音乐频谱可以理解为是对音乐信号在不同频率上的能量分布的一种可视化展示。

就好像我们通过看彩虹的颜色分布能了解到光的组成一样,通过音乐频谱,我们能够直观地看到音乐中不同频率成分的强弱。

当单片机与音乐频谱相结合,就诞生了单片机音乐频谱这个有趣的概念。

它利用单片机的强大处理能力,对输入的音乐信号进行快速分析和计算,然后将结果以各种形式展现出来,比如通过LED 灯的闪烁、显示屏上的图形变化等等。

要实现单片机音乐频谱,需要解决几个关键的技术问题。

首先是音乐信号的采集。

我们需要一个合适的传感器或者接口,将外界的音乐信号转换成单片机能够处理的数字信号。

这就像是我们的耳朵,要先听到声音,才能理解声音的内容。

接下来是信号处理。

单片机接收到音乐信号后,需要运用各种算法和程序对其进行快速傅里叶变换(FFT)等处理,以提取出不同频率的能量信息。

这个过程就像是对声音进行拆解和分析,找出其中的各个组成部分。

然后是显示输出。

处理好的频率能量信息需要以一种直观、吸引人的方式展示出来。

常见的方式有使用多个 LED 灯组成阵列,通过灯的亮度或者颜色变化来反映不同频率的强度;或者在液晶显示屏上绘制出动态的频谱图形。

在实际应用中,单片机音乐频谱有着广泛的用途。

在音响设备中,它可以为用户提供直观的音频效果反馈,帮助用户更好地调整音响参数,获得最佳的听觉体验。

在音乐创作和表演中,它可以作为一种独特的视觉效果,为舞台增添魅力。

基于单片机的音频频谱显示器设计说明

基于单片机的音频频谱显示器设计说明

目次1 绪论-----------------------------------------------------------12 系统功能-------------------------------------------------------13 系统设计-------------------------------------------------------2 3.1 主控单元----------------------------------------------------2 3.2 STC12C5A60S2 系列单片机单片机的A/D转换器-------------------10 3.3 STC12C5A60S2 系列单片机单片机的I/O口结构-------------------113.4 频谱显示单元-----------------------------------------------144 音频频谱显示相关问题-------------------------------------------16 4.1 频谱及频谱显示---------------------------------------------164.2 FFT运算规则及编程思想--------------------------------------175 总结-----------------------------------------------------------22 参考文献-------------------------------------------------------24 致-----------------------------------------------------------23 附录A 源程序-------------------------------------------------25 附录B 系统电路图---------------------------------------------321 绪论随着电子技术的进步发展在功率放大器的设计上功能也不断更新。

单片机音乐频谱..

单片机音乐频谱..

题目:单片机LED音乐频谱的设计院(系):专业:学生姓名:学号:指导教师:2011年07月07日摘要该系统采用增强型8051单片机STC12C5A60S2为主控制器,通过单片机内置的ADC对音频信号进行采样、量化,然后通过快速傅里叶变换运算,在频域计算出音频信号各个频率分量的功率,最后通过双基色LED单元板进行显示。

该方案具有电路结构简洁,开发、生产成本低的优点。

关键词:单片机;傅里叶;LED;目录1. 引言 (1)2. 方案设计 (2)2.1设计要求 (2)2.2总体方案设计 (3)2.3总体方案组成 (6)3. 系统电路设计 (6)3.1单片机主控电路设计主控制器 (6)3.2LED显示模块电路设计 (7)4. 软件设计 (8)4.1软件设计流程图 (8)5.系统的测试 (8)6.结论 (9)7.参考文献 (11)8. 附录 (14)1. 引言本文介绍的音乐频谱显示器可对mp3、手机、计算机输出的音乐信号进行实时的频谱显示。

系统采用增强型8051单片机STC12C5A60S2为主控制芯片,通过单片机内置的ADC对音频信号进行采样,把连续信号离散化,然后通过快速傅里叶变换(FFT)运算,在频域计算出音频信号各个频率分量的功率,最后通过双基色LED单元板进行显示。

在显示的频率点不多的情况下,本系统比采用DSP或ARM作为主控制芯片的设计方案具有电路结构简洁,开发、生产成本低的优点。

2. 方案设计2.1设计要求1. 单片机自带AD 转换,这样省去外围AD 电路。

2. 控制LED 随着音乐跳动,需要理解傅里叶原理。

2.2总体方案设计经分析,将系统分为两个部分,一个是由单片机组成的主控。

另一部分是LED 显示部分,单片机对接收到的音频进行处理经过傅里叶换算后在LED 显示,5V 稳压电源给各个部分供电。

该系统实现的方法有很多种,下面将列出大家最经常用到的实现方案。

系统框图如图1所示图1 音乐频谱总体系统框图 该系统由音频信号预处理电路、单片机STC12C5A60S2控制电路、LED 频谱显示电路等部分组成。

用51单片机演奏音乐

用51单片机演奏音乐

单片机演奏音乐一般说来,单片机演奏音乐基本都是单音频率,它不包含相应幅度的谐波频率,也就是说不能象电子琴那样能奏出多种音色的声音。

因此单片机奏乐只需弄清楚两个概念即可,也就是“音调”和“节拍”。

音调表示一个音符唱多高的频率,节拍表示一个音符唱多长的时间。

在音乐中所谓“音调”,其实就是我们常说的“音高”。

在音乐中常把五线谱中央C 上方的A 音定为标准音高,其频率f=440Hz。

当两个声音信号的频率相差一倍时,也即f2=2f1时,则称f2比f1 高一个倍频程, 在音乐中1与.1(1前面的点应在1的上面),2与 .2……正好相差一个倍频程,在音乐学中称它相差一个八度音。

在一个八度音内,有12个半音。

以1—i 八音区为例,12 个半音是:1—#1、#1—2、2—#2、#2—3、3—4、4—#4,#4—5、5 一#5、#5—6、6—#6、#6—7、7—i。

其中“#”表示半音,用于升高或降低半个音。

这12 个音阶的分度基本上是以对数关系来划分的。

如果我们只要知道了这十二个音符的音高,也就是其基本音调的频率,我们就可根据倍频程的关系得到其他音符基本音调的频率。

知道了一个音符的频率后,常采用的方法就是通过一个延时程序,延时对应频率周期的二分之一周期(即t=1/2f)后,将单片机上连接蜂鸣器的I/O (P3.7)口来回取反,或者说来回清零,置位,从而让蜂鸣器发出声音,为了让单片机发出不同频率的声音,我们只需将不同的延时时间值t赋给延时程序即可实现。

例:我门以440Hz的声音频率来计算,其对应的时间 t=1/2f=1/2*440=1136us 但在实际程序中常采用查表的方式来取的t 值,而为了节约存储器空间则将t值以字节来进行存储,由于大部分t值都大于256。

所以,需将t值除以一个常数(t/x)使其小于256。

那么,在查表取得t 值后就要再乘上该常数后再赋给延时程序。

以下为常用音符对应的频率和二分之一周期值t :一首乐曲的每一个音符除了频率之外,还会有不同的节拍,确定节拍的方法有以下几种:1.在一张乐谱中,我们经常会看到这样的表达式,等等,这里1=C,1=G表示乐谱的曲调,和我们前面所谈的音调有很大的关联,就是用来表示节拍的。

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

题目:单片机LED音乐频谱的设计院(系):专业:学生姓名:学号:指导教师:2011年07月07日摘要该系统采用增强型8051单片机STC12C5A60S2为主控制器,通过单片机内置的ADC对音频信号进行采样、量化,然后通过快速傅里叶变换运算,在频域计算出音频信号各个频率分量的功率,最后通过双基色LED单元板进行显示。

该方案具有电路结构简洁,开发、生产成本低的优点。

关键词:单片机;傅里叶;LED;目录1. 引言 (1)2. 方案设计 (2)2.1设计要求 (2)2.2总体方案设计 (3)2.3总体方案组成 (6)3. 系统电路设计 (6)3.1单片机主控电路设计主控制器 (6)3.2LED显示模块电路设计 (7)4. 软件设计 (8)4.1软件设计流程图 (8)5.系统的测试 (8)6.结论 (9)7.参考文献 (11)8. 附录 (14)1. 引言本文介绍的音乐频谱显示器可对mp3、手机、计算机输出的音乐信号进行实时的频谱显示。

系统采用增强型8051单片机STC12C5A60S2为主控制芯片,通过单片机内置的ADC对音频信号进行采样,把连续信号离散化,然后通过快速傅里叶变换(FFT)运算,在频域计算出音频信号各个频率分量的功率,最后通过双基色LED单元板进行显示。

在显示的频率点不多的情况下,本系统比采用DSP或ARM作为主控制芯片的设计方案具有电路结构简洁,开发、生产成本低的优点。

2. 方案设计2.1设计要求1. 单片机自带AD 转换,这样省去外围AD 电路。

2. 控制LED 随着音乐跳动,需要理解傅里叶原理。

2.2总体方案设计经分析,将系统分为两个部分,一个是由单片机组成的主控。

另一部分是LED 显示部分,单片机对接收到的音频进行处理经过傅里叶换算后在LED 显示,5V 稳压电源给各个部分供电。

该系统实现的方法有很多种,下面将列出大家最经常用到的实现方案。

系统框图如图1所示图1 音乐频谱总体系统框图 该系统由音频信号预处理电路、单片机STC12C5A60S2控制电路、LED 频谱显示电路等部分组成。

图l为系统整体设计原理框图。

图1 系统整体设计原理框图系统各组部分的功能:(1)音频信号预处理电路主要对输入的音频进行电压放大和电平提升。

(2)单片机STC12C5A60S2控制电路采用内置的ADC 对音频信号进行采样量化,然后对量化后的音频数据采用FFT 算法计算其频谱值,再将各频谱值进行32级量化。

(3)LED 频谱显示电路在单片机的控制下,负责将FFT 计算得到的音频信号的各个频点的大小进行直观显示。

1.音频信号预处理电路图2 音频信号预处理电路音频信号预处理电路见图2所示,对输入的音频进行电压放大和电平提升。

手机、计算机输出的音频信号Vin 经过RP1进行电压调节后,经集成运放LMV358反相放大10倍(Av=-R3/R2=-10),提高系统的灵敏度。

选用单电源供电的运放LMV358,一方面可以简化系统电源电路的设计,直接采用系统的+5V 供电即可;另一方面其输出端静态电压为VCC/2,即2.5V 。

放大后的音频信号和这2.5V 叠加后变为直流电压信号,满足后面单片机内置的ADC 对输入电压量程的要求。

另外,LMV358为轨到轨输出运放,它可在+5V 单电源供电条件下仍具有较大的动态输出范围。

2.单片机STC12C5A60S2控制电路STC12C5A60S2单片机是宏晶科技生产的新一代单时钟/机器周期(1T)8051单片机,具有高速、低功耗及超强抗干扰等特点,指令代码完全兼容传统8051,但速度快8-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,所以理论上采样频率最高取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)来计算音频信号的频谱值。

根据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采样一次128个点,经过FFT运算后将得到128个频率点。

由于FFT结果的对称性,我们选取前64个点进行显示。

现在FFT算法已发展出多种形式,本系统采用按时间抽选(DIT)的基-2FFT算法,这种算法程序相对较简单,节省存储单元,运行效率较高,比较适合用单片机编程实现。

DIT基-2FFT算法主要由倒位序运算和多级蝶形运算实现。

a.倒位序运算的实现DIT基-2FFT算法通常将原始数据序列倒位序存储,运算后的结果则按正常顺序输出。

一般的数字信号处理的教材都介绍雷德(Rader)算法,通过“反向进位加法”将原始数据序列进行倒位序存储[2]。

雷德算法的灵活性较大,但在本系统中,参与运算的数据点数只有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+jIm,将式(1)转变为实部和虚部的表示形式,得到:由上面式(1)、式(2)可见,一个蝶形运算需要一次复数乘法Xm-1(k+b)WNr及两次复数加(减)法。

在单片机系统中编程实现时,需把复数运算转变为实数运算。

同理,将式(2)转变为:将sin、cos函数做成表格sin_tab[128]、cos_tab[128],直接查表可提高运算速度。

3.频谱值的显示系统中采用5*11个不同颜色的草帽LED进行显示,每列显示音频信号的一个频率点,每列LED点亮的高度表示该频率点幅度的大小。

整个显示板一共有5列,工作的时候,可以看到每列根据频率幅度的大小在跳动。

2.3 整体系统组成本系统硬件部分由单片机主控电路、LED显示部分、音频采集等部分组成,其中单片机主控电路有外接晶振,电源供电电路阻等部分组成。

软件部分详细见下文。

单片机全系统如下图2所示。

3. 系统电路设计3.1单片机主控电路设计单片机主控模块包括了振落电路、音频采集电路,同时接入了各个模块的接口,保证了整个系统的灵活性。

单片机是整个系统的控制中枢,它指挥外围器件协调工作,从而完成特定的功能。

硬件实现上采用模块化设计,每一模块只实现一个特定功能,最后再将各个模块搭接在一起。

这种设计方法可以降低系统设计的复杂性。

控制电路的核心器件是由美国Atmel公司生产的AT89S52单片机,属于MCS-51系列。

AT89S52是一种低功耗、高性能的CMOS8位微控制器,具有8K在系统可编程Flash存储器,采用的工艺是Atmel公司的高密度非易失存储器技术;片上Flash允许程序存储器在系统可编程,亦适于常规编程器;在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案;价格低廉、性能可靠、抗干扰能力强。

因此广泛应用于工业控制和嵌入式系统中。

单片机主控电路原理图如下所示:图4.1 单片机主控电路原理图3.2 LED显示模块电路设计4. 软件设计4.1软件设计流程图FFT倒序流程图FFT计算流程图5. 系统测试制作的过程中首先遇到的问题是LED如何组装,经过查阅资料发现,可以利用LED的管脚互相按照电路图连接起来,这个时候主要是利用万用表来测试,LED灯到底有无坏掉的。

通电后,在无音频输入时,LED应该无闪烁跳动现象。

在制作完成的时候,发现LED灯闪烁,这个时候,在音频输入端接入了47p的电容,这样就解决了这个问题。

6. 结论本系统采用增强型8051单片机STC12C5A60S2实现音乐频谱显示,该方案硬件电路设计简单、成本低,并具有较高的实用价值。

本方案是通过ADC采样输入的音频信号,ADC采样完成以后,将数据进行倒序排列并进行FFT运算,结果通过TFT液晶显示出来。

由于采用的处理器的处理能力的原因,不能做到很高的采样频率和很精细的频率分辨率,要提高系统的频率分辨率,就需要增加采样点数。

可以借助PC的强大处理能力,将采样的数据通过预留的串口传送给PC,在PC上完成FFT运算以及显示,这就是虚拟仪器的方式,实际工作中应用前景也非常大。

谢辞感谢老师对我们的指导。

完成了这个实训任务,虽然结果差强人意,但是还是有进步的,有收获的。

希望以后在学习生活中能继续好好学习。

7.参考文献[1]宏晶科技.STC12C5A60S2系列单片机器件手册[M].2010.[2]程佩青.数字信号处理教程(第二版)[M].北京:清华大学出版社,2001.[3]靳桅,等.基于51系列单片机的LED显示屏开关技术(第2版)[M].北京:北京航空航天大学出版社,2011.作者简介:吴永德(1980―),男,讲师,从事电子技术专业教学及研究。

罗萍(1979―),女,讲师,从事计算机技术专业教学及研究。

相关文档
最新文档