FIR滤波器一、实验仪器:PC机一台,JQ-NIOS-2C35实验箱一台及辅助软件(DSPBuilder、Matlab/Simulink、QuartusII、Modelsim)。二、实验目的:1.初步了解JQ-NIOS-2C35实验箱的基本结构;2.学习和熟悉基于DSPBuilder开发数字信号处理实验的流程。3.学习和熟悉DSPBuilder层次化的设计方法。三、实验原理:1.FIR滤波器基础FIR滤波器具有直接型、级联型和频率抽样型三种基本结构[14]。由于在DSPBuilder模型设计中采用了直接型结构,我们只对直接型结构进行讨论。这种结构也被称为抽头延迟线结构,或横向滤波器结构[15][16]。图1显示的是直接型结构的示意图,从图中可以看出,每个抽头上的加权值Mrrb,.......,2,1,0),(,分别等于滤波器的单位冲击响应Mrrh,......,2,1,0),(。输入与抽头加权值的乘积的和就是输出)(ny。图1FIR滤波器直接型结构示意图转置定理定义为,如果将上图中的所有支路倒转,并将输入x(n)和输出y(n)的位置调换,则其冲击响应不变。将转置定理应用于上图,则得到FIR滤波器的转置结构,如图2所示。图2转置型FIR滤波器结构示意图2.具有线性相位的FIR滤波器结构若一个FIR滤波器具有线性相位,且其单位冲击响应h(n)全为实数,则h(n)具有如下特性:当N为偶数时,h(n)=h(M-n);当N为奇数时,h(n)=-h(M-n)。所谓线性相位特性是指滤波器对不同频率的正弦波产生的相移和正弦波的频率成直线关系。在本次试验设计中采用的是N为偶数的结构,图3显示的是N为偶数时线性相位滤波器的结构。图3线性相位滤波器结构示意图(N为偶数)3.FIR滤波器的设计方法FIR滤波器的设计方法主要有窗函数法、频率抽样法和切比雪夫逼近法三种。其中窗函数法是设计FIR滤波器最基本的方法。在本次实验设计中,采用的方法也是窗函数法,接下来我们主要讨论用窗函数法设计FIR滤波器。窗函数设计的基本思想是要选择一种合适的理想频率选择性滤波器,然后将它的冲击响应截短以获得一个具有线性相位和因果的FIR滤波器。因此这种方法的关键是选取某种好的窗函数和一种理想滤波器,在滤波器性能参数给定的情况下,应尽量选择主瓣尽可能窄,边瓣峰值进可能小的窗函数。在了解了FIR滤波器的原理及设计方法后,基于DSPBuilder设计FIR滤波器的第一项工作就是滤波器参数的选取。这一工作是借助于Matlab提供的设计滤波器专用的工具箱——FDAtool来完成的。在启动FDAtool前先确定所要设计的FIR滤波器的要求,在这里,我们将用凯撒窗设计一个16阶的低通滤波器,截止频率为10800Hz,采样频率sf为50000HZ。四、实验步骤:一、创建FIR子系统按照下表给出的操作,创立文件,找到相应模块并设置参数:位置对象参数桌面Matlab工作目录设为Matlab安装目录下的work文件夹File-New-ModelMatlab-simulinkFile-Save命名为FSKAlteraDSPBuilder-ArithmeticIncrementDecrementBusType设为SignedInteger,numberofbits设为8,在SpecifyClock选项前打勾,并在下面的对话框中输入ClockAlteraDSPBuilder-StorageLUTAddressWidth设为8,DataType设为SignedInteger,numberofbits设为8,MATLABArray设为127*sin(2*(16000/50000)*pi*(1:2^8))AlteraDSPBuilder-StoragDelayAlteraDSPBuilder-ArithmetiProductAlteraDSPBuilder-IO&BusAltbusBusType设为SignedInteger,numberofbits设为9AlteraDSPBuilder-IO&BusInputSimulink-SourceStepStepTime设为2e-4,Initialvalue设为0,Finalvalue设为1,Sampletime设为1/50000将上表中的模块按照下图连接起来。连接好后,按住鼠标左键,框住全部的模块及连接,单击鼠标右键,选择CreateSubsystem,建立输入子系统。单击子系统下的文本命名为Input1_Subsystem。复制上面所建立的子模块,命名为Input2_Subsystem。不同的是LUT模块的MATLABArray设为127*sin(2*(8000/50000)*pi*(1:2^8))。再按下图中的形式添加模块至模型,这里有一个小技巧,按住CTRL+R可以对模块进行旋转,以便于连接。连接后,创建子模块,命名为Fir_SubSystem。二、连接FIR模型再按照下表,找到相应模块并设置参数:位置对象参数AlteraDSPBuilder-IO&BusOutputBusType设为SignedInteger,numberofbits设为17AlteraDSPBuilder-IO&BusOutputBusType设为SignedInteger,numberofbits设为17AlteraDSPBuilder-IO&BusOutputBusType设为SignedInteger,numberofbits设为9AlteraDSPBuilder-IO&BusOutputBusType设为SignedInteger,numberofbits设为9AlteraDSPBuilder-AltLabClockReal-WorldClockPeriod设为20,PeriodUnits设为ns,SimulinkSampleTime设为1/50000,ResetType设为ActiveLowAlteraDSPBuilder-AltLabSignalCompilerAlteraDSPBuilder-AltLabTestBenchOn将所有模块按照下图进行连接:(其中前两个与Fir模块相连,后两个与Input模块相连,一定不能错。)三、Simulink仿真执行File-ConfigurationParameters,将solver设为discrete,Type设为Fixed-step,StopTime设为0.005。点击菜单栏中的黑色小三角,启动simulation,simulation结束后,双击Scope模块,打开波形观察界面,在波形上点击鼠标右键,选择Autoscale,即可观察simulation后的波形。四、RTL级仿真点击TestBenchOn模块,打开模块参数界面,在Advanced选项卡中,点选LauchGUI,并依次点击GenerateHDL,RunSimulink和RunModelsim,启动RTL级仿真。随后显示的界面即为ModelsimRTL级仿真的波形图。选中tb_fir/dut/output信号,点击鼠标右键,选中Propertyties选项,选择Format为analog,将Height设为100,Scale设为0.1,点击【OK】确认。同样的方法,选中tb_fir/dut/output1信号,点击鼠标右键,选中Propertyties选项,选择Format为analog,将Height设为100,Scale设为0.2;选中tb_fir/dut/output2信号,点击鼠标右键,选中Propertyties选项,选择Format为analog,将Height设为100,Scale设为0.3;选中tb_fir/dut/output3信号,点击鼠标右键,选中Propertyties选项,选择Format为analog,将Height设为100,Scale设为0.4;最后,在波形界面单击鼠标右键,选择ZoomFull,即可观察到RTL级仿真波形。五、实验结果:结果1:Simulink仿真结果结果2:RTL级仿真结果:Simulink仿真波形与RTL级仿真波形应相同,且结果为16000Hz的正弦波被滤去,8000Hz的正弦波得以保留。六、实验结果讨论与分析FIR滤波器具有直接型、级联型和频率抽样型三种基本结构[14]。由于在DSPBuilder模型设计中采用了直接型结构,若一个FIR滤波器具有线性相位,且其单位冲击响应h(n)全为实数,则h(n)具有如下特性:当N为偶数时,h(n)=h(M-n);当N为奇数时,h(n)=-h(M-n)。所谓线性相位特性是指滤波器对不同频率的正弦波产生的相移和正弦波的频率成直线关系。FIR滤波器的设计方法主要有窗函数法、频率抽样法和切比雪夫逼近法三种。其中窗函数法是设计FIR滤波器最基本的方法。在本次实验设计中,采用的方法也是窗函数法,窗函数设计的基本思想是要选择一种合适的理想频率选择性滤波器,然后将它的冲击响应截短以获得一个具有线性相位和因果的FIR滤波器。因此这种方法的关键是选取某种好的窗函数和一种理想滤波器,在滤波器性能参数给定的情况下,应尽量选择主瓣尽可能窄,边瓣峰值进可能小的窗函数。观察实验结果我们可以得出,由于两个结果是一致的,我们不妨拿RTL级仿真结果考察。由连接顺序我们可以知道,输出波形中,第一个和第四个是两个标准的正弦波。设置时,我们设的频率是不同的,第一个是8000Hz,第四个是16000Hz。第三个波形则是两个波形合成后的波形;第二个波形则是第三个波形经过铝板后的结果。观察第二个波形,发现其波形相对于第三个波形来说,已经很大程度上的接近于正弦波了。这也就是说我吗所设计的滤波器有一定的滤波效果。