您的当前位置:首页正文

基于单片机的音乐节拍灯光显示系统

2022-06-07 来源:易榕旅网
文档从互联网中收集,已重新修正排版,word格式支持编辑,如有帮助欢迎下载支持。

基于单片机的音乐灯光节拍显示系统

2009-05-20 16:31:00 阅读487 评论2 字号:大中小 订阅

基于单片机的音乐灯光节拍显示系统

摘要:本文通过使用单片机和数字信号处理技术,实现了单片机控制的音乐节拍显示系统。本系统分为,声音采集单元,声音处理单元和显示单元。其中声音采集单元包括声音接收和 A/D 转换系统。声音接收单元接收到的音频模拟信号,经过 A/D 转换为数字信号,送给下一级处理单元处理。声音处理单元采用C52单片机进行FFT处理。显示单元接收处理后的信号, 控制5组共35个小灯泡进行显示。 软件方面使用单片机进行DFT,进而判断出该时间段音频信号的主谱,从而控制灯泡的颜色和亮度跟随着音乐节拍和强弱的变化而做出相应的实时变化,实现音乐的频谱分析并加以灯光显示。

关键词:单片机;数字信号处理;傅里叶变换;源程序;仿真与调试 Music Based on Single-Chip Light Display System Ma Xian

Abstrac: In this paper, through the use of single-chip and digital signal processing technology, the realization of a single-chip microcomputer to control the beat of the music display system. The system is divided into voice acquisition unit, the voice processing unit and display unit. Voice acquisition unit which includes the voices of receiving and A / D conversion system. Sound receiver unit to receive the audio analog signal, after A / D conversion for digital signal processing unit to the next level of processing. Voice processing unit C52 single-chip microcomputer used for FFT processing. Display unit after receiving the signal, control a total of 5 groups for 35 shows a small light bulb. Software for the use of single-chip DFT, and then determine the time period of the main audio signal spectrum, so as to control the color and brightness of light bulbs with the music beats and the strength to make the corresponding changes in real-time changes in the realization of the music spectrum analysis and light show.

Keywords: SCM; Digital Processing Technology; Fourier Transform Protel schematic; Simulation 前言

本系统仅是对设计思想的简单验证,仅仅是一个模型,不能直接投入使用。但是本系统的成功说明这种设计是可以实现的,并且只要对软硬件进行适当的修改可以应用于很多领域。譬如,可以设计LED显示屏、LED灯光装饰系列产品等。

LED显示屏系列可以有:LED可变信息标志、LED可变限速标志、LED车道控制器、交通信号灯、费额显示牌、倒记时牌、雨棚信号灯、及各种系列的室内外LED显示屏。

LED灯光装饰系列可以有:应用于酒吧、舞厅、夜总会、俱乐部、休闲中心等娱乐场所的LED彩显幕墙、LED彩显天花、LED彩显地面、建筑物外墙(或轮廓)的夜景灯光装饰和外墙显示屏等。下面就以酒吧 显示屏幕为例分析如何将本系统进行改进后应用于实际。

1 系统的应用与发展 1.1 系统的发展前景

当显示部分用全彩LED来代替单色的LED时,用单片机控制的全彩LED显示屏幕将会成为目前高档DISCO酒吧、舞台等夜场最先进的背景灯光产品。由于它应用了单片机技术和数字信号处理技术,所

1word格式支持编辑,如有帮助欢迎下载支持。

文档从互联网中收集,已重新修正排版,word格式支持编辑,如有帮助欢迎下载支持。

以既不同于普通的灯光装饰,也不同于传统的激光舞台灯。它的出现对夜场传统的灯光装饰提出了极大的挑战,同时也使夜场的灯光装饰步入了一个完全崭新的时代。

通过适当的控制,它能根据音乐的旋律、节奏而产生明暗及色彩的变化并能形成各种动态画面效果,烘托出一种梦幻密离、炫目神秘、华丽斑斓的背景灯光。从而迎合了高档的DISCO酒吧、舞台等夜场对灯光背景的特殊要求,将成为目前夜场装饰的最新亮点。

单片机控制的全彩LED彩显屏的优势有:

1、 变化多端的色彩,256级灰度、1670多万种颜色任由你凃鸭;

2、 真正音乐控制、通过麦克风可根据DJ打碟的现场音乐控制LED彩显墙的变化,与音乐实现无缝连接、让声与光容于一体;

3、精心设计的控制软件,友善的操作界面,加上多窗口多页面显示、快捷键操作,让DJ轻松调配声与光,展现奇妙的梦幻般变化;这样的应用系统与时代的发展相适应,若与各项先进技术的发展保持同步,将来会有更大的发展前景。

1.2 系统的应用

在自动化技术控制系统中,单片机的使用实现音乐灯光控制的自动化、智能化,再不需要人为干预的情况下自动用灯光的变换调剂出更好的音乐感觉,实现声光一体化。

随着单片机技术的日益成熟,单片机的发展趋势将是向大容量、高性能化,外围电路内装化等方面发展。对于单片机控制实现的音乐节拍显示器随着单片机的发展其性能也要求越来越高,效果也需要越来越好。

可以采用双CPU结构的单片机,以提高处理能力,增加显示与音乐的同步性能;通过串口驱动显示电路,减少占用的I/O口;外围电路内装化,降低功耗;采用大存储量的单片机和高采样速率的A/D转换器增加处理的点数,以提高处理精度。随着单片机技术的日趋成熟,有可能采用含有内置A/D转换器的单片机。

由于单片机的存储空间有限,限制了采样的点数,这样处理后显示的精度就不是很高。这要求在以后的发展中采用存储容量更大的单片机来完成系统,这样对单片机也提出了更高更新的要求。由于输入的音频信号一般为模拟形式的,首先要通过A/D转换器进行模数转换和采样,所以转换器的速度和采样频率都会影响显示的精度。显示是要对一段时间内信号进行傅立叶变换提取频率和最大幅度,所以傅立叶变换的时间也会影响显示的实时性。要求傅立叶变换和单片机对信号的处理都要相当快。对傅立叶变换的算法也提出了新的更高的要求,需要开发新的更快的算法。

2音乐灯光节拍的设计

2.1 音乐灯光节拍显示系统的原理设计 2.1.1 需求分析

设计一个系统时,首先要了解它的市场需求,确定有没有必要做这样的系统;其次要了解这种系统的现状,最近的科研成果等以保证自己设计的系统具有实用性和超前性,这些在前面第一章的绪论中已经给出了详细地介绍,这里不再累述。

2.1.2 系统功能的分析

2word格式支持编辑,如有帮助欢迎下载支持。

文档从互联网中收集,已重新修正排版,word格式支持编辑,如有帮助欢迎下载支持。

对于任何一个系统我们首先都要先知道它的目的和用途。音乐灯光节拍显示,顾名思义就是说要求外部灯光随着音乐的节拍有节奏的显示。对于这样的应用系统本设计分为三部分:输入部分、单片机的处理和输出显示部分。

输入部分是指音乐从外部输入到单片机的过程。单片机的处理是指单片机内的CPU对输入的数据进行适当的处理给输出显示部分提供必要的数据或是显示所需的依据。输出显示部分是指外部灯光随音乐节拍的闪烁,这种闪烁或是动态的或是静态的,或是彩色的或是单色的都是由设计者决定的。下面我分别对这三个部分进行具体的设计:

2.1.3 输入部分的设计

由于单片机只能处理离散的数字信号,而现实生活中更多的是模拟信号尤其是音乐信号多为200Hz~15KHz的模拟信号,这就是对系统的实用性提出的要求。为了解决这样的问题,在系统的输入部分要实现对模拟信号的离散化。这对于目前越来越成熟的模数转换技术实现起来是轻而易举的。也就是说我们要通过模数转换器(ADC)将输入的模拟音乐信号数字化,然后再送入单片机。

而目前的模数转换器无论是种类还是数量都已经相当多,从技术上讲也已经相当成熟。目前所用的模数转换器从转换输出的有效位数来说有4位、8位、10位、12位14位等,从原理上分有直接A/D转换器和间接A/D转换器。在直接型A/D转换器中,输入的模拟电压被直接转换成数字代码,不经任何中间变量;在间接型A/D转换器中,首先把输入的模拟电压转换成某种中间变量,然后再把这个中间变量转换成数字代码输出。每一种转换器又都有若干不同的种类。但是A/D转换器有它的技术指标,主要有:转换时间和转换速率、分辨率、转换精度。转换时间是指A/D完成一次转换所需要的时间,转换时间的倒数是转换速率。分辨率习惯用输出的二进制位数或BCD码位数表示。转换精度是指一个实际的A/D转换器于一个理想的A/D转换器在量化之上的差值。

由于A/D转换器的种类很多,不同的A/D转换器的各种指标、性能和总体的性价比都不一样,因此对于输入部分的关键是如何选择合适的A/D转换器使输入单片机的信号的各个性能都达到要求。这部分内容将在下面器件的选择部分进行讲解。

2.1.4 单片机的处理

输入到单片机内的数据首先被存储在单片机的数据存储区内。由于显示部分要求灯光随音乐节拍进行,而音乐属于音频信号,音乐的节拍和音频信号的频率所对应,因此要想实现显示与节拍统一,就要对输入的离散化的数字信号进行数字信号处理,与音频信号频率有关的数字信号处理技术目前最常用的是离散傅立叶变换。

离散博里叶变换(Discrete Fourier Transform,简称DFT),其实质是有限长序列傅里叶变换的有限点离散采样,从而开辟了频域离散化的道路,使数字信号处理可以在频域采用数字运算的方法进行,这样就大大增加了数字信号处理的灵活性。更重要的是DFT有多种快速算法,统称为快速傅里叶变换(Fast Fourier Transform),从而使信号的实时处理和设备的简化得以实现。因此,采用时域离散系统代替传统的连续时间系统。

在单片机处理部分要完成的任务就是对存储区内的数字信号进行离散傅立叶变换(DFT),并在变换后选择最大幅度所对应的离散的K值(根据采样频率得每一个K值都与一个模拟频率相对应),将最大幅度值和频率通过单片机的I/O口输出以控制显示。

对于DFT也有许多要注意的问题,譬如进行DFT的点数,软件实现DFT时的代码及其优化问题等。由于DFT的运算量很大,点数的选择很重要,这又涉及到与所选的单片机的各种性能之间能不能实现很好的结合的问题。对于这些将在下面的软件设计中结合硬件进行具体分析。

3word格式支持编辑,如有帮助欢迎下载支持。

文档从互联网中收集,已重新修正排版,word格式支持编辑,如有帮助欢迎下载支持。

2.1.5 输出显示部分

对输出显示部分的设计思想比较简单直接,这便于实现。考虑到实际的音乐信号的频率范围为200Hz~15KHz,通过A/D转换器的采样及经过DFT后,模拟的频率就会与数字频率K相对应,即K有一定的取值范围(其中K的最大值也就是所进行的DFT的点数)。本文设计的系统是通过用不同颜色的二极管组成一个5×7的点阵实现的。用7种不同颜色的二极管来代表不同的频率,这通过将数字频率K值等分为7份实现,每一段K值用一种颜色的二极管代表。每种颜色的二极管有5个用来表示幅度的大小,通过将幅度等分为不同的5段实现。由于单片机输出的信号幅度最大为5V,故当幅度为0~1V时,所对应频率的二极管亮一个;为1~2V时,亮两个二极管;为2~3V时,亮三个二极管;为3~4V时,亮四个二极管;为4~5V时,亮五个二极管。

当然这种设计对于精度的要求是比较低的,如果想提高精度可以通过增加点阵的大小了实现即将频率和幅度划分得更细,但这样会增加硬件电路的复杂程度,这个问题可以通过采用集成化的液晶点阵显示屏来解决,对此的具体讨论会在设计方案的改进部分给出。

以上是本课题的总体思路,下面将具体介绍基于的单片机的音乐灯光节拍显示系统的设计。 2.2 音乐灯光节拍显示系统的硬件设计

单片机应用系统是指以单片机为核心,配以一定的外围电路和软件,能实现某种或几种功能的应用系统。通常由软件和硬件两部分组成。对于本文课题——音乐灯光节拍显示是一种基于单片机的应用系统,故它也应该有两部分组成即硬件部分和软件部分。所以对这个系统的设计就可分为两部分:软件设计和硬件设计。这两部分是紧密相连不可分割的,下面先分析硬件电路的设计:

2.2.1 硬件电路的设计

1)器件的选择。首先要先选定单片机的类型。对于不同的单片机它们各方面的性能是不同的,譬如CPU的处理能力和速度,内部存储器的大小,I/O口的多少,定时器的多少,体积重量的差别,抗干扰能力的强弱,价格的不同,灵活性可靠性等多方面的不同。因此,要根据所设计系统的具体要求来选择性能价格比最高的单片机型号。本文所设计的音乐灯光节拍显示系统是一小型的应用系统,它对存储容量和处理速度的要求都不是很高,所以选用常用的8位微处理器8051就可以了。而8051的运算能力和控制方面的能力也是很强的,能够满足处理DFT的所需。

其次是选择A/D转换器的类型。在输入部分的设计一节中,已经说明A/D转换器的种类相当丰富,要选好A/D转换器,对本文所设计的系统来说相当重要。整个系统的精度主要有单片机的处理速度和A/D转换器决定。

对于不同原理实现的A/D转换器其转换时间是大不相同的。总的来说,积分型、电荷平衡型和跟踪比较型A/D转换器的转换速率较慢,转换时间从几毫秒到几十毫秒不等,只能构成低速A/D转换器。一般适用于对温度、压力、流量等缓变参量的检测与控制。逐次比较型的A/D转换器的转换时间从几us到100us,属于中速A/D转换器。转换时间最短的A/D转换器是那些用双极型或CMOS工艺制成全并行型、串并行型和电压转移函数型的A/D转换器。根据什么来选择不同转换时间的A/D转换器呢?

首先A/D转换器的转换时间相当于对模拟信号的采样频率,这就要求它能够满足奈奎斯特准则,即采样频率要大于输入模拟信号最高频率的两倍。由于通常的音乐频率范围为200Hz~15KHz,其最高频率(fm)为15KHz,

( 由( )应大于等于30KHz,

4word格式支持编辑,如有帮助欢迎下载支持。

文档从互联网中收集,已重新修正排版,word格式支持编辑,如有帮助欢迎下载支持。

(

由(,但是考虑到单片机的处理速度、系统的精度要求没有必要对A/D转换器的转换时间有这么高的要求,而且 一般音乐频率也不会很高。另外对A/D转换器转换精度的要求也不很高,综合考虑本系统选用ADC0809进行模拟。ADC0809是一种逐次逼近式8路模拟输入、8位数字量输出的A/D转换器。它可对0~5V的模拟信号进行转换,完成一次转换需要100us,即转换速率为10千次/秒。根据采样定理得一个周期的信号才能采10个点,也就是说ADC0809最高也只能处理1KHz的信号(这就要求注意对音乐芯片的选择)。对于这样的转换时间对输入信号的最高频率是有一定限制的,如果输入信号的频率过高就会产生失真和较大的延时,但在初步的实验中采用ADC0809进行仿真还是比较合适的。对于它产生的失真和延时可以作为一个改进的方向。

接下来是显示电路器件的选择。 这一部分根据所设计的方案是比较简单的,只需要选择不同颜色的7种二极管,每种各5个就可以了。由于参考工作电压为5V,二极管功率要求尽量小一些。

最后是一些外围辅助电路器件的选择。对于单片机应用系统外围电路也是很重要的,应该适当考虑对它的选择与设计。ADC0809有8个输入通道,它通常需要通过地址锁存器74LS373与8051相接,但是由于本文设计的系统只需要一个输入,就不需要地址锁存器了,且由于ADC0809的输出具有TTL三态锁存缓冲器可以直接连到8051的数据总线上。对于显示电路由于单片机的输出电压不能直接驱动二极管所以要通过三极管对输出电压进行放大后来驱动,需要选择合适的三极管。

2)硬件电路的连接。器件选择好后就要进行电路的连接。ADC0809的8位数字量输出直接和8051的P0口相接,ADC0809的三根地址线A、B、C与P0口的低三位相连。8051的WR和P2.7引脚通过或非门与ADC0809的START和ALE引脚相连。8051的RD和P2.7引脚也通过一或非门与ADC0809的OE引脚相连。ADC0809的EOC引脚通过一非门与8051的INT1(P3.3)引脚相连。8051的ALE引脚通过两个D触发器与0809的CLK引脚相连,提供0809工作时的时钟频率。8051的P1口用来驱动显示电路,为了节约单片机的I/O口我通过一译码器(74138)实现频率行的选择。P1.0,P1.1,P1.2分别于74138的三个输入端连接,选741388个输出端中的7个作为点阵行驱动口线,剩余的5个P1口用作幅度选择的口线。这样单片机就有更多的I/O口线去干其它的事情。

对于连接以后的硬件总体电路原理图,见附录1。 2.2.2 软件部分的设计

对于一个单片机应用系统只有硬件没有软件的驱动,硬件是不能工作的;同样只有软件没有硬件,工作也是无法完成的,软件和硬件是紧密相连的,二者缺一不可。

首先是要使ADC0809工作。ADC0809由两种工作方式,一种是查询方式,一种是中断控制法。查询法是在单片机把启动命令送到ADC之后,CPU对ADC的状态一直进行查询,以检查ADC变换是否已经结束,如查询到变换已结束,则读入转换完毕的数据。中断控制法是在启动信号送到ADC之后,单片机执行别的程序。当ADC转换结束并向单片机发出中断请求信号时,单片机响应此中断请求,进入中断服务程序,读入转换数据,并进行必要的数据处理,然后返回到原程序。本设计采用的是中断控制法,这种方法不需要单片机进行转换时间的管理,CPU效率高,适用于转换时间较长的ADC0809。

在所设计的系统中把ADC0809作为外部数据存储器,给定通道0的地址[0x7FF8],通过地址来控制是对哪一通道进行转换。

确定ADC0809的工作方式后开始设计软件部分的工作流程。

5word格式支持编辑,如有帮助欢迎下载支持。

文档从互联网中收集,已重新修正排版,word格式支持编辑,如有帮助欢迎下载支持。

在主程序中首先进行初始化,确定外部中断为低优先级,时钟中断为高优先级;开中断;对定时器0进行工作方式、初始值的设定;启动ADC0809开始工作。这时8051开始等待或去做其它的事情,在这里由于单片机的任务是单一的所以就用空循环语句让单片机等待中断的发生,然后进中断子程序进行处理。

外部中断子程序的功能是当ADC0809转换完成向8051发出中断请求,读取ADC0809通道0的转换结果并把结果存储到8051的外部数据存储器内,等待CPU的处理。

时钟中断子程序是在定时时间到后对数据进行处理,它是整个程序的核心,其中包括最重要的部分DFT。由于DFT的运算量很大,运算时间很长,故在降低精度的情况下进行16点DFT,又因为ADC0809的转换时间大约是100us,因此将时钟0的初始值设为0xF9C0,实现1600us的定时,在这段时间内单片机大约采样16点(实际上小于16)。通过信号产生子程序将采软件部分工作流程图

图2-1系统流程图

取到的信号补足16点,并产生进行DFT所需的信号的虚部。由于DFT技术已经很成熟,而它也有专门的快速算法FFT,所以对于DFT部分采用已有的程序。利用已有的DFT程序最后输出的是每一点所对应的实部和虚部的幅度值,而最终要用到的是信号幅度值,所以通过另一子程序来产生各个数字频率值K所对应的幅度,并取出最大幅度和它所对应的频率值K。最后通过显示子程序将幅度值和频率值所代表的信息显示出来。

2.3 傅立叶变换的原理与算法 2.3.1 DFT的定义

设x(n)是一个长度为M的有限长序列,则定义x(n)的N点离散傅里叶变换为 , (

X(k)的离散傅里叶逆变换IDFT(Inverse Discrete Fourier Transform,简称IDFT)为 , (

式中, ,N称为DFT变换区间长度,N≥M。通常称( 把(,有 由于

所以,在变换区间上满足下式: 由此可见,(

x(n)的离散傅里叶变换结果与变换区间长度N的取值有关。下面介绍DFT的物理意义。

由[19]可得,序列x(n)的n点DFT是z变换在单位圆上的n点等间隔采样。X(k)为x(n)的傅里叶变换X(ejw)在区间[0,2π]上的N点等间隔采样。这就是DFT的物理意义。

2.3.2 DFT的隐含周期

前面定义的DFT变换对中,x(n)与X(k)均为有限长序列,但由于 的周期性,使(,且周期均为N。对任意整数m,总有

所以(, 满足:

6word格式支持编辑,如有帮助欢迎下载支持。

文档从互联网中收集,已重新修正排版,word格式支持编辑,如有帮助欢迎下载支持。

同理可证明(,x(n+mN)=x(n)

实际上,任何周期为 的周期序列 都可以看作长度为 的有限长序列 的周期延拓序列,而 则是 的一个周期,即

( (

一般定义周期序列 中从 到 的第一个周期为 的主值区间,而主值区间上的序列称为 的主值序列。因此 和 的关系可叙述为: 是 的周期延拓序列; 是 的主值序列。

如果 的长度为 ,且 ,则可写出 的离散傅里叶级数表示式 ( (

式中, 为 的主值序列。将(,有限长序列x(n)的离散傅里叶变换X(k),正好是x(n)的周期延拓序列x((n))n的离散傅里叶级数系数 的主值序列,即 。

2.3.3 离散傅里叶变换的基本性质

1.线性性质 如果x1(n)和x2(n)是两个有限长序列,长度分别为N1和N2,而式中,a、b为常数,取N=max[N1,N2],若y[n]=ax1(n)+bx2(n),则y(n)的N点DFT为

, (

其中 和 分别为 和 的 点DFT。 2.循环移位性质

1)序列的循环移位 设x(n)为有限长序列,长度为N,则x(n)的循环移位定义为 (

(,将x(n)以N为周期进行周期延拓得到 ,在将 左移m位得到 的主值序列则得到有限长序列x(n)的循环移位序列y(n)。循环移位的实质是将x(n)左移m位,而移出主值区间(0≤n≤N-1)的序列值又一次从右侧进入主值区。“循环移位”就是由此而来的。

2)时域循环移位定理 设x(n)是长度为N的有限长序列,y(n)为x(n)的循环移位,即 ( 则

( 其中 , 。

3)频域循环移位定理 如果 , 则 (

7word格式支持编辑,如有帮助欢迎下载支持。

文档从互联网中收集,已重新修正排版,word格式支持编辑,如有帮助欢迎下载支持。

3.循环卷积定理 有限长序列x1(n)与x2(n),长度分别为N1和N2,N=max[N1,N2]。x1(n)和x2(n)的 点DFT分别为:

如果 则 或 ( 一般称(

2.3.4 用DFT对连续信号进行谱分析

工程实际中,经常遇到的连续信号xa(t),其频谱函数xa(jΩ)也是连续函数。为了利用DFT对xa(t)进行频谱分析,先对xa(t)进行时域采样,得到x(n)=xa(nT),再对x(n)进行DFT,得到的X(K)则是x(n)的傅里叶变换X(ejw)在频率区间[0,2π]上的N点等间隔采样。这里x(n)和 X(K)均为有限长序列。然而,由傅里叶变换理论知道,若信号持续时间有限长,则其频谱无限宽;若信号的频谱有限宽,则其持续时间无限长。所以严格地讲,持续时间有限的带限信号是不存在的。因此,按采样定理采样时,上述两种情况下的采样序列x(n)=xa(nT)均应为无限长,不满足DFT的变换条件。实际上对频谱很宽的信号,为防止时域采样后产生频谱混叠失真,可用预滤波法滤除幅度较小的高频成分,使连续信号的带宽小于折叠频率。对于持续时间很长的信号,采样点数太多以致无法存贮和计算,只好截取有限点进行DFT。由上述可见,用DFT对连续信号进行谱分析必然是近似的,其近似程度与信号带宽、采样频率和截取长度有关。实际上从工程角度看,滤除幅度很小的高频成分和截去幅度很小的部分时间信号是允许的。

2.3.5 DFT的算法

DFT是信号分析与处理中的一种重要变换。因直接计算DFT的计算量与变换区间长度 的平方成正比,当N较大时,计算量太大,所以在快速傅里叶变换(简称FFT)出现以前,直接用DFT算法进行谱分析和信号的实时处理是不切实际的。直到1965年发现了DFT的一种快速算法以后,情况才发生了根本的变化。

自从1965年图基(J w. Tuky)和库利(T.W. Coody) 在《计算机数学》(Math.Computation,voI.19,1965)杂志上发表了著名曲《机器计算傅里叶级数的一种算法》论文后,桑德(G.Sand)—图基等快速算法相继出现,又经人们进行改进,很快形成一套高效运算方法,这就是现在的快速傅里叶变换,简称FFT(Fast Fourier Transform)。这种算法使DFT的运算效率提高1~2个数量级,为数字信号处理技术应用于各种信号的实时处理创造了良好的条件.大大推动了数字信号处理技术的发展。

人类的求知欲和科学的发展是永无止境的。多年来,人们继续寻求更快、更灵活的好算法。l984年,法国的杜哈梅尔(P.Dohamel)和霍尔曼(H.Ho11mann)提出的分裂基快速算法,使运算效率进一步提高。下面主要讨论基2FFT算法。

时域抽取法基2FFT基本原理

FFT算法基本上分为两大类:时域抽取法FFT( Decimation-In-Time FFT,简称DIT—FFT)和频域抽取法FFT(Decimation-In-Frquency FFT,简称DIF—FFT)。下面介绍DIF—FFT算法。

设序列x(n)的长度为N,且满足 N=2M,M为自然数按 的奇偶把x(n)分解为两个N/2点的序列 则 的DFT为 = 由于 所以

8word格式支持编辑,如有帮助欢迎下载支持。

文档从互联网中收集,已重新修正排版,word格式支持编辑,如有帮助欢迎下载支持。

其中 和 分别为 和 的 点DFT,即

由于 和 均以 为周期,且 ,所以 又可表示为

这样,就将 点DFT分解为两个N/2点的DFT和以上两式的运算。 DIT—FFT的运算规律及编程思想

为了最终写出DIT—FFT运算程序或设计出硬件实现电路,下面介绍它的运算规律。

1)原位计算 由[19]中的图4.2.4 可以看出,DIT—FFT的运算过程很有规律。N=2M点的FFT共进行M级运算,每级由N/2个蝶形运算组成。同一级中,每个蝶形的两个输入数据只对计算本蝶形有用,而且每个蝶形的输入、输出数据结点又同在一条水平线上,这就意味着计算完一个蝶形后,所得输出数据可立即存入原输入数据所占用的存贮单元。这样,经过M级运算后,原来存放输入序列数据的N个存贮单元中便依次存X(K)的N个值。这种利用同一存贮单元存贮蝶形计算输入、输出数据的方法称为原位(址)计算。原位计算可节省大量内存,从而使设备成本降低。

2)旋转因子的变化规律 如上所述,N点DIT—FFT运算流图中,每级都有N/2个蝶形。每个蝶形都要乘以因子WPN,称其为旋转因子,p称为旋转因子的指数。但各级的旋转因子和循环方式都有所不同。为了编写计算程序,应先找出旋转因子与运算级数的关系。用L表示从左到右的运算级数(L=0,1...M)。观察[19]中图,第 级共有2L-1个不同的旋转因子。

时的各级旋转因子表示如下: L=1时, , L=2时, L=3时, ,

对 的一般情况,第L级的旋转因子为 , 由于 所以 ,

这样,就可按以上两式确定第L级运算的旋转因子。

3)蝶形运算规律 设序列x(n)经时域抽选(倒序)后,存入数组X中。如果蝶形运算的两个输入数据相距B个点,应用原位计算,则蝶形运算可表示成如下形式:

式中 ;

下标L表示第L级运算,XL(J)则表示第L级运算后数组元素X(J)的值。如果是实数运算完成上述蝶形运算,可按下面的算法进行。

4)编程思想及程序框图 仔细观察[19]图4.2.4,还可归纳出一些对编程序有用的运算规律:第 级中,每个蝶形的两个输入数据相距B=2L-1个点;同一旋转因子对应着间隔为2L点的2M-L个蝶形。

总结上述运算规律,便可采用下述运算方法。先从输入端(第1级)开始,逐级进行,共进行 级运算。在进行第上级运算时,依次求出2L-1个不同的旋转因子,每求出一个旋转因子,就计算完它对应的所有2M-L个蝶形。这样,我们可用三重循环程序实现D1T—FFT运算,程序框图如图2.2所示。

9word格式支持编辑,如有帮助欢迎下载支持。

文档从互联网中收集,已重新修正排版,word格式支持编辑,如有帮助欢迎下载支持。

另外,DIT—FFT算法的输出X(K)为自然顺序,但为了适应原位计算,其输入序列不是按x(n)的自然顺序排序,这种经过M-1次偶奇抽选后的排

图2-2 DIT_FFT运算和程序框图

序称为序列x(n)的倒序(倒位)。因此,在运算之前应先对序列x(n)进行倒序。程序框图中的倒序框就是完成这一功能的。下面介绍倒序算法。

5)序列的倒序 D1T—FFT算法的输入序列的排序看起来似乎很乱,但仔细分析就会发现这种倒序是很有规律的。由于N=2M,所以顺序数可用M位二进制数表示。M次偶奇时域抽选过程如图2.3所示。第一次按最低位n0的0和1将x(n)分解为偶奇两组,第二次又按次低位n1的0、l值分别对偶奇组分解;依次类推,第M次按nM-1位分解,最后所得二进制倒序数如图2.3所示。表2.1列出了N=8时以二进制数表示的顺序数和倒序数,由表显而易见,只要将顺序数(n2n1n0)的二进制位倒置,则得对应的二进制倒序值(n0n1n2)。按这一律,用硬件电路和汇编语言程序产生倒序数很容易。但用高级语言程序实现时,直接倒置二进制数值是不行的,因此必须找出产生倒序数的十进制运算规律。由表2.1可见,自然顺序数I增加l,是在顺序数的二进制数最低位加1,向左进位。而倒序数则是在 位二进制数最高位加1,逢2向右进位。例如,在( 000)最高位加1,则得(100),而(100)最高位为1,所以最高位加1要向次高位进位,其实质是将最高位变为0,再在次高位加1。用这种算法,可以从当前任一例序值求得下一个倒序

图2-3 形成倒序的树状图

为了叙述方便,用J表示当前倒序数的十进制数值。对于N=2M,M位二进制数最高位的权值为N/2,且从左向右二进制位的权值依次为N/4,N/8,…,2,1。因此,最高位加1相当于十进制运算J+N/2。如果最高位是0(JN/2),则要将最高位变成0(J<=J-N/2),次高位加l (J+N/4)。但次高位加1时,同样要判断0、1值,如果为0(J表2-1 顺序和倒序二进制数对照表 顺序 十进制数I 0 1 2 3 4 5 6 7 图2-4 倒序规律

形成倒序 后,将原存贮器中存放的输入序列重新按倒序排列。设原输入序列x(n)先按自然顺序存入数组 中。例如,对N=8,A(0),A(1)...A(7) 中依次存放着x(0),x(1),…,x(7)。对x(n)的重新排序(倒序)规律

二进制数 0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1 倒序 二进制数 0 0 0 1 0 0 0 1 0 1 1 0 0 0 1 1 0 1 0 1 1 1 1 1 十进制数J 0 4 2 6 1 5 4 7 10word格式支持编辑,如有帮助欢迎下载支持。

文档从互联网中收集,已重新修正排版,word格式支持编辑,如有帮助欢迎下载支持。

如图2.4所示。倒序的程序框图如图2.5所示,图中的虚线框内是完成计算倒序值的运算流程图。由图2.4可见,第一个序一个序列值x(N-1)不需要重排;当I=J时不需要交换,所以图2.5中,顺序数I的起始、终止值分别为1和N-2;倒序数J的起始值为N/2。另外,为了避免再次调换前面已调换过的一对数据,图中只对I图2-5 倒叙程序框图

2.4程序中函数功能的简单介绍

在主程序中,IT1=0; EX1=1; 两条语句是用来设置外部中断1的;TMOD=0x11;设置定时器0为计时方式1,TH0=0xF9;TL0=0xC0; 设置定时器0的定时初值,它基本决定对多长时间的模拟信号进行DFT处理;ET0=1; 定时器0

下面是时钟中断子程序流程图: 图2-6 时钟中断流程图

开中断,TR0=1;外部中断1开中断,EA=1;CPU开中断;d_adr=&IN0;*ad_adr=j;这两条语句启动0809开始工作;while(1) display();调用显示子程序循环等待,当中断发生时进入中断子程序,进行相应的处理。

函数int_serv()是外部中断1子程序,它的功能是当0809转换结束后通知单片机读取转换结果,读取语句是ar[I]=*ad_adr;I++;*ad_adr=j;。

函数time0_int()是时钟0中断子程序,它的功能是当定时到时对这段时间内转换的数据进行数据预处理、DFT处理、找出这段时间内信号的最大幅度值和它所对应的频率然后进行显示。

函数 sig_G()实现数据预处理功能,即保证采集来的数据适合用来进行DFT(与下面具体的DFT_FFT函数有关)。

函数DFT_FFT()用来实现对处理好的数据进行傅里叶变换,并产生虚部和实部幅度值ar、ai。 函数fp_G()用来产生数据的幅值并找出最大的。函数display()是显示函数,利用fp_G()产生的最大幅度值和频率使二极管点阵显示。

通过以上函数组成的总程序和硬件电路的结合,形成了小型的单片机音乐灯光节拍显示应用系统。 3 仿真与调试 3.1软件的仿真与调试

设计所用的编程软件是Keil 51的u Vision2编程环境。u Vision2具有强大的项目管理功能,一个项目由源程序文件、开发工具选项以及编程说明三部分组成,通过目标创建选项和容易实现对一个u Vision2项目进行完整的编译与连接,直接产生最终应用目标程序。先建立一个项目,把我所编写的程序加进去,然后按照以上步骤进行软件的编译连接,并生成目标程序。

u Vision2中还包含一个器件数据库,器件库中有各种单片机上存储器和外围集成功能资源信息。在项目开发过程中通过数据库选定一种单片机后,u Vision2会自动设置默认的Ax51汇编器、Cx51编译器、Bl51/Lx51连接定位器及Debug调试器选项。u Vision2中集成的调试器具有十分强大的仿真调试功能。利用它提供的各种功能可以对所建项目进行各种模拟式的调试,并可以通过察看功能和串口输出来显示结果。

11word格式支持编辑,如有帮助欢迎下载支持。

文档从互联网中收集,已重新修正排版,word格式支持编辑,如有帮助欢迎下载支持。

对总程序进行编译后,利用Debug对它进行调试。首先利用全速运行进行总体调试先确定程序能够运行,然后利用单步调试命令进行单步跟踪调试,并通过察看窗口察看各个变量和数据存储区内的值,确定程序的正确性。而且通过u Vision2提供的外围端口命令来控制中断产生,对中断子程序进行仿真。

通过软件仿真与调试确定总程序的逻辑没有问题,可以保证在与硬件连接仿真时的成功率。 3.2硬件电路的调试

硬件电路连接好后,将仿真器和计算机的并口连接,用仿真器代替单片机芯片,将编译后的程序下载到仿真器中,就可以实现对硬件电路的调试。

通过对硬件的调试可以完全测试所设计的系统的性能,分析系统是否达到了预期的目的。当然硬件的调试并不是一件容易的事情,一次调试成功是不可能的。我所作的硬件是在面包板上插器件,用导线来连接的。这种电路很难调试,首先导线与插孔的接触相当不好,很容易导致接触不良,电路不通;其次,由于各个器件在工艺上会存在误差,可能会使软件和硬件不能很好的结合。还有可能是软件本身有问题。总之导致电路不能成功调试的原因很多,需要在调试失败时一一进行查找。

在调试过程中,首先碰到的问题是显示部分不工作。面对这个问题我先分析了是程序的问题还是硬件电路的问题。在对显示部分的程序进行单独测试后确定显示部分的程序和电路都没有问题。在不经意中发现0809芯片发烫,这时就怀疑0809有没有工作。经过对0809进行测试发现在连接电路时0809的一个引脚直接连在了电源上,这是个致命的错误,很可能会烧坏0809芯片,在改正后又对0809进行单独测试发现工作正常,很庆幸同时系统也调试成功。调试工作是需要耐心的,检查硬件电路的问题是相当耗时间和精力的,这一过程几乎花费了一周时间。

3.3调试结果的分析

最终的调试结果是二极管组成的点阵能够随音乐节拍一起闪烁。最终结果的出现是在艰辛的努力下得到的。刚开始时不能显示,即二极管没有发光,原因是ADC0809的一引脚接错导致芯片不能工作。改正后能够显示,但是现实的方式明显的错误,根据自己的设计思想是不能出现调试中出现的结果的。在对单片机的I/O口的驱动方式和工作状态进行进一步学习后发现自己的显示程序有问题,且按照原来的程序调试中出现的结果是正确的,经过重新修改和设计之后,终于能够正确显示了。

但是显示时有时二极管的闪烁太快,很难看清楚,但有的二极管显示却很稳定。对这个问题进行了分析,最后得出的结论是与输入的音乐信号的幅度有关,由于音乐信号很多频率的幅度值都在一个范围内,使得这个范围所对应的二极管显示刷新的频率高,显示就相对稳定,另一些幅度范围的二极管被刷新的频率低显示效果就不好。另外二极管的亮度也不够,在白天有些二极管基本看不出来在发光。这个问题是由于给此系统设定的参考电压为5V,那么单片机的输出电压最高为5V,对二极管的驱动电压不够。这个问题可以利用三极管对输出电压进行适当放大后在驱动二极管,效果会好一些。

4 系统性能的评价与改进 4.1 系统的评价

此系统能够实现其功能,具有一定的使用价值,但是由于系统只是模拟性质的,其性能还不是很好,可以说系统设计的思路是没有问题的,要想将这样一个系统不做任何修改投入生产是不行的,它各方面都达不到实际需要的要求,所以从原理上来说这样的系统是可行的,从实际上来说,这个系统有待于改进。下面讲述如何对系统进行改进以适应实际需要。

4.2 系统的改进

12word格式支持编辑,如有帮助欢迎下载支持。

文档从互联网中收集,已重新修正排版,word格式支持编辑,如有帮助欢迎下载支持。

通过调试仿真结果可以看到本系统还有很多值得改进的地方。此系统最终的结果是灯光随音乐节拍一起闪烁,这里强调的是“随”即实时性。但仿真的结果说明此系统的实时性很差,灯光的闪烁明显滞后于音乐。造成系统显示部分实时性差的原因很多,下面从以下几个方面入手分析如何改进系统:

4.2.1 A/D转换器

本系统在设计时较为看重简单和器件选择的方便两方面,因此在搭硬件电路时采用的是ADC0809,有前面器件选择中对ADC0809的介绍可知,它的最高采样频率为1KHz,而一般音乐芯片的频率都是大于这个频率的,那么采样部分就会存在失真。对这个问题可以通过采用转换时间更短的A/D转换器,使其保证最高声音频率(人耳能听到的)20KHz都不失真,如ADC0820等,可以提高显示部分的准确性。

4.2.2 单片机

本系统采用单片机的时钟分频后作为ADC0809的时钟信号,这样单片机时钟信号不稳定时会对0809产生较大的影响,可以给单片机使用稳定性高的晶振或者用外接时钟作为0809的时钟信号。

随着单片机技术的日益成熟,单片机的发展趋势将是向大容量、高性能化,外围电路内装化等方面发展。对于单片机控制实现的音乐节拍显示器随着单片机的发展其性能也要求越来越高,效果也需要越来越好。

可以采用双CPU结构的单片机,以提高处理能力,增加显示与音乐的同步性能;通过串口驱动显示电路,减少占用的I/O口;外围电路内装化,降低功耗;采用大存储量的单片机和高采样速度的A/D转换器增加处理的点数,以提高处理精度。随着单片机技术的日趋成熟,有可能采用含有内置A/D转换器的单片机。

4.2.3 音乐芯片的幅度

本系统采用的是5V的参考电压,音乐芯片输入的电压幅度是比较小的,这样会使显示部分出现不均匀的现象(即所分幅度范围内有信号就显示,没有信号就不显示)。对这个问题可以通过在对音乐进行转换前先通过程控放大器将一段时间内音乐信号的幅度按与信号的幅度成比例的关系放大,同时保证最大信号幅度被放大到参考电压,在处理完后再通过程序将处理后的信号输出控制显示部分。

4.2.4 DFT的算法

本系统采用的是基2 快速算法,这种算法适用于复信号,所以在进行DFT之前要先通过sig_G()函数对信号进行预处理,这是占用单片机时间的,而我们在现实生活中所采集的音乐数据大多数是实信号,因此采用有关专门用于实信号的DFT算法,它的运算时间相对少许多。而在系统中DFT运算占据了大部分的处理时间,这样系统时间就会大大减少,一方面提高了显示频率(一分钟内显示的次数),另一方面减少了延时提高显示部分的实时性。

4.2.5 颜色的单调性

基于系统设计的简单原则,硬件电路中采用的是单色的LED,灯光效果太单调,目前一般的产品都已经实现了彩色显示。目前市场上彩色LED也已经很多,利用全彩LED代替单色的LED。

5.结 论

本文以应用于舞台上的音乐灯光节拍显示系统的设计,讨论了基于单片机技术和数字信号处理技术的软件系统和硬件系统设计的主要步骤和过程。

全文介绍了课题背景,分析了系统的原理设计和实际电路的设计,并通过仿真对系统性能进行了分析。全文着重叙述了软件系统和硬件系统的详细设计,应用到的傅立叶变换原理和算法及系统的改进。本

13word格式支持编辑,如有帮助欢迎下载支持。

文档从互联网中收集,已重新修正排版,word格式支持编辑,如有帮助欢迎下载支持。

文还对软件中的程序代码进行了简单说明。通过本文,我已经完成了基于单片机和数字信号处理技术中最经典的应用——傅立叶变换系统的所有开发步骤,并给出了完整的系统详细设计文档,还对系统的性能通过仿真进行了分析,验证了系统的适用性。

但是,从文章中也可以看到,由于多方面的限制,比如A/D转换器的转换时间、傅立叶变换的点数等,本文设计的系统只能适用于一般的低频信号,更严格一点只能用于低于1KHz的音频信号,而且系统显示的实时性也较差。不过,转换时间快的A/D转换器现在已经非常普遍,傅立叶变换的更加快速的算法也正在被一些程序专家研发,所以我设计的系统会随着这些技术的进步、发展而不断进步和发展的。

谢 辞

在毕业论文的完成之时我首先要感谢我的指导老师叶尔江老师。在完成毕业论文的短短几个月的时间里,无论从毕业论文的选题到研究方法的选择,最后到论文的定稿,叶老师都给予了我许多宝贵的意见和建议,让我在这篇毕业论文的完成过程中迅速的成长,为我日后工作学习做研究打下了坚实的基础。他认真负责对学术研究工作细心严谨的工作作风,也深深的影响了我,促使我用这种优秀的素质来要求自己指导今后的研究工作。

其次我还要感谢樊老师,是他不断鼓励我,给予我细心的指点和教导。感谢他在我完成该论文中给予我的大力支持,如果没有他的帮助就不会有今天这收获的果实。同时我还要感谢我的朋友杨军,他的热情和认真的态度,一直感染着我,他是我做毕业设计的坚强后盾,不会的问题,我们一起研究,发现的成果我们快乐分享,度过的每一天都那么充实。利用网络资源、图书馆等翻阅大量资料,有问题及时与导师沟通请教,在此期间,我的毕业设计一点点逼近成功。其中的酸甜苦辣,我们都尝到了,当我们忙碌了一天,走出实验室的时候,成就感油然而生。严谨的导师,帮助过我的老师、同学、朋友,他们的帮助使得整个工作过程可以顺利完成。再次还要感谢我亲爱的同学们她们给了这四年里最多的欢笑最亲密的关怀,她们是我大学生活中触手可及的阳光人生旅程上永远鲜亮的风景,最后感谢我的父母和我的家人在我成长的多个年头里一直对我的生活无微不至的照顾。我的哥哥一直是我人生道路上最好的良师益友。我的家人一直关心我的身体和学业,给了我无限的爱。感谢他们对我细心的栽培和关爱。时间如水生命如梭短短的大学四年生活即将结束对于收获和失去,我都同样报以感恩之情。每一份欢笑,每一份感动,每一份汗水,每一份成果,都已成为过去最美好的回忆。在这里请让我再次对每一位见证我成长和那些和我一起成长的人们说一声谢谢!

参考文献:

[1] TMS320F243/F241/C242 DSP Controllers Reference Guide, Chip Structure, TI, January 2000 [2] TMS320F/C240 DSP Controllers Peripheral Library and Specific Devices Reference ,Guide ,TI, January 2000

[3]TMS320F243/F241/C242 DSP Controllers System and Peripherals Reference Guide, T1,January 2000

[4] 黄风英.DSP原理与应用.东南大学出版社,1997

[5] 下念旭.DSP基础与应用系统设计.北京:航空航大大学出版社,2001 [6] 王建,杨建国.51系列单片机及C51程序设计.科学出版社,2002 [7] 张毅刚.新编MCS-51单片机应用于设计.哈尔滨工业出版社, 2004 [8] 赖麒文.8051单片机嵌入式系统应用.科学出版社,2002 [9] 刘燕燕编著.试验指导书. 电子与通信工程实验室,2004

14word格式支持编辑,如有帮助欢迎下载支持。

文档从互联网中收集,已重新修正排版,word格式支持编辑,如有帮助欢迎下载支持。

[10] 纪宗南.单片机外围器件实用手册.北京:航空航天大学出版社,2002 [11] 赵文波,赵文涛.单片机语言C51程序设计.人民邮电出版社,2005 [12] 陈龙三.单片机C语言控制与应用.清华大学出版,2005

[13] 纪宗南.单片机外围器件实用手册.北京:航天航空大学出版社,2002 [14] 王建校. 51系列单片机及C51程序设计. 北京:科学出版社,2003 [15] 陈明荧. 8051单片机基础教程. 北京:科学出版社,2002

[16] 董文等. 国外常用A/D、D/A转换器集成电路使用手册. 广州经济技术开发区电脑系统工程公司 ,2000

[17] 张培仁等. 基于C语言编程MCS-51单片机原理与应用. 清华大学出版社,2003 [18] 丁玉美等. 数字信号处理. 西安电子科技大学出版社,2004

[19]林君,刘福春等. 高速数字信号处理原理、器件及其应用. 海洋出版社出版, 2003 [20]北方交通大学信息科学研究所. 近代数字信号处理通用程序. 北京:科学出版社, 2002 [21] W.D.斯坦福. 数字信号处理. 科学出版社出版,2000 [22] 艾费科等. Digital Signal Processing. 电子工业出版社,2000 附 录1 电路原理总图 源程序

#include #include #include #include

#define IN0 XBYTE[0x7FF8]; #define PI 3.1415926; typedef unsigned char uchar; uchar I=0; uchar j=0;

uchar M=4; //进行16点DFT uchar N=16;

float MAX; //取DFT_FFT变换中幅度的最大值 uchar K; //最大值所对应的K即频率

15word格式支持编辑,如有帮助欢迎下载支持。

文档从互联网中收集,已重新修正排版,word格式支持编辑,如有帮助欢迎下载支持。

uchar xdata *ad_adr; uchar flag=0;

static float xdata ar[16]; //***** 1.6ms内对通道0的采样数据的存储区 static float xdata ai[16];

static float xdata hk[16]; sbit p1_0=P1^0; sbit p1_1=P1^1; sbit p1_2=P1^2; sbit p1_3=P1^3; sbit p1_4=P1^4; sbit p1_5=P1^5;

sbit p1_6=P1^6; sbit p1_7=P1^7; sbit p3_0=P3^0; sbit p3_1=P3^1;

void sig_G(float Ar[],float Ai[]);

void DFT_FFT(float AR[],float AI[],uchar m,uchar n); void fp_G (float aR[],float aI[],uchar n); void display(float max,uchar k); void main(void) {

IT1=0; //***** 驱动0809 利用中断进行采样,采样时间(即采样点数)有定时器T0决定

EX1=1;

TMOD=0x11; // *****定时器0计时方式1 TH0=0xF9; TL0=0xC0;

ET0=1; //****定时器0开中断 TR0=1;

EA=1; //********CPU开中断

16word格式支持编辑,如有帮助欢迎下载支持。

文档从互联网中收集,已重新修正排版,word格式支持编辑,如有帮助欢迎下载支持。

ad_adr=&IN0; *ad_adr=j; while(1) {

if(flag==1)

{DFT_FFT(ar,ai,M,N); fp_G(ar,ai,N); display(MAX,K); flag=0; EX1=1; TR0=1;} else if(flag==0); } }

//*************外部中断子程序*即*读取0809转换结果******** void int_serv(void) interrupt 2

{p3_0=0; //*********测试中端信号产生 ar[I]=*ad_adr; I++; *ad_adr=j;

p3_0=1;} //********确定终端产生 //***************时钟0中断子程序*************** void time0_int(void) interrupt 1 { {

flag=1; //**********置标志位 p3_1=0; TR0=0; EX1=0; sig_G(ar,ai);

17word格式支持编辑,如有帮助欢迎下载支持。

文档从互联网中收集,已重新修正排版,word格式支持编辑,如有帮助欢迎下载支持。

p3_1=1; } }

//*************适合DFT的信号产生子程序************ void sig_G(float Ar[],float Ai[]) {uchar n; for(n=I;nfor(n=0;n//******************************** DFT子程序************************** void DFT_FFT(float AR[],float AI[],uchar m,uchar n) {int i,il,jl,j,LH,nl,k,b; float tr,ti,p,p1; LH=(int)n/2; j=LH; nl=n-2;

for(i=1;i<=nl;i++) {if(i=k)

18word格式支持编辑,如有帮助欢迎下载支持。

文档从互联网中收集,已重新修正排版,word格式支持编辑,如有帮助欢迎下载支持。

{j=j-k; k=(int)k/2; } j=j+k; }

for(i=1;i<=m;i++) {b=(int)pow(2,(i-1)); for(j=0;j<=(b-1);j++) {

p1=(float)pow(2,(m-i))*j*2.0*PI; p=p1/(float)n; for(k=j;k<=(n-1);)

{tr=(float)(AR[k+b]*cos(p)+AI[k+b]*sin(p)); ti=(float)(AI[k+b]*cos(p)-AR[k+b]*sin(p)); AR[k+b]=AR[k]-tr; AI[k+b]=AI[k]-ti; AR[k]=AR[k]+tr; AI[k]=AI[k]+ti; k+=b*2; } } } }

//**************显示幅度与所对应频率的产生****************** void fp_G (float aR[],float aI[],uchar n) { int i;

for (i=0;i{hk[i]=sqrt(pow(aR[i],2)+pow(aI[i],2));} MAX=hk[0];

19word格式支持编辑,如有帮助欢迎下载支持。

文档从互联网中收集,已重新修正排版,word格式支持编辑,如有帮助欢迎下载支持。

K=0;

for(i=1;iMAX) {MAX=hk[i]; K=i;} } }

//**************显示子程序********************************* void display(float max,uchar k) {if((k>=0)&&(k<3)) {p1_0=0;p1_1=0;p1_2=0;} if((k>=3)&&(k<5)) {p1_0=1;p1_1=0;p1_2=0;} if((k>=5)&&(k<7)) {p1_0=0;p1_1=1;p1_2=0;} if((k>=7)&&(k<9)) {p1_0=1;p1_1=1;p1_2=0;} if((k>=9)&&(k<11)) {p1_0=0;p1_1=0;p1_2=1;} if((k>=11)&&(k<13)) {p1_0=1;p1_1=0;p1_2=1;} if((k>=13)&&(k<17)) {p1_0=0;p1_1=1;p1_2=1;} if((max>=0)&&(max<=0.2))

{p1_3=1;p1_4=0;p1_5=0;p1_6=0;p1_7=0;} if((max>0.2)&&(max<=0.5))

{p1_3=1;p1_4=1;p1_5=0;p1_6=0;p1_7=0;} if((max>0.5)&&(max<=0.9))

{p1_3=1;p1_4=1;p1_5=1;p1_6=0;p1_7=0;} if((max>0.9)&&(max<=1.5))

20word格式支持编辑,如有帮助欢迎下载支持。

文档从互联网中收集,已重新修正排版,word格式支持编辑,如有帮助欢迎下载支持。

{p1_3=1;p1_4=1;p1_5=1;p1_6=1;p1_7=0;} if((max>1.5)&&(max<=5))

{p1_3=1;p1_4=1;p1_5=1;p1_6=1;p1_7=1;} }

21word格式支持编辑,如有帮助欢迎下载支持。

因篇幅问题不能全部显示,请点此查看更多更全内容