基于模型设计的FPGA开发与实现:滤波器设计与实现(一)在Matlab中高效设计滤波器

来源:互联网 发布:ubuntu怎么切换到root 编辑:程序博客网 时间:2024/04/27 14:38
 

http://blog.sina.com.cn/McCrocodile

如何快速高效的设计数字滤波器时本章节的重点。

数字滤波器通常用于改变信号的时域或者频域的某个特性。最简单的数字滤波器时LTI先行时间不变滤波器。通常分为有限冲击相应FIR和无限冲击相应IIR。

传统的模拟滤波器是借助RLC和运算放大器实现,随着DSP和FPGA的出现,数字滤波器借助其优势在某些领域正在逐渐取代模拟滤波器。使用拉普拉斯域分析的模拟原型方法只适用于IIR设计,FIR设计需要新的计算算法。此处主要介绍基于Matlab的设计与实现,随后还探讨基于FPGA的实现和改进。

这里首先来回顾下滤波器的理论知识,

屏幕剪辑的捕获时间: 2011/8/22 22:09

屏幕剪辑的捕获时间: 2011/8/22 22:10

下面主要介绍基于GUI和Fdesign的方式设计滤波器,和基本的定点化功能以及HDL代码生成功能的使用。由于介绍命令行设计滤波器的资料比较多,这里就不错介绍。

滤波器设计之GUI

2011年8月22日

21:32

使用GUI设计的方式有两种:FDATool 和filterbuilder。

FDATool

设计实例:

这儿以设计一个低通滤波器分离两个信号为例,介绍使用fdatool设计FIR滤波器。

要求:输入信号x1+x2,x1为100Hz正弦信号,x2为300Hz正弦信号,采样率为3KHz

期望输出为x1.

屏幕剪辑的捕获时间: 2011/8/22 22:38

如上图所示为使用Equiripple等纹波法设计一个直接型FIR滤波器,Fs为采样率为3KHz,Fpass通带最大频率110Hz,Fstop阻带最小频率为230Hz,Apass通带纹波0.1dB,Astop阻带衰减60dB。[通俗来讲可以认为是在0~230Hz,通带的纹波不会超过0.1dB,阻带从230Hz起最小衰减不小于60dB].下面是帮助文档中的描述,详细查阅帮助和其他参考资料了。

屏幕剪辑的捕获时间: 2011/8/22 22:52

观察设计的滤波器的性能:

这儿采用两种方法来测试,首先使用Matlab的脚本测试。

1)导出滤波器系数到Matlab Worksapce中,File-->Export….可以选择导出系数或者对象,此处我选择导出为对象,

fs=3e3;

t=0:1/fs:0.1;

x1=sin(100*2*pi.*t);

x2=sin(300*2*pi.*t);

x=x1+x2;%input Signal

y=filter(Hd_firlp,x);%滤波

%观察结构

figure;subplot(4,1,1);plot(t,x1);title('100 Hz')

subplot(4,1,2);plot(t,x2);title('300 Hz')

subplot(4,1,3);plot(t,x);title('Input signal')

subplot(4,1,4);plot(t,y);title('Filter output')

屏幕剪辑的捕获时间: 2011/8/22 23:15

有图可以分析FIR滤波器的性质,可以调整滤波器设计的参数观察结构的差异。

2)使用Simulink模型测试结构,有时候是非常必要的,也是MBD-FPGA数字信号处理中我所建议的。

在File-->Export to Simulink对话框中选择导出模块类型。

屏幕剪辑的捕获时间: 2011/8/22 23:25

屏幕剪辑的捕获时间: 2011/8/22 23:25

等纹波法经常用于设计FIR,甚至可以用来设计希尔伯特滤波器和积分器。选择窗口中左侧和上边的不同菜单,熟悉其功能,尝试修改参数,观察对滤波的影响,更多地东西你可以查阅帮助文档。

FilterBuilder

使用命令行:filterbuilder 启动GUI,如下图,之后选择需要设计的滤波器类型。

屏幕剪辑的捕获时间: 2011/8/28 20:45

