首页 文学文摘 时政新闻 科技科普 经济法律 健康生活 管理财经 教育教学 文化艺术 社科历史

基于单片机的快速傅里叶算法实现

作者:周小丽 来源:电子技术与软件工程

本文介绍了一种成本相对较低,实现简单,扩展容易的音乐频谱显示。所谓音乐频谱显示是指通过硬件或软件的方法,随着音乐强弱和节奏的变化,将音频信号中每个频率成分的幅值信息通过屏幕实时地显示出来。目前实际生产的音响系统产品,大多数采用以下两种方法实现音乐频谱显示:一是利用硬件滤波器和A/D转换器;二是利用DSP芯片处理频谱显示。前者实现简单,但硬件成本高,扩展不容易,后者软件和硬件实现都较复杂。两者都不适合于在便携设备中应用。本文针对单片机资源和运算速度都有限的特点,提出一种切实可行的FFT(快速傅里叶变换)算法来实现频谱显示。

【关键词】音乐频谱显示 DSP FFT

1 音乐频谱显示介绍

音乐频谱显示,就是通过硬件或软件的方法,随着音乐强弱和节奏的变化,将音频信号中每个频率成分的幅值信息通过屏幕实时地显示出来。

2 硬件设计

其大体设计思路为:首先对音频信号进行采集,经过数据处理后输出至端口,最后驱动屏幕显示。最小系统,是指芯片能够正常工作所需的最小电路。在最小系统的基础上进行外围电路的扩展,便构成了整个系统电路。它外围电路主要包括电源电路、端口扩展电路和显示电路。

系统采用12V交流电输入,经过整流、滤波、降压后,将电源分为+9V、+5V、+3.3V三个部分,+9V电源主要为+3.3V电源模块提供输入电压,+3.3V主要为lm3s615提供电源,+5V为显示屏提供电源。

lm3s615有34个IO口,在本系统中,屏幕为18*20的点阵屏,其中20根管脚用于传输数据,18根管脚用于每列的控制。数据端采用串行输入并行输出芯片74HC595,它最少只需3个IO口即可实现多位数据的输出,而总的时延仅为几十纳秒。控制端采用3-8译码器74LS138。为满足本系统的要求,使用了三块74HC595和三块74LS138来对端口进行扩展。最终使用了7个IO口,即可实现对38个管脚的控制,极大地节省了IO口的使用。

显示将使用20个三极管,来控制LED的亮灭。LED点阵使用了360个普通的发光二极管,按行20个和列18个依次排布。

3 软件设计

单片机以41 KHz的速率采集到的音频信号都是时域里面的离散信号,需要对数据进行离散傅里叶变换(DFT)。如果直接用DFT算法进行谱分析和信号的实时处理,那是不切实际的。考虑到单片机运算速度有限的特点,在本系统中采用了分裂基快速算法,使运算效率进一步提高,主要是对蝶形运算和倒序运算的编程。为保持频谱显示的协调性,加入了峰值缓慢下降程序。

3.1 蝶形运算

完成一个蝶形运算,需要一次复数乘法和两次复数加法。经过一次分解后,计算1个N点DFT共需要计算两个N/2点DFT和N/2个蝶形运算。而计算一个N/2点DFT需要(N/2)的平方次复数乘法和N/2(N/2-1)次复数加法。由此可见,仅仅经过一次分解,就使运算量减少近一半,所以可以对N/2点DFT作进一步分解。从而使运算量大大地减少。可以归纳出一些对编程有用的运算规律:第L级中,每个蝶形的两个输入数据相距B=2L-1个点;每级有B个不同的旋转因子;同一旋转因子对应着间隔为2L点的2M-L个蝶形。

总结上述运算规律,便可采用下述运算方法。先从输入端(第1级)开始,逐级进行,共进行M级运算。在进行第L级运算时,依次求出B个不同的旋转因子,每求出一个旋转因子,就计算完它对应的所有2M-L个蝶形。这样,可用三重循环程序实现DIT-FFT运算。根据基2-FFT算法,N点FFT运算可以分成log2N级,每一级都有N/2个蝶形运算。可见每个蝶形运算的输出都是由其输入值与某一正弦函数和余弦函数的乘积累加得到的。

3.2 倒序运算

以8点为例,来阐述倒序它的规律所在。在运算M级蝶形运算之前应先对序列进行倒序。为叙述方便,用J表示当前倒序数的十进制数值。对于N=2M,M位二进制数最高位的十进制权值为N/2,且从左向右二进制位的权值依次为N/4,N/8,…,2,1。

因此,最高位加1相当于十进制运算J+N/2。如果最高位是0(J

3.3 峰值缓慢下降

为避免数据改变过于频繁,使显示故加此算法其主要思路是:当前采样值与前一次采样值相比较,若比前一次值高,则更新数据,否则,在前一次值的基础上缓慢下降,直至为零。中途若有数据更高,则再次更新数据。如此循环,便可实现峰值的缓慢下降。

4 系统测试

在完成硬件和软件的设计后,需对整个系统进行测试以保证方案的可行性。测试可分为FFT算法的测试、数据采集测试和整体测试。

FFT算法测试:该测试为验证FFT算法得出的结果。主要测试环境为Microsoft Visual C++ 6.0。

数据采集测试:将音频信号输入至单片机,再通过串口观察数据的变化,观察工具为windows xp的超级终端。

整体测试:该测试主要是观察输出的频谱是否与电脑上显示的频谱一致。第一次输入1 KHz的正弦信号,第二次输入普通音频信号,再分别作对比。通过比较,得到的结果与预期结果基本一致,系统测试通过,设计基本完成。将该频谱显示器放置在音响旁,即实惠,又能为我们的音乐增添一点色彩。

参考文献

[1]高西全,丁玉美.数字信号处理[M].西安:西安电子科技大学出版社,2008(08):11-223.

[2]杨颂华,冯毛官,孙万蓉,胡力山.数字电子技术基础[M].西安:西安电子科技大学出版社,2000(07):2-45.

[3]张富.C及C++程序设计[M].北京:人民邮电出版社,2005(07)67-189.

[4] 籍顺心.单片机的C语言应用程序设计(第四版)[M].北京:北京航空航天大学出版社,1999(09):2-129.

作者单位

四川师范大学成都学院 四川省成都市 611745