0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

利用单片机实现实现频谱显示的快速傅里叶变换算法并进行优化

电子设计 来源:郭婷 作者:电子设计 2019-04-28 09:21 次阅读

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单片机进行算法优化,并详细论述系统的实现方法,结果证明该方法具有可行性。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6002

    文章

    43990

    浏览量

    621148
  • 转换器
    +关注

    关注

    27

    文章

    8213

    浏览量

    142046
  • 控制器
    +关注

    关注

    112

    文章

    15245

    浏览量

    171359
收藏 人收藏

    评论

    相关推荐

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

    方法实现音频频谱显示:一是利用硬件滤波器和A/D转换器;二是利用DSP处理频谱
    发表于 03-02 23:59

    单片机实现fft变换分析信号频谱

    本帖最后由 eehome 于 2013-1-5 09:46 编辑 求单片机实现fft变换分析信号频谱 (1)用8位AD转换芯片对信号实现
    发表于 12-14 12:51

    音频编码解码芯片实现快速傅里叶变换的功能

    最近想用音频编码解码芯片实现快速傅里叶变换的功能,选了一款芯片AD1701用mini开发板。但是FFT功能能不能实现这个问题?现在一直没有找到,也没有看到更多的其它
    发表于 12-20 09:19

    详解快速傅里叶变换FFT算法

    详解快速傅里叶变换FFT算法
    发表于 03-28 11:48

    详解快速傅里叶变换FFT算法

    详解快速傅里叶变换FFT算法
    发表于 05-25 09:31

    快速傅里叶变换FFT算法及其应用

    快速傅里叶变换FFT算法及其应用
    发表于 05-28 09:13

    详解快速傅里叶变换FFT算法

    详解快速傅里叶变换FFT算法
    发表于 03-05 11:07

    快速傅里叶变换C语言实现

    快速傅里叶变换C语言实现 模拟采样进行频谱分析FFT是DFT的快速算法用于分析确定信号(时间连续可积信号、不一定是周期信号)的频率(或相位、
    发表于 07-20 06:01

    离散傅里叶变换及其快速算法

    离散傅里叶变换及其快速算法离散傅里叶变换 (Discrete Fourier Transform,DFT)是时间函数是离散的,而且频谱函数也是离散的
    发表于 10-30 12:54 33次下载

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

    单片机实现音频频谱显示快速算法研究 1 引言     在家庭影院、卡拉OK等音响系统中,实时
    发表于 12-10 10:26 3326次阅读
    <b class='flag-5'>单片机</b><b class='flag-5'>实现</b>音频<b class='flag-5'>频谱</b><b class='flag-5'>显示</b>的<b class='flag-5'>快速算法</b>研究

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

    单片机实现音频频谱显示快速算法研究单片机实现音频
    发表于 05-20 16:50 12次下载

    利用快速傅里叶变换计算相关面

      快速傅里叶变换 (fast Fourier transform),即利用计算机计算离散傅里叶变换(DFT)的高效、快速计算方法的统称,简
    发表于 11-27 16:23 1520次阅读

    傅里叶变换的介绍傅里叶变换有什么意义和应用

    傅里叶变换是数字信号处理领城种很重要的算法。傅里叶表明:任何连续测量的时序或信号,都可以表示为不同频率的正弦波信号的无限叠加。而根据该原理的傅里叶变换算法利用直接测量到的原始信号,以累加方式来计算
    发表于 04-30 08:00 2次下载
    <b class='flag-5'>傅里叶变换</b>的介绍<b class='flag-5'>傅里叶变换</b>有什么意义和应用

    傅里叶变换(FFT)的主要思想与算法

    利用FFT算法实现快速傅里叶变换, 在理论、工程中具有非常广泛的应用。除了能够在合适的计算平台完成FFT
    的头像 发表于 07-04 14:36 3381次阅读

    利用FFT算法实现快速傅里叶变换

    简 介: 利用FFT算法实现快速傅里叶变换, 在理论、工程中具有非常广泛的应用。除了能够在合适的计算平台完成FFT
    的头像 发表于 07-10 09:07 2719次阅读