一直对信号分析与处理有着比较浓厚的兴趣,只可惜数学水平挺一般,难以将兴趣发展为job,因此就蜻蜓点水了。
公司里的几乎人人都会simulink,而我是十足的门外汉。看别人用得行云流水总是挺眼馋的,于是也班门弄斧试试。
实现的功能是将三个幅度都为1初相位0,频率分别为10Hz、20Hz、30Hz的正弦信号叠加在一起,将混叠后的信号通过一个带通滤波器,只剩下20Hz的正弦信号,用示波器显示滤波前与滤波后的效果。
首先从matlab主界面启动simulink,new一个model,找到signal procesing blockset->filter designs,添加一个FDATool模块,如图所示:
然后找在simulink->sources往model中添加三个sine wave模块,如下图所示:
接着在simulink->math operations下添加一个add模块,如图:
最后再simulink->sinks下添加两个scope模块:
添加完成后,我们先要做必要的参数设置,对sine wave模块的设置方法是双击该模块,10Hz信号发生模块参数设置为如下图所示:
这里频率是以归一化角频率出现,我们应该设置的值为w=f*2*pi。还有采样周期我设置的是0.001s,远高于奈奎斯特采样率,理论只需大于60Hz,我这样做的原因是使后面的波形显示更平滑,因为后面滤波器的显示输出采用的是零阶保持输出,采样过低导致显示效果很差。
另外两个sine wave模块的设置类似。
然后还要设置add模块的参数。因为默认只有两个输入端,我这有三个。双击add模块,将++改为+++即可。设置如下:
然后就是scope模块的设置,默认只有一个输入,我将一个设置为两个输入,对比滤波前后的信号波形,另一个设置为三输入,分别检测三个信号源。
设置scope的方法是先双击,然后找到参数设置按钮,如下所示:
点击参数标签,如下:
将里面number of axes设置成需要的输入通道数目即可。
接下来就是滤波器核心模块设置了,双击FDATool模块,配置成为如下:
这里面有很多参数我现在还没搞懂是什么作用,比如那个Density Factor,不过先放一边吧。注意采样频率设置为1KHz,阻带衰减我都只设置为20分贝,因为是仿真嘛,实际肯定是不够的。让后点击DesignFilter生成滤波器,发现滤波器阶数是216,高得挺吓人的啦,都知道FIR滤波器阶数比IIR要高,但如此高还是让我惊讶得厉害,认真想想,由于我是从10Hz~30Hz中间滤出20Hz,滤波器肯定是很痛苦的嘛。况且我的采样率设置得那么高,所以216阶也就不足为怪了。
最后的model线路连接如下:
仿真前最后还有一步,就是设置simulink的求解器,在菜单中选择simulation->configuration parameters,如下图:
仿真时间设置为2s就够了,那个solver选项选为discrete(XXXX)一项,虽说是仿真离散系统,但具体为甚么要这样我还不清楚。
完了就可以开始仿真了,仿真的结果如下:
第一个是滤波器输出信号,第二个是混叠信号。
可以看到,滤波器从混叠信号中还原出了20Hz的信号,效果还挺不错的,呵呵!
这里有个小细节,有人可能会问为啥滤波器输出信号开始有一段很不规整?我想是因为滤波器的初始状态值不确定(软件可能设为0吧,反正我是不知道),由于是216阶的,那么滤波器必须要采样216个数据后才能输出稳定的值。
用户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
用户437545 2013-5-15 18:54