FFT在单片机上的实现

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

FFT在单片机上的实现
摘要
音频信号分析仪是一种可广泛见于各种音响、调音和录音设备上的,能实时地采样及分析输入的音频信号的频谱,并将其显示在显示屏上的设备,使人在聆听音乐时能对音乐的高低频能有直观的了解。

本文所介绍的即是这样一个音频信号分析系统。

系统的硬件由信号调理、控制处理器、显示模块三部分组成。

信号调理电路使信号可输入300mV~3V的交流音频信号。

这里只对单路信号处理:当电压较低时使用LM324运放获得增益,对超过12800Hz的信号进行滤波处理。

另外设置输出音频接口以便监听。

控制处理器采用51内核1T单片机STC12C60A5S2,晶振频率为32.768MHz。

该单片机自带8路10位高速ADC,这里只用1路ADC的高8位。

对信号连续采32个点进行浮点型FFT运算。

一次完整采样的时间为1.25ms,最高采样频率为25600Hz,分辨频率为800Hz~12800Hz,分16级。

显示部分主体为1602液晶显示屏,其具有2行×16列的8×5点显示点阵。

16分频谱将分别以柱高形式显示在显示屏上。

程序中设置了频率下落效果以使观感更好。

另设置了对比度调节电阻,使屏幕对比度可调。

关键词:FFT 单片机音频频谱
THE REALIZATION OF FFT IN THE
MICROCONTROALER
ABSTRACT
Audio signal analyzer is a kind of device which can be widely found in various of audio, mixing and recording devices, and can sampling and analysis of the spectrum of the input have an intuitive audio signal and displays it on the display in real-time, people can are listening to Music for music when high frequency understanding. What presented in this article is just such an audio signal analysis system. The hardware of the system are formed with three parts: the signal conditioner, the control processor and the display module.
Signal conditioning circuit makes the signal of 300mV ~ 3V AC audio signal available for inputting. In this system,we only process with single-channel signal: When the voltage is lower the system uses LM324 op amp to gain voltage, and as to signals more than 12800Hz it filters them. In addition the system sets an output audio interface for monitoring.
The control processor of the system is the 51 cores 1T MCU STC12C60A5S2, with 32.768MHz crystal frequency. The device comes with 8-channel &10-bit high-speed ADC, where only one channel ADC high 8. The signal collected 32 points in consecutive floating-point FFT operation. A complete sampling time is 1.25ms, the maximum sampling frequency is 25600Hz, and the distinguish frequency is 800Hz ~ 12800Hz, with 16 levels.
The main display section is 1602 LCD screen, which has 2 rows ×16 columns - 8 × 5 dot display matrix. 16 points to the column height spectrum will be displayed on the display. The process of setting of the frequency drop in the perception of better effect. There is also contrast adjustment resistor, which makes the screen contrast adjustable.
KEY WORDS:FFT,MCU,AUDIO SPECTRUM
目录
第1章绪论 (1)
§1.1研究的背景及意义 (1)
§1.1.1课题研究背景 (1)
§1.1.2课题研究意义 (1)
§1.2课题发展的状况 (1)
§1.3设计任务 (2)
第2章系统方案设计 (3)
§2.1 系统方案设计 (3)
§2.2系统硬件的选择 (3)
§2.2.1处理器的比较与选择 (3)
§2.2.2采样模块的确定 (4)
§2.2.3显示器件的比较和选择 (4)
第3章系统硬件设计 (5)
§3.1 单片机STC12C5A60S2 (5)
§3.1.1单片机STC12C5A60S2功能简介 (5)
§3.1.2 单片机STC12C5A60S2引脚图 (6)
§3.1.2 单片机的最小系统 (6)
§3.2 显示屏LCD1602 (7)
§3.2.1 LCD1602简介 (7)
§3.2.2 LCD1602的硬件连接 (8)
§3.3.1 LM324电压增益与偏移电路 (9)
§3.3.2 滤波电路 (10)
第4章系统软件设计 (11)
§4.1系统软件总体设计 (11)
§4.2 系统软件详细设计 (12)
§4.2.1 系统的准备和初始化 (12)
§4.2.2 AD采样子程序 (13)
§4.2.3 蝶形运算的FFT算法 (15)
§4.2.4 显示子程序 (17)
第5章系统调试 (20)
§5.1 信号电压调试 (20)
§5.2 单频率信号测试 (20)
§5.2.1 实际频率分度测试 (21)
§5.2.1 频率混叠和滤波效果 (22)
§5.3 实际使用效果 (22)
结论 (24)
参考文献 (25)
致谢 (26)
附录 (27)
一、主程序代码 (27)
二、原理图 (35)
第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-1 STC12C5A60S2引脚图
§3.1.2 单片机的最小系统
STC12C60S2最高支持33MHz的晶振,为使单片机处理数据的速度尽量快,
这里选用32.768MHz的晶振。

