FIR数字滤波器的设计与实现Word格式文档下载.docx
《FIR数字滤波器的设计与实现Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《FIR数字滤波器的设计与实现Word格式文档下载.docx(22页珍藏版)》请在冰点文库上搜索。
isalwaysstable,
soitiswidelyusedin
variousfieldsofdigitalsignalprocessing,
soitis
animportantresearchtopic.
Withthedevelopmentofmicroelectronicstechnology,
digitalsignalprocessing
hasbeentherapiddevelopment.
Digitalfilter
isthespectrumanalysis,
radar
signalprocessing,
communicationand
signalprocessingapplicationsin
thebasicalgorithm,
hasbeenwidelyapplied
indigital
audio,
imageprocessing,
datatransmission
andbiomedicalfields.
Thecontentofthispaperincludes
FIRdigitalfilterwith
linearphase
conditionand
networkstructure,
characteristicsanddesign
methodandDSPdesign
technology,
MATLAB/Simulinkdetailed
design
processwizard,
ModelSimsimulationbasedon.
Inthispaper,
throughadesignexample,
presentsarealization
offiniteimpulseresponse
filter
schemebyusingDSP
Builder,
andto
achievea20
orderlow-pass
digitalfilter
asanexample,
thedesign
andcompletethesoftware
simulationandverification.
Throughsimulationandverification,
thesystemofthedigitalfilterdesigned
to
runsuccessfully,
andthedesignedfilterhasgoodstability,
highaccuracy,
lesssusceptibletoenvironmentalimpact.
Thedevelopment
of
intheuseofFPGA,
usingMatlab
environment
basedon
DSP
Builder
asadesigntool
canbemoreconvenienttocreatemodels,completethewholedesign.
Keywords:
MATLAB;
Digitalfilter;
DSPBuilder;
FIR.
目录
一、绪论1
(一)数字滤波器的研究背景1
(二)数字滤波器的概念以及分类2
(三)FIR和IIR滤波器的比较2
二、FIR数字滤波器的原理3
三、DSPBuilder设计流程4
四、基于DSPBuilder的FIR数字滤波器的设计与实现6
(一)利用DSPBuilder库建立DDS模型6
(二)加入激励,完成系统仿真6
(三)由Simulink模型转成VHDL7
(四)综合7
(五)利用Modelsim完成功能仿真7
(六)编译适配8
五、基于MATLAB的滤波器设计工具8
(一)滤波器指标8
(二)打开MATLAB的FDATOOL8
(三)滤波器分析9
(四)导出滤波器系数12
六、课程设计心得14
七、参考文献15
八、附录16
一、绪论
(一)数字滤波器的研究背景
作为嵌入式系统的基础元件之一,FPGA的面貌正日新月异:
逻辑单元不断增加、单位成本和功耗不断降低,而根本的设计灵活性和快速转换能力却始终未变。
在变与不变的共同推动下,FPGA的价值发生了变化,它已从纯粹的建模工具发展成为适合中小批量生产的应用器件,而其应用也从早期的嵌入式通信系统扩展到了低成本的消费电子。
FPGA之所以越来越多地在嵌入式系统中得到应用,主要得益于它在低成本和低功耗两方面均取得了很好的进步,从而能够满足OEM日益紧迫的上市周期、不断缩减的成本结构和低功耗要求。
“内外两个因素正驱动着这种以价值为基础的FPGA市场的高速发展。
”Act公司中国区经理夏明威如是说,“内因是FPGA单位成本的急速下降。
凭借半导体工艺技术的不断进步和制造效率的提高,FPGA已在很多对成本高度敏感的市场上与ASIC平分秋色。
”
市场分析师对可编程逻辑器件市场的预测也验证了这一趋势。
首先据市场调研公司GartnerDataquest预测,2003到2008年,整体可编程逻辑市场的复合年均增长率达38%;
其次,他们预测这一增长是由汽车和消费电子应用驱动的。
他们还认为,FPGA在消费电子中的应用将于2008年超过10亿美元,即接近其2002年营收水平的10倍。
增长的推动力主要来自全球数字和高解晰度广播电视传输标准、游戏和多媒体娱乐系统、LCD和等离子显示技术、以及家用DVR和DVD-W技术应用的不断上升;
在汽车领域,FPGA将越来越多用于驾驶室内娱乐系统和GPS导航系统、信息、通信和安全系统。
以FPGA为核心的PLD产品是近几年集成电路中发展得最快的产品。
随着FPGA性能的高速发展和设计人员自身能力的提高,FPGA将进一步扩大可编程芯片的领地,将复杂专用芯片挤向高端和超复杂应用。
目前FPGA的发展趋势主要体现在以下几个方面:
1、向更高密度、更大容量的千万门系统级方向迈进;
2、向低成本、低电压、微功耗、微封装和绿色化发展;
3、IP资源复用理念将得到普遍认同并成为主要设计方式;
4、MCU、DSP、MPU等嵌入式处理器IP将成为FPGA应用的核心;
5、随着处理器以IP的形式嵌入到FPGA中,ASIC和FPGA之间的界限将越来越模糊,未来的某些电路版上可能只有这两部分电路:
6、模拟部分(包括电源和一块FPGA芯片,最多还有一些大容量的存储器)。
分布式算法(distributedarithmetic,DA)最初是在1973年由Croisier提出的,由Peled和Liu进行了推广工作。
但直到Xilinx发明FPGA的查找表以后,DA算法才在上世纪90年代初重新受到重视,并有效地应用在FIR滤波器的设计中。
长期以来,FPGA一直被用于逻辑或时序控制上,很少用于信号处理方面,主要原因是FPGA中没有直接的硬件乘法器。
通过分布式算法,对于固定系数的乘法这个问题得到了很好的解决。
而且由FPGA代替ASIC和DSP作为前端数字信号处理的运算,在规模、重量和功耗方面都有所降低,而且吞吐量更高,开发成本进一步缩短。
可以预见,在未来,大量的FPGA将会统治更多的如FIR滤波、CORDIC算法或FFT等的前端应用。
(二)数字滤波器的概念以及分类
所谓数字滤波器是指输入输出均为数字信号,通过一定的运算关系改变输入信号中所含频率成分的相对比例或者滤除某些频率成分的器件。
常用的滤波器有无限长单位脉冲响应(IIR)滤波器和有限长单位脉冲响应(FIR)滤波器两种。
其中,FIR滤波器能提供理想的线性相位响应,在整个频带上获得常数群延时从而得到零失真输出信号,同时它可以采用十分简单的算法实现,这两个优点使FIR滤波器成为设计的首选。
采用一种基于DSPBuilder的FPGA设计方法,使FIR滤波器设计较为简单易行,并能满足设计要求。
设FIR滤波器单位脉冲响应
长度为N,其系统函数
为:
是
的(N-1)次多项式,它在z平面上有(N-1)个零点,原点z=0是(N-1)阶重极点。
因此,
永远稳定。
稳定和线性相位特性是FIR滤波器突出的优点。
(三)FIR和IIR滤波器的比较
在很多实际应用中如语音和音频信号处理中,数字滤波器来实现选频功能。
因此,指标的形式应为频域中的幅度和相位响应。
在通带中,通常希望具有线性相位响应。
在FIR滤波器中可以得到精确的线性相位。
在IIR滤波器中通常的相位是不可能得到的,因此主要考虑幅度指标。
IIR数字滤波器的设计和模拟滤波器的设计有着密切的联系。
通常要设计出适当的模拟滤波器,再通过一定的频带变换把它转换成所需要的数字IIR滤波器。
此外,任何数字信号处理系统中也还不可避免地用到模拟滤波器,因此模拟滤波器设计也是数字信号应该掌握的技术。
FIR滤波器的设计方法和IIR滤波器的设计方法有很大的不同。
FIR滤波器设计任务是选择有限长度的
,使传输函数
满足技术要求。
在设计和实现上FIR滤波器具有如下优越性:
(1)相应相位可为严格线性,因此它不存在延迟失真,只有固定的时间延迟;
(2)由于不存在稳定性问题,所以设计相对简单;
(3)只包含实数算法,不涉及复数算法,不需要递推运算,长度为M的滤波器(阶数为M-1)它的计算值约为M/2。
二、FIR数字滤波器的原理
对于一个FIR滤波器系统而言,它的冲激响应总是有限长的,其系统函数可以记为:
其中M是FIR滤波器的零点数,即延时节数,在这里被称为FIR滤波器的节数。
最基本的FIR滤波器可用下式表示:
其中
是输入采样序列,
是滤波器系数,L是滤波器的系数长度,
表示滤波器的输出序列。
也可以用卷积来表示输出序列
与
、
的关系。
图2-1中显示了一个典型的直接I型4阶FIR滤波器,其输出序列
满足下列等式:
(
图2-14阶FIR滤波器结构
在这个FIR滤波器中,总共存在3个延时节,4个乘法单元,一个4输入的加法器。
如果采用普通的数字信号处理器(DSPProcessor)来实现,只能用串行的方式顺序的执行延时,乘加操作,这不可能在一个DSP(指数字信号处理器)指令周期内完成,必须用多个指令周期来完成。
但是,如果采用FPGA来实现,就可以采用并行结构,在一个时钟周期内得到一个FIR滤波器的输出。
三、DSPBuilder设计流程
DSPBuilder是一个系统级(或算法级)设计工具,它架构在多个软件工具之上,并把系统级和RTL级两个设计领域的设计工具连接起来,最大程度发挥了两种工具的优势。
DSPBuilder依赖于MathWorks公司数学分析工具Matlab/Simulink,以Simulink的Blockset出现,可以在Simulink中进行图形化设计和仿真,同时又通过SignalCompiler可以把Matlab/Simulink的设计文件(.mdl)转成相应的硬件描述语言VHDL设计文件(.vhd),以及用于控制综合与编译的TCL脚本。
而对后者的处理可以由FPGA/CPLD开发工具Quartus
,DSPBuilder针对不同情况提供了两套设计流程,即自动流程和手动流程。
图2-1是利用DSPBuilder进行DSP设计的流程框图。
如图2-1所示,DSPBuilder设计流程第一步是在Matlab/Simulink中进行设计输入,即在Matlab的Simulink环境中建立一个mdl模型文件,用图形方式调用AlteraDSPBuilder和其它Simulink库中的图形模块(Block),构成系统级或算法级设计框图(或称Simulink设计模型)。
第二步是利用Simulink强大的图形化仿真、分析功能,分析此设计模型的正确性,完成模型仿真。
在这两步中,与一般的MatlabSimulink建模过程几乎没有什么区别,所不同的是设计模型库采用AlteraDSPBuilder的Simulink库,也不涉及到其它EDA软件,没有自动流程和手动流程的区别。
图2-1DSPBuilder设计流程
为了针对不同用户的设计目的和设计要求,DSPBuilder提供了两种不同的设计流程,主要可以分为自动流程和手动流程。
在手动流程中,设计者可以灵活地指定综合、适配条件。
不过,需要手动的调用VHDL综合器进行综合,调用Quartus
进行适配,调用ModelSim或者Quartus
进行仿真,最后用Quartus
产生相应的编程文件用于FPGA的配置。
采用手动流程时,除了行为级仿真验证和设计输入外,其它过程与标准的基于VHDL的EDA设计流程完全是一致的。
由上一步的DSPBuilder设计流程得到VHDL文件(由Simulink模型文件
.mdl通过SignalCompiler转换而成),送入综合器进行综合。
综合器可以是SynplifyPro,也可以是LelnardoSpectrum,或者采用Altera自己的Quartus
。
在综合时,可能需要对综合器进行配置或者提供综合的约束条件。
由于这个过程操作可能比较繁琐,所以DSPBuilder的SignalCompiler相应提供了一个接口,针对设计,自动产生一个TCL脚本与综合器Synplify或者LelnardoSpectrum相接。
综合器在综合操作后会产生一个网表文件,以供下一个流程使用。
这里产生的网表文件称为ATOM网表文件(如图2-1所示),主要是EDIF一种参数可设置的,并含有具体器件系列硬件特征(如逻辑宏LCs、I/O单元、乘积项、嵌入式系统块ESB等)的网表文件。
如果用DSPBuilder产生的DSP模型只是庞大设计中的一个子模块,则可以在设计中调用DSPBuilder产生的VHDL文件,以构成完整的设计。
同时,一样可以使用Quartus
强大的LogicLock功能和SignalTap测试技术。
在图2-1的流程中,其中有个流程在DSP设计中是不可或缺的,那就是HDL仿真。
与DSPBuilder可以配合使用的HDL仿真器是ModelSim。
DSPBuilder在生成VHDL代码时,可以同时生成用于测试DSP模块的TestBench(测试平台)文件,DSPBuilder生成的TestBench文件采用VHDL语言,测试向量与该DSP模块在Simulink中的仿真激励相一致。
通过ModelSim仿真生成的TestBench可以验证生成的VHDL代码与Simulink中DSP模型的一致性。
另外,DSPBuilder在产生TestBench的同时,还产生了针对ModelSim仿真的Rcl脚本来简化用户的操作,掩盖ModelSim仿真时的复杂性。
四、基于DSPBuilder的FIR数字滤波器的设计与实现
(一)利用DSPBuilder库建立DDS模型
(二)加入激励,完成系统仿真
(三)由Simulink模型转成VHDL
(四)综合
(五)利用Modelsim完成功能仿真
(六)编译适配
五、基于MATLAB的滤波器设计工具
(一)滤波器指标
若需要设计一个20阶的FIR滤波器(h(0)=0),给定的参数如下:
低通滤波器;
采样频率Fs为48kHz,滤波器Fc为10.8kHz;
输入序列位宽为9位(最高位为符号位)。
在此利用MATLAB来完成FIR滤波器系数确定。
(二)打开MATLAB的FDATOOL
MATLAB集成了一套功能强大的滤波器设计工具FDATool(FilterDesign&
AnalysisTool),可以完成多种滤波器的设计、分析和性能评估。
点击MATLAB主窗口下方的“Start”(开始)按钮,按图5-1选择“ToolBox”→“FilterDesign”→“FilterDesign&
AnalysisTool(FDATool)”,打开FDATool,如图5-2所示。
图5-1打开的FDATool
图5-2FDATool界面
(三)滤波器分析
计算完FIR滤波器系统分析后,往往需要对设计好的FIR滤波器进行相关的性能分析,以便了解该滤波器是否满足设计要求。
分析操作步骤如下:
1.选择FDATool的菜单“Analysis”→“MagnitudeResponse”,启动幅频响应分析。
图5-3显示了滤波器的幅频响应图,x轴为频率,y轴为幅度值(单位为dB)。
在图的左侧列出了当前滤波器的相关信息:
(1)滤波器类型为DirectformFIR(直接I型FIR滤波器)
(2)滤波器阶数为4
图5-3FIR滤波器的幅频响应
图5-4FIR滤波器的相频响应
图5-5幅频响应与相频响应的比较
图5-6FIR滤波器的冲激响应
图5-7FIR滤波器的阶跃响应
图5-8FIR滤波器的零极点
求出的FIR滤波器的系数可以通过选择菜单“Analysis”→“FilterCoefficients”来观察,见图5-9。
图中列出了FDATool计算的19阶直接I型FIR滤波器的部分系数。
图5-9FIR滤波器系数
(四)导出滤波器系数
为导出设计好的滤波器系数,选择FDATool菜单的“File”→“Export….”,打开导出(Export)对话框,如图5-10所示。
图5-10导出系数对话框
现在若要在FIR滤波器模型中使用这些数据,还需要将他们转化为整数,在MATLAB主窗口的命令中键入:
Num*(2^15)
得到:
六、课程设计心得
通过这次结课报告,我不仅巩固以前所学的知识,并且又新学到了不少的有用的知识,不但使我提高了自己的能力也知道了自己的不足。
我深刻地认识到,只有单纯的理论知识是不行的,必须多实践,多操作才可以使自己的知识得到巩固,从而提高自身素质。
在系统的设计过程中,虽然遇到了很多不同程度的问题和困难,但最后基本上均以解决,系统能够顺利运行并完成各项功能。
由于时间上和个人学识上有限,系统还存在一些不足之处,还有一些功能更高更完善的功能没有能实现,有待于以后进一步的改进和完善。
七、参考文献
《现代DSP技术》潘松黄继业王国栋著
《数字信号处理》高西全丁玉没著
《DSP基础与实用系统设计(PDF版)》王念旭编著
《IntroductiontoMatlab7》
(美)DoloresEtter,DavidKuncicky,HollyMoore著译者:
邱李华
《MATLAB7.0从入门到精通(修订版)》刘保柱,苏彦华,张宏林编著
《精通Matlab7》(美)亨塞尔曼,(美)利特菲尔德著,朱仁峰译出版社
《精通MATLAB6.5版教程(含CD-ROM光盘一张)》张志涌编著
八、附录
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_signed.all;
librarydspbuilder;
usedspbuilder.dspbuilderblock.all;
librarylpm;
uselpm.lpm_components.all;
usestd.textio.all;
Entitytb_dadadadais
generic(ClockPeriod:
time:
=20.00000ns);
endtb_dadadada;
architecturetbDspBuilderoftb_dadadadais
signalclock:
std_logic:
='
0'
;
signalSystemReset:
std_logic:
1'
signalsReadSimulinkStimuli:
signalWriteStimuli:
std_logic:
signalCountClock:
integer:
=0;
signalAltBus:
std_logic_vector(7downto0):
=(others=>
'
);
signalAltBus1:
std_logic_vector(17downto0);
componentdadadada
port(
clock:
instd_logic;
sclrp:
AltBus:
instd_logic_vector(7downto0);
AltBus1:
outstd_logic_vector(17downto0));
endcomponent;
Begin
assert(1<
0)reportaltversionseverityNote;
--Samplingclockprocessgeneration
ClkPr:
process
begin
waitforClockPeriod/2;
clock<
=notclock;
endprocessClkPr;
--SystemReset:
Ini