基于ModelSim的FFT算法的设计

基于ModelSim的FFT算法的设计
基于ModelSim的FFT算法的设计

摘要

快速傅立叶变换(FFT)作为时域和频域转换的基本运算,是数字谱分析的必要前提。传统的FFT使用软件或DSP实现,高速处理时实时性较难满足,因此专用集成电路(ASIC)和可编程逻辑器件(以现场可编程门阵列FPGA为代表)应运而生。速度上ASIC 更占优势,但是随着点数的增加,芯片面积将迅速扩大,也就意味着成本的提高。而FPGA内部含有硬件乘法器,大量的存储单元和可编程I/O,十分适合于FFT处理器的实现,而且相对ASIC,成本低廉,可以反复编程,便于调试,也更具市场竞争力。

本文应用Verilog语言完成32点基-2复数的FFT处理系统设计,包括蝶形运算单元设计、存储单元设计、块浮点单元设计、地址产生单元设计、功能切换单元设计以及时序控制单元的设计工作。以选取的FPGA器件库为基础,使用modelsim软件进行仿真,并对结果进行分析。

关键词:快速傅立叶变换;Verilog;单元设计;modelsim仿真

Abstract

Fast Fourier Transform is a necessary precondition of digital spectral analysis as the basic computing between the time domain and frequency domain. The traditional FFT uses software or DSP to realize, which is difficult to meet real-time in high speed processing. Application specific integrated circuit (ASIC) and programmable logic device (represented by field programmable gate array, FPGA) arises at the historic moment. ASIC has the advantage in the speed, but the chip area will expand rapidly with the processing points increasing, which means the improvement of costs. While FPGA contains hardware multipliers, massive memory cells and programmable I/O, so it is very suitable for implementation of FFT processor. Therefore, FPGA is low-cost, easy to debug and can be repeatedly programmed. It has more market competitiveness.

Use Verilog language completed 32 points 2 complex FFT processing system design, Including butterfly computing unit design, storage unit design, block floating-point unit design, the address generation unit design, the function switch unit design and timing control unit design work . On the basis of the selected library as the FPGA device, use the modelsim simulation software, and analyze the results.

Key Words:FFT;Verilog;Unit design;modelsim simulation

目录

1 绪论 (1)

1.1 课题的背景及意义 (1)

1.2 FFT的国内外发展研究现状 (2)

1.2.1 通用数字信号处理芯片 (2)

1.2.2 专用集成电路芯片ASIC (3)

1.2.3 可编程逻辑器件 (3)

1.3 篇章结构 (5)

2 离散福利叶变换的快速算法的基本理论 (6)

2.1 基-2FFT算法 (6)

2.2 定点数的相关概念 (15)

2.2.1 定点数的定义 (15)

2.2.2 定点数加减法的溢出及检测方法 (15)

2.3 定点数的定标 (16)

2.4 有限字长效应 (16)

2.5 块浮点数 (17)

3 FFT的算法设计 (18)

3.1 FFT处理器的实现框图 (18)

3.2 蝶形运算单元的设计 (18)

3.3 流水线结构 (25)

3.4 存储单元的设计 (26)

3.4.1 FFT数据存取规律分析 (26)

3.4.2 双口RAM及其地址发生器的设计 (27)

3.4.3 ROM 及其地址发生器的设计 (30)

3.5 浮点单元的设计 (33)

3.6 时序控制单元的设计 (38)

4 基于verilog语言的FFT的设计与仿真 (40)

4.1 ModelSim介绍 (40)

4.2 ModelSim仿真 (40)

4.2.1 建立工程 (41)

4.2.2 加载文件 (41)

4.2.3 开始仿真 (42)

4.3 结果分析 (44)

结论 (46)

致谢 (47)

参考文献 (48)

附录 A 英文原文 (50)

附录 B 汉语翻译 (55)

1绪论

1.1 课题的背景及意义

随着数字技术与计算机技术的发展,数字信号处理(Digital Signal Processing,DSP)技术已深入到各个学科领域,其应用又是多种多样,但数字信号处理基本上从两个方面来解决信号的处理问题:一个是时域方法,即数字滤波;另一个是频域方法,即频谱分析。处理的任务大致分为三类:卷积——用于各种滤波器,对给定频率范围的原始信号进行加工(通过或滤出)来提高信噪比;相关——用于信号比较,分析随机信号的功率谱密度;变换——用于分析信号的频率组成,对信号进行识别。其中,离散傅立叶变换(Discrete-time Fourier Transform,DFT)和卷积是信号处理中两个最基本也是最常用的运算,它们涉及到信号与系统的分析与综合这一广泛的信号处理领域。由数字信号处理的基本理论可知,卷积可以转化为DFT来实现,实际上其他许多算法,如相关、谱分析等也都可以转化DFT来实现;此外,各种系统的分析、设计和实现中都会用到DFT的计算问题。所以,DFT在各种数字信号处理中起着核心作用,而DFT的快速算法快速傅立叶变换(Fast Fourier Transform,FFT)就成为了数字信号处理的最基本技术之一,对FFT算法及其实现方式的研究是很有意义的。

目前,FFT广泛应用在频谱分析、匹配滤波、数字通信、图像处理、语音识别、雷达处理、遥感遥测、地质勘探和无线保密通讯等众多领域。在不同应用场合,需要不同性能要求的FFT处理器。在很多应用领域都要求FFT处理器具有高速度、高精度、大容量和实时处理的性能。因此,如何更快速、更灵活地实现FFT变得越来越重要。

此外,数字滤波在图像处理、语音识别和模式识别等数字信号处理中占有重要地位。与模拟滤波器相比,数字滤波器可以满足滤波器幅度和相位特性的严格要求,可以克服模拟滤波器所无法克服的电压漂移、温度漂移和噪声等问题。有限冲激响应(FIR)滤波器可以保证严格的线性相位。同时由于其实现结构主要是非递归的,因此FIR滤波器可以稳定工作。FIR滤波器被广泛用于各类数字信号处理系统中实现卷积、相关、自适应滤波、正交插值等处理。

随着数字信号处理技术的发展,在消费电子领域要求处理速度更快、功耗更低、集成度更高和产品开发周期更短,因此许多数字信号处理的实现方法被不断提出,其中基于FPGA的数字信号处理实现技术就是其中的重要技术之一。

近几年,随着现场可编程门阵列FPGA技术的迅速发展,采用并行度更大、速度更快的FPGA芯片来实现FFT和FIR数字滤波器己成为必然趋势。FPGA技术的关键就是利用强有力的设计工具来缩短开发周期,提供元器件的优质利用性,降低设计成本,并能够并行处理数据,容易实现流水线结构,且升级简便,提高设计的灵活性,这些都非常适合实现FFT算法和FIR数字滤波器。

因此,自主研发基于FPGA芯片的FFT和FIR数字滤波器,把FFT和FIR数字滤波器实时性的要求和FPGA芯片设计的灵活性结合起来,实现并行算法与硬件结构的优化配置,提高FFT和FIR数字滤波器处理速度,满足现代信号处理的高速度、高可靠性要求,成为了现今我国数字信号处理的一个研究点。鉴于此种趋势,作者将基于FPGA 的FFT和FIR数字滤波器设计与实现作为了研究课题。

1.2 FFT的国内外发展研究现状

针对FFT和FIR数字滤波器的硬件实现方案主要有三种途径:DSP处理器、专用集成电路ASIC、可编程逻辑器件,其中可编程逻辑器件以FPGA为代表。

1.2.1 通用数字信号处理芯片

通用数字信号处理芯片即DSP处理器,按照DSP的用途,可分为通用型DSP 芯片和专用型DSP芯片。

通用型DSP芯片适合普通的DSP应用,通用DSP芯片具有接口灵活、编程方便、稳定性好、运算精度高等特点,同时也更适应于大规模集成电路如TI公司的一系列DSP芯片属于通用型DSP芯片。

专用DSP芯片是为特定的DSP运算而设计的,更适合特殊的运算,如数字滤波、卷积和FFT,如Motorola公司的DSP56200,Zoran公司的ZR34881,Inmos 公司的IMSA100等就属于专用型DSP芯片。

针对一般数字信号处理算法的实现,采用通用可编程硬件处理器技术来实现FFT和FIR数字滤波器。这种实现方法具有软件设计多用性的优点,能够适用于各种需要FFT 运算和FIR数字滤波器进行信号处理的应用场合,灵活方便。但是,通用DSP处理器构成的FFT处理器和FIR数字滤波器采用循环编码算法,程序量小,但存在大量的冗余运算,需要许多跳转操作,处理速度较慢,难以满足现代数字信号处理高速、大规模、