当外部晶振大于10MHz时,单片机需要外部复位电路。

用RC上电复位的的方式,电容为10uF、电阻为10K 时,电容的放电时间为ms,大于RST脚高电平复位时间。

单片机的串口通过PL-2303芯片与电脑USB 连接用来下载程序。

这里省略PL-2303芯片的连接图。

方便起见,单片机供电直接使用USB的+5V供电。

下面是单片机的最小系统连接图:
图3-2STC12C5A60S2最小系统
§3.2 显示屏LCD1602
§3.2.1 LCD1602简介
1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们
就能看到字母“A”。

读CGROM地址的时候,先读左边那列,再读上面那行,如:感叹号!的ASCII为0x21,字母B的ASCII为0x42(前面加0x表示十六进制)。

另外还有8个可由用户自定义的5X8的字符发生器CGRAM。

用户可以将自定义图形写入其中。

其他特性为:+5V电压,对比度可调,内含复位电路,有80字节显示数据存储器DDRAM,提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多种功能。

§3.2.2 LCD1602的硬件连接
图3-3 单片机与1602液晶的连接
§3.3 信号调理电路
§3.3.1 LM324电压增益与偏移电路
本系统的信号输入来自数字音频播放器如PC 机的声卡、MP3,或有源麦克风等有源设备,单声道输入。

输入信号为均值为0,幅值为0.3V~1.5V 的交流信号,由R Chl -输入。

而进入单片机ADC 模块的电压out V 要求0~cc V ,cc V 为USB 供电的+5V 。

因此必须进行电压调理。

整个系统采用单电源供电,所以无法对交流信号直接放大,必须先偏移再放大。

该过程可由一个运算放大器来完成。

