FFT在单片机上的实现 下载本文

河南科技大学毕业设计(论文)

图4-4 8点FFT运算示意图

本程序每次采样32个点,进行32点FFT运算。限于篇幅不再画出32点FFT运算图。程序用排好的32个序号来重排采集到的32个信号点。运算时的复数用结构体存储和表示。具体运算程序见附录。 §4.2.4 显示子程序

由信号处理的相关知识知,非周期信号的频谱图为连续函数。声音信号显然为非周期信号,但在单片机内,频谱只能表示为离散且成倍的频率分量。本系统将每个频谱分量以亮柱的高度形式显示在显示屏上。

LCD1602一般只能显示CGROM内的160个字符,不能显示图形。要显示不同高度的立柱,只能编辑CGRAM。在程序初始化阶段,已将CGRAM的0x10~0x17的用户自定义位置写入如下图形:

17

河南科技大学毕业设计(论文)

图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。整屏刷新一次需要经历32?2?5ms?320ms。若计算出16个频率分量幅值后统一显示,则信号采集后至少要经过320ms才能看到结果,实时性太差。本程序利用定时器,采用了显示与频谱计算工作交替处理的方式,即:

18

河南科技大学毕业设计(论文)

在两次写1602的等待过程中进行采样和计算工作,每次对1602的同列两个亮块操作时,取到的数据都是刚刚计算好的数据。这样就使得屏幕上每隔

2?2?5ms?20ms都会有一个亮柱显示新的数据。程序流程图如下:

图4-6 显示子程序流程图

显示程序见附录。

19

河南科技大学毕业设计(论文)

第5章 系统调试

§5.1 信号电压调试

根据§3.3.1 的设计,为了达到最好的采样效果,需要根据信号的幅值调节可变电阻R2,使输入的信号在0~Vref中能有较大的变化。编写调试程序,使显示屏显示出一段时间内(1s左右)从P1.2脚输入的信号电压最大值,以VP1.2/Vref?255表示。调试过程为:将系统输入连接PC机的声卡,输出端连接耳机,PC机播放音乐并调到合适的音量。然后调整R2阻值,使显示屏显示到一个200左右的数值。如屏幕显示值为191,在无信号输入时显示为100,则交流的信号在输入单片机以后就变成了9~191,以100为均值的数据。这里需要说明的是,FFT变换的交流部分并不会因信号的均值不同而不同,所以无信号时的输入值并不需引入FFT计算中。

图5-1 电压调试

§5.2 单频率信号测试

调整好信号电压后,使用虚拟仪器v0.94,使声卡发出特定频率的正弦波对系统性能进行测试。

20