实时性的要求。在进行大点数FFT计算和FIR数字滤波时,并行算法与DSP处理器的寻址能力不相适应,不能有效利用数据传输的带宽和运算能力,造成硬件资源的浪费。

1.2.2 专用集成电路芯片ASIC

在集成电路界ASIC被认为是一种为专门目的而设计的集成电路。是指应特定用户要求和特定电子系统的需要而设计、制造的集成电路。ASIC在一些特殊功能的表现上相当好,这种方案运算速度快,可靠性高,非常适合实时和对可靠性要求较高的信号处理系统,在批量生产时与通用集成电路相比具有体积更小、功耗更低、可靠性提高、性能提高、保密性增强、成本降低等优点,但是专用芯片不能重新组态,可编程能力有限,在产品发展过程中,它的功能无法任意修改或改进。因此,任何的线路改版都需要重新设计并且重新制造,这不仅增加开发成本,而且造成产品快速上市的障碍,不太适合处理算法和参数经常改变的场合。

1.2.3 可编程逻辑器件

可编程逻辑器件以其独特的优越性能,一出现就受到大家的青睐。它不仅速度快、集成度高,并且几乎能随心所欲的完成定义的逻辑功能,还可以加密和重新编程,其编程次数可以达到1万次以上。使用可编程逻辑器件可以大大简化硬件系统,降低成本,提高系统的可靠性、灵活性和保密性。因此,可编程逻辑器件是设计数字系统的理想器件。现在已广泛用于计算机硬件、工业控制、智能仪表、通信设备和医疗电子仪器等多个领域。可编程逻辑器件的应用不仅使电子产品性能有了很大改善,而且也使数字系统设计方法发生了根本性变革。

其中,现场可编程门列阵(FPGA)是最近几年发展起来的新型高密度可编程逻辑器件。现场可编程门阵列(FPGA)是20世纪80年代中期由美国Xilinx公司首先推出的大规模可编程逻辑器件。由于FPGA器件采用标准化结构,并且具有体积小、集成度高、功耗低、速度快、可无限次反复编程等特点,已成为开发电子产品的首选器件。

FPGA的功能由逻辑结构的配置数据决定。工作时,这些配置数据存放在片内的SRAM或者熔丝图上。使用无SRAM的FPGA,在工作前需要从芯片外部加载配置数据。配置数据可以存储在片外的EPROM或其他存储体上,人们可以控制加载过程,在现场修改器件的逻辑功能,即所谓现场编程。

世界上第一片FPGA由美国Xilinx公司于1985年发明,因而FPGA技术在国外发展较早,随着FPGA技术的普及,使用FPGA芯片设计正在世界范围内兴起。国内外已积极地开展了基于FPGA的数字信号处理算法应用与研究,并且也取得了长足的进步。

目前在国际上,两大FPGA巨头Xilinx和Altera除了FPGA的生产外还与其第三方合作伙伴致力于IP核的开发。这些IP核中包含了基本的数字信号处理模块,如FFT、FIR等。由于FPGA芯片厂商对自己公司生产的芯片的性能非常了解,因此设计的模块能最大限度的发挥芯片的性能。目前Altera公司提供的FFT模块采用4引擎结构,在实现1024点FFT时所需时间己经降至很低。使用IP核构建数字信号处理系统具有诸多优点,如开发周期短、性能稳定、可靠、维护方便等。但也存在以下的缺点:IP核价格昂贵(Altera公司的FFT IP核售价为7995美元),且IP核源代码不对外开放,不利于二次开发;IP核针对通用的设计,在某些特殊的应用场合不一定最优因此还难以在我国基层应用领域普及。

国内方面,我国的FPGA技术起步较晚,但是进入21世纪后,发展非常迅速。目前不少大学及研究所都使用FPGA芯片设计开发具有自主知识产权的FFT和FIR数字滤波器,但是由于起步较晚,基础薄弱,所设计的FFT和FIR数字滤波器无论是速度,还是可扩展性上都与国外有一定差距。

2002年罗雪苟、詹阳分析了使用FPGA实现FFT的几种方法,对这几种方法的优缺点进行了讨论。

2003年韩颖等采用Xilinx公司的FPGA设计了FFT处理器。采用流水方式对复数数据实现了加窗、FFT、求模平方三种运算,整个设计使用双基-2蝶形运算单元,采用流水线方式尽量避免瓶颈的出现,提高了系统时钟频率。

2004年刘国栋等也使用基2算法设计了FFT单元,他使用了ALTERA高性能的Stratix器件对512点、1024点、2048点、4096点和8192点都进行了分析。

2004年鲁欣等也设计了4096点FFT,但是他使用了1024点的FFT IP核进行了扩展设计,如果系统输入时钟为50MHz,计算时间为0.577ms。

2008年刘在爽、卢莹莹对FPGA实现FIR数字滤波器也进行研究,讨论了乘累加和基于CSD(Canonic signed Digital,标准有符号数)编码的数字滤波器的设计。

1.3 篇章结构

本文主要针对基-2顺序处理的FFT处理器和FIR数字滤波器的FPGA实现进行了研究,涉及算法选取、处理器结构设计、系统仿真、FPGA实现和系统测试。本论文共5章,各章的具体内容如下:

第1章阐述了硬件实现的国内外现状及选题的意义和论文内容。

第2章为离散福利叶变换的快速算法的基本理论;

第3章为基于modelsim的FFT算法的设计

第4章为基于verilog语言的32点基-2复数的FFT的设计与仿真

最后一章为结论

最后对整篇论文进行了总结和讨论。

2 离散福利叶变换的快速算法的基本理论

本章主要介绍了基-2FFT 算法和用硬件实现数字信号处理算法所涉及到的几个基本

问题。

2.1 基-2FFT 算法

1、概述

长度为N 的有限长序列x(n)的DFT 的表达式为[1]:

1,...,1,0,)()(10-==

∑-=N k W n x k X N N kn N (2.1)

x(n)在一般情况下是为复数序列的。如果直接按(2.1)式计算X(k)值,那么对于某一个

k 值而言需要N 次复数乘法和m-1次复数加法。那么对于N 个k 值,一共需要N 2次复数乘法

以及N(N-1)次复数加法运算。当N>>1时,N(N-1)≈N 2。从上面的说明中可以看出,N 点

DFT 的乘法和加法运算次数均与N 2成正比。当N 较大时,运算量是十分庞大的。如果N

取1024,那么N 2将达到1,048,576。如此巨大的计算量对于实时信号处理来说其运算速度

是难以达到的。所以要想使得DFT 在各种科学和工程计算中得到广泛的应用就必须想办

法减少其运算量。

在前面已经讲到,N 点DFT 的复乘次数等于N 2。其实一个N 点DFT 可以看做是由几个

较短的DFT 组成的。基于这一思想,可以将N 点DFT 分解为几个较短的DFT ,这样一来

乘法次数将大大减少,能够非常明显地降低DFT 的运算量。此外,旋转因子wmN 具有明

显的周期性和对称性。其周期性表现为:

m N m N j iN m N j lN m N W e e W

===-+-+ππ2)(2 (2.2) 其对称性表现为

m N N m N W W --= m N m N N W W =-]*[

或者 (2.3)

不断的把长序列的DFT 分解成几个短序列的DFT ,并且利用m N W 的周期性和对称性

来减少DFT 的运算次数,这就是FFT 算法的基本思想。比较常用的FFT 算法有基-2FFT

和基-4FFT 两种。基-2FFT 中的基2指的是N=2M ,即有限长序列的长度N 要到等于2

的整数次幂;同理可得基-4FFT 中的基4指的是有限长序列的长度N 要到等于4的整数

次幂。下面就以8点的FFT 为例详细分析基-2FFT 算法。

2、基-2FFT 算法基本原理

基-2FFT 算法基本上分为时域抽取法FFT(DIT-FFT)和频域抽取法FFT(DIF-FFT)两

大类。由于这两种算法的基本原理是相同的,所以下面主要介绍DIT-FFT 算法。本课题

采用的就是DIT-FFT 这一算法。

设序列x(n)的长度为N ,并且有以下的条件成立

N=2M ,M 为自然数

1x (r)和2x (r)是x(n)按n 的奇偶性分解成的两个N/2点的子序列,如下式所示

12

,...1,0),2()(1-==N r r x r x 12

,...,1,0),12()(2-=+=N r r x r x

那么x(n)的DFT 为

∑∑==+=n kn N

n kn N W n x W n x k X )()()(

∑∑-=+-=++=12/0)12(21

2/0

2)12()2(N r r k N N r kr N W r x W

r x ∑∑-=-=+=12/02212/01)()(N r kr N N r k

N

W r x W r x

由于

kr N kr N

j kr N j kr N W e e W 22/22222===--ππ

所以

1,...,1,0)

