单片机实现音频频谱显示的快速算法研究

发布者:平安守护最新更新时间:2009-12-09 来源: 电子设计工程关键字:频谱显示  音频  单片机  快速傅里叶变换(FFT) 手机看文章 扫描二维码
随时随地手机看文章

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)。Fn若要精确到Hz,则需采样长度为(1/f)s的信号。提高频率分辨率,需增加采样点数,但这在一些实际应用中是不现实的,则采用有频率细分法,即采样比较短时间的信号,然后在后面补充一定数量的0,使其长度达到所需的点数,再作FFT,这在一定程度上能够提高频率分辨率。由于该系统是将音频信号频谱划分成14段显示,因此采用16点FFT运算,去掉第1点和第16点的结果即可。

3.3 音频数据采集电路

    A/D转换器选用TLC549,它具有8位转换结果,差分基准电压输入,3线数据串行输出接口,转换时间最大达17μs,每秒访问和转换次数达到40 000次,全部非校准误差为±0.5LSB,低功耗,最大为15 mW。因此,该器件完全满足系统40kHz采样频率的要求。

    图2为系统音频数据采集电路。音频信号来源于CD或DVD碟机输出的音乐信号,因而基本无噪音,考虑到音频信号是交流信号,电压范围在±0.1 V之间,而TLC549的输入必须是直流的,电压范围为0~5 V,所以还需整流和放大的预处理过程。A/D转换后得到8位数字值音频幅值的8位数字量。

 

4 音频频谱算法

    音频频谱值的计算采用快速傅里叶算法FFT(Fast Fourier Transform),为了提高显示器的刷新频率,系统每隔10 ms读取16次A/D转换值,得到16点实数序列,紧接着完成16点FFT运算得到16点复数序列。

4.1 倒位序及其优化算法

    基2-FTT算法将原始数据倒位序存储,但运算后的结果则按正常顺序输出。原始采样数据放在数组float datalm[16]中,datalm[0]存放第1次读取的A/D转换值,datalm[1]存放第2次读取的A/D转换值,以此类推,可见第n(n=(b3b2b1b0)b)次读取的A/D转换值存放在dataIm[n]中。倒序操作后采样数据存储在float dataRe[16]中,原来第n次读取的A/D转换值存放在datalm[n](n=(b0b1b2b3)b)中。根据样本大小在系统代码段中建立倒序表数组,采用查表方式实现快速倒序操作,与移位操作等方法相比,可明显提高运算速度。

4.2 蝶形运算及其优化算法

    根据基2-FFT算法,N点FFT运算可以分成log2N级,每一级都有N/2个蝶形运算,如图3所示。 

 

    蝶形运算公式的推导过程如下:

    将式(1)化简成实部和虚部的形式,得到:

    可见每个蝶形运算的输出都是由其输入值与某一正弦函数和余弦函数的乘积累加得到的。由式(3)~式(6)编制正弦和余弦表,每次做蝶形运算时可查表加快运算速度。

    基2-FFT算法的基本思想是用3层循环完成全部N点FFT运算:(1)最里层循环处理单独的一个蝶形运算,采用查表方法实现乘法运算;(2)中间层循环完成每一级的N/2个蝶形运算;(3)最外层循环完成log2N级蝶形运算。

    由此可看出:在每一级中,最里层循环完成N/2L个蝶形运算;中间层循环控制最里层循环进行2L-1次运算。因此,中间层循环完成时,共进行2L-1xN/2L=N/2个蝶形运算。实际上最里层和中间层循环完成了第L级计算,最外层则最终完成log2N级蝶形运算。

    需要加以说明的数据是:(1)在第L级中,每个蝶形的两个输入端相距b=2L-1一个点;(2)同一乘数对应着相邻间隔为2L个点的N/2L个蝶形;(3)第L级的2L-1个蝶形因子WPN中的P,可表示为P=jx25-L,其中j=0,1,2,…(2L-1-1)。

    完成16点FFT运算的RAM需求量是128字节,而单片机SST89V58RD2的RAM共1 K字节:显示器每10 ms刷新一次,而单片机SST89V58RD2的时钟频率是40 MHz,完成一次16点FFT运算实际所需时间不到6 ms,因此该系统完全满足FFT运算的时间复杂度和空间复杂度要求。

