单片机实现音乐频谱
用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以上。
基于单片机的音频频谱显示器的研究与开发
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。
基于单片机的音频频谱程序
此程序用的单片机是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(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以上。
单片机实现音频频谱显示的快速算法研究
单片机实现音频频谱显示的快速算法研究1 引言在家庭影院、卡拉OK等音响系统中,实时显示音乐信号的频谱将为音响系统增添不少色彩。
目前实际生产的音响系统产品,大多采用以下两种方法实现音频频谱显示:一是利用硬件滤波器和A/D转换器;二是利用DSP处理频谱显示。
前者实现简单,但硬件成本高,后者软件和硬件实现都较复杂。
这里针对单片机RAM资源少、运算速度慢的特点,提出一种切实可行的快速傅里叶变换算法实现频谱显示。
2 系统整体设计及原理该系统设计由单片机SST89V58RD2、音频数据采样电路、A/D转换电路、频谱显示电路等部分组成。
图1为系统整体设计原理框图。
该系统从功能上可划分成3部分:(1)音频数据采集电路实现模拟音频信号的采样保持和量化处理,包括音频采样电路和加转换电路;(2)频谱显示电路实现模拟音频信号频谱的分段显示,它将音频信号频谱划分成14段,每段按照14级量化,由VFD显示器件显示;(3)主控制器采用SST89V58RD2单片机。
在完成系统其他控制任务的前提下,充分利用单片机剩余计算资源,采用优化FFT算法计算音频信号频谱,并将计算结果输出到频谱显示电路。
3 音频信号的采集和预处理3.1 采样频率根据香农采样定理,一般采样频率至少应为所采样音频信号最高频率的2倍。
由于人耳能够感受的频率为20 Hz~20 kHz,所以理论上采样频率最高取40 kHz。
目前工业上广泛采用的采样频率大致有3种:44 kHz、16 bit的声音称作CD音质:22 kHz、16 bit的声音效果近似于立体声广播(FMStereo),称作广播音质;11 kHz、8 bit的声音称作电话音质。
本文为提高频谱计算的精度,拟采用40 kHz的采样频率和8Bit的数据位长。
3.2 样本大小采样频率确定后,还需确定样本值,即完成一次FFT运算所需的采样点数。
根据数字信号处理的基本原理,假设采样频率为Fs,采样点数为N,则FFT运算后,第n点所表示的频率为:Fn=[(n-1)×Fs]/N(1≤n≤N)。
利用单片机实现实现频谱显示的快速傅里叶变换算法并进行优化
利用单片机实现实现频谱显示的快速傅里叶变换算法并进行优化1 引言在家庭影院、卡拉OK等音响系统中,实时显示音乐信号的频谱将为音响系统增添不少色彩。
目前实际生产的音响系统产品,大多采用以下两种方法实现音频频谱显示:一是利用硬件滤波器和A/D转换器;二是利用DSP处理频谱显示。
前者实现简单,但硬件成本高,后者软件和硬件实现都较复杂。
这里针对单片机RAM资源少、运算速度慢的特点,提出一种切实可行的快速傅里叶变换算法实现频谱显示。
2 系统整体设计及原理该系统设计由单片机SST89V58RD2、音频数据采样电路、A/D转换电路、频谱显示电路等部分组成。
图1为系统整体设计原理框图。
该系统从功能上可划分成3部分:(1)音频数据采集电路实现模拟音频信号的采样保持和量化处理,包括音频采样电路和加转换电路;(2)频谱显示电路实现模拟音频信号频谱的分段显示,它将音频信号频谱划分成14段,每段按照14级量化,由VFD显示器件显示;(3)主控制器采用SST89V58RD2单片机。
在完成系统其他控制任务的前提下,充分利用单片机剩余计算资源,采用优化FFT算法计算音频信号频谱,并将计算结果输出到频谱显示电路。
3 音频信号的采集和预处理3.1 采样频率根据香农采样定理,一般采样频率至少应为所采样音频信号最高频率的2倍。
由于人耳能够感受的频率为20 Hz~20 kHz,所以理论上采样频率最高取40 kHz。
目前工业上广泛采用的采样频率大致有3种:44 kHz、16 bit的声音称作CD音质:22 kHz、16 bit的声音效果近似于立体声广播(FMStereo),称作广播音质;11 kHz、8 bit的声音称作电话音质。
本文为提高频谱计算的精度,拟采用40 kHz的采样频率和8Bit的数据位长。
3.2 样本大小。
用单片机实现电子音乐曲调
功能扩展:用单片机实现电子音乐曲调一、程序功能用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、节拍的确定对于单片机来说,产生不同频率的脉冲是非常方便的,利用单片机的定时/计数器来产生这样的方波频率信号。
单片机音乐频谱..
题目:单片机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 频谱显示电路等部分组成。
单片机音乐频谱程序
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
呼
吸
触
摸
键
灯
(
图二
)
MCU 部分的原理图
颜
:
:
:
色
图三 (三) 编程思路 1)
点阵驱动电路图
在主函数中,单片机通过 AD 对音频数据采样,然后存放到数据缓存区进行预处理,完成 AD 滤波 处理, 自动增益控制信息扫描以及其他信息处理。 接着, 将缓存区数据送入 快速傅立叶变换 (FFT) 处理子函数进行运算。 处理完后, 从缓存区取出运算结果, 根据得到幅值计算出点阵的显示数据, 并存储到显示缓存区。 在中断函数中,根据显示缓冲区的内容对点阵显示屏进行实时刷新点亮。
根据傅立叶分析,任何声音可以分解为数个甚至无限个正弦波,而它们往往又包含有无数多的谐 波分量。而它们又往往是时刻在变化着。所以一个声音的构成其实是很复杂的。将声音的频率分量绘 制成曲线,就形成了频谱。 对频谱进行分析的仪器就是频谱分析仪,早期频谱仪都是模拟分析的。频谱仪的原理就是将声音
信号通过一系列不同中心频率的模拟带通滤波器。每个带通滤波器相当于一个共振电路,其特性由中 心频率(步进的) 、频带宽度及响应时间表示。在声音信号通过滤波器后,经过平方检波器,并进行平 均之后,在每个频率上测定所传输的功率,从而得到信号的频谱。然而,传统的频谱仪受到滤波器性 能的制约,因为模拟电路本身的特性所局限,滤波器的带宽和响应时间成反比,也就是说模拟滤波器 的频率分辨力与时间分解能力之间存在矛盾。因为频谱仪所测量的往往都是非稳态声,一般来说,都 是使用若干个滤波器来覆盖整个频率范围,并将信号同时并联地输入到这些滤波器上去。或者使用中 心频率能够从低到高连续变化的滤波器。 随着科学技术的不断进步,现在我们所使用的基本不再是那些笨重而不准确的模拟仪器的频谱仪, 取而代之的是基于处理器的软件分析法。它分析的数据来源其实是经过了 ADC(模数转换器件)转换 后得出的数字信号,所以频谱仪软件所测量的信号准确度,很大程度取决于数模转换电路的性能。比 起模拟滤波器,数字滤波器应该要更加迅速和精确。 2) 你问:那什么是均衡器和音乐频谱显示?在我们欣赏音乐的过程中有什么样的作用? 我答:对于录音棚等专业级别的音乐制作来说,通常都需要对录制的音频信号进行频谱分析来辅助音 频的加工制作。当然对于我们普通的爱好者来说,不需要那么精确的频谱分析,我们更多的是用来略 显音乐节奏,美化环境,增添气氛。于是,大多数的音乐播放软件(如图一),手机,mp3,高档的音箱 设备等,都有了音乐频谱显示。
单片机 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单片机——把乐谱翻译成频率表方便以后使用
/* 1 2 3 4 5 6 7 为 7 个基本音阶 前面加逗号','表示这是低音 前面加上点号'`'表示这是高音 后面加'#',表示这个音符升半个音阶 后面加'.',表示这个音符要再加长自身一半的延时 后面加一个或多个'-',每个表示延时一拍 后面加一个或多个'_',表示这个音符要缩短自身一半的时长,最多支持 2 个'_'。
yinc: switch(*(song+i)) {
case '#': //有半音 j 加一个音阶 i++;j++;
goto yinc;
case '-': //有一个音节加长 yinchang+=4; i++; goto yinc;
case '_': //有一个音节缩短 yinchang/=2; i++;
} printf("}"); printf("\n");
}
*diao=*song; for(i=0,i1=0;;) {
gaodi=0; //高低=0 banyin=0;//半音=0 yinchang=4;//音长 1 拍 if((*(song+i)=='|') || (*(song+i)==' ')) i++; //拍子间隔和一个空格过滤
switch(*(song+i)) { case ',': gaodi=-12;i++;//低音 break;
单片机音乐频谱
单片机音乐频谱在我们的日常生活中,音乐无处不在。
从街头巷尾的广播,到个人耳机里的旋律,音乐以其独特的魅力丰富着我们的生活。
而在科技的世界里,有一种神奇的技术叫做单片机音乐频谱,它为我们呈现了音乐的另一种奇妙展现方式。
首先,让我们来了解一下什么是单片机。
单片机,简单来说,就是一个集成了微处理器、存储器、输入输出接口等功能于一体的芯片。
它体积小、功耗低,但功能却十分强大,可以按照我们编写的程序来执行各种任务。
那么,什么是音乐频谱呢?音乐频谱可以理解为是对音乐信号在不同频率上的能量分布的一种可视化展示。
就好像我们通过看彩虹的颜色分布能了解到光的组成一样,通过音乐频谱,我们能够直观地看到音乐中不同频率成分的强弱。
当单片机与音乐频谱相结合,就诞生了单片机音乐频谱这个有趣的概念。
它利用单片机的强大处理能力,对输入的音乐信号进行快速分析和计算,然后将结果以各种形式展现出来,比如通过LED 灯的闪烁、显示屏上的图形变化等等。
要实现单片机音乐频谱,需要解决几个关键的技术问题。
首先是音乐信号的采集。
我们需要一个合适的传感器或者接口,将外界的音乐信号转换成单片机能够处理的数字信号。
这就像是我们的耳朵,要先听到声音,才能理解声音的内容。
接下来是信号处理。
单片机接收到音乐信号后,需要运用各种算法和程序对其进行快速傅里叶变换(FFT)等处理,以提取出不同频率的能量信息。
这个过程就像是对声音进行拆解和分析,找出其中的各个组成部分。
然后是显示输出。
处理好的频率能量信息需要以一种直观、吸引人的方式展示出来。
常见的方式有使用多个 LED 灯组成阵列,通过灯的亮度或者颜色变化来反映不同频率的强度;或者在液晶显示屏上绘制出动态的频谱图形。
在实际应用中,单片机音乐频谱有着广泛的用途。
在音响设备中,它可以为用户提供直观的音频效果反馈,帮助用户更好地调整音响参数,获得最佳的听觉体验。
在音乐创作和表演中,它可以作为一种独特的视觉效果,为舞台增添魅力。
基于单片机的多功能音乐频谱仪的设计与实现
能框架设计如图1所示。
图1系统功能框架设计图2硬件设计本系统以STC12C5A60S2单片机为核心,通过蓝牙无线接收模块进行采集,主要包括以下功能:频谱显示、环境温度监测、时钟和呼吸灯功能。
这些功能增强了音乐频谱仪的实用性。
2.1频谱显示功能本系统将采集到的音频信号通过A/D转换模块转为数字信号后,再经过滤波处理和快速傅里叶变换得到信号的频谱,通过LED矩阵频谱显示器显示出来。
主要包括两个模块:音频输入模块和音频滤波模块。
音频输入模块通过单片机P1口,完成音频信号的采样并将采样信号进行A/D转换。
A/D转换口在P1口有10位8路高速A/D转换器,通过软件可设置将AH201612216037)。
安徽新华学院电子通信工程学院讲师,主要从事智能信息处理研究。
安装简便等优点。
图2DS18B20温度传感器采样电路原理图2.3时钟功能本系统利用STC12C5A60S2单片机内部的A/D模块[6],将采集的信号进行模数转换为时间数据,并通过单片机同步传输数据给显示模块。
2.4无线蓝牙传输模块当手机蓝牙与音乐频谱仪蓝牙模块匹配连接成功后,即可实现频谱仪与手机的数据传输功能[7],当单片机蓝牙模块收到手机发送的特定信号后,即可利用内部的A/D模块,将音频模拟信号转化为数字信号,实现音频信号的无线传输。
3软件设计多功能音乐频谱仪采用STC12C5A60S2单片机作为线代表一种频率成分。
图3系统程序流程图图4音乐频谱效果显示图4结束语本文提出了一种多功能音乐频谱仪系统,该系统采用单片机控制,将人们喜爱“听”的音乐形象化地展示“看”出来,采用蓝牙模块实现语音信号的无线传输,并且增加了呼吸灯、时钟与温度显示功能,大大增强了系统的实用性与人性化。
【参考文献】[1]蒋长锦,蒋勇.快速傅里叶变换及其C程序[M].合肥:中国科学技术大学出版社,2004:32-349.[2]郭天祥.51单片机C语言教程[M].北京:电子工业出版社,2009.[3]冀勇钢,杨赫天.基于单总线温度传感器的多点测温系统设计[J].现代电子技术,2010,12:23-25.[4]王泽元.基于DS18B20多点温湿度采集系统的设计[J].吉。
基于STM32DSP库的音乐频谱设计
基于STM32DSP库的音乐频谱设计音乐频谱设计是指将音频信号转换为频谱表示,以便可视化和分析音频信号中的频率成分。
在STM32系列微控制器上,可以使用STM32DSP库来实现音乐频谱设计。
STM32DSP库是针对STM32系列微控制器的数字信号处理库,提供了一系列的函数和算法用于实现音频信号的处理和分析。
在使用DSP库进行音乐频谱设计时,主要包括以下几个步骤:1.音频输入:首先需要将音频信号输入到STM32微控制器中,可以通过外部音频输入设备或者内部音频模块将音频信号输入到STM32的ADC模块中。
2.采样和滤波:使用STM32ADC模块对音频信号进行采样,并采用数字滤波器对信号进行去噪和滤波操作,以提高频谱分析的准确度。
3.快速傅里叶变换(FFT):使用STM32DSP库中的FFT函数对音频信号进行快速傅里叶变换,将时域信号转换为频域信号。
4.频谱显示:将频域信号表示为频谱图形,可以使用LCD显示模块或者LED灯阵列来实现频谱可视化。
可以使用STM32的GPIO和SPI接口来连接LCD模块或者LED灯阵列。
5.频谱分析:对频谱进行分析,可以计算不同频率范围内的能量峰值、频率分布等信息,以实现音乐频谱的可视化效果。
在进行音乐频谱设计时,还可以结合其他音频处理算法,如均衡器、动态压缩等来改善音频效果。
可以使用STM32DSP库中的滤波、压缩等函数来实现这些功能。
总结起来,基于STM32DSP库的音乐频谱设计主要包括音频输入、采样和滤波、FFT变换、频谱显示和分析等步骤。
通过使用STM32系列微控制器和DSP库的优势,可以实现高效、准确的音乐频谱设计,为音频应用提供更好的用户体验。
单片机音乐频谱
单片机音乐频谱一、概述在单片机应用领域中,音乐频谱的设计与实现是一项常见且有趣的任务。
音乐频谱是指将音频信号的频率内容进行可视化展示的一种方法,通过频谱图可以直观地观察到音频信号的频谱特性。
本文档将详细介绍如何利用单片机实现音乐频谱的设计与实现。
二、硬件设计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.单片机:也称为微控制器,是一种包含处理器核心、存储器和外设功能的集成电路芯片,用于控制电子设备的工作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
图二 MCU 部分的原理图
) ( 灯 吸呼 键摸触
色 : :: 颜
图三 点阵驱动电路图 (三) 编程思路
1) 在主函数中,单片机通过 AD 对音频数据采样,然后存放到数据缓存区进行预处理,完成 AD 滤波 处理,自动增益控制信息扫描以及其他信息处理。接着,将缓存区数据送入 快速傅立叶变换(FFT) 处理子函数进行运算。处理完后,从缓存区取出运算结果,根据得到幅值计算出点阵的显示数据, 并存储到显示缓存区。
a) 采用 USB 接口供电,并且对 USB 接口进行了扩展。在没有额外占用电脑主机 USB 接口情况下, 随时随地给系统供电;
b) 加入了触摸键设计,以及震动反馈。当触摸键响应时有震动反馈,及声光提示,如今很多触屏手 机也有这种时尚设计;
c) 加入 ThinkPad 笔记本上的经典呼吸灯指示设计。如夏日里的萤火虫,一闪一闪亮晶晶,不仅有趣 还能指示系统工作状态;
好的声音效果,其各段频率成分应该有一定的比例,录音的时候,录音师操作调音台就可以使各 段频率的成分得到调整。由于各种乐器的基频高低是不同的,所以,也可以使各种乐器之间的声音比 例得到调整,常见的是把频率由低至高分成 5 段或 7 段、10 段或 15 段,有经验的录音师或音乐家能听 出哪里(哪个频率段)“空”了,即这个频段弱。哪里“鼓了个包”,即这个频段过强。通过均衡器可 以把这些予以弥补。又因为每个人对音乐中频率分布的欣赏标准是不同的,因此,各位录音师掌握的 尺度也不同,显示出各自的风格。
小贴士(1): 根据 STC12A32S2 单片机的资源情况,最多只有 1280B RAM,我们取 64 点的 FFT 就可以满足要求,还
达到更好的视觉效果,更高的刷新频率,以及为以后软件扩展留下余地。
(二) 电路原理图
我们制作这个音乐频谱显示只是用来娱乐,所以没必要追求很高的精确度和工业级别稳定性,所以, 我对电路进行了一系列的 简化处理,这样既可以节省元器件,也可以减少 DIY 的难度,提高我们的 兴趣。 在不影响正常使用的 情况下,我对电路进行了如下精简设计,但也相应的 加入了不少亮点:
3) 你问:我们制作音乐频谱显示需要用到什么基础知识吗? 我答:首先,我们采用是基于微处理器的软件分析法,微处理器是本制作的核心部分,因此,选择一 个合适的性能与配置的微处理器是关键,我选择增强型的 8051 单片机便能够满足本次制作的要求。 软件上的分析法核心是快速傅立叶算法,简称 FFT。
4) 你问:什么是 FFT? 我答:FFT(Fast Fourier Transform)即离散傅立叶变换的快速算法。在数字信号处理中常常需要用到离
1) 你问:什么是频谱?什么是频谱显示? 我答:说到“频谱”这个词,它好像是一种很神秘的东西,究竟什么是“频谱”?这便要从波形本身 的来源说起。我们知道,一切声音都是由振动产生的。声音之所以千变万化各不相同,是因为它们的 振动各不相同。看看琵琶,吉他或者其他的弦类乐器,可以发现它的每一根琴弦的直径都是不一样的。 琴弦越细,音调也就越高。反之则越低。显然粗的弦就不如细的弦振动得快或者说是振动的频率高。 产生音调高低的不同,就是由于振动的频率不同。很显然频率越高,音高也就越高。 频率的单位是赫兹(简写为 Hz),赫兹 (1857-1894),是德国物理学家,他发现了电磁波,为了纪 念他,人们用它的名字来做为频率的单位。所谓的一赫兹,就是一秒钟振动一次。那么 440Hz 呢,当 然就是每秒振动 440 次,这个声音就是音乐中的标准 A 音,是乐器定音的标准。而钢琴中央 C 的频率 则是 261.63Hz。 我们人的耳朵能够听到的频率范围,是 20Hz 到 20000Hz。低于这个频率范围的声音叫次声波,而 高于这个频率范围的声音叫做超声波。所以我们能听到的音乐的频率,即都在人耳可听到的这个范围 之内,约从 20Hz 到 20KHz。 比如,下面的表格中是我们常见的一些人声的基频范围 • 男低音 80-320Hz • 男中音 96-387Hz • 男高音 122-488Hz • 女低音 145-580Hz • 女高音 259-1034Hz
我们知道,实际上每一种音乐声,包括哪怕是一个人的独唱,一件乐器的独奏,都包括了一系列 从低到高不同频率的声波,更不要说是乐队演奏了。如果声音中低频成分多,听起来就较厚实;如果 是高音成分多,听起来就比较明亮。有的人喜欢听低音成分多些,有些人喜欢听高音成分多些,各不 相同。因此,以前的收录机上就有一个调节高低音的旋钮。把旋钮指向高音部位,高音就比较强;把 旋钮指向低音部位,低音就比较强,这就是一个简单的均衡器。
根据傅立叶分析,任何声音可以分解为数个甚至无限个正弦波,而它们往往又包含有无数多的谐 波分量。而它们又往往是时刻在变化着。所以一个声音的构成其实是很复杂的。将声音的频率分量绘 制成曲线,就形成了频谱。
对频谱进行分析的仪器就是频谱分析仪,早期频谱仪都是模拟分析的。频谱仪的原理就是将声音
信号通过一系列不同中心频率的模拟带通滤波器。每个带通滤波器相当于一个共振电路,其特性由中 心频率(步进的)、频带宽度及响应时间表示。在声音信号通过滤波器后,经过平方检波器,并进行平 均之后,在每个频率上测定所传输的功率,从而得到信号的频谱。然而,传统的频谱仪受到滤波器性 能的制约,因为模拟电路本身的特性所局限,滤波器的带宽和响应时间成反比,也就是说模拟滤波器 的频率分辨力与时间分解能力之间存在矛盾。因为频谱仪所测量的往往都是非稳态声,一般来说,都 是使用若干个滤波器来覆盖整个频率范围,并将信号同时并联地输入到这些滤波器上去。或者使用中 心频率能够从低到高连续变化的滤波器。
一、 理论篇
下面我们将讲解与制作有关的基础理论知识,我将力求使音乐频谱显示的原理通俗易懂。当然,你如果 实在等不及了,或者暂时没时间弄明白也可以快速跳过本节,在制作篇直接跟我动手开始做。 (一) 理论基础概述
正在阅读本文的你可能会问,制作这么神奇的东西,她到底是什么原理,需要用到些什么理论吗?我 能明白其中的原理吗?
随着科学技术的不断进步,现在我们所使用的基本不再是那些笨重而不准确的模拟仪器的频谱仪了 ADC(模数转换器件)转换 后得出的数字信号,所以频谱仪软件所测量的信号准确度,很大程度取决于数模转换电路的性能。比 起模拟滤波器,数字滤波器应该要更加迅速和精确。
2) 你问:那什么是均衡器和音乐频谱显示?在我们欣赏音乐的过程中有什么样的作用? 我答:对于录音棚等专业级别的音乐制作来说,通常都需要对录制的音频信号进行频谱分析来辅助音 频的加工制作。当然对于我们普通的爱好者来说,不需要那么精确的频谱分析,我们更多的是用来略 显音乐节奏,美化环境,增添气氛。于是,大多数的音乐播放软件(如图一),手机,mp3,高档的音箱 设备等,都有了音乐频谱显示。
简而言之,使用 A/D 转换器对输入的音频信号进行采样以后,经过 FFT 变换,然后取某些频率项的幅 值,量化显示,驱动 LED 点阵,点亮相应的 LED 灯。
限于篇幅,我们暂且不对 FFT 的数学原理进行过深的原理分析,以免打消大家的积极性,即使不很清楚 FFT 原理,按照我的步骤也可以做出漂亮动感的音乐频谱显示来。
文/张孝虎
以前,每当看到家里的音箱功放上的几排小灯,随着播放的音乐如波浪般跳跃,或者在电脑上打开 千千静听这个音乐播放软件时,看到那动感的频谱跟随音乐节奏优美的舞动着时,不禁思绪万千, 要是自己某天能亲手用普通的单片机 DIY 这么一个东东,那将是多么有成就感的事情,至少对我们电子爱好 者来说,这是许多人曾经梦想过的。伴随音箱里传来的美妙音乐,原本只能“听”的音乐,现在却还能“看”, 给人带来视觉上的炫酷享受。 本文将带领你动手探究其中的奥秘,你会发现她不再神秘,只要跟着我一步一步动手做,你一定可以 成功做出来。让我们给音乐赋予一个完美的视听极限,你还在等什么?马上动手吧!
2) 在中断函数中,根据显示缓冲区的内容对点阵显示屏进行实时刷新点亮。
(四) 程序流程图
开始 main()
IO 引脚初始化 及 功能设定
集成 AD 上电初始化
PWM 呼吸灯初始化设定 及 启动 PWM 定时
缓冲区及缓存数组初始化
开机 Logo 显示
中断 定时器初始化 及 启动定时器 读取 64 个 AD 转换值 进行自动增益调整及数据预处理 送入 FFT 中进行数据分析 转换计算出显示数据 并 更新到显示缓存
5) 你问:我们的制作中如何使用 FFT? 我答:很简单,首先,我们用 ADC 去采样一个模拟信号之后,使之变为数字信号。根据采样定理,因
音频信号的最高频率约为 20Khz,若 adc 的采样频率设置为 40Khz,既有采样频率大于信号频率的两倍,就 能基本满足要求。其次,将采样得到的数字信号,送入 FFT 进行变换处理。通常,若我们取 N 个采样点, 经过 FFT 运算之后,就可以得到 N 个点的 FFT 结果。但通常为了方便进行 FFT 运算,通常 N 取 2 的整数次 方。设 Fs 为 ADC 的采样频率,N 为傅立叶变换的点数.则有最小分辨频率 f=Fs/N,因此频谱显示的最低频率 就是 f Hz,以后每向右移一个点,频率值将增加 f Hz. 由于 FFT 结果的对称性,通常只使用前 N/2 个采样点的 结果。
图一 千千静听播放音乐时的频谱显示
当高级组合音响在工作时,你可以看到其中有一个部件上有一排一、二十个高高低低的推式调纽 按频率高低自左而右排列,显示一种频率分布图;或者是还有一、二十个高高低低的光柱在不断地上 下跳,时而中间起一个高峰,时而并排突起两、三个高峰,而且与音乐的高低和强度同步,高音越是 强,高峰就偏右边;低音越是强,高峰就偏左边,这就是均衡器及其联结的频谱显示。有时,也用一 排色彩不同的条纹来显示,条纹的色彩亮度随声音的强弱而同步地改变。
d) 省去了 MCU 的复位电路,以及晶振上的 2 个起振瓷片电容,但一般不影响系统正常工作; e) 双音频插孔设计。不影响正常的音频输出,省去了音频分线器; f) 去掉音频输入处理的电平移动电路,简化电路,并加入软自动增益控制,实现自动根据音乐的声