运放选用LM324N ,连线图如下:
图3-4 电压增益与偏移电路
这是一个同向加法电路,由模拟电路相关知识易得:
127
(1)()((23)//4//5)6234
out V V R V R R R R R R R R =+
+++ 其中1V 为R Chl -的输入信号,电压范围为0.3±V 1.5±V ,2V 为偏移电压,由稳压二极管产生,其作用是使均值为0的交流音频信号偏移使全为正值。

电阻
2R ~7R 的值的计算过程略,这里只对图中的数值进行验证。

当R Chl -输入电压为0.3±V 时,应将放大倍数取最大,可变电阻2R 取0,得:
12
7(1)()(3//4//5)0.8634
out V V R V R R R R R R =+
+=V 当R Chl -的输入电压为 1.5±V 时,应将放大倍数取最小, 可变电阻2R 取
10K Ω,得:
127(1)()((23)//4//5) 1.46234
out V V R V R R R R R R R R =+
++=+V 可见电阻如图取值,当音频信号较大和较小时,都可以通过调节可变电阻R2来使采样达到较好的效果。

为使稳压管正常工作,稳压管的阴极应接在高于稳压管反向导通电压的位置。

即有:
45
145D cc
V R R R R R V +++>
将451R K =Ω、5 1.2R K =Ω、 3.3D V V =、5CC V V =带入上式,得1R K Ω<,取1R K Ω=12。

§3.3.2 滤波电路
如果由于原信号频带很宽或采样频率s f 选得太低,则频域中相邻周期的波形就会发生重叠,从而引起误差。

这种现象称频率混叠,简称频混。

如果一个信号的频谱具有无限的带宽,则不论如何选择采样频率s f ,频混误差都不可避免。

然而这种信号并不多见,比较常见的是一个有用的低频信号混进了一个高频的噪声信号。

因此在采样之前先用低通滤波器滤去高频噪声,这种低通滤波器称为抗混淆滤波器。

在现代数字式分析系统中,它已被列为基本组成环节。

抗混淆滤波器的截止频率选为/2s f 。

由采样定理可知:对一个频率为0~m f 的有限带宽连续信号进行采样,只有当采样频率2s m f f ≥时,其离散傅里叶变换才不会发生频率混淆,因而只有用这样采样的点才能得到离散信号的频谱。

人可感知的音频中多不超过12KHz ,为了凸显低频声音信号的频谱变化,本系统只分析12KHz 以下的音频信号。

使用RC 滤波器,当8 1.2R K =Ω,截止频率
12s f KHz =时,电容值1C 为:
11
11()28
s C nF f R π=
=⨯
取10nF 。

另外,单片机ADC 输入的标准电路还要求加一个截止频率为3.2MHz 的滤波器。

总体滤波电路图如下:
图3-5 滤波电路
第4章系统软件设计
§4.1系统软件总体设计
该系统的软件需要完成控制ADC模块采样信号、对采集的数据计算、控制液晶显示屏显示三个任务。

三个任务理论上应顺序运行,上一个任务完成后生成的数据交予下一个任务继续处理。

但信号采样需要严格控制采样时间间隔,数据计算任务处理速度很快,而液晶显示的控制又会间隔较长时间。

因此三个部分不能一个接一个运行。

程序还包括了各模块的初始化,总程序流程图如下:
图4-1系统程序流程总图
本程序采用中断的方式,将需要定时的采样程序和显示程序分别放在两个中
断服务程序中,而主程序一直等待采样完成处理数据。

数据的连接使用了两个全局变量数组。

这样就使三个子程序在运行时,采样程序的采样时间间隔有了保障,而后两个子程序又始终有数据可以处理。

§4.2 系统软件详细设计
§4.2.1 系统的准备和初始化
Code代码段准备了一个32 个元素的nxd数组和一个8×8的User数组。

定义如下:
unsigned char code nxd[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};
unsigned char code User[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.1 P1.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.2 AD采样子程序
AD采样的数据将反映信号的频率,因此AD采样的间隔必须保证。

有两种方案来保证时间间隔:使用高中断优先级的定时器或直接连续采样,靠ADC自己的采样延时来控制时间间隔。

定时器控制看似更加准确,但ADC的采样延时仍存在,实际每两采样点的时间间隔=定时器延时时间 两次ADC采样延时时间之差。

若ADC采样延时时间有误差,以这种方式定时的误差仍存在,且程序结构复杂,编写困难。

实际上,STC12C5A60S2单片机对模数转换速度已经有了很好的控制。

本程序拟使用单片机数模转换的转换时间来控制采样速率,而不再使用另外的定时器。

程序流程图如图:
图4-2 AD 采样子程序流程图
STC12C5A60S2单片机对模数转换速度由AUXR1中的SPEED1、SPEED0两位控制。

速度定义如表:
表4-1 STC12C5A60S2数模转换速度控制位
SPEED1
SPEED0
A/D 转换所需时间
1
1
90个时钟周期转换一次,CPU 工作频率21MHz 时,A/D 转换速度约250KHz
1 0 180个时钟周期转换一次 0 1 360个时钟周期转换一次 0
540个时钟周期转换一次
当SPEED1=0,SPEED0=0,soc f =32MHz 时,采样时间间隔d t 有:
540
16.9()d soc
t us f =
= 采样的信号的最高频率分量h f 有:
1
292h d
f KHz t =
=⨯ h f 高于音频最高频率22KHz 。

由于人可感知的音频中多不超过12KHz ,若隔
点采样,则h f 变为:
1
1522h d
f KHz t =
=⨯ 定采样点数为32个点,则通过FFT 变换可将原信号变为16个频率分量相加(采样点数的确定和FFT 结果的解释见下节)。

最小频率分量为940Hz 。

采样过程并未关断定时器0中断,因此采样过程会被打断。

但定时器0的溢出间隔较长(5ms),期间可进行很多次完整的32点采样。

只有当32个点是连续采样并被移出时,主循环中的数据处理函数才开始运行。

§4.2.3 蝶形运算的FFT 算法
FFT(Fast Fourier Transformation),即为快速傅氏变换,是离散傅氏变换的快速算法,它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。

它对傅氏变换的理论并没有新的发现,但是对于在计算机系统或者说数字系统中应用离散傅立叶变换,可以说是进了一大步。

设x(n)为N 项的复数序列,由DFT 变换,任一X(m)的计算都需要N 次复数乘法和N-1次复数加法,而一次复数乘法等于四次实数乘法和两次复数加法,一次复数加法等于两次实数加法,即使把一次复数乘法和一次复数加法定义成一次“运算”(四次实数乘法和四次实数加法),那么求出N 项复数序列的X (m ),即N 点DFT 变换大约就需要N^2次运算。

当N=1024点甚至更多的时候,需要N2=1048576次运算,在FFT 中,利用WN 的周期性和对称性,把一个N 项序列(设N=2k,k 为正整数),分为两个N/2项的子序列,每个N/2点DFT 变换需要(N/2)2次运算,再用N 次运算把两个N/2点的DFT 变换组合成一个N 点的DFT 变换。

这样变换以后,总的运算次数就变成N+2*(N/2)^2=N+N^2/2。

继续上面的例子,N=1024时,总的运算次数就变成了525312次,节省了大约50%的运算量。

而如果我们将这种“一分为二”的思想不断进行下去,直到分成两两一组的DFT 运算
单元,那么N 点的DFT 变换就只需要Nlog2N 次的运算,N 在1024点时,运算量仅有10240次,是先前的直接算法的1%,点数越多,运算量的节约就越大,这就是FFT 的优越性。

2点DFT 运算称为蝶形运算,而整个FFT 就是由若干级迭代的蝶形运算组成,而且这种算法采用原位运算,故只需N 个存储单元
图4-3 蝶形运算单元
图4-3是FFT 频域抽取算法的基本运算单元,一般称为蝶形运算.下一步再将X(4m+i),i=0,1,2,3分解成4个N42序列,迭代r 次后完成计算,整个算法的复杂度减少为O(Nlog4N)
上诉结论可以推广到N 点的一般情况,规律是第一列只有一种类型的蝶形运算,系数是 ,以后每列的蝶形类型,比前一列增加一倍,到第是N/2个蝶形类型,系数是,共N/2个。

由后向前每推进一列,则用上述系数中偶数序号的那一半,例如第列的系数则为参加蝶形运算的两个数据点的间距,则是最末一级最大,其值为N/2,向前每推进一列,间距减少一半。

对N = 2L 点FFT ,共需L 级蝶形运算,每级有N/2个蝶形运算组成,蝶形运算两节点的距离:2L-1(L 表示级数)每个蝶形运算有一次复乘和2次复加。


1
11M-L
M-L
12L 102
1,0
N
2222
012
2
01
22L (1,2,3...)0,1,2. (21)
L 2N 8M 32:L 2J 02:L 2,J 1
L 3,J 0L 3,2:L M M M M
J L J J J L J N J N N N N J N L M W J W W W W W W W W W W ----====-====⎧==⎪⎨==⎪⎩===第级的系数因子为,即第级的蝶形运算系数因子类型数为个,如=,共有级
第一级个为;,第二级个为=;;;第三级个为=2
3J 1L 3,J 2L 3,J 3N N
W W ⎧⎪=⎪⎨==⎪⎪==⎩;;)
()()(21k X W k X k X k
N +=)()()2
(
21k X W k X k N X k
N -=+1()
X k 2()
X k k
N
×W ×1
×(-1)
×1
×1
图4-4 8点FFT运算示意图
本程序每次采样32个点,进行32点FFT运算。

限于篇幅不再画出32点FFT 运算图。

程序用排好的32个序号来重排采集到的32个信号点。

运算时的复数用结构体存储和表示。

具体运算程序见附录。

§4.2.4 显示子程序
由信号处理的相关知识知,非周期信号的频谱图为连续函数。

声音信号显然为非周期信号,但在单片机内,频谱只能表示为离散且成倍的频率分量。

本系统将每个频谱分量以亮柱的高度形式显示在显示屏上。

LCD1602一般只能显示CGROM内的160个字符,不能显示图形。

要显示不同高度的立柱,只能编辑CGRAM。

在程序初始化阶段,已将CGRAM的0x10~0x17
的用户自定义位置写入如下图形:
图4-5 1602字符空间(字库)图
当需要在第p列显示高为l的亮柱时,先对LCD写入p列第二行的地址,若l <8,就在这个位置调取CGRAM中0x10~0x16对应高度的图形(当l=0时调取0x20显示空格),若l≥8,则在p列第二行显示0x17全亮图后,在第p列第一行显示高度为l-8的亮柱。

这样就实现了以亮柱高度直观展示频率分量幅值的目的。

为了获得更好的视觉感受,显示程序还加入了频谱亮柱缓慢下落的动画效果。

做法为:当本次计算的的频率幅值大于等于上次的幅值时,立即更新此幅值以待显示。

若本次计算的频率幅值小于上次的幅值时,只将上次的幅值减1显示。

如此就会使得亮柱可以突然升高,却只能缓慢下落。

这符合了人对突然增强的事件敏感而对突然减弱的事件不敏感的感受。

由LCD1602的资料知,控制一个亮块需要有写地址和写数据两步操作,且间隔的典型时间为5ms。

整屏刷新一次需要经历3225320
ms ms
⨯⨯=。

若计算出16个频率分量幅值后统一显示,则信号采集后至少要经过320ms才能看到结果,实时性太差。

本程序利用定时器,采用了显示与频谱计算工作交替处理的方式,即:。

相关文档
最新文档