5 频谱值在VFD上的显示

    系统要求将音频信号频谱划分成14段,每段按14级量化,再使用VFD显示器显示,因此对于FFT运算结果还要作一定转换才能输出到显示器。第n点的FFT运算结果是复数,实部是dataRe[n],虚部是datalm[i]。该点的模值除以2/N就是对应该频率下信号的幅度(对于第1个点则是除以N);该点的相位即是对应该频率下信号的相位。最后的结果保存在dataRe[i]中,因为音频信号频谱被划分成14段,所以dataRe[0]和dataRe[15]的值应该舍去。同时,dataRe[i]可能不是整数,而VFD显示器要求每个频段按照14级量化,因此还需将dataRe[i]的值量化成0~14整数,最后输出到VFD电路上显示。

6 结束语

    讨论了单片机实现音响系统频谱显示的快速傅里叶变换算法,针对SST89V58RD2单片机进行算法优化,并详细论述系统的实现方法,结果证明该方法具有可行性。

关键字:频谱显示  音频  单片机  快速傅里叶变换(FFT) 引用地址:单片机实现音频频谱显示的快速算法研究

上一篇:利用捕获比较功能实现MSP430与微机串行通信的研究
下一篇:基于MSp430的微功耗数据采集系统的开发应用

推荐阅读最新更新时间:2024-03-16 12:27

51单片机开发系列二_1602字符液晶显示
从51单片机入门,对流水灯有了一定的认识后,就可以进入学习显示类的外设驱动,因为学习时往往需要直接验证、跟踪结果,显示类的外设可以把代码运行情况以非常直观的方式反馈回来。因此,笔者此处首先分析讲解1602字符型液晶的使用。 1. 1602字符型液晶概述 1602字符型液晶能够同时显示16列2行共32个字符信息。其内部已经存储了不同的点阵字符图形,包括阿拉伯数字、英文大小写、常用符号等。每个点阵字符图形都有一个固定的代码,与我们使用的ASCII码是一致的。例如大写英文字母’A’的代码为0x41,只需在需要显示的地址位置写入数据0x41即可显示出字符’A’。可用于一些简单信息交互的设计。 2. 硬件原理图 1602需三根控制线
[单片机]
51<font color='red'>单片机</font>开发系列二_1602字符液晶<font color='red'>显示</font>
基于单片机的温控报警系统设计 ,
本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确,其输出温度采用数字显示,主要用于对测温比较准确的场所,或科研实验室使用,该设计控制器使用单片机AT89S51,测温传感器使用DS18B20,用3位共阳极LED数码管以串口传送数据,实现温度显示,能准确达到以上要求。 #include reg52.h #include stdio.h #include absacc.h code unsigned char seg7code = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92, 0x82,0xf8,0x80,0x90,0x40}; //显示段码 sbit TMDA
[单片机]
基于<font color='red'>单片机</font>的温控报警系统设计 ,
汽车用 MCU 系列集成 Altia 人机交互代码生成器
赛普拉斯半导体公司 和 Altia 今日共同宣布为赛普拉斯 Traveo™ 汽车用微控制器 (MCU) 系列集成 Altia 人机交互代码生成器。本次合作为汽车制造商能够在仪表盘、平视显示器和 HVAC 显示器中实现丰富图形和先进功能相结合提供了低成本高效益的平台。Traveo 系列的 Altia 代码生成解决方案已被多家国际汽车制造商和顶级供应商采纳应用。 赛普拉斯Traveo汽车用 MCU 系列集成 Altia 人机交互代码生成 赛普拉斯 Traveo MCU 系列产品搭载具有Arm® Cortex®-R5 240-Mhz 内核的32-位 RISC 微控制器,以单芯片 MCU 解决方案实现高端图形功能。该系列微控制器
[汽车电子]
基于LIN节点的车载防盗报警设计与实现
  随着汽车工业的迅猛发展,车身上的电子控制单元也越来越多。传统的车身线束不仅会增加制造成本,而且会降低系统的可靠性和可维护性。于是,汽车车身总线应运而生。采用车身总线设计不仅可以简化线路、节约制造成本、提高可靠性,同时也节省了系统的维护成本。车载防盗报警模块是车身控制单元(BCM)的一部分,由于其本身对总线通信的实时性和速率要求不高,所以将其接入低速总线LIN上。   LIN总线   LIN总线主要用于不需要CAN性能、速率和复杂性的低速系统,是一种低成本的串行通信网络,采用一个主节点及若干从节点的结构,基于通用的UART/SCI的硬件接口,最高速率可以达到20kb/s。   LIN总线通过报文帧进行数据传输,一个完整的报
