FFT在单片机上的实现Word文档格式.docx
《FFT在单片机上的实现Word文档格式.docx》由会员分享,可在线阅读,更多相关《FFT在单片机上的实现Word文档格式.docx(34页珍藏版)》请在冰豆网上搜索。
5dotdisplaymatrix.16pointstothecolumnheightspectrumwillbedisplayedonthedisplay.Theprocessofsettingofthefrequencydropintheperceptionofbettereffect.Thereisalsocontrastadjustmentresistor,whichmakesthescreencontrastadjustable.
KEYWORDS:
FFT,MCU,AUDIOSPECTRUM
第1章绪论
§
1.1研究的背景及意义
1.1.1课题研究背景
在家庭影院、卡拉OK等音响系统中,实时显示音乐信号的频谱将为音响系统增不少色彩。
目前实际生产的音响系统产品,大多采用以下两种方法实现音频频谱显示:
一是利用硬件滤波器和A/D转换器;
二是利用单片机或DSP处理频谱显示。
前者实现简单,但硬件成本高;
后者软件和硬件实现都较复杂。
1.1.2课题研究意义
目前,大多数音频信号处理仪不但体积大而且价格贵,在一些特殊方面难以普及使用,而嵌入式系统分析仪具有小巧可靠的特点,所以开发基于特殊功能单片机的音频信号分析仪器是语音识别的基础,具有很好的现实意义。
1.2课题发展的状况
早期专业的音频分析仪种类很少,在做音频测量时一般是利用万用电表、频率计、示波器及频谱仪等组合成一套音频测试系统。
这种测试系统中间环节多,各环节之间接口匹配较为困难,使用起来比较麻烦,测量结果往往也不精确。
传统的频谱分析仪的前端电路是一定带宽内可调谐的接收机,输入信号经变频器变频后由低通滤器输出,滤波输出作为垂直分量,频率作为水平分量,在示波器屏幕上绘出坐标图,就是输入信号的频谱图。
由于变频器可以达到很宽的频率,例如30Hz-30GHz,与外部混频器配合,可扩展到100GHz以上,频谱分析仪是频率覆盖最宽的测量仪器之一。
无论测量连续信号或调制信号,频谱分析仪都是很理想的测量工具。
但是,传统的频谱分析仪也有明显的缺点,它只能测量频率的幅度,缺少相位信息,因此属于标量仪器而不是矢量仪器。
近年来出现的音频分析仪器也与仪器的主流发展趋势一致,朝着高度集成化、智能化的方向发展,这些仪器集成了复杂音频信号发生装置、功率放大装置等,具备了一些初步的图形化分析功能,使用户很容易组建音频测量系统。
基于快速傅里叶变换(FFT)的现代频谱分析仪,通过傅里叶运算将被测信号分解成分立的频率分量,达到与传统频谱分析仪同样的结果,。
这种新型的频谱分析仪采用数字方法直接由模拟/数字转换器(ADC)对输入信号取样,再经FFT处理后获得频谱分布图。
在这种频谱分析仪中,为获得良好的仪器线性度和高分辨率,对信号进行数据采集时ADC的取样率最少等于输入信号最高频率的两倍,亦即频率上限是100MHz的实时频谱分析仪需要ADC有200MS/S的取样率。
目前半导体工艺水平可制成分辨率8位和取样率4GS/S的ADC或者分辨率12位和取样率800MS/S的ADC,亦即,原理上仪器可达到2GHz的带宽,为了扩展频率上限,可在ADC前端增加下变频器,本振采用数字调谐振荡器。
这种混合式的频谱分析仪可扩展到几GHz以下的频段使用。
1.3设计任务
1、完成信号电压调理电路和硬件的连接电路的设计。
制作出硬件实物。
2、ADC模块能正确采集到音频的完整波形,并保证一定的精度。
3、学习频谱分析和傅里叶变换有关原理,使用FFT算法分析出当前音频的频谱。
4、设计显示程序,使显示屏能实时地、以柱状图的形式将音频频谱显示出来,并有一定的美观效果。
第2章系统方案设计
2.1系统方案设计
图2-1系统总体方案
系统由信号调理电路、数模转换模块、主控制器、显示部件组成。
信号调理电路主要负责对音频信号的电压进行变换,使其电压变化能正确地被数模转换模块采集。
对信号的滤波处理也在这里进行。
ADC模块将连续变化的电压值转化为单片机可识别的离散数字量。
主控制器对采集的数据处理得到信号频谱,并控制显示屏将频谱实时显示出来。
由于是对模拟信号的实时采集分析,本系统除了可应用于数码音乐播放器的音频谱显示,还可连接麦克风显示分析环境或人声音频谱。
2.2系统硬件的选择
2.2.1处理器的比较与选择
鉴于本次设计的学习目的,处理器选择最易操作的51内核的单片机。
传统8051单片机以12个晶振周期作为一个机器周期,处理速度慢,内存较小,且在用到ADC时需要与ADC芯片通讯花费时间,因此舍弃传统8051单片机。
升级版的51内核单片机有STC12系列和Cygnal的C8051F系列待选。
其中后者被誉为51系列最快单片机,内部有最高12位高速ADC和最高4K的RAM。
但这款单片机价格较贵且仅有贴片形式的封装,调试困难。
STC的12系列单片机同样有较快的处理速度,内部有最高10位高速ADC和1280字节RAM。
考虑到本次设计目的为普通的频谱分析器,且液晶显示屏整体刷新速度有100ms的瓶颈限制,这里采用双排插针封装的STC12C560S2单片机作为处理器。
晶振使用单片机最高允许的32.768MHz晶振。
2.2.2采样模块的确定
由于单片机自带ADC转换模块,可以直接使用。
内部ADC模块的采样速度高达250K/S,远高于音频最高频率20KHz的二倍。
使用内部ADC模块还可以省去通信、存储等使用外部ADC芯片时的繁琐操作。
因此确定使用单片机内部ADC模块作为采样模块。
2.2.3显示器件的比较和选择
常见的单片机操作的8位显示屏有1602和12864两种,均为单色显示屏。
前者是分块显示的显示屏。
每格块的像素点为8×
5,共2行16列。
后者12864为128×
64个像素点的整块点阵显示屏,用于显示图形十分方便,但每次更新图形都需要整屏刷新,需要传输的数据量较大。
综合考虑,采用1602作为显示设备。
利用同列的两个显示块显示一个变化高度的亮柱来表示一个频率分量的幅值大小。
第3章系统硬件设计
3.1单片机STC12C5A60S2
3.1.1单片机STC12C5A60S2功能简介
1.增强型8051CPU,单时钟/机器周期,指令代码完全兼容传统8051
2.工作电压:
STC12C5A60S2系列工作电压:
5.5V-3.5V(5V单片机)
3.工作频率范围:
0~35MHz,相当于普通8051的0~420MHz
4.用户应用程序空间8K/16K/20K/32K/40K/48K/52K/60K/62K
5.片上集成1280字节RAM
6.通用I/O口(36/40/44个),复位后为:
准双向口/弱上拉(普通8051传统I/O口)可设置成四种模式:
准双向口/弱上拉,强上拉,仅为输入/高阻,开漏上拉,仅为输入/高阻,开漏上拉,仅为输入/高阻,每个I/O口驱动能力均可达到20mA,但整个芯片最大不要超过120mA
7.ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器可通过串口(P3.0/P3.1)直接下载用户程序。
8.有EEPROM功能(STC12C5A62S2/AD/PWM无内部EEPROM)
9.看门狗
10.内部集成MAX810专用复位电路(外部晶体12M以下时,复位脚可直接1K电阻到地)
11.外部掉电检测电路:
在P4.6口有一个低压门槛比较器5V单片机为1.33V,误差为±
5%,3.3V单片机为1.31V,误差为±
3%
12.时钟源:
外部高精度晶体/时钟,内部R/C振荡器(温漂为±
5%到±
10%以内)用户在下载用户程序时,可选择是使用内部R/C振荡器还是外部晶体/时钟常温下内部R/C振荡器频率为:
5.0V单片机为:
11MHz~17MHz单片机为:
8MHz~12MHz。
精度要求不高时,可选择使用内部时钟,但因为有制造误差和温漂,以实际测试为准。
13.共4个16位定时器,两个与传统8051兼容的定时器/计数器,16位定时器T0和T1,没有定时器2,但有独立波特率发生器做串行通讯的波特率发生器,再加上2路PCA模块可再实现2个16位定时器
14.3个时钟输出口,可由T0的溢出在P3.4/T0输出时钟,可由T1的溢出在P3.5/T1输出时钟,独立波特率发生器可以在P1.0口输出时钟
15.外部中断I/O口7路,传统的下降沿中断或低电平触发中断,并新增支持上升沿中断的PCA模块。
16.PWM(2路)/PCA(可编程计数器阵列,2路)也可用来当2路D/A使用,也可用来再实现2个定时器,也可用来再实现2个外部中断(上升沿中断/下降沿中断均可分别或同时支持)
17.A/D转换,10位精度ADC,共8路,转换速度可达250K/S
18.通用全双工异步串行口(UART),由于STC12系列是高速的8051,可再用定时器或PCA软件
19.STC12C5A60S2系列有双串口,后缀有S2标志的才有双串口,RxD2/P1.2(可通过寄存器设置到P4.2),TxD2/P1.3(可通过寄存器设置到P4.3)
20.工作温度范围:
-40~+85℃(工业级)/0~75℃(商业级)
21.封装:
PDIP-40
3.1.2单片机STC12C5A60S2引脚图
图3-1STC12C5A60S2引脚图
3.1.2单片机的最小系统
STC12C60S2最高支持33MHz的晶振,为使单片机处理数据的速度尽量快,这里选用32.768MHz的晶振。
当外部晶振大于10MHz时,单片机需要外部复位电路。
用RC上电复位的的方式,电容为10uF、电阻为10
时,电容的放电时间为ms,大于RST脚高电平复位时间。
单片机的串口通过PL-2303芯片与电脑USB连接用来下载程序。
这里省略PL-2303芯片的连接图。
方便起见,单片机供电直接使用USB的+5V供电。
下面是单片机的最小系统连接图:
图3-2STC12C5A60S2最小系统
3.2显示屏LCD1602
3.2.1LCD1602简介
1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:
阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。
读CGROM地址的时候,先读左边那列,再读上面那行,如:
感叹号!
的ASCII为0x21,字母B的ASCII为0x42(前面加0x表示十六进制)。
另外还有8个可由用户自定义的5X8的字符发生器CGRAM。
用户可以将自定义图形写入其中。
其他特性为:
+5V电压,对比度可调,内含复位电路,有80字节显示数据存储器DDRAM,提供各种控制命令,如:
清屏、字符闪烁、光标闪烁、显示移位等多种功能。
3.2.2LCD1602的硬件连接
图3-3单片机与1602液晶的连接
3.3信号调理电路
3.3.1LM324电压增益与偏移电路
本系统的信号输入来自数字音频播放器如PC机的声卡、MP3,或有源麦克风等有源设备,单声道输入。
输入信号为均值为0,幅值为
V~
V的交流信号,由
输入。
而进入单片机ADC模块的电压
要求0~
,
为USB供电的+5V。
因此必须进行电压调理。
整个系统采用单电源供电,所以无法对交流信号直接放大,必须先偏移再放大。
该过程可由一个运算放大器来完成。
运放选用LM324N,连线图如下:
图3-4电压增益与偏移电路
这是一个同向加法电路,由模拟电路相关知识易得:
其中
为
的输入信号,电压范围为
V
V,
为偏移电压,由稳压二极管产生,其作用是使均值为0的交流音频信号偏移使全为正值。
电阻
~
的值的计算过程略,这里只对图中的数值进行验证。
当
输入电压为
V时,应将放大倍数取最大,可变电阻
取0,得:
的输入电压为
V时,应将放大倍数取最小,可变电阻
取
,得:
可见电阻如图取值,当音频信号较大和较小时,都可以通过调节可变电阻R2来使采样达到较好的效果。
为使稳压管正常工作,稳压管的阴极应接在高于稳压管反向导通电压的位置。
即有:
将
、
带入上式,得
,取
。
3.3.2滤波电路
如果由于原信号频带很宽或采样频率
选得太低,则频域中相邻周期的波形就会发生重叠,从而引起误差。
这种现象称频率混叠,简称频混。
如果一个信号的频谱具有无限的带宽,则不论如何选择采样频率
,频混误差都不可避免。
然而这种信号并不多见,比较常见的是一个有用的低频信号混进了一个高频的噪声信号。
因此在采样之前先用低通滤波器滤去高频噪声,这种低通滤波器称为抗混淆滤波器。
在现代数字式分析系统中,它已被列为基本组成环节。
抗混淆滤波器的截止频率选为
由采样定理可知:
对一个频率为
的有限带宽连续信号进行采样,只有当采样频率
时,其离散傅里叶变换才不会发生频率混淆,因而只有用这样采样的点才能得到离散信号的频谱。
人可感知的音频中多不超过12KHz,为了凸显低频声音信号的频谱变化,本系统只分析12KHz以下的音频信号。
使用RC滤波器,当
,截止频率
时,电容值
为:
取10nF。
另外,单片机ADC输入的标准电路还要求加一个截止频率为3.2MHz的滤波器。
总体滤波电路图如下:
图3-5滤波电路
第4章系统软件设计
4.1系统软件总体设计
该系统的软件需要完成控制ADC模块采样信号、对采集的数据计算、控制液晶显示屏显示三个任务。
三个任务理论上应顺序运行,上一个任务完成后生成的数据交予下一个任务继续处理。
但信号采样需要严格控制采样时间间隔,数据计算任务处理速度很快,而液晶显示的控制又会间隔较长时间。
因此三个部分不能一个接一个运行。
程序还包括了各模块的初始化,总程序流程图如下:
图4-1系统程序流程总图
本程序采用中断的方式,将需要定时的采样程序和显示程序分别放在两个中断服务程序中,而主程序一直等待采样完成处理数据。
数据的连接使用了两个全局变量数组。
这样就使三个子程序在运行时,采样程序的采样时间间隔有了保障,而后两个子程序又始终有数据可以处理。
4.2系统软件详细设计
4.2.1系统的准备和初始化
Code代码段准备了一个32个元素的nxd数组和一个8×
8的User数组。
定义如下:
unsignedcharcodenxd[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};
unsignedcharcodeUser[8][8]=
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F},
{0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x1F},
{0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x1F},
{0x00,0x00,0x00,0x00,0x1F,0x1F,0x1F,0x1F},
{0x00,0x00,0x00,0x1F,0x1F,0x1F,0x1F,0x1F},
{0x00,0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F},
{0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F},
{0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F}};
nxd数组用于将32个采样点重新排列,其值为采样点重排的顺序。
这将在下面的§
4.2.3蝶形运算的FFT算法中详细介绍。
User二维数组为液晶显示块的8种显示点阵的分布,这将在下面的§
4.2.4显示子程序中详细介绍。
main()函数的开始是一些初始化程序,这包括液晶显示屏的初始化、显示屏CGRAM的写入、ADC的初始化和定时器0的初始化。
代码和注释如下:
LcdInt();
delay(15);
//调用LCD初始化函数,设置显示模式为:
16×
2显示,5×
7点阵,8位数据接口,显示开,有光标,光标闪烁,光标右移,字符不移。
并清屏。
CgInt();
delay(10);
//调用CgInt子函数,将User数组写入LCD1602的CGRAM中的0x10~0x17。
P1ASF=0x06;
//P1.1P1.2口作为AD输入,P1.1作为今后可能开发双通道分析的保留。
AUXR1&
=0xfb;
//ADRJ=0,10位ADC的高8位放在ADC_RES中,后续将不再用低2位。
EADC=1;
//开AD中断
ADC_CONTR=0x8a;
NOP5;
//启动ADC转换
AUXR=0x80;
//T0x12=1,定时器0以12倍速运行
TMOD=0x01;
//定时器0工作在方式1
TL0=T1MS;
TH0=T1MS>
>
8;
//定时器0赋初值
TR0=1;
//开定时器0中断
ET0=1;
//定时器0启动
EA=1;
//开总中断
4.2.2AD采样子程序
AD采样的数据将反映信号的频率,因此AD采样的间隔必须保证。
有两种方案来保证时间间隔:
使用高中断优先级的定时器或直接连续采样,靠ADC自己的采样延时来控制时间间隔。
定时器控制看似更加准确,但ADC的采样延时仍存在,实际每两采样点的时间间隔=定时器延时时间
两次ADC采样延时时间之差。
若ADC采样延时时间有误差,以这种方式定时的误差仍存在,且程序结构复杂,编写困难。
实际上,STC12C5A60S2单片机对模数转换速度已经有了很好的控制。
本程序拟使用单片机数模转换的转换时间来控制采样速率,而不再使用另外的定时器。
程序流程图如图:
图4-2AD采样子程序流程图
STC12C5A60S2单片机对模数转换速度由AUXR1中的SPEED1、SPEED0两位控制。
速度定义如表:
表4-1STC12C5A60S2数模转换速度控制位
SPEED1
SPEED0
A/D转换所需时间
1
90个时钟周期转换一次,CPU工作频率21MHz时,A/D转换速度约250KHz
180个时钟周期转换一次
360个时钟周期转换一次
540个时钟周期转换一次
当SPEED1=0,SPEED0=0,
=32MHz时,采样时间间隔
有:
采样