原创 基于Simulink的FIR滤波器设计与仿真--初识matlab

2012-10-26 16:11 11977 14 20 分类: 测试测量

 

一直对信号分析与处理有着比较浓厚的兴趣,只可惜数学水平挺一般,难以将兴趣发展为job,因此就蜻蜓点水了。

公司里的几乎人人都会simulink,而我是十足的门外汉。看别人用得行云流水总是挺眼馋的,于是也班门弄斧试试。

实现的功能是将三个幅度都为1初相位0,频率分别为10Hz20Hz30Hz的正弦信号叠加在一起,将混叠后的信号通过一个带通滤波器,只剩下20Hz的正弦信号,用示波器显示滤波前与滤波后的效果。

首先从matlab主界面启动simulinknew一个model,找到signal procesing blockset->filter designs,添加一个FDATool模块,如图所示:

20121026145911733001.gif

 然后找在simulink->sourcesmodel中添加三个sine wave模块,如下图所示:

20121026160504534002.jpg

 

接着在simulink->math operations下添加一个add模块,如图:

20121026160513960003.jpg

最后再simulink->sinks下添加两个scope模块:

20121026160536378004.jpg

 

 

 

 

 

 

 

添加完成后,我们先要做必要的参数设置,对sine wave模块的设置方法是双击该模块,10Hz信号发生模块参数设置为如下图所示:

20121026160548953005.jpg

这里频率是以归一化角频率出现,我们应该设置的值为w=f*2*pi。还有采样周期我设置的是0.001s,远高于奈奎斯特采样率,理论只需大于60Hz,我这样做的原因是使后面的波形显示更平滑,因为后面滤波器的显示输出采用的是零阶保持输出,采样过低导致显示效果很差。

另外两个sine wave模块的设置类似。

 

然后还要设置add模块的参数。因为默认只有两个输入端,我这有三个。双击add模块,将++改为+++即可。设置如下:

20121026160603296006.jpg

 

 

 

 

 

然后就是scope模块的设置,默认只有一个输入,我将一个设置为两个输入,对比滤波前后的信号波形,另一个设置为三输入,分别检测三个信号源。

设置scope的方法是先双击,然后找到参数设置按钮,如下所示:

 

20121026160613339007.jpg

点击参数标签,如下:

20121026160631277008.jpg

将里面number of axes设置成需要的输入通道数目即可。

 

接下来就是滤波器核心模块设置了,双击FDATool模块,配置成为如下:

20121026160708381009.jpg

这里面有很多参数我现在还没搞懂是什么作用,比如那个Density Factor,不过先放一边吧。注意采样频率设置为1KHz,阻带衰减我都只设置为20分贝,因为是仿真嘛,实际肯定是不够的。让后点击DesignFilter生成滤波器,发现滤波器阶数是216,高得挺吓人的啦,都知道FIR滤波器阶数比IIR要高,但如此高还是让我惊讶得厉害,认真想想,由于我是从10Hz~30Hz中间滤出20Hz,滤波器肯定是很痛苦的嘛。况且我的采样率设置得那么高,所以216阶也就不足为怪了。

 

 

最后的model线路连接如下:

20121026160721544010.jpg

仿真前最后还有一步,就是设置simulink的求解器,在菜单中选择simulation->configuration parameters,如下图:

20121026160738479011.jpg

仿真时间设置为2s就够了,那个solver选项选为discrete(XXXX)一项,虽说是仿真离散系统,但具体为甚么要这样我还不清楚。

 

完了就可以开始仿真了,仿真的结果如下:

20121026160758384012.jpg

第一个是滤波器输出信号,第二个是混叠信号。

可以看到,滤波器从混叠信号中还原出了20Hz的信号,效果还挺不错的,呵呵!

 

这里有个小细节,有人可能会问为啥滤波器输出信号开始有一段很不规整?我想是因为滤波器的初始状态值不确定(软件可能设为0吧,反正我是不知道),由于是216阶的,那么滤波器必须要采样216个数据后才能输出稳定的值。

 

 

文章评论6条评论)

登录后参与讨论

用户377235 2015-8-14 16:58

不错,受教了

用户377235 2015-1-11 14:32

一万个赞

用户286469 2013-8-26 16:43

归一化角频率就是模拟角频率呗?那怎么设置呢?

用户377235 2013-8-26 16:42

归一化角频率是模拟角频率呗?怎么设?

用户444719 2013-8-15 19:15

没有SignalBlockset怎么办

用户437545 2013-5-15 18:54

看懂了,做做试试看!!!
相关推荐阅读
用户423038 2012-12-26 09:35
利用序列的DTFT来分析被采样模拟信号的频谱----我的一点理解
       假设被采样的模拟信号为x(t)=sin(Ω0t+∅),其周期为T0,频率 为f0;        采样周期为Ts,  则采样后得到的序列为x(n)=sin(w0n+∅), ...
用户423038 2012-12-26 09:34
时域抽取基2FFT算法C程序注解
/*********************************************************************    简介:此程序包是通用的快速傅里叶变换C语...
用户423038 2012-12-26 09:33
由DFT来分析模拟信号频谱的过程之我的理解
   所谓信号的频谱,就是信号的傅里叶变换,就是信号的频域特性。           我们知道,连续时间信号的傅里叶变换所得信号的频谱函数是模 拟角频率Ω的连续函数;而对连续时间信号...
用户423038 2012-12-26 09:33
因果实序列可以完全由其奇分量或偶分量恢复
        首先,任意实序列都可以分解成奇序列和偶序列之和。 即x[n]=xe[n]+xo[n],其中,xe[n]=(x[n]+x[-n])/2,xo[n]=(x[n]-x[-n])/2。...
用户423038 2012-12-26 09:31
(*(volatile unsigned long *)用法
           对于不同的计算机体系结构,设备可能是端口映射,也可能是内存映射的。如果系统结构支持独立的IO地址空间,并且是端口映射,就必须使用汇编语...
用户423038 2012-12-26 09:29
傅里叶变换的物理意义
        傅里叶变换的实质是将一个信号分离为无穷多多正弦/复指数信号的加成,也就是说,把信号变成正弦信号相加的形式——既然是无穷多个信号相加,那对于非周期信号来说,每个信号的加权应该都是零—...
我要评论
6
14
关闭 站长推荐上一条 /2 下一条