[单片机]
基于LIN节点的车载防盗报警设计与实现
单片机系统可靠性设计解决方案(一)
单论单片机硬件系统设计解决方案,一般从三个方面分析:优选设计方案、增加冗余和容错率、采用硬件抗干扰。本文详细的介绍了优化这三个方面对单片硬件可靠性带来的好处。 1、选优设计 在系统硬件设计和加工时,应该选用质量好的接插件,设计好工艺结构;选用合格的元器件,进行严格的测试、筛选和老化;设计时技术参数(如负载)要留有一定的余量或降额使用元器件;提高印制板和组装的质量。 2、采用硬件抗干扰措施 来自供电系统以及通过导线传输、电磁耦合等产生的电磁干扰信号,是单片机系统工作不稳定的重要因素,在系统硬件设计时必须采取有效的干扰抑制措施。单片机应用系统中还常使用系统监视电路检测系统发生的错误或故障,自动报警或使系统自动恢复正常工作状态。如采用电
[电源管理]
<font color='red'>单片机</font>系统可靠性设计解决方案(一)
AVR单片机内部RC振荡器校正方法
简介:VR单片机具有内部RC振荡器,对于内部振荡器的校正一直是一个比较难的问题,由于这个问题的困扰,导致很多正常的程序无法正常工作,特此整理该文档供读者参考。 操作理论 – 内部 RC 振荡器 在产品中内部 RC 振荡器在 5V 或 3.3V 下校正。工厂校正的精度在 +/-3 或 +/-10% (参考数据手册)。如果一个设计需要比工厂标准校正更高的精度,就需要再次校正 RC 振荡器,这样可以得到大约 +/-1%(对于工厂校正精度是+/-10%的器件是 +/-2%)的精度。 时钟选择 AVR 熔丝的设置控制了系统使用的时钟源。为了使用内部 RC 振荡器,需要选择正确的熔丝。数据手册中说明了可以使用的熔丝设置。 晶体参数
[单片机]
红外热释电传感器单片机设计
随着近年来,随着改革开放的深入发展,电子电器的飞速发展人民的生活水平有了很大提高。各种高档家电产品和贵重物品为许多家庭所拥有。然而一些不法分子也是越来越多。这点就是看到了大部分人防盗意识还不够强造成偷盗现象屡见不鲜。因此,越来越多的居民家庭对财产安全问题十分担忧。报警器这时正为人们解决了不少问题但是市场上的报警器大部分都是用于一些大公司财政机构。价格高昂一般人们难以接受。如果再设计和生产一种价廉、性能灵敏可靠的防盗报警器,必将在防盗和保证财产安全方面发挥更加有效的作用。由于红外线是不可见光,有很强的隐蔽性和保密性,因此在防盗、警戒等安保装置中得到了广泛的应用,此外,在电子防盗、人体探测等领域中,被动式热释电红外探测器也以其价格低廉
[单片机]
红外热释电传感器<font color='red'>单片机</font>设计
AD574与8031单片机及前置电路的一种实用接口电路
  AD574是美国核拟器件公司Analog Devices) 生产的12 位逐次逼近型快速A/D 转换器。其转换35us,转换误差为土0.05%,是前我国应用广泛,价格适中的A/D转换器。其内部含三态电路,可直接与各种微处理器连接,且无须附加逻辑接口电路,便能与CMOS 及TTL 电平兼容。内部配置的高精度参考电压源和时钟电路,使它不需要任何外部电路和时钟信号,就能实现A/D转换功能,应用非常方便。   许多文献有关于AD574与8031单片机接口技术的介绍, 但其控制功能引线基本局限于单一的AD574与8031的连接。由于8031无内部程序存贮器, 其内部数据存贮器也有限, 因而8031构成的测控系统, 往往都需外扩存贮器
[单片机]
AD574与8031<font color='red'>单片机</font>及前置电路的一种实用接口电路
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved