1、实验二 FIR 滤波器的 DSP 实验一、实验目的1. 了解 MATLAB 的 FIR 滤波器设计方法与编程; 2. 掌握 FIR 滤波器算法基本原理和 C 语言的编程方法;二、实验内容FIR 滤波器设计流程为,根据给出的滤波器设计(通带带宽、阻带衰减、相位要求)要求,在 Matlab 环境下仿真得到滤波器系数,得到了滤波器系数后在 CCS 下编程设计 DSP的 FIR 滤波器。1.使用 Matlab 中的 FDAtool 设计 FIR 滤波器MATLAB 工具箱中的 FDATool 是通过指定滤波器的性能指标来快速设计数字滤波器, 它是一种交互式工具,只要在 FDATool 工具里选择相应的
2、滤波器设计方法,并填入需要的技术指标,如通带阻带截止频率、阶数等,即可生成所需的滤波器。并可以在界面上可以看到幅频相频、零极点分布等图形。下面以低通 FIR 滤波器为例,介绍它的使用过程。1)在 Matlab 的 Start 菜单中选择 Toolboxes - Filter Design - Filter Design t=(0:200)/Fs;s=sin(2*pi*t*1000)+sin(2*pi*t*3000) +1/10*sin(2*pi*t*10000);subplot(1,1,1);plot(t,s);axis(0 0.005 -2 2);grid产生了 1000Hz 和 2000H
3、z 的混叠波,并且变量 Fs、t、s 将显示在 workspace 列表中。2)在FDATool 的界面里选择FileExport to SPTool,然后在将导入SPTool的滤波器命名为filter点击 Apply,这样,设计的滤波器就导入了 SPTool 中。3)在弹出的SPTool 主界面里点击菜单FileImport 将信号s 导入,在Importto SPTool 界面里单击s 再点右边的“”将s 导入 同样的方法将采样频率Fs导入在并取名为“input”后单击“OK”。input 数据录入4)在SPTool 界面选中 “input”和“filter”还有“mtlbse ”后单击“
4、Apply”,将从滤波器输出的信号命名为output,观察输入输出的波形图可以单击“View”; 观察频谱图单击“Create”然后在“method ”栏里选择FFT 。A:输入波形inputB:输出波形 outputC:输出频谱5)通过观察输入输出的波形图及频谱图验证所设计的滤波器的功能。可以看出2000HZ 的频率分量被滤,所设计的滤波器实现了低通滤波功能。2.参阅 FIR 基本理论及 C 语言编程方法,研读、分析实验指导书中的代码;3. 双击 ,启动 CCS 的配置程序选项,选择“C5502 Simulator ”;4. 启动 CCS,打开实验工程文件,再编译并装载程序;5. 仿真波形输
5、入与输出波形比较输入信号频谱图输出信号频谱图4.修改代码:滤波器设计要求:线性相位低通滤波器,模拟信号通带为 01kHz,阻带衰减在 5kHz 处为-60dB。采样率为 20kHz。5.通过代码修改、仿真,理解定点运算和浮点运算相比的优缺点。6.通过仿真波形的分析、理解滤波器阶数与滤波器延时以及滤波器的阻带衰减之间的关系。三、实验报告要求1.将实验过程的每一个步骤作截图和必要文字说明。附:代码1.c 文件#include #include #define order 21 #define N 128 #define pi 3.14159265358979323846float firorder
6、 = -0.001806524723551,-0.003360662865095,2.461716477557e-18, 0.011364134676,0.01497353758673, -0.01319873582525, -0.05446122716448, -0.03301236910014,0.1029885989805, 0.288399704569, 0.3762270877324, 0.288399704569,0.1029885989805, -0.03301236910014, -0.05446122716448, -0.01319873582525,0.0149735375
7、8673, 0.011364134676,2.461716477557e-18,-0.003360662865095,-0.001806524723551;float s;int i,n;float inputN,outputN; int fs=8000; int f1=2000; int f2=1000; void wavein()for(n=0;nN;n+ )inputn= sin(2*pi*n*f2/fs)+sin(2*pi*n*f1/fs); void main() int p=0;n=0;wavein(); for(n=0;nN;n+ ) p=0;s=0;while(porder)
8、p+;outputn=s;2.FDAtool 生成的 FIR 滤波器/* Discrete-Time FIR Filter (real)* -* Filter Structure : Direct-Form FIR* Filter Length : 21* Stable : Yes* Linear Phase : Yes (Type 1)*/#include “tmwtypes.h“/* * Expected path to tmwtypes.h * E:Program FilesmatlabR2012bexternincludetmwtypes.h */const int BL = 21;c
9、onst real64_T B21 = -0.001806524723551,-0.003360662865095,2.461716477557e-18, 0.011364134676,0.01497353758673, -0.01319873582525, -0.05446122716448, -0.03301236910014,0.1029885989805, 0.288399704569, 0.3762270877324, 0.288399704569,0.1029885989805, -0.03301236910014, -0.05446122716448, -0.01319873582525,0.01497353758673, 0.011364134676,2.461716477557e-18,-0.003360662865095,-0.001806524723551;