同样以上面的例子为例,设计一个滤波器,下面的图可以看出来,里面的选项大同小异,所以使用也是大致差不多,喜欢用哪个就用哪个就用那个了。

屏幕剪辑的捕获时间: 2011/8/28 20:47

同样的方式也可以用于设计IIR滤波器,总结下这种滤波器的设计方法基本步骤为:

A、选择一个设计方法

B、尝试(猜测)参数,然后设计滤波器

C、观察滤波器的响应是否符合要求

D、测试知道满足要求

你尝试过上面所有的方法的吗?如果还没有抓紧,只有尝试你才会真正的明白。

滤波器设计之Fdesign

2011年8月22日

21:33

首先说说Matlab字r2008a之后面向对象的功能变得越来越强大,尤其是在R2011a中的DSP System ToolBox ,Communication system Toolbox等系统级的工具箱的整合和出现,面向对象编程方式变得更重要了。如设计DUC和DDC等都可以使用,也是MBD相System Design发展的一个重要体现吧。

fdesign是一个filter design object 滤波器设计对象,使用fdesign作为一种比较新的设计滤波方法。滤波器实现的对象主要有三种:

dfilt:单速滤波器(本小节主要涉及到的)

mfilt:多速率滤波器(后面会介绍到)

adaptfilt:自适应滤波器(后面会介绍到)

上一小节最后部分总结了基于GUI的设计方法的基本步骤,这些步骤对于基于传统的命令行方式设计的同样也使用。那么问题就出来了:对设计的权衡是低效的。Not efficient for assessing design trade-offs效率就是基于fdesign设计方法的优势。

面向对象的滤波器设计方法的基本步骤:

1、创建fdesign对象,设置设计的需求

2、找出满足需求的设计方法

3、使用各种可能的方法设计滤波器,并比较选择。

4、分析权衡各设计之间的性能资源:滤波器阶数与阻带衰减和通带波纹,滤波器阶数与过渡带宽度,算法延时和计算复杂度。

下面还是以一个例子简要说明基于fdesign的单速滤波器设计,完成目标还是分离上一节中的两个信号:

%使用fdesign方式设计简单单速滤波器

d = fdesign.lowpass %创建一个低通滤波器对象

%% 设置设计要求

d.Fpass=100/3e3;

d.Fstop=250/3e3;

d.Apass=1;

d.Astop=60

% d= fdesign.lowpass('Fp,Fst,Ap,Ast',100,250,1,60,3e3);%另外的方式1

% d = fdesign.lowpass(0.0333,0.0833,1,60);%另外的方式2

%% 查找满足要求的方法

designmethods(d)

% designmethods(d,'fir')

%% 设计滤波器

hd = design(d,'equiripple');

%% 分析滤波器

fvtool(hd);

cost(hd)% 计算开销

info(hd)

cost(hd)

ans =

Number of Multipliers : 86

Number of Adders : 85

Number of States : 85

Multiplications per Input Sample : 86

Additions per Input Sample : 85

上面采用了等纹波法设计了滤波器,还以采用其他的方式设计并比较观察。

%% 仿真测试

fs=3e3;

t=0:1/fs:0.1;

x1=sin(100*2*pi.*t);

x2=sin(300*2*pi.*t);

x=x1+x2;%input Signal

y=filter(hd,x);%滤波

plot(t,y);title('Filter output')

%% 生成Simulink 模块

realizemdl(hd)

同样生成Simulik模块可以加入Simulink模型中仿真测试。具体的用法请查阅帮助文档。

屏幕剪辑的捕获时间: 2011/8/25 23:48

这儿由于还没有定点化,所以给HDL代码生成的部分放到后面一小节介绍。下面是Mathworks给出的资料图。

屏幕剪辑的捕获时间: 2011/8/30 21:08

如果你想深入了解基于fdesign的滤波器设计,建议你深入阅读帮助文档,并尝试里面提供的Demo,这儿仅仅作为简单的入门介绍。尝试之后你才会理解到功能的强大和高效省事。

原创粉丝点击