()()()()(2112/02/21

2/02/1

-=+=+=∑∑-=-=N k k X W k X W r x W W r x k W k N N r kr N k N N r kr N (2.4)

其中)(1k X 和)(2k X 分别为)(1r x 和)(2r x 的N/2点DFT ,即

)]

([)()()]([)()(212/02/2

211

2/02/11r x DFT W r x k X r x DFT W r x k X N r kr N N r kr N ====

∑∑-=-= (2.5) (2.6)

又由于)(1k X 和)(2k X 都是以N/2为周期,且

k N

N k N W W -=+2 所以X(k)又可以表示为如下所示的表达式

12

,...,

1,0)()()(21-=+=N k k X W k X k X k N (2.7) 12,...1,0)()()2(21-=-=+N k k X W k X N k X k N (2.8) 这样一个N 点的DFT 就被拆分成为了两个N/2点的DFT 。式(2.7)和式(2.8)说明了原N

点的DFT 和这两个N/2点的DFT 之间的关系。通常为了后续说明的方便,和其它许多文献

一样,在本文中也将式(2.7)和式(2.8)的运算用图2.1所示的一个流图符号表示。因为这个

流图符号形状酷似一只蝴蝶,所以称其为蝶形运算符号。

图2.1蝶形运算符号

采用蝶形运算符号的这种图示方法,可以用图2.2来表示前面所讲到的运算。

在图2.2中,N=23=8,式(2.7)给出了X(O)~X(3)的计算方法,而式(2.8)给出了X(4)~X(7)

的计算方法。由图2.1可以看出,要完成一个蝶形运算,需要一次复数乘法和两次复数加

法运算。由图2.2可以看出,经过一次分解后,计算一个N 点DFT 共需要计算两个N/2点

DFT 可和N/2个蝶形运算。由前面的说明可以知道,计算一个N/2点DFT 需要(N-2)2次复

数乘法和N/2(N/2-1)次复数加法。那么按图2.2计算N 点DFT 共需要2(N /

2)2+N/2=N(N+1)/2≈N 2/2(N>>1)次复数乘法和N(N/2-1)+2N/2=N 2/2次复数加法运算。通

过对比可以看出,只进行过这样的次分解就使得运算量减少了近一半,充分说明了这样

分解对减少DFT 的运算量是十分有效的。由这里N=2M ,N/2仍然是偶数,为了使得计算

量能够得到进一步的减少,可以仿效前面的做法对N/2点DFT 再做进一步分解。

图2.2 N 点DFT 的一次时域抽取分解图(NtiS)

与第一次分解相同,)1(3x 和)1(4x 为)(1r x 按奇偶分解成的两个长为N/4的子序列,即

14

,...,1,0,)12()()2()(1423-=???+==N l l x l x l x l x 那么,)(1k X 又可表示为

∑∑-=+-=++=14/0

)12(2/11

4/022/1

1)12()2()(N i l k N N i kl N W l x W l x k X ∑∑-=-=+=1

4/04/42/14/04/3)()(N i kl N k

N N i kl N W l x W W l x

12/,...,1,0),()(42/3-=+=N k k X W k x k N (2.9)

其中

∑∑-=-=====

14/044/4

41

4/034/33)]

