使用窗函数设计FIR滤波器
2017-05-01 12:09
183 查看
转自http://blog.csdn.net/zhoufan900428/article/details/8969470
目录(?)[+]
设计参数
理想FIR低通滤波器
窗函数
用窗函数实现一个FIR滤波器
5写在最后的话
![](http://img.blog.csdn.net/20130524125320444)
范围
![](http://img.blog.csdn.net/20130524125634621)
称为通带,对于允许误差而言,
![](http://img.blog.csdn.net/20130524125639109)
这个范围,称为通带纹波( 指在滤波器的频响中通带的最大幅值和最小幅值之间的差值)。同样的,对于范围
![](http://img.blog.csdn.net/20130524125920195)
则是阻带,
![](http://img.blog.csdn.net/20130524125923276)
这个范围,称为阻带纹波。中间的黑色部分是过度带。角频率
![](http://img.blog.csdn.net/20130524130437875)
称为通带边缘频率,
![](http://img.blog.csdn.net/20130524130440530)
角频率则被称为阻带起始频率。
通常的滤波器的设计,都会指明这几个参数,最后设计的滤波器,必须满足这几个参数。当然,这里举得例子是低通滤波器的,高通或者带通,就与之相反了。
![](http://img.blog.csdn.net/20130524131018692)
这里的
![](http://img.blog.csdn.net/20130524134244409)
,表示截止频率。
![](http://img.blog.csdn.net/20170501120036232?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcWluZ2tvbmd5ZXl1ZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
先由理想的滤波器出发,求其理想滤波器的单位冲击响应。得到了单位冲击响应,也就得到了滤波器的系数。这样,我们就设计出了一个理想的滤波器。这是一个完美的想法,那么开始动手吧,寻找他的单位冲击响应。运用离散时间的傅里叶逆变换,有如下的式子。
![](http://img.blog.csdn.net/20140414095259390)
由此,我们得到了一个单位冲击响应的表达式(sinc是辛格函数),到这我们就可以设计出一个理想的滤波器了吗?好吧,让我们再确认一遍。第一,这个式子是离散的。对于单位冲击响应,本来就应该是离散的,没有错,很好,我们距离理想滤波器又近了一步。第二,这个式子所求出的单位冲击响应的个数,很不幸!个数是无限的。到这里,我们基本可以确定了,理想滤波器是实现不了的。
虽然理想滤波器是实现不了的,但是我们可以退一步,从无限的理想滤波器的单位冲击响应中,在选择一部分冲击响应,构成一个不太理想的,但又达到一定标准的滤波器。我们只能“将就”着使用这个不太理想的滤波器,那么接下来还有一个问题,我们要如何从无限的数列中选择出有限的一部分,从而达到我们的设计要求。
![](http://img.blog.csdn.net/20130524133912980)
这个式子确实可以帮助我们选择一部分有限的数列。而这个式子,被称为矩形窗。可以看出,N越大,性能越街进理想滤波器。这里N称为窗函数的长度。
这就是我们选定的窗口,然后我们把窗口函数加上,也就是加窗!其实也就一个乘法,如下所示。
![](http://img.blog.csdn.net/20130524135139333)
这样,也就完成了一个加窗。
但是,在实际的实践过程中,很少用矩形窗的。其原因是,矩形窗的阻带衰减不够,仅仅只有21[dB]。于是,各种各样的窗口就被提出了。各有各的特点,在我们所学的初步的设计中,我们就仅仅看阻带衰减就够了。各种窗函数的性能如下。
================================================
窗函数 过渡带大小 阻带衰减
================================================
矩形窗 1.8π/N 21[dB]
汉宁窗 6.2π/N 44[dB]
汉明窗 6.6π/N 53[dB]
布莱克曼窗 11π/N 74[dB]
1.根据设计的规格,参数要求,我们选择一个适合的窗函数。这里主要我们还是看阻带衰减,阻带衰减要大于给定的值。一般,若没有给定阻带衰减,我们则需要通过通带纹波和阻带纹波去求,如下。
![](http://img.blog.csdn.net/20130524140504125)
2.根据要求的通带边缘频率和阻带起始频率,计算过度区的大小,从而计算出窗函数的长度。
3.最后,根据窗函数和理想滤波器的单位冲击响应,计算出我们所需要的滤波器的单位冲击响应。
现在,我们来实战一下,假设我们需要设计如下滤波器。
![](http://img.blog.csdn.net/20130524141050538)
规格中,没有给定阻带衰减,我们只能自己计算。
![](http://img.blog.csdn.net/20130524141253400)
这里,阻带衰减为40.8[dB],我们选择的窗的阻带衰减不能比这个小,这里其实汉宁窗就可以做到。但我还是选择用汉明窗去做。然后,计算窗长度。
![](http://img.blog.csdn.net/20130524141256994)
窗长度有了,计算单位冲击响应吧。
![](http://img.blog.csdn.net/20130524141300384)
这样,我们就得到了一个FIR滤波器。下面是我们计算出来的这个滤波器的单位冲击响应。
![](http://img.blog.csdn.net/20130524141650455)
但是,滤波器真的可以实现么?真的可以设计出这样一个滤波器么?
我觉得要拿着这个单位脉冲响应结果,去实际计算一下,才能发现,这样的滤波器是实现不了的!拿教科书上的话来说,这个滤波器是非因果的!
这个问题的解决方法,和窗函数的FIR设计代码的实现在下一节[数字信号处理]单位冲击响应的频响与FIR的实现代码(C语言)。
目录(?)[+]
设计参数
理想FIR低通滤波器
窗函数
用窗函数实现一个FIR滤波器
5写在最后的话
1.设计参数
首先,先明白几个概念。通带,阻带,过渡带,通带纹波和阻带纹波分别是什么?看下图,范围
称为通带,对于允许误差而言,
这个范围,称为通带纹波( 指在滤波器的频响中通带的最大幅值和最小幅值之间的差值)。同样的,对于范围
则是阻带,
这个范围,称为阻带纹波。中间的黑色部分是过度带。角频率
称为通带边缘频率,
角频率则被称为阻带起始频率。
通常的滤波器的设计,都会指明这几个参数,最后设计的滤波器,必须满足这几个参数。当然,这里举得例子是低通滤波器的,高通或者带通,就与之相反了。
2.理想FIR低通滤波器
首先,先由理想低通滤波器为出发点开始考虑。理想低通滤波器的频响如下所示这里的
,表示截止频率。
先由理想的滤波器出发,求其理想滤波器的单位冲击响应。得到了单位冲击响应,也就得到了滤波器的系数。这样,我们就设计出了一个理想的滤波器。这是一个完美的想法,那么开始动手吧,寻找他的单位冲击响应。运用离散时间的傅里叶逆变换,有如下的式子。
由此,我们得到了一个单位冲击响应的表达式(sinc是辛格函数),到这我们就可以设计出一个理想的滤波器了吗?好吧,让我们再确认一遍。第一,这个式子是离散的。对于单位冲击响应,本来就应该是离散的,没有错,很好,我们距离理想滤波器又近了一步。第二,这个式子所求出的单位冲击响应的个数,很不幸!个数是无限的。到这里,我们基本可以确定了,理想滤波器是实现不了的。
虽然理想滤波器是实现不了的,但是我们可以退一步,从无限的理想滤波器的单位冲击响应中,在选择一部分冲击响应,构成一个不太理想的,但又达到一定标准的滤波器。我们只能“将就”着使用这个不太理想的滤波器,那么接下来还有一个问题,我们要如何从无限的数列中选择出有限的一部分,从而达到我们的设计要求。
3.窗函数
首先,我们先考虑最简单的情况。对于理想单位冲击响应而言,其形状大概和一个高斯分布很像(当然,只是很像,n=0时候,单位冲击响应的值最大,由两边慢慢减少。当然,可能也出现负值。)!所以,我们为了能使得滤波器的性能接近理想滤波器,那么,我们选择其最主要的部分,也就是,值较大的部分。其余部分则放弃。根据之前的叙述,我们可以使用如下式子表示。这个式子确实可以帮助我们选择一部分有限的数列。而这个式子,被称为矩形窗。可以看出,N越大,性能越街进理想滤波器。这里N称为窗函数的长度。
这就是我们选定的窗口,然后我们把窗口函数加上,也就是加窗!其实也就一个乘法,如下所示。
这样,也就完成了一个加窗。
但是,在实际的实践过程中,很少用矩形窗的。其原因是,矩形窗的阻带衰减不够,仅仅只有21[dB]。于是,各种各样的窗口就被提出了。各有各的特点,在我们所学的初步的设计中,我们就仅仅看阻带衰减就够了。各种窗函数的性能如下。
================================================
窗函数 过渡带大小 阻带衰减
================================================
矩形窗 1.8π/N 21[dB]
汉宁窗 6.2π/N 44[dB]
汉明窗 6.6π/N 53[dB]
布莱克曼窗 11π/N 74[dB]
4.用窗函数实现一个FIR滤波器
以上说了很多有关于窗函数的原理,现在来整理一下设计的步骤。1.根据设计的规格,参数要求,我们选择一个适合的窗函数。这里主要我们还是看阻带衰减,阻带衰减要大于给定的值。一般,若没有给定阻带衰减,我们则需要通过通带纹波和阻带纹波去求,如下。
2.根据要求的通带边缘频率和阻带起始频率,计算过度区的大小,从而计算出窗函数的长度。
3.最后,根据窗函数和理想滤波器的单位冲击响应,计算出我们所需要的滤波器的单位冲击响应。
现在,我们来实战一下,假设我们需要设计如下滤波器。
规格中,没有给定阻带衰减,我们只能自己计算。
这里,阻带衰减为40.8[dB],我们选择的窗的阻带衰减不能比这个小,这里其实汉宁窗就可以做到。但我还是选择用汉明窗去做。然后,计算窗长度。
窗长度有了,计算单位冲击响应吧。
这样,我们就得到了一个FIR滤波器。下面是我们计算出来的这个滤波器的单位冲击响应。
5.写在最后的话
到此,我们“设计”出了一个滤波器,我们也顺利的得出了它的单位脉冲响应。但是,滤波器真的可以实现么?真的可以设计出这样一个滤波器么?
我觉得要拿着这个单位脉冲响应结果,去实际计算一下,才能发现,这样的滤波器是实现不了的!拿教科书上的话来说,这个滤波器是非因果的!
这个问题的解决方法,和窗函数的FIR设计代码的实现在下一节[数字信号处理]单位冲击响应的频响与FIR的实现代码(C语言)。
相关文章推荐
- 使用窗函数设计FIR滤波器
- 阻带窗函数[数字信号处理]使用窗函数设计FIR滤波器
- [数字信号处理]使用窗函数设计FIR滤波器
- FIR滤波器设计中的窗函数
- 最佳FIR滤波器设计-使用remezord,remez
- 语音信号滤波去噪——使用FLATTOPWIN设计的FIR滤波器
- [转贴] 不要以为使用了模式就是好设计
- 使用设计模式改善程序结构(2)
- [转贴] 不要以为使用了模式就是好设计
- ThreadLocal的设计与使用
- 一些面向对象的设计法则-法则1:优先使用(对象)组合,而非(类)继承
- Jexi设计 (8) 使用SWT创建GUI
- ThreadLocal的设计与使用
- 使用oo设计聊天室
- JUnit的框架设计及其使用的设计模式
- 使用设计模式改善程序结构
- 使用Publish/Subscribe 设计模式达到对象间数据同步
- 面向最终用户的Web应用的兼容性设计:为在Windows(XP 2000 98)下屏幕分辨率为1024*768或800*600使用IE浏览器(IE6, IE5)的中国用户设计
- 使用设计模式构建通用数据库访问类
- 让用户使用我设计的网页字体