([)()()]([)()(N i kl N N i kl N l x DFT W l x k x l x DFT W l x k x 同理,由)(3k X 和)(4k X 的周期性和Wm 2/N 尼的对称性2/2/4

/N k N N k W W -=+最后得到:

14/,...,1,0,)()()4/()()()(42/3142/31-=??

???-=++=N k k X W k X N k X k X W k X k X k N k N (2.10) 同理可得

14/,...,1,0,)()4/()()()(62/5262/52-=??

???-=++=N k k X W k X N k X k X W k X k X k N k N (2.11) 其中有

14/,...1,0,)12()()2()()]([)()()]([)()(2625614/04

/6

651

4/04/55-=?

??+======

∑∑-=-=N l l x l x l x l x l X DFT W l x k X l X DFT W l x k X N i kl N N i kl N

这样,如图2.3所示,经过第二次的分解,一个N/2点的DFT 就被拆分成为了两个N/4

点的DFT 了。式(2.10)和式(2.11)说明了原N/2点的DFT 和这两个N/4点的DFT 之间的关系。

依次类推,经过M-1次分解,最后将N 点DFT 分解成N/2个2点DFT 。将前面两次分解的过

程综合起来,就得到了一个完整的8点DIT-FFT 运算流图,如图2.4所示。图中用到关系

式mk N k m N W W =/。图中的输入序列不是顺序的,但是后面会看到,其排列是有规律的。

图2.3 N 点DFT 的第二次时域抽取分解图(N_8)

图2.4 N 点DIT--FFT 运算流图(N=8)

3、DIT-FFT 算法与直接计算DFT 运算量的比较

由DIT-FFT 算法的分解过程及图2.4可见,N=2M 时,其运算流图应该有M 级蝶形,

每一级都由N/2蝶形运算构成。每一级运算都需要N/2次复数乘和N 次复数an (每个蝶形需

要两次复数加法)。所以,M 级运算总共需要的复数乘次数为

N N M N C M 2log 2

2)2(== 复数加次数为

N N NM C A 2log )2(==

而由前面的介绍,直接计算N 点的DFT 需要N 2次复数乘法以及N(N-1)次复数加法运

算。N>>1时,N(N-1)是约等于N 2的。当N=210=1024时,可以求得直接计算N 点的DFT 和

使用基-2DIT-FFT 算法的所需乘法次数的比值为

8.2045120

1048576log )2/(22==N N N 这样,运算效率就提高了200多倍。图2.5为FFT 算法与直接计算DFT 所需乘法次数的

比较曲线。由此图更加直观地看出FFT 算法的优越性,从图2.5可以明显的看出,N 越大

时,优越性就越明显。

图2.5 FFT算法与直接计算DFT所需乘法次数的比较曲线

4、DIT-FFT的一些运算规律

DIT-FFT运算中是存在一些规律的,下面简单的介绍一下这些规律。

(1)原址计算

由图2.4可以看出,DIT-FFT的运算过程是很有规律的。N=2M点的FFT共需要进行进行M级运算,每级由N/2个蝶形运算组成。在同一级运算中,每一个蝶形运算是有两个输入和两个输出的。这两个输入、输出数据节点在同一水平线上,并且它们只对本蝶形运算有效,对其它的蝶形运算是无效的。因为这样,当计算完一个蝶形以后,所得输出数据可立即存入原输入数据所占用的存储单元i以此类推,当M级运算都计算完毕以后,原来存放输入序列数据的N个存储单元中便依次存放了X(k)的N个值。这种利用同一存储单元存储蝶形运算计算输入、输出数据的方法就称为原址计算。很明显原址计算可以节省存储资源,从而降低硬件的成本。

(2)旋转因子的变化规律

由8点DIT-FFT的运算流图可以推得在N点DIT-FFT运算流图中,每级都有N/2个蝶

形。每个蝶形都要乘以因子

p

N

W。p

N

W被称为旋转因子,其中p为旋转因子的指数。

通过观察图2.4可以推得,第L级共有2L-1个不同的旋转因子。N=23=8时的各级旋转因子表示如下:

3,2,1,0,31

,0,20

,1222/24/============J W W W L J W W W L J W W W L J J N p N J J N p N J J N p N L L L 时,时,时, (2.12)

对N=2M 的一半情况,第L 级的旋转因子为

L M L J N J N p N M

L M L M L L J p N J p J W W W N J L W W L M M L -----=-====?=-==--212,...,2,1,0,22221

2,...,2,1,0,12

212 (2.13)

(3)蝶形运算规律

设序列x(n)经时域抽选(倒序)后,存入数组X 中。如果蝶形运算的两个输入数据相

距B 个点,应用原位计算,则蝶形运算可表示成如下形式:

p N L L p

N L L W B J X J X B J X W B J X J X J X )()()()()()(1111+-<=+++<=----

其中p=J2M-L ;J=0,1,...,2L-1;L=1,2,...,M

下标L 表示第L 级运算,XI ,(J)则表示第L 级运算后数组元素X(J)的值。

(4)序列的倒序

仔细分析可以发现看似毫无规律可循的DIT-FFT 算法的输入序列的排序其实是很有

规律的。由于N=2M ,所以顺序数可用M 位二迸制数(0121...n n n n M M --)表示。

当N=8时,这种规律就可以用图2.6和表2.1来表示。

图2.6 形成倒序的树状图(N-23)

表2.1 顺序和倒序二进制数对照表

顺序倒叙

十进制数I 二进制数二进制数十进制数J

0 000 000 0

1 001 100 4

2 010 010 2

3 011 110 6

4 100 001 1

5 101 101 5

6 110 011 3

7 111 111 7

5、DIT-FFT的输入顺序输出倒序的信号流图

DIT-FFT的信号流图的形式不是唯一的,它还有多种表现形式。图2.7是DIT-FFT的一种变形的运算流图,其中蝶形运算的旋转因子、运算量与图2.4相同。从图中很容易看出它是一种顺序输入,倒序输出的方式。这种结构的信号流图有一个非常特别的优点就是前一级的旋转因子刚好是后一级上一半蝶形运算的旋转因子,且顺序不变,如果旋转因子的计算采用查表法,只要构造出一个N/2点的N

W,就可以用它来计算N、N/2、N/4、...

p

长度的FFT。因此在大型数据处理系统的FFT算法中,较多采用的是图2.7所示的流图算法。本课题也是采用的图2.7所示的流图算法。

图2.7 DIT--FFT的顺序输入倒序输出形式

2.2 定点数的相关概念

2.2.1 定点数的定义

定点数指的是在二进制数中小数点的位置是固定的数。浮点表示法所能表示的数值范围将远远大于定点表示法。对于字长相同的定点数与浮点数来说,浮点数虽然扩大了数的表示范围,但这是以降低精度为代价的,也就是数轴上各点的排列更稀疏了。浮点运算要比定点运算复杂。定点运算时,当运算结果超出数的表示范围,就发生溢出;而在浮点运算时,运算结果超出尾数的表示范围却并不一定溢出,只有当阶码也超出所能表示的范围时,才发生溢出。

2.2.2 定点数加减法的溢出及检测方法

在定点小数机器中,数的表示范围为|X|<1。在运算过程中如出现大于1的现象,称为“溢出”。在定点机中,正常情况下是不允许出现溢出的。例如:

x=+0.1011,y=+0.1001,那么[x]补=0.1011,[y]补=0.1001,由补码加法公式

[X]补+[Y]补=[X+Y]补

得:[x+y]补=0.0100,两个正数相加的结果成为负数,这显然是错误的。

x=-0.1101,Y=-0.1011,那么[x]补=1.0011,[y]补=1.0101,同理可得:

[x+y]补=0.1000,两个负数相加的结果成为正数,这同样是错误的。

运算结果产生了溢出是发生错误的原因。两个正数相加,结果大于机器所能表示的最大正数,称为上溢。两个负数相加,结果小于机器所能表示的最小负数,称为下溢。为了判断“溢出”是否发生,可以采用双符号位法,也称为“变形补码”或“模4补码”,从而可使模2补码所能表示的数的范围扩大一倍。数的变形补码定义为:[x]补=x当2>x≥O

[x]补=4+x当0>x≥-2

或用同余式表示为:[x]补=4+X(mod 4)

下式也同样成立:[x]补+[y]补=[x+y]补(mod 4)

为了得到两数变形补码之和等于两数和的变形补码,同样必须:

1、两个符号位都看做数码一样参加运算;

2、两数进行以4为模的加法,即最高符号位上产生的进位要丢掉。

采用变形补码后,任何小于l 的正数,两个符号位都是0,即00.n x x x ...21;任何大

于-l 的负数,两个符号位都是“1”,即11.n x x x ...21;如果两个数相加后,其结果的符

号位出现“01”或“10”两种组合时,表示发生溢出。这是因为两个绝对值小于l 的数

相加,其结果不会大于或等于2,所以最高符号位永远表示结果的正确符号。

2.3 定点数的定标

数的定标就是根据需要,人为地指定小数点的位置,这主要是由于在利用FPGA 进

行数字系统设计的时候无法将小数直接表示出来。数的定标有Q 表示法和S 表示法两种表

示方法。现在以16位为例,通过表2.3来介绍这两种表示法所能表示的十进制数的范围和

精度。这里讨论的为有符号数。

表2.3 16位有符号数的定标表示法

Q 表示 S 表示 十进制数表示范围

Q15 S0.15 -1<=x<=0.9999695

Q14 S1.14 -2<=x<=1.9999390

Q13 S2.13 -4<=x<=3.9998779

Q12 S3.12 -8<=x<=7.9997559

Q11 S4.11 -16<=x<=15.9995117

Q10 S5.10 -32<=x<=31.9990234

Q9 S6.9 -64<=x<=63.9980469

Q8 S7.8 -128<=x<=127.9960938

Q7 S8.7 -256<=x<=255.9921875

Q6 S9.6 -512<=x<=511.9804375

Q5 S10.5 -1024<=x<=1023.96875

Q4 S11.4 -2048<=x<=2047.9375

Q3 S12.3 -4096<=x<=4095.875

Q2 S13.2 -8192<=x<=8191.75

Q1 S14.1 -16384<=x<=16383.5

Q0 S15.0 -32768<=x<=32767

2.4 有限字长效应

和单片机、DSP 等器件一样,FPGA 也是不能直接处理模拟信号的。模拟信号必须

利用A/D 转换成数字信号以后才能利用FPGA 处理。由于A/D 器件的精度是一定的,所以

转换之后的数值和真实值之间存在着偏差,这就是输入的量化误差。

当利用FPGA 实现乘法计算的时候,例如计算两个N 位宽的二进制数的乘积,乘积的

基于labview的低通滤波器设计要点

基于LabVIEW的低通滤波器设计 学号: 201220120214 姓名:敖智男 班级: 1221202 专业:测控技术与仪器 课程教师:方江雄 2015年6月14 日

目录 一.设计思路 (2) 二.设计目的 (2) 三.程序框图主要功能模块介绍 1.测试信号生成模块 (3) 2.滤波功能模块.................................................................. .3 3.频谱分析模块 (4) 4.While循环模块 (5) 四.进行频谱分析.................................................................6、7五.主要设计步骤..................................................................8、9六.运行结果.. (10) 七.设计心得 (11)

低通滤波器是指对采样的信号进行浦波处理,允许低于截至频率的信号通过,高于截止频率的信号不能通过,提高有用信号的比重,进而消除或减少信号的噪声干扰。 一.设计思路 本VI设计的低通滤波器主要是先将正弦信号和均匀白噪声信号叠加,利用Butterworth低通滤波器进行滤波处理,得到有用的正弦信号:再对经过低通滤波器处理后的信号及信号频谱与滤波前的进行比较分析,检测滤波后的信号是否满足用户的要求。 二.设计目的 基于LabVIEW虚拟平台,将“正弦波形”函数和“均匀白噪声”函数产生的信号进行叠加以产生原始信号,让其先通过一个高通滤波器,滤除白噪声的带外杂波,以便在后续程序中低通滤波器可以输出正弦波;然后经过低通滤波器滤波处理,对滤波前后的信号和信号频谱进行比较,从而对低通滤波器的滤波效果进行检验。

实验二 FFT算法的MATLAB实现

班级:学号:姓名 实验二FFT算法的MATLAB实现 (一)实验目的: (1)掌握用matlab进行FFT在数字信号处理中的高效率应用。 (2)学习用FFT对连续信号和时域离散信号进行谱分析。 (二)实验内容及运行结果: 题1:若x(n)=cos(nπ/6)是一个N=12的有限序列,利用MATLAB计算它的DFT 并进行IDFT变换同时将原图与IDFT变换后的图形进行对比。当求解IFFT变换中,采样点数少于12时,会产生什么问题。 程序代码: N=12; n=0:11; Xn=cos(n*pi/6); k=0:11; nk=n'*k; WN=exp(-j*2*pi/N) WNnk=WN.^nk XK=Xn*WNnk; figure(1) stem(Xn) figure(2) stem(abs(XK)) 运行结果:

IFFT变换中,当采样点数少于12时图像如下图显示:

分析:由图像可以看出,当采样点数小于12时,x(n)的频谱不变,周期为6,而XK 的频谱图发生改变。 题2:对以下序列进行谱分析 132()()103()8470x n R n n n x n n n =+≤≤?? =-≤≤??? 其他n 选择FFT 的变换区间N 为8和16点两种情况进行频谱分析,分别打印其幅频特 性曲线并进行对比、分析和讨论。 ㈠ 程序代码: x=ones(1,3);nx=0:2; x1k8=fft(x,8); F=(0:length(x1k8)-1)'*2/length(x1k8); %进行对应的频率转换 stem(f,abs(x1k8));%8点FFT title('8点FFTx_1(n)'); xlabel('w/pi'); ylabel('幅度'); N=8时:

按时间抽取的基2FFT算法分析及MATLAB实现

按时间抽取的基2FFT 算法分析及MATLAB 实现 一、DIT-FFT 算法的基本原理 基2FFT 算法的基本思想是把原始的N 点序列依次分解成一系列短序列,充分利用旋转因子的周期性和对称性,分别求出这些短序列对应的DFT ,再进行适当的组合,得到原N 点序列的DFT ,最终达到减少运算次数,提高运算速度的目的。 按时间抽取的基2FFT 算法,先是将N 点输入序列x(n)在时域按奇偶次序分解成2个N/2点序列x1(n)和x2(n),再分别进行DFT 运算,求出与之对应的X1(k)和X2(k),然后利用图1所示的运算流程进行蝶形运算,得到原N 点序列的DFT 。只要N 是2的整数次幂,这种分解就可一直进行下去,直到其DFT 就是本身的1点时域序列。 图1 DIT-FFT 蝶形运算流图 二、DIT-FFT 算法的运算规律及编程思想 1.原位计算 [ 对N=M 2点的FFT 共进行M 级运算,每级由N/2个蝶形运算组成。在同一级中,每个蝶的输入数据只对本蝶有用,且输出节点与输入节点在同一水平线上,这就意味着每算完一个蝶后,所得数据可立即存入原输入数据所占用的数组元素(存储单元),经过M 级运算后,原来存放输入序列数据的N 个存储单元中可依次存放X(k)的N 个值,这种原位(址)计算的方法可节省大量内存。 2.旋转因子的变化规律 N 点DIT ―FFT 运算流图中,每个蝶形都要乘以旋转因子p W N ,p 称为旋转因子的指数。例如N =8 =3 2 时各级的旋转因子: 第一级:L=1, 有1个旋转因子:p W N =J /4W N =J 2L W J=0

第二级:L=2,有2个旋转因子:p W N =J /2W N =J 2L W J=0,1 第三级:L=3,有4个旋转因子:p W N =J W N =J 2L W J=0,1,2,3 对于N =M 2的一般情况,第L 级共有1-L 2个不同的旋转因子: p W N =J 2L W J=0,1,2,… ,1-L 2 -1 L 2=M 2×M -L 2= N ·M -L 2 故: 按照上面两式可以确定第L 级运算的旋转因子 \ 3、同一级中,同一旋转因子对应蝶形数目 第L 级FFT 运算中,同一旋转因子用在L -M 2 个蝶形中; 4、同一级中,蝶形运算使用相同旋转因子之间相隔的“距离” 第L 级中,蝶距:D=L 2; 5、同一蝶形运算两输入数据的距离 在输入倒序,输出原序的FFT 变换中,第L 级的每一个蝶形的2个输入数据相距:B=1 -L 2。 6、码位颠倒 输入序列x(n)经过M 级时域奇、偶抽选后,输出序列X(k)的顺序和输入序列的顺序关系为倒位关系。 '

FFT滤波器和FIR滤波器性能比较分析

分类号:TP311.1 U D C: 密级:公开编号: 学位论文 FFT滤波器和FIR滤波器性能比较分析 论文作者姓名: 申请学位专业:通信工程 申请学位类别:工学学士 指导教师姓名(职称): 论文提交日期:2015年5月25日

FFT滤波器和FIR滤波器性能比较分析 摘要 二十一世纪标志着数字化时代的来临,随着信息科技的快速发展,数字信号处理技术(DSP)已经发展成为信息产业之中的重要技术。它在通讯、电力系统、仪器自动化、遥感技术等技术领域得到了普遍的应用。与模拟滤波器相比,数字滤波器拥有稳定性高,精度高。设计方式灵活等重要的优点,没有模拟滤波器所存在的电压漂移和噪声等问题。并且拥有接近于理想的频率响应特性。这些优势注定了数字滤波器会得到广泛的应用。这其中,有限冲击响应滤波器(FIR滤波器)能够在保证幅度特性满足技术要求的同时,保证严格的线性相位特性。在数据传输,语音技术等方面应用广泛。同时,DSP的发展和FPGA技术的出现为数字滤波器的硬件实现提供了多样化的选择。 本课题主要应用C++语言设计FIR滤波器以及FFT滤波器,并对所设计的滤波器进行仿真。应用Microsoft Visual Studio 2010编译调试程序。主要运用窗函数设计法设计滤波器。 学术中比较常用的窗函数有以下几种:矩形窗函数,三角形窗函数,汉宁窗函数,海明窗函数,布莱克曼窗函数。通过这几种窗函数来分析两种滤波器在时间开销、幅度误差、相位误差等方面的差异。 关键字:数字信号技术滤波器 FIR FFT 模型仿真窗函数

Comparative analysis of FFT filter and FIR filter performance Abstract The 21st century is the era of digital, with the rapid development of information technology, digital signal processing (DSP) technology has become an important technology in information industry. It has been widely used in the field of high-tech communications, power systems, instrument automation, remote sensing etc.. Compared with analog filter, digital filter has high stability, high precision. The design is flexible and other important advantages, no problem existing simulation filter voltage drift and noise etc.. And have close to the ideal frequency response. This kind of advantage to digital filter will be widely used. Among these, the finite impulse response (FIR) filter can in the guarantee range characteristics to meet technical requirements at the same time, to ensure the strict linear phase characteristics. In data transmission, voice technology has been applied widely. At the same time, provides a diverse selection of DSP development and FPGA technology for the realization of digital filterhardware. The main comppiling language of designing the FIR filter and FFT filter in this paper is C++ language.Debugging programs through The application of Microsoft Visual Studio 2010 . Academic commonly used window function is the following: Rectangular window function, Bartlett window function, Hanning window function, Hamming window function, Blackman window function.Through the analysis of several window functions to find differences between the two kinds of filters, and the difference of amplitude error and phase error. Keywords: Digital signal technology FIR filter simulation window function

FFT的定点DSP实现

1 引言 CCS(Code Composer Studio)是TI公司的DSP集成开发环境。它提供了环境配置、源文件编辑、程序调试、跟踪和分析等工具,帮助用户在一个软件环境下完成编辑、编译链接、调试和数据分析等工作。与TI提供的早期软件开发工具相比,利用CCS能够加快软件开发进程,提高工作效率。CCS一般工作在两种模式下:软件仿真器和与硬件开发板相结合的在线编程。前者可以脱离DSP芯片,在PC机上模拟DSP指令集与工作机制,主要用于前期算法实现和调试。后者实时运行在DSP芯片上,可以在线编制和调试应用程序。 2 C语言和汇编语言的混合编程 TMS320 C5000系列的软件设计通常有三种方法: (1) 用C语言开发; (2) 用汇编语言开发; (3) C和汇编的混合开发。 其中用C语言开发具有兼容性和可移植的优点,有利于缩短开发周期和减少开发难度,但是在运算量较大的情况下,C代码的效率还是无法和手工编写的汇编代码的效率相比,比如FFT运算,用汇编语言开发的效率高,程序执行速度快,而且可以合理利用芯片的硬件资源,但是开发难度较大,开发周期长,而且可读性和可移植性差。C和汇编的混合编程则可以充分利用前两者的优点,以达到最佳利用DSP资源的目的。但是,采用C和汇编语言混合编程必须遵循相关函数调用规则和寄存器调用规则,否则会给程序的开发带来意想不到的问题。 2.1 C语言和汇编语言混合编程的四种方法 (1) 独立编写汇编程序和C程序,分开编译或汇编成各自的目标代码模块,再用链接器将二者链接起来。这种方法比较灵活,但是设计者必须自己维护各汇编模块的入口和出口代码,自己计算传递的参数在堆栈中的偏移量,工作量较大,但是能做到对程序的绝对控制。 (2) 在C程序中使用汇编程序中定义的变量和常数。 (3) 在C程序中内嵌汇编语句。这种方法可以实现C语言无法实现的一些硬件控制功能,如修改中断控制寄存器。 (4) 将C语言编译生成相应的汇编代码,手工修改和优化C编译器生成的汇编代码。采用这种方法可以控制C编译器,从而产生具有交叉列表的汇编程序,而设计者可以对其中的汇编语句进行修改,然后对汇编程序进行编译,产生目标文件。

FFT-C快速傅里叶变换超级详细的原代码

快速傅立叶变换(FFT)的C++实现收藏 标准的离散傅立叶DFT 变换形式如: y k=Σj=0n-1a jωn-kj = A (ωn-k). (ωn k为复数1 的第k 个n 次方根,且定义多项式A (x)=Σj=0n-1a j x j) 而离散傅立叶逆变换IDFT (Inverse DFT)形式如:a j=(Σk=0n-1y kωn kj)/n . yk=Σj=0n-1 ajωn-kj = A (ωn-k). (ωnk 为复数1 的第k 个n 次方根,且定义多项式 A (x) = Σj=0n-1 ajxj ) 而离散傅立叶逆变换IDFT (Inverse DFT)形式如:aj=(Σk=0n-1 ykωnkj)/n . 以下不同颜色内容为引用并加以修正: 快速傅立叶变换(Fast Fourier Transform,FFT)是离散傅立叶变换(Discrete Fourier transform,DFT)的快速算法,它是根据离散傅立叶变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。它对傅立叶变换的理论并没有新的发现,但是对于在计算机系统或者说数字系统中应用离散傅立叶变换,可以说是进了一大步。 设Xn 为N 项的复数序列,由DFT 变换,任一Xi 的计算都需要N 次复数乘法和N -1 次复数加法,而一次复数乘法等于四次实数乘法和两次实数加法,一次复数加法等于两次实数加法,即使把一次复数乘法和一次复数加法定义成一次“运算”(四次实数乘法和四次实数加法),那么求出N 项复数序列的Xi ,即N 点DFT 变换大约就需要N2 次运算。当N =1024 点甚至更多的时候,需要N2 = 1048576 次运算,在FFT 中,利用ωn 的周期性和对称性,把一个N 项序列(设N 为偶数),分为两个N / 2 项的子序列,每个N / 2点DFT 变换需要(N / 2)2 次运算,再用N 次运算把两个N / 2点的DFT 变换组合成一个N 点的DFT 变换。这样变换以后,总的运算次数就变成N + 2 * (N / 2)2 = N + N2 / 2。继续上面的例子,N =1024 时,总的运算次数就变成了525312 次,节省了大约50% 的运算量。而如果我们将这种“一分为二”的思想不断进行下去,直到分成两两一组的DFT 运算单元,那么N 点的DFT 变换就只需要N * log2N 次的运算,N = 1024 点时,运算量仅有10240 次,是先前的直接算法的1% ,点数越多,运算量的节约就越大,这就是FFT 的优越性。 FFT 的实现可以自顶而下,采用递归,但是对于硬件实现成本高,对于软件实现都不够高效,改用迭代较好,自底而上地解决问题。感觉和归并排序的迭代版很类似,不过先要采用“位反转置换”的方法把Xi 放到合适的位置,设i 和j 互为s = log2N 位二进制的回文数,假设s = 3, i = (110)2 = 6, j = (011)2 = 3, 如果i ≠j , 那么Xi 和Xj 应该互换位置。(关于这个回文数的生成,是很有趣而且是很基本的操作,想当初偶初学C++ 的时候就有这样的习题。)当“位反转置换”完成后,先将每一个Xi 看作是独立的多项式,然后两个两个地将它们合并成一个多项式(每个多项式有2 项),合并实际上是“蝶形运算”(Butterfly Operation, 参考《算法导论》吧^_^),继续合并(第二次的每个多项式有4 项),直到只剩

基于MATLAB的FIR滤波器设计

EDA 课程设计报告 滤波器设计参数:根据要求,要设计一个输入8位,输出8位的17阶线性相位FIR 滤波器,所以采用图2(a)的方式,其中输入信号范围为:[±99,0,0,0, ±70,0,0,0, ±99,0,0,0, ±70,…],此滤波器 Fs 为44kHz,Fc 为10.4kHz 。 (一)FIR 数字滤波器理论简述 有限冲激响应(FIR )数字滤波器和无限冲激响应(IIR )数字滤波器广泛应用于数字信号处理系统中。IIR 数字滤波器方便简单,但它相位的非线性,要求采用全通网络进行相位校正,且稳定性难以保障。FIR 滤波器具有很好的线性相位特性,使得它越来越受到广泛的重视。 有限冲击响应(FIR )滤波器的特点: 1 既具有严格的线性相位,又具有任意的幅度; 2 FIR 滤波器的单位抽样响应是有限长的,因而滤波器性能稳定; 3只要经过一定的延时,任何非因果有限长序列都能变成因果的有限长序列,因而能用因果系统来实现; 4 FIR 滤波器由于单位冲击响应是有限长的,因而可用快速傅里叶变换(FFT)算法来实现过滤信号,可大大提高运算效率。 5 FIR 也有利于对数字信号的处理,便于编程,用于计算的时延也小,这对实时的信号处理很重要。 6 FIR 滤波器比较大的缺点就是阶次相对于IIR 滤波器来说要大很多。 FIR 数字滤波器是一个线性时不变系统(LTI ),N 阶因果有限冲激响应滤波器可以用传输函数H (z )来描述, ()()N k k H z h k z -==∑ (0.1) 在时域中,上述有限冲激响应滤波器的输入输出关系如下: [][][][][]N k y n x n h n x k h n k ==*=-∑ (0.2) 其中,x [n ]和y [n ]分别是输入和输出序列。 N 阶有限冲激响应滤波器要用N +1个系数描述,通常要用N+1个乘法器和N 个两输入加法器来实现。乘法器的系数正好是传递函数的系数,因此这种结构称为直接型结构,可通过式(1.2)来实现,如图1。

基于matlab的IIR的滤波器设计

《数字信号处理》课程设计报告 专业: 班级: 学号: 姓名: 指导教师: 二0一二年六月十四日

目录 一:课程设计目的 (4) 二:课程设计的题目描述和要求 (4) 1:设计题目的描述 (4) 2:课程设计描述 (4) 3:课程设计要求 (4) 三:课程设计报告内容 (5) 1:总体设计 (5) 1.1:采集语音信号 (5) 1.2:声音信号的时域和频域分析 (5) 1.3:设计一个余弦噪声,并产生噪声的时域和频域图,并分析 (5) 1.4:对声音信号加噪声 (6) 1.5:设计B——F低通滤波器,并对其进行频谱分析 (6) 1.6:对加噪声的信号滤波,并回放,并分析频谱 (7) 2:软件仿真调试结果分析 (7) 2.1:运行语音信号程序 (8) 2.2:运行噪声信号 (8) 2.3:运行加噪声后的语音信号 (9) 2.4运行滤波器程序 (10)

2.5:滤波后的语音信号 (11) 四:设计总结 (12) 源程序代码: (13)

一:课程设计目的 1:通过对课程设计任务的完成,进一步巩固数字信号处理的基本概念、理论、分析方法和实现方法; 2:进一步扩展我们掌握的基本理论和分析方法方面的知识,能有效地将理论和实际紧密结合; 3:同时增强自己的软件编程实现能力和解决实际问题的能力。 4:练习能够熟练地用Matlab语言编程实现IIR数字滤波器和FIR数字滤波器,进一步明确数字信号处理的工程应用。 二:课程设计的题目描述和要求 1:设计题目的描述 基于matlab的IIR的Butterworth滤波器设计 目标:(1)语音采集 (2)设计滤波器,将采集的语音信号进行IIR滤波. (3)回放语音信号 2:课程设计描述 要求录制一段自己的语音信号后,格式为WAV。在MATLAB软件中采集语音信号、回放语音信号。 画出语音信号的时域波形和频谱图,对所采集的信号加入干扰噪声,要求噪声在3000Hz以上,对加入噪声进行播放,并进行时域和频谱分析,对比加噪声前后的时域图和频谱图,对比加噪声音信号和通过低通滤波器处理的音频信号不同的时域和频域波形。 3:课程设计要求 通过本次课程设计加深我对所学知识的理解和认识。并通过的实验来验证仿真自己的理解。理解了总体滤波器的设计。 运用matlab观察信号的处理操作过程。在加深自己matlab动手实验能力的同时,独立运用自己的数字信号处理知识来处理音频信号。 通过本次课程设计基本掌握matlab软件的编程方法。并进行相应的拓展。

用matlab实现fft算法

A1=str2double(get(handles.edit8,'String')); A2=str2double(get(handles.edit9,'String')); F1=str2double(get(handles.edit10,'String')); F2=str2double(get(handles.edit11,'String')); Fs=str2double(get(handles.edit12,'String')); N=str2double(get(handles.edit13,'String')); t=[0:1/Fs:(N-1)/Fs]; x=A1*sin(2*pi*F1*t)+A2*sin(2*pi*F2*t); %信号x的离散值 axes(handles.axes1) %在axes1中作原始信号图 plot(x); grid on m=nextpow2(x);N=2^m; % 求x的长度对应的2的最低幂次m if length(x)

FFT算法及IIR、FIR滤波器的设计

《DSP原理及其应用》实验设计报告 实验题目:FFT算法及滤波器的设计

摘要 随着信息科学的迅猛发展,数据采集与处理是计算机应用的一门关键技术,它主要研究信息数据的采集、存储和处理。而数字信号处理器(DSP)芯片的出现为实现数字信号处理算法提供了可能。数字信号处理器(DSP)以其特有的硬件体系结构和指令体系成为快速精确实现数字信号处理的首选工具。DSP芯片采用了哈佛结构,以其强大的数据处理功能在通信和信号处理等领域得到了广泛应用,并成为研究的热点。 本文主要研究基于TI的DSP芯片TMS320c54x的FFT算法、FIR滤波器和IIR滤波器的实现。首先大概介绍了DSP和TMS320c54x的结构和特点并详细分析了本系统的FFT变换和滤波器的实现方法。 关键词:DSP、TMS320c54x、FFT、FIR、IIR

Abstract With the rapid development of information science, data acquisition and processing is a key technology of computer applications, the main research of it is collection, storage and processing of information data. The emergence of the digital signal processor (DSP) chip offers the potential for the realization of the digital signal processing algorithm. Digital signal processor (DSP), with its unique hardware system structure and instruction system become the first tool of quickly and accurately realize the digital signal processing.DSP chip adopted harvard structure, with its powerful data processing functions in the communication and signal processing, and other fields has been widely applied, and become the research hot spot. This paper mainly studies the FFT algorithm based on TMS320c54x DSP chip of TI, the realization of FIR filter and IIR filter. First introduced the DSP and TMS320c54x briefly, then analyzed in detail the structure and characteristics of the system of the realization of FFT transform and filter method. Keyword: DSP、TMS320c54x、FFT、FIR、IIR

基于MATLAB的数字滤波器设计(DOC)

目录 1 引言 (1) 2 设计任务 (2) 2.1设计内容 (2) 2.2设计要求 (2) 3 语音信号的采集及时频分析 (3) 3.1语音信号的采集 (3) 3.2语音信号的时频分析 (3) 4 基于MATLAB的数字滤波器的设计 (5) 4.1数字滤波器的设计 (5) 4.1.1数字滤波器的基本概念 (5) 4.1.2 IIR滤波器设计思想 (5) 4.2IIR数字滤波器设计 (5) 4.2.1 IIR低通滤波器设计 (5) 4.2.2 IIR带通滤波器设计 (7) 4.2.3 IIR带通滤波器设计 (9) 5 合成信号及其滤波 (12) 5.1合成信号 (12) 5.2合成信号滤波 (13) 6 设计系统界面 (15) 6.1系统界面设计工具—GUI概述 (15) 6.2界面设计及使用说明 (15) 7 心得体会 (18) 参考文献 (19) 附录 (20)

1 引言 数字信号处理是利用计算机或专用处理设备,以数值计算的方法对信号进行采集、抽样、变换、综合、估值与识别等加工处理,借以达到提取信息和便于应用的目的。它在语音、雷达、图像、系统控制、通信、航空航天、生物医学等众多领域都获得了极其广泛的应用。具有灵活、精确、抗干扰强、设备尺寸小、造价低、速度快等优点。 数字滤波器, 是数字信号处理中及其重要的一部分。随着信息时代和数字技术的发展,受到人们越来越多的重视。数字滤波器可以通过数值运算实现滤波,所以数字滤波器处理精度高、稳定、体积小、重量轻、灵活不存在阻抗匹配问题,可以实现模拟滤波器无法实现的特殊功能。数字滤波器种类很多,根据其实现的网络结构或者其冲激响应函数的时域特性,可分为两种,即有限冲激响应( FIR,Finite Impulse Response)滤波器和无限冲激响应( IIR,Infinite Impulse Response)滤波器。 IIR滤波器采用递归型结构,即结构上带有反馈环路。IIR滤波器运算结构通常由延时、乘以系数和相加等基本运算组成,可以组合成直接型、正准型、级联型、并联型四种结构形式,都具有反馈回路。同时,IIR数字滤波器在设计上可以借助成熟的模拟滤波器的成果,如巴特沃斯、契比雪夫和椭圆滤波器等,有现成的设计数据或图表可查,在设计一个IIR数字滤波器时,我们根据指标先写出模拟滤波器的公式,然后通过一定的变换,将模拟滤波器的公式转换成数字滤波器的公式。 MATALB 可以创建图形用户界面GUI (GraphicalUser Interface) ,它是用户和计算机之间交流的工具。MATLAB 将所有GUl 支持的用户控件都集成在这个环境中并提供界面外观、属性和行为响应方式的设置方法,随着版本的提高,这种能力还会不断加强。而且具有强大的绘图功能,可以轻松的获得更高质量的曲线图。 滤波器的设计可以通过软件或设计专用的硬件两种方式来实现。随着MATLAB软件及信号处理工具箱的不断完善,MATLAB很快成为应用学科等领域不可或缺的基础软件。它可以快速有效地实现数字滤波器的设计、分析和仿真,极大地减轻了工作量,有利于滤波器设计的最优化。

实数FFT算法的设计及其C语言实现

实数FFT算法的设计及其C语言实现 目前国内有关数字信号处理的教材在讲解快速傅里叶变换(FFT)时,都是以复数FFT为重点,实数FFT算法都是一笔带过,书中给出的具体实现程序多为BASIC或FORTRAN程序并且多数不能真正运行。鉴于目前在许多嵌入式系统中要用到FFT运算,如以DSP为核心的交流采样系统、频谱分析、相关分析等。本人结合自己的实际开发经验,研究了实数的FFT算法并给出具体的C语言函数,读者可以直接应用于自己的系统中。 首先分析实数FFT算法的推导过程,然后给出一种具体实现FFT算法的C语言程序,可以直接应用于需要FFT运算的单片机或DSP等嵌入式系统中。 1 倒位序算法分析 按时间抽取(DIT)的FFT算法通常将原始数据倒位序存储,最后按正常顺序输出结果X(0),X(1),...,X(k),...。假设一开始,数据在数组float dataR[128]中,我们将下标i表示为(b6b5b4b3b2b1b0)b,倒位序存放就是将原来第i个位置的元素存放到第(b0b1b2b3b4b5b6)b 的位置上去.由于C语言的位操作能力很强,可以分别提取出b6、b5、b4、b3、b2、b1、b0,再重新组合成b0、b1、b2、b3、b4、b5、b6,即是倒位序的位置。程序段如下(假设128点FFT): /* i为原始存放位置,最后得invert_pos为倒位序存放位置*/ int b0=b1=b2=b3=b4=b5=6=0; b0=i0x01; b1=(i/2)0x01; b2=(i/4)0x01; b3=(i/8)0x01; b4=(i/16)0x01; b5=(i/32)0x01; b6=(i/64)0x01; /*以上语句提取各比特的0、1值*/ invert_pos=x0*64+x1*32+x2*16+x3*8+x4*4+x5*2+x6; 大家可以对比教科书上的倒位序程序,会发现这种算法充分利用了C语言的位操作能力,非常容易理解而且位操作的速度很快。 2 实数蝶形运算算法的推导 我们首先看一下图1所示的蝶形图。

基于matlab的FIR数字滤波器设计(带通,窗函数法)

数字信号处理 课程设计报告 设计名称:基于matlab的FIR数字滤波器设计 彪

一、课程设计的目的 1、通过课程设计把自己在大学中所学的知识应用到实践当中。 2、深入了解利用Matlab设计FIR数字滤波器的基本方法。 3、在课程设计的过程中掌握程序编译及软件设计的基本方法。 4、提高自己对于新知识的学习能力及进行实际操作的能力。 5、锻炼自己通过网络及各种资料解决实际问题的能力。 二、主要设计内容 利用窗函数法设计FIR滤波器,绘制出滤波器的特性图。利用所设计的滤波器对多个频带叠加的正弦信号进行处理,对比滤波前后的信号时域和频域图,验证滤波器的效果。 三、设计原理 FIR 滤波器具有严格的相位特性,对于信号处理和数据传输是很重要的。 目前 FIR滤波器的设计方法主要有三种:窗函数法、频率取样法和切比雪夫等波纹逼近的最优化设计方法。常用的是窗函数法和切比雪夫等波纹逼近的最优化设计方法。本实验中的窗函数法比较简单,可应用现成的窗函数公式,在技术指标要求高的时候是比较灵活方便的。 如果 FIR 滤波器的 h(n)为实数, 而且满足以下任意条件,滤波器就具有准确的线性相位: 第一种:偶对称,h(n)=h(N-1-n),φ (ω)=-(N-1)ω/2 第二种:奇对称,h(n)=-h(N-1-n), φ(ω)=-(N-1)ω/2+pi/2 对称中心在n=(N-1)/2处 四、设计步骤 1.设计滤波器 2.所设计的滤波器对多个频带叠加的正弦信号进行处理 3.比较滤波前后信号的波形及频谱 五、用窗函数设FIR 滤波器的基本方法 基本思路:从时域出发设计 h(n)逼近理想 hd(n)。设理想滤波器的单位响应在时域表达为hd(n),则Hd(n) 一般是无限长的,且是非因果的,不能

实验2FFT算法实现

实验2 FFT 算法实现 2.1 实验目的 1、 加深对快速傅里叶变换的理解。 2、 掌握FFT 算法及其程序的编写。 3、 掌握算法性能评测的方法。 2.2 实验原理 一个连续信号)(t x a 的频谱可以用它的傅立叶变换表示为 dt e t x j X t j a a Ω-+∞ ∞-?= Ω)()( (2-1) 如果对该信号进行理想采样,可以得到采样序列 )()(nT x n x a = (2-2) 同样可以对该序列进行z 变换,其中T 为采样周期 ∑+∞∞--=n z n x z X )()( (2-3) 当ωj e z =的时候,我们就得到了序列的傅立叶变换 ∑+∞∞-=n j j e n x e X ωω)()( (2-4) 其中ω称为数字频率,它和模拟域频率的关系为 s f T /Ω=Ω=ω (2-5) 式中的s f 是采样频率。上式说明数字频率是模拟频率对采样率s f 的归一化。同模拟域的情况相似,数字频率代表了序列值变化的速率,而序列的傅立叶变换称为序列的频谱。序列的傅立叶变换和对应的采样信号频谱具有下式的对应关系。 ∑+∞∞--=)2(1)(T m j X T e X a j πωω (2-6) 即序列的频谱是采样信号频谱的周期延拓。从式(2-6)可以看出,只要分析采样序列的频谱,就可以得到相应的连续信号的频谱。注意:这里的信号必须是带限信号,采样也必须满

足Nyquist 定理。 在各种信号序列中,有限长序列在数字信号处理中占有很重要的地位。无限长的序列也往往可以用有限长序列来逼近。对于有限长的序列我们可以使用离散傅立叶变换(DFT ),这一变换可以很好地反应序列的频域特性,并且容易利用快速算法在计算机上实现当序列的长度是N 时,我们定义离散傅立叶变换为: ∑-===10)()]([)(N n kn N W n x n x DFT k X (2-7) 其中N j N e W π 2-=,它的反变换定义为: ∑-=-==10)(1)]([)(N k kn N W k X N k X IDFT n x (2-8) 根据式(2-3)和(2-7)令k N W z -=,则有 ∑-====-10)]([)(|)(N n nk N W z n x DFT W n x z X k N (2-9) 可以得到k N j k N e W z z X k X π2|)()(===-,k N W -是z 平面单位圆上幅角为k N πω2=的点,就是将单位圆进行N 等分以后第k 个点。所以,X(k)是z 变换在单位圆上的等距采样,或者说是序列傅立叶变换的等距采样。时域采样在满足Nyquist 定理时,就不会发生频谱混淆;同样地,在频率域进行采样的时候,只要采样间隔足够小,也不会发生时域序列的混淆。 DFT 是对序列傅立叶变换的等距采样,因此可以用于序列的频谱分析。在运用DFT 进行频谱分析的时候可能有三种误差,分析如下: (1)混淆现象 从式(2-6)中可以看出,序列的频谱是采样信号频谱的周期延拓,周期是2π/T ,因此当采样速率不满足Nyquist 定理,即采样频率T f s /1=小于两倍的信号(这里指的是实信号)频率时,经过采样就会发生频谱混淆。这导致采样后的信号序列频谱不能真实地反映原信号的频谱。所以,在利用DFT 分析连续信号频谱的时候,必须注意这一问题。避免混淆现象的唯一方法是保证采样的速率足够高,使频谱交叠的现象不出现。这就告诉我们,在确定信号的采样频率之前,需要对频谱的性质有所了解。在一般的情况下,为了保证高于折叠频率的分量不会出现,在采样之前,先用低通模拟滤波器对信号进行滤波。 (2)泄漏现象 实际中的信号序列往往很长,甚至是无限长序列。为了方便,我们往往用截短的序列来近似它们。这样可以使用较短的DFT 来对信号进行频谱分析。这种截短等价于给原信号序列乘以一个矩形窗函数。而矩形窗函数的频谱不是有限带宽的,从而它和原信号的频谱进行卷积以后会扩展原信号的频谱。值得一提的是,泄漏是不能和混淆完全分离开的,因为泄露导致频谱的扩展,从而造成混淆。为了减小泄漏的影响,可以选择适当的窗函数使频谱的扩散减到最小。 (3)栅栏效应 因为DFT 是对单位圆上z 变换的均匀采样,所以它不可能将频谱视为一个连续函数。

(完整word版)stm32F103进行FFT算法教程

STM32F103 12-15元左右 本文将以一个实例来介绍如何使用STM32提供的DSP库函数进行FFT。 1.FFT运算效率 使用STM32官方提供的DSP库进行FFT,虽然在使用上有些不灵活(因为它是基4的FFT,所以FFT的点数必须是4^n),但其执行效率确实非常高效,看图1所示的FFT运算效率测试数据便可见一斑。该数据来自STM32 DSP库使用文档。 图1 FFT运算效率测试数据 由图1可见,在STM32F10x系列处理器上,如果使用72M的系统主频,进行64点的FFT运算,仅仅需要0.078ms而已。如果是进行1024点的FFT运算,也才需要2.138ms。 2.如何使用STM32提供的DSP库函数 2.1下载STM32的DSP库 大家可以从网上搜索下载得到STM32的DSP库,这里提供一个下载的地址:https://https://www.360docs.net/doc/625747691.html,/public/STe2ecommunities/mcu/Lists/cortex_ mx_stm32/DispForm.aspx?ID=30831&RootFolder=%2fpublic%2fST e2ecommunities%2fmcu%2fLists%2fcortex%5fmx%5fstm32%2fST M32F10x%20DSP%20library%2c%20where%20is%20it 2.2添加DSP库到自己的工程项目中 下载得到STM32的DSP库之后,就可以将其添加到自己的工程项目中了。

其中,inc文件夹下的stm32_dsp.h和table_fft.h两个文件是必须添加的。stm32_dsp.h是STM32的DSP库的头文件。 src文件夹下的文件可以有选择的添加(用到那个添加那个即可)。因为我只用到了256点的FFT,所以这里我只添加了cr4_fft_256_stm32.s文件。添加完成后的项目框架如图2所示。 图2 项目框架 2.3模拟采样数据 根据采样定理,采样频率必须是被采样信号最高频率的2倍。这里,我要采集的是音频信号,音频信号的频率范围是20Hz到20KHz,所以我使用的采用频率是44800Hz。那么在进行256点FFT时,将得到44800Hz / 256 = 175Hz的频率分辨率。 为了验证FFT运算结果的正确性,这里我模拟了一组采样数据,并将该采样数据存放到了long类型的lBufInArray数组中,且该数组中每个元素的高16 位存储采样数据的实部,低16位存储采样数据的虚部(总是为0)。 为什么要这样做呢?是因为后面要调用STM32的DSP库函数,需要传入的参数规定了必须是这样的数据格式。 下面是具体的实现代码: 1 /****************************************************************** 2函数名称:InitBufInArray() 3函数功能:模拟采样数据,采样数据中包含3种频率正弦波(350Hz,8400Hz,18725Hz) 4参数说明: 5备注:在lBufInArray数组中,每个数据的高16位存储采样数据的实部, 6低16位存储采样数据的虚部(总是为0) 7作者:博客园依旧淡然(https://www.360docs.net/doc/625747691.html,/menlsh/) 8 *******************************************************************/

相关文档
最新文档