如果对傅里叶已经很了解的可以直接跳到第二章,如有不明白的地方建议返回第一章寻找答案。谢谢阅读!希望本文可以帮助到你。

目录

  • 如果对傅里叶已经很了解的可以直接跳到第二章,如有不明白的地方建议返回第一章寻找答案。谢谢阅读!希望本文可以帮助到你。
  • 基础知识
    • 1. 傅里叶分析
      • 1.1 本节版权问题
      • 1.2 什么是频域
      • 1.3 傅里叶级数(Fourier Serie)的频谱
      • 1.4 傅里叶级数(Fourier Series)的相位谱
      • 1.5 傅里叶变换(Fourier Transformation)
      • 1.6 欧拉公式
      • 1.7 指数形式的傅里叶变换
    • 2. 低通滤波器
      • 2.1 版权问题
      • 2.2 基本指标
      • 2.3 理想低通滤波器设计
      • 2.4 窗函数
      • 2.5 用窗函数设计一个FIR滤波器
        • 2.5.1 步骤一
        • 2.5.2 步骤二
        • 2.5.3 步骤三
        • 2.5.4 理论实战
  • Matlab——用窗函数设计低通FIR滤波器
    • 1.设计步骤
      • 1.1 确定滤波器类型
      • 1.2 确定设计的滤波器的参数
  • 代码

基础知识

1. 傅里叶分析

注意本文中将sin和cos波形,都称为“正弦波”

1.1 本节版权问题

作 者:韩 昊

知 乎:Heinrich

微 博:@花生油工人

知乎专栏:与时间无关的故事

谨以此文献给大连海事大学的吴楠老师,柳晓鸣老师,王新年老师以及张晶泊老师。

1.2 什么是频域

从我们出生,我们看到的世界都以时间贯穿,股票的走势、人的身高、汽车的轨迹都会随着时间发生改变。这种以时间作为参照来观察动态世界的方法我们称其为时域分析。而我们也想当然的认为,世间万物都在随着时间不停的改变,并且永远不会静止下来。但如果我告诉你,用另一种方法来观察世界的话,你会发现世界是永恒不变的,你会不会觉得我疯了?我没有疯,这个静止的世界就叫做频域
先举一个公式上并非很恰当,但意义上再贴切不过的例子:
在你的理解中,一段音乐是什么呢?

这是我们对音乐最普遍的理解,一个随着时间变化的震动(波形上图也叫时域波形图)。但我相信对于乐器小能手们来说,音乐更直观的理解是这样的:

是的,其实这一段写到这里已经可以结束了。上图是音乐在时域的样子,而下图则是音乐在频域的样子。所以频域这一概念对大家都从不陌生,只是从来没意识到而已。
现在我们可以回过头来重新看看一开始那句痴人说梦般的话:世界是永恒的。
将以上两图简化:
时域:

频域:

在时域,我们观察到钢琴的琴弦一会上一会下的摆动,就如同一支股票的走势;而在频域,只有那一个永恒的音符。

所以

你眼中看似落叶纷飞变化无常的世界,实际只是躺在上帝怀中一份早已谱好的乐章。
抱歉,这不是一句鸡汤文,而是黑板上确凿的公式:傅里叶同学告诉我们,任何周期函数,都可以看作是不同振幅,不同相位正弦波的叠加。在第一个例子里我们可以理解为,利用对不同琴键不同力度,不同时间点的敲击,可以组合出任何一首乐曲。

而贯穿时域与频域的方法之一,就是传中说的傅里叶分析。傅里叶分析可分为傅里叶级数(Fourier Serie)和傅里叶变换(Fourier Transformation),我们从简单的开始谈起。

1.3 傅里叶级数(Fourier Serie)的频谱

还是举个栗子并且有图有真相才好理解。

如果我说我能用前面说的正弦曲线波叠加出一个带90度角的矩形波来,你会相信吗?你不会,就像当年的我一样。但是看看下图:

第一幅图是一个郁闷的正弦波cos(x)

第二幅图是2个卖萌的正弦波的叠加cos(x)+a.cos(3x)

第三幅图是4个发春的正弦波的叠加

第四幅图是10个便秘的正弦波的叠加

随着正弦波数量逐渐的增长,他们最终会叠加成一个标准的矩形,大家从中体会到了什么道理?

只要努力,弯的都能掰直!反之也可!!!

随着叠加的递增,所有正弦波中上升的部分逐渐让原本缓慢增加的曲线不断变陡,而所有正弦波中下降的部分又抵消了上升到最高处时继续上升的部分使其变为水平线。一个矩形就这么叠加而成了。但是要多少个正弦波叠加起来才能形成一个标准90度角的矩形波呢?不幸的告诉大家,答案是无穷多个。(上帝:我能让你们猜着我?)

不仅仅是矩形,你能想到的任何波形都是可以如此方法用正弦波叠加起来的。这是没
有接触过傅里叶分析的人在直觉上的第一个难点,但是一旦接受了这样的设定,游戏就开始有意思起来了。

还是上图的正弦波累加成矩形波,我们换一个角度来看看:


在这几幅图中,最前面黑色的线就是所有正弦波叠加而成的总和,也就是越来越接近矩形波的那个图形。而后面依不同颜色排列而成的正弦波就是组合为矩形波的各个分量。这些正弦波按照频率从低到高从前向后排列开来,而每一个波的振幅都是不同的。

一定有细心的读者发现了,每两个正弦波之间都还有一条直线,那并不是分割线,而是振幅为0的正弦波!也就是说,为了组成特殊的曲线,有些正弦波成分是不需要的。

这里,不同频率的正弦波我们成为频率分量。

好了,关键的地方来了!!

如果我们把第一个频率最低的频率分量看作“1”,我们就有了构建频域的最基本单元。

对于我们最常见的有理数轴,数字“1”就是有理数轴的基本单元。

时域的基本单元就是“1秒”,如果我们将一个角频率为ω0\omega_0ω0​的正弦波cos(ω0\omega_0ω0​t)看作基础,那么频域的基本单元就是ω0\omega_0ω0​。

有了“1”,还要有“0”才能构成世界,那么频域的“0”是什么呢?cos(0t)就是一个周期无限长的正弦波,也就是一条直线!所以在频域,0频率也被称为直流分量,在傅里叶级数的叠加中,它仅仅影响全部波形相对于数轴整体向上或是向下而不改变波的形状。 加点个人见解,直流分量的值也就是这条直线的大小,比作是将波形整个上移或下移多少,就是初中甚至小学的图形变换——移动。

接下来,让我们回到初中,回忆一下已经死去的八戒,啊不,已经死去的老师是怎么定义正弦波的吧。

正弦波就是一个圆周运动在一条直线上的投影。所以频域的基本单元也可以理解为一个始终在旋转的圆

画矩形波

三角波

锯齿波

波形


这是什么奇怪的东西?
这就是矩形波在频域的样子,是不是完全认不出来了?教科书一般就给到这里然后留给了读者无穷的遐想,以及无穷的吐槽,其实教科书只要补一张图就足够了:频域图像,也就是俗称的频谱,见下图

动图如下

上图显示了从时域到频域图形的变化

但是在讲相位谱之前,我们先回顾一下刚刚的这个例子究竟意味着什么。记得前面说过的那句“世界是静止的”吗?估计好多人对这句话都已经吐槽半天了。想象一下,世界上每一个看似混乱的表象,实际都是一条时间轴上不规则的曲线,但实际这些曲线都是由这些无穷无尽的正弦波组成。我们看似不规律的事情反而是规律的正弦波在时域上的投影,而正弦波又是一个旋转的圆在直线上的投影。那么你的脑海中会产生一个什么画面呢?

我们眼中的世界就像皮影戏的大幕布,幕布的后面有无数的齿轮,大齿轮带动小齿轮,小齿轮再带动更小的。在最外面的小齿轮上有一个小人——那就是我们自己。我们只看到这个小人毫无规律的在幕布前表演,却无法预测他下一步会去哪。而幕布后面的齿轮却永远一直那样不停的旋转,永不停歇。这样说来有些宿命论的感觉。说实话,这种对人生的描绘是我一个朋友在我们都是高中生的时候感叹的,当时想想似懂非懂,直到有一天我学到了傅里叶级数……

1.4 傅里叶级数(Fourier Series)的相位谱

上一章的关键词是:从侧面看。这一章的关键词是:从下面看。

在这一章最开始,我想先回答很多人的一个问题:傅里叶分析究竟是干什么用的?这段相对比较枯燥,已经知道了的同学可以直接跳到下一个分割线。

先说一个最直接的用途。无论听广播还是看电视,我们一定对一个词不陌生——频道。频道频道,就是频率的通道,不同的频道就是将不同的频率作为一个通道来进行信息传输。下面大家尝试一件事:

先在纸上画一个sin(x),不一定标准,意思差不多就行。不是很难吧。

好,接下去画一个sin(3x)+sin(5x)的图形。

别说标准不标准了,曲线什么时候上升什么时候下降你都不一定画的对吧?

好,画不出来不要紧,我把sin(3x)+sin(5x)的曲线给你,但是前提是你不知道这个曲线的方程式,现在需要你把sin(5x)给我从图里拿出去,看看剩下的是什么。这基本是不可能做到的。

但是在频域呢?则简单的很,无非就是几条竖线而已。

所以很多在时域看似不可能做到的数学操作,在频域相反很容易。这就是需要傅里叶变换的地方。尤其是从某条曲线中去除一些特定的频率成分,这在工程上称为滤波,是信号处理最重要的概念之一,只有在频域才能轻松的做到。

再说一个更重要,但是稍微复杂一点的用途——求解微分方程。(这段有点难度,看不懂的可以直接跳过这段)微分方程的重要性不用我过多介绍了。各行各业都用的到。但是求解微分方程却是一件相当麻烦的事情。因为除了要计算加减乘除,还要计算微分积分。而傅里叶变换则可以让微分和积分在频域中变为乘法和除法,大学数学瞬间变小学算术有没有。

傅里叶分析当然还有其他更重要的用途,我们随着讲随着提。

下面我们继续说相位谱:

通过时域到频域的变换,我们得到了一个从侧面看的频谱,但是这个频谱并没有包含时域中全部的信息。因为频谱只代表每一个对应的正弦波的振幅是多少,而没有提到相位。基础的正弦波A.sin(wt+θ)中,振幅,频率,相位缺一不可,不同相位决定了波的位置,所以对于频域分析,仅仅有频谱(振幅谱)是不够的,我们还需要一个相位谱。
那么这个相位谱在哪呢?我们看下图,这次为了避免图片太混论,我们用7个波叠加的图。

鉴于正弦波是周期的,我们需要设定一个用来标记正弦波位置的东西。在图中就是那些小红点。小红点是距离频率轴最近的波峰,而这个波峰所处的位置离频率轴有多远呢?
为了看的更清楚,我们将红色的点投影到下平面,投影点我们用粉色点来表示。当然,这些粉色的点只标注了波峰距离频率轴的距离,并不是相位。

这里需要纠正一个概念:时间差并不是相位差。如果将全部周期看作2π\piπ或者360度的话,相位差则是时间差在一个周期中所占的比例。我们将时间差除周期再乘2π\piπ,就得到了相位差。

在完整的立体图中,我们将投影得到的时间差依次除以所在频率的周期,就得到了最下面的相位谱

所以,频谱是从侧面看,相位谱是从下面看。下次偷看女生裙底被发现的话,可以告诉她:“对不起,我只是想看看你的相位谱。”

注意到,相位谱中的相位除了0,就是π\piπ。因为cos(t+π\piπ)=-cos(t),所以实际上相位为π\piπ的波只是上下翻转了而已。对于周期方波的傅里叶级数,这样的相位谱已经是很简单的了。另外值得注意的是,由于cos(t+2π\piπ)=cos(t),所以相位差是周期的,π\piπ和3π\piπ,5π\piπ,7π\piπ都是相同的相位。人为定义相位谱的值域为(-π\piπ,π\piπ],所以图中的相位差均为π\piπ。

最后来一张大集合:

1.5 傅里叶变换(Fourier Transformation)

相信通过前面三章,大家对频域以及傅里叶级数都有了一个全新的认识。但是文章在一开始关于钢琴琴谱的例子我曾说过,这个栗子是一个公式错误,但是概念典型的例子。所谓的公式错误在哪里呢?

傅里叶级数的本质是将一个周期的信号分解成无限多分开的(离散的)正弦波,但是宇宙似乎并不是周期的。曾经在学数字信号处理的时候写过一首打油诗:

往昔连续非周期,
回忆周期不连续,
任你ZT、DFT,
还原不回去。
(请无视我渣一样的文学水平……)

在这个世界上,有的事情一期一会,永不再来,并且时间始终不曾停息地将那些刻骨铭心的往昔连续的标记在时间点上。但是这些事情往往又成为了我们格外宝贵的回忆,在我们大脑里隔一段时间就会周期性的蹦出来一下,可惜这些回忆都是零散的片段,往往只有最幸福的回忆,而平淡的回忆则逐渐被我们忘却。因为,往昔是一个连续的非周期信号,而回忆是一个周期离散信号

是否有一种数学工具将连续非周期信号变换为周期离散信号呢?抱歉,真没有。

比如傅里叶级数,在时域是一个周期且连续的函数,而在频域是一个非周期离散的函数。这句话比较绕嘴,实在看着费事可以干脆回忆第一章的图片。

而在我们接下去要讲的傅里叶变换,则是将一个时域非周期的连续信号,转换为一个在频域非周期的连续信号。

算了,还是上一张图方便大家理解吧:

或者我们也可以换一个角度理解:傅里叶变换实际上是对一个周期无限大的函数进行傅里叶变换。

所以说,钢琴谱其实并非一个连续的频谱,而是很多在时间上离散的频率,但是这样的一个贴切的比喻真的是很难找出第二个来了。

因此傅里叶变换在频域上就从离散谱变成了连续谱。那么连续谱是什么样子呢?

你见过大海么?

为了方便大家对比,我们这次从另一个角度来看频谱,还是傅里叶级数中用到最多的那幅图,我们从频率较高的方向看。

以上是离散谱,那么连续谱是什么样子呢?

尽情的发挥你的想象,想象这些离散的正弦波离得越来越近,逐渐变得连续……

直到变得像波涛起伏的大海:

很抱歉,为了能让这些波浪更清晰的看到,我没有选用正确的计算参数,而是选择了一些让图片更美观的参数,不然这图看起来就像屎一样了。

不过通过这样两幅图去比较,大家应该可以理解如何从离散谱变成了连续谱的了吧?原来离散谱的叠加,变成了连续谱的累积。所以在计算上也从求和符号变成了积分符号。

不过,这个故事还没有讲完,接下去,我保证让你看到一幅比上图更美丽壮观的图片,但是这里需要介绍到一个数学工具才能然故事继续,这个工具就是——

1.6 欧拉公式

虚数i这个概念大家在高中就接触过,但那时我们只知道它是-1的平方根,可是它真正的意义是什么呢?

这里有一条数轴,在数轴上有一个红色的线段,它的长度是1。当它乘以3的时候,它的长度发生了变化,变成了蓝色的线段,而当它乘以-1的时候,就变成了绿色的线段,或者说线段在数轴上围绕原点旋转了180度。

我们知道乘-1其实就是乘了两次 i使线段旋转了180度,那么乘一次 i 呢——答案很简单——旋转了90度。


同时,我们获得了一个垂直的虚数轴。实数轴与虚数轴共同构成了一个复数的平面,也称复平面。这样我们就了解到,乘虚数 i 的一个功能——旋转。
现在,就有请宇宙第一耍帅公式欧拉公式隆重登场——

eix=cosx+isinxe^{ix}=cos x+isin xeix=cosx+isinx

这个公式在数学领域的意义要远大于傅里叶分析,但是乘它为宇宙第一耍帅公式是因为它的特殊形式——当 x 等于 π\piπ的时候。得出:

eπi+1=0e^{\pi i}+1=0eπi+1=0

经常有理工科的学生为了跟妹子表现自己的学术功底,用这个公式来给妹子解释数学之美:”石榴姐你看,这个公式里既有自然底数 e ,自然数 1 和 0 ,虚数 i 还有圆周率 π\piπ,它是这么简洁,这么美丽啊!“但是姑娘们心里往往只有一句话:”臭屌丝……“

这个公式关键的作用,是将正弦波统一成了简单的指数形式。我们来看看图像上的涵义:

欧拉公式所描绘的,是一个随着时间变化,在复平面上做圆周运动的点,随着时间的改变,在时间轴上就成了一条螺旋线。如果只看它的实数部分,也就是螺旋线在左侧的投影,就是一个最基础的余弦函数。而右侧的投影则是一个正弦函数。
关于复数更深的理解,大家可以参考:

复数的物理意义是什么?

这里不需要讲的太复杂,足够让大家理解后面的内容就可以了。

1.7 指数形式的傅里叶变换

有了欧拉公式的帮助,我们便知道:正弦波的叠加,也可以理解为螺旋线的叠加在实数空间的投影。而螺旋线的叠加如果用一个形象的栗子来理解是什么呢?

光波

高中时我们就学过,自然光是由不同颜色的光叠加而成的,而最著名的实验就是牛顿师傅的三棱镜实验:


所以其实我们在很早就接触到了光的频谱,只是并没有了解频谱更重要的意义。
但不同的是,傅里叶变换出来的频谱不仅仅是可见光这样频率范围有限的叠加,而是频率从0到无穷所有频率的组合。

这里,我们可以用两种方法来理解正弦波:

第一种前面已经讲过了,就是螺旋线在实轴的投影。

另一种需要借助欧拉公式的另一种形式去理解:

eit=cost+isinte^{it}=cost+isinteit=cost+isint
e−it=cost−isinte^{-it}=cost-isinte−it=cost−isint

将以上两式相加再除2,得到:

cos(t)=cos(t)=cos(t)= eit+e−it2\frac{e^{it}+{e^{-it}}}{2}2eit+e−it​

这个式子可以怎么理解呢?

我们刚才讲过,eite^{it}eit可以理解为一条逆时针旋转的螺旋线,那么e−ite^{-it}e−it则可以理解为一条顺时针旋转的螺旋线。而cos(t)cos(t)cos(t)则是这两条旋转方向不同的螺旋线叠加的一半,因为这两条螺旋线的虚数部分相互抵消掉了!

举个例子的话,就是极化方向不同的两束光波,磁场抵消,电场加倍。

这里,逆时针旋转的我们称为正频率,而顺时针旋转的我们称为负频率(注意不是复频率)。

好了,刚才我们已经看到了大海——连续的傅里叶变换频谱,现在想一想,连续的螺旋线会是什么样子:

想象一下再往下翻:

是不是很漂亮?
你猜猜,这个图形在时域是什么样子?

哈哈,是不是觉得被狠狠扇了一个耳光。数学就是这么一个把简单的问题搞得很复杂的东西。

顺便说一句,那个像大海螺一样的图,为了方便观看,我仅仅展示了其中正频率的部分,负频率的部分没有显示出来。

如果你认真去看,海螺图上的每一条螺旋线都是可以清楚的看到的,每一条螺旋线都有着不同的振幅(旋转半径),频率(旋转周期)以及相位。而将所有螺旋线连成平面,就是这幅海螺图了。

好了,讲到这里,相信大家对傅里叶变换以及傅里叶级数都有了一个形象的理解了,我们最后用一张图来总结一下:

2. 低通滤波器

2.1 版权问题

2.2 基本指标

[0,ωp\omega_pωp​]范围称为通带,对于允许误差而言,[1-δp\delta_pδp​,1+δp\delta_pδp​] 这个范围,称为通带纹波。同样的,对于[ωs\omega_sωs​,π\piπ] 范围则是阻带,[0,δs\delta_sδs​] 这个范围,称为阻带纹波。中间的黑色部分是过渡带。角频率称为通带边缘频率,角频率则被称为阻带起始频率。也可见下图。

通常的滤波器的设计,都会指明这几个参数,最后设计的滤波器,必须满足这几个参数。当然,这里举得例子是低通滤波器的,高通或者带通,就与之相反了。

低通滤波器顾名思义就是低频率成分通过,高频率成分截止,那么在设计一个低通滤波器时首先要明白想要截止多大的频率。比如想截掉4Hz以上的信号,理想状态下就是将4Hz以上的信号成分全部截止,4Hz以下的信号全部保留。然而事实上几乎不存在这样的滤波器,通常情况下总是在通过频率和截止频率之间存在一个过渡带。通过频率这部分称为通带,允许通过的最大频率为通带截止频率ωp\omega_pωp​,截止频率这部分称为阻带,阻带最小截止频率为ωs\omega_sωs​,通带和阻带之间的部分为过渡带,也即ωp\omega_pωp​~ωs\omega_sωs​。通带之间的波动称为通带波动δpδ_pδp​,阻带之间的波动称为阻带波动δsδ_sδs​如上图所示。

滤波器阶数
滤波器的阶数,就是指过滤谐波的次数,一般来讲,同样的滤波器,其阶数越高,滤波效果就越好,但是,阶数越高,成本也就越高,因此,选择合适的阶数是非常重要的。
另一种表述:窗函数的长度就是滤波器的阶数,滤波器的系数和窗函数的长度没有必然的关系,它只与滤波器的截止频率、过渡带、阻带内的衰减等有关。

谐波
自然界有很多信号,如高压放电的脉冲信号;锤子敲击物体的撞击力,通过压电传感器转换的电信号任何信号都有一定的波形,通过数学分析,非正弦的周期性信号,都可以用有限(数量)的正弦波形合成出来,其中与非正弦信号频率相同的正弦波叫做基波其他高于基波整数倍的正弦波就是谐波。

那问题又来了为什么我们要过滤掉信号中的谐波呢?
其实很简单,基波应该是我们主要想提取到信号成分,那么有了谐波的存在,必然会对基波产生干扰,使得我们的信号发生了变化,所以为了提取我们主要得信号成分,我们必须要把谐波给滤掉。

2.3 理想低通滤波器设计

首先,先由理想低通滤波器为出发点开始考虑。理想低通滤波器的频响如下所示:
上式中 ωc\omega_cωc​= (ωp\omega_pωp​+ωs\omega_sωs​)/2 ,表示截止频率
先由理想的滤波器出发,求其理想滤波器的单位冲击响应。得到了单位冲击响应,也就得到了滤波器的系数。这样,我们就设计出了一个理想的滤波器。这是一个完美的想法,那么开始动手吧,寻找他的单位冲击响应。运用离散时间的傅里叶逆变换,有如下的式子。

由此,我们得到了一个单位冲击响应的表达式(sinc是辛格函数),到这我们就可以设计出一个理想的滤波器了吗?好吧,让我们再确认一遍。

第一,这个式子是离散的。对于单位冲击响应,本来就应该是离散的,没有错,很好,我们距离理想滤波器又近了一步。

第二,这个式子所求出的单位冲击响应的个数,很不幸!个数是无限的。到这里,我们基本可以确定了,理想滤波器是实现不了的。

虽然理想滤波器是实现不了的,但是我们可以退一步,从无限的理想滤波器的单位冲击响应中,在选择一部分冲击响应,构成一个不太理想的,但又达到一定标准的滤波器。我们只能“将就”着使用这个不太理想的滤波器,那么接下来还有一个问题,我们要如何从无限的数列中选择出有限的一部分,从而达到我们的设计要求。

2.4 窗函数

首先,我们先考虑最简单的情况。对于理想单位冲击响应而言,其形状大概和一个高斯分布很像(当然,只是很像,n=0时候,单位冲击响应的值最大,由两边慢慢减少。当然,可能也出现负值。)!所以,我们为了能使得滤波器的性能接近理想滤波器,那么,我们选择其最主要的部分,也就是,值较大的部分。其余部分则放弃。根据之前的叙述,我们可以使用如下式子表示。

这个式子确实可以帮助我们选择一部分有限的数列。而这个式子,被称为矩形窗。可以看出,N越大,性能越街进理想滤波器。这里N称为窗函数的长度。

这就是我们选定的窗口,然后我们把窗口函数加上,也就是加窗!其实也就一个乘法,如下所示。


这样,也就完成了一个加窗。

但是,在实际的实践过程中,很少用矩形窗的。其原因是,矩形窗的阻带衰减不够,仅仅只有21dB。于是,各种各样的窗口就被提出了。各有各的特点,在我们所学的初步的设计中,我们就仅仅看阻带衰减就够了。各种窗函数的性能如下。
表一

窗函数 过渡带大小 阻带衰减(dB)
矩形窗 1.8π\piπ/N 21
汉宁窗 6.2π\piπ/N 44
海明窗 6.6π\piπ/N 53
布莱克曼窗 11π\piπ/N 74

2.5 用窗函数设计一个FIR滤波器

2.5.1 步骤一

根据设计的规格,参数要求,我们选择一个适合的窗函数。这里主要我们还是看阻带衰减,阻带衰减要大于给定的值。一般,若没有给定阻带衰减,我们则需要通过通带纹波和阻带纹波去求,如下。

2.5.2 步骤二

根据要求的通带边缘频率和阻带起始频率,计算过度区的大小,从而计算出窗函数的长度。

2.5.3 步骤三

最后,根据窗函数和理想滤波器的单位冲击响应,计算出我们所需要的滤波器的单位冲击响应。

2.5.4 理论实战

现在,我们来实战一下,假设我们需要设计如下滤波器。

规格中,没有给定阻带衰减,我们只能自己计算。

这里,阻带衰减为40.8[dB],我们选择的窗的阻带衰减不能比这个小,这里其实汉宁窗就可以做到。但我还是选择用汉明窗去做。然后,计算窗长度。

窗长度有了,计算单位冲击响应吧。

这样,我们就得到了一个FIR滤波器。下面是我们计算出来的这个滤波器的单位冲击响应。

但是使用上图所示的单位冲击响应,所设计的滤波器,是无法实现的。

现在,让我们看看其这个滤波器的频响。所谓频响,就是计算其单位冲击响应的离散时间傅里叶变换,

我们可以看出,这个滤波器的频响的计算结果是实数,并没有虚数部分。也就是,其相位谱一直是0,也就意味着,这个滤波器输入与输出之间没有延迟,这种相位特性称为0延迟相位特性。

但是,这个滤波器无法是无法实现的。我们实际计算一下该滤波器的输入输出,就可以明白。

这个滤波器在计算的过程中,需要过去的值和未来的值。未来的值是不可预测的,所以,这个滤波器无法实现。为了使得这个滤波器可以实现,我们只好移动其单位冲击响应,使得其不再需要未来的值。比如,就像下面这样移动。


这样的话,这个滤波器就可以实现了,我们只需要记录其40个过去的输入值和现在的输入值。但是,由于移动了其单位冲击响应,会不会对频响产生什么影响呢,我们来看看。

为了更好的说明问题,L去代替之前例子中的20。

移动之后频响,我们根据上面式子可以得出两个结论:
1,移动不会对幅度谱产生影响。
2,,移动会对相位产生一个延迟,这个延迟主要取决于移动的长度,移动的长度越长,延迟越大。但是,这个移动是线性的。

因此,我们把这个移动的相位特性称为,线性相位特性。到这里,我们移动后的,因果的,可实现的滤波器的单位冲击响应,如下所示。

Matlab——用窗函数设计低通FIR滤波器

1.设计步骤

1.1 确定滤波器类型

不同的FIR类型可设计不同类型的滤波器,I型可设计LP(低通滤波器),HP(高通滤波器),BP(带通滤波器),BS(带阻滤波器)。

FIR I型 FIR II型 FIR III 型 FIR IV型
LP HP BP BS LP BP BP HP BP BS

1.2 确定设计的滤波器的参数

设计指标如下:
ωp\omega_pωp​=0.2π\piπ
ωs\omega_sωs​=0.3π\piπ
RpR_pRp​=0.25 dB
AsAsAs=50 dB

下面是设计方式:
根据 汉明窗 > 阻带衰减 As=50 > 汉宁窗阻带衰减() 应选用汉明窗或者阻带衰减更大的窗函数都可
我这里使用汉明窗,仅供参考

WsW_sWs​=ωs\omega_sωs​π\piπ
WpW_pWp​=ωp\omega_pωp​π\piπ

前面 2.3节已经说过,此处求截止频率wcw_cwc​

wcw_cwc​=(Ws−WpW_s-W_pWs​−Wp​)/2

过渡带带宽:

BBB=Ws−WpW_s-W_pWs​−Wp​

求解滤波器长度 N:

N>=(窗函数近似过渡带宽度)/(Wp-Ws)
也可见上面的 2.5.4 中的求解,再对比表一

N=6.6π/BN=6.6\pi/BN=6.6π/B

求出阶数M

M≈\approx≈N

再加入理想的脉冲响应信号Hd(wc,M)H_d(w_c,M)Hd​(wc​,M)

求出W=hamming(N)W=hamming(N)W=hamming(N)

加窗
h=Hd∗Wh=H_d*Wh=Hd​∗W
hhh 即为所设计FIR滤波器系数向量b(n)。

滤波
sigFiltered = filter(h,1,signal)

完成!!!!
注意:不明白的公式可以看基础知识的第2大节

代码

下面附上代码:
为了大家能真正掌握它,希望大家多看看上面的内容

clear
clc
Wp=0.2;
Rp=0.25; %通带最大衰减dB
Ws=0.3;
As=50;%阻带最大衰减
wp=Wp*pi;%通带截至角频率
ws=Ws*pi;%阻带截止角频率
tr_width=ws-wp;%过渡带宽度
%确定滤波器的长度N   N>=(窗函数近似过渡带宽度)/(Wp-Ws)
%hamming窗近似为7pi/N
M=ceil(6.6*pi/tr_width)+1;%阶数,ceil向正无穷圆整
%窗函数长度:N=mod(N+1,2)+N   mod对N+1取2的余数
% 滤波器长度,指的是滤波器的滤波的频带范围。
% 比方说,我们生产的变频器专用滤波器,滤波范围是10K~30MHz;从这个角度来讲,滤波器的滤波范围越宽越好了,
n=[0:1:M-1];
wc=(ws+wp)/2;
%理想滤波器脉冲信号如下
%hd = (Wc/pi)*sinc(Wc*(k-0.5*M)/pi);%低通
hd=ideal_lp(wc,M);%理想脉冲响应
w_ham=(hamming(M))';%加窗h=hd.*w_ham;%实际脉冲响应,截断
%求解离散系统的频率响应
[db,mag,pha,grd,w]=freqz_m(h,1);delta_w=2*pi/1000;
Rp=-(min(db(1:1:fix(wp/delta_w)+1)));%fix向0取整
As=-round(max(db(ws/delta_w+1:1:501)));
pha1=-180*unwrap(pha)/pi;
%unwrap相位矫正
%当 2.5025与 -2.9863之间超过阈值 pi 后视为发生跳变,将2.5025加上或减去 2*pi,以此类推。
%  数组为     -2.2685 -2.9863 2.5025  1.7062  1.0361  0.2504  -0.5363
%  相位矫正后 -2.2685 -2.9863 -3.7807 -4.5770 -5.2471 -6.0328 -6.8194
figure(1)
subplot(2,2,1);
stem(n,hd);title('理想脉冲响应')axis([0 M-1 -0.1 0.3]);
xlabel('n');ylabel('hd(n)');
subplot(2,2,2);
stem(n,w_ham);
title('哈明窗')
axis([0 M-1 0 1.1]);
xlabel('n');ylabel('w(n)');subplot(2,2,3);
stem(n,h);
title('实际脉冲响应')
axis([0 M-1 -0.1 0.3]);
xlabel('n');ylabel('h(n)')subplot(2,2,4);
stem(n,hd-h);
title('理想脉冲响应-实际脉冲响应')
axis([0 M-1 -0.1 0.3]);
xlabel('n');ylabel('hd(n)-h(n)')figure(2)
subplot(2,2,3);
plot(w/pi,pha1);
title('Phase Response')
xlabel('frequency in pi units');ylabel('pi units');
axis([0,1,-2000,0])
set(gca,'XTickMode','manual','XTick',[0,wp/pi,ws/pi,1]);
%设置网格的显示格式,gca获取当前figure句柄,将坐标修改
set(gca,'YTickMode','manual','YTick',[-2000,-1500,-1000, -500,0]);
grid
% set(gca,'YTickLabelMode','manual','YTickLabel',['-2000';'-1500';'-1000';' -500';'    0'])subplot(2,2,2);
plot(w/pi,db);title('幅度响应(单位:db)');
grid
axis([0 1 -100 10]);xlabel('频率(单位:pi)');ylabel('分贝数')
set(gca,'XTickMode','manual','XTick',[0,wp/pi,ws/pi,1]);subplot(2,2,1);
plot(w/pi,mag);title('幅度响应');
grid
axis([0 1 0 1.1]);xlabel('频率(单位:pi)');
set(gca,'XTickMode','manual','XTick',[0,wp/pi,ws/pi,1]);

其中使用的函数代码如下:

%滤波器的幅值响应、相位响应、群延迟响应计算函数
function[db,mag,pha,grd,w]=freqz_m(b,a)
[H,w]=freqz(b,a,1000,'whole');
%freqz(b,a,n,fs)中
% 返回值H则包含了离散系统频响在0~pi范围内n个频率等分点的值,w则包含了范围内n个频率等分点。
% b和a分别为系统函数的分子和分母多项式的系数向量,n=1000 为要显示的频率等分点,默认为512,fs为要显示的频率的2倍。
% 本调用方法中计算离散系统在0-pi范围内的n个频率等分点的频率响应值。因此可以先调用freqz函数计算系统的频率响应,
% 然后利用abs和angle以及plot,即可绘制出系统在该范围的频率响应曲线
%频率向量W(N点,且单位为弧度)
H=(H(1:1:501))';%转置
w=(w(1:1:501))';
mag=abs(H);%取幅度值实部
db=20*log10((mag+eps)/max(mag));%幅值响应,单位db
pha=angle(H);%取相位值对应相位角
grd=grpdelay(b,a,w);%平均滤波器的延迟

产生理想低通滤波器的冲击响应函数

%产生理想低通滤波器的冲击响应函数
function hd=ideal_lp(wc,M)
alpha=(M-1)/2;%滤波器阶数
n=[0:1:(M-1)];
m=n-alpha+eps;
hd=sin(wc*m)./(pi*m);%理想脉冲响应
%%hd = (Wc/pi)*sinc(Wc*(k-0.5*M)/pi);%低通
%hd = (Wc/pi)*sinc(Wc*(k-0.5*M)/pi);%低通k-0.5*M为式中m

数字滤波器设计——Matlab(理想低通滤波器、FIR滤波器)相关推荐

  1. [Matlab]FIR滤波器设计:(基本窗函数FIR滤波器设计)

    [Matlab]FIR滤波器设计:(基本窗函数FIR滤波器设计) ​ IIR滤波器主要设计方法先设计一个模拟低通滤波器,然后把它转化为形式上的数字滤波器.但对于FIR滤波器来说,设计方法的关键要求之一 ...

  2. matlab窗函数带通滤波器,Matlab结合窗函数法设计数字带通FIR滤波器

    Matlab结合窗函数法设计数字带通FIR滤波器 课程设计任务书学生姓名: 专业班级: 通信工程 指导教师: 工作单位: 信息工程学院 题 目:利用 Matlab 仿真软件系统结合窗函数法设计一个数字 ...

  3. fir 低通 matlab,MATLAB常用的FIR滤波器设计方法之窗函数法

    FIR滤波器很多工科出身的人都不会陌生,在我们的学习和工作中,也常常需要设计FIR滤波器.因为FIR滤波器有两个特点:滤波器是稳定的以及具有线性相位.FIR滤波器在信号处理相关领域当然也包括本人所在的 ...

  4. matlab 理想低通滤波器函数,理想滤波器、原型模拟滤波器和窗函数的特性matlab6...

    实验六<理想滤波器.原型模拟滤波器和窗函数的特性>1.实验内容 1.计算下列理想数字滤波器的单位冲激响应,并画出其频率响应和单位冲激响应,观察单位冲激响应波形的对称特性 1)理想低通滤波器 ...

  5. FIR数字滤波器的FPGA实现(一)-FIR滤波器基本原理

    (一)FIR数字滤波器的FPGA实现-FIR滤波器基本原理 文章目录 (一)FIR数字滤波器的FPGA实现-FIR滤波器基本原理 1 FIR滤波器基本原理 1.1 FIR滤波器的结构及设计 1.1.1 ...

  6. 设计多频带的FIR滤波器

    有时在信号处理中需要对信号进行多频带的数字滤波,以往的办法是单独设计一个个频带的滤波器,把信号输入到每一个滤波器(并联),再把它们的输出信号叠加在一起.是否能设计一个多频带的滤波器,一次输入/输出把多 ...

  7. matlab 滤波窗函数,FIR滤波器窗函数设计法详细步骤以及Matlab代码

    采用窗函数法设计理想低通,高通滤波器,参考北京交通大学陈后金主编的[数字信号处理]5.2节 窗函数法设计线性相位FIR数字滤波器P164,和P188. 设计步骤如下: 1) 确定滤波器类型,不同的FI ...

  8. matlab 理想低通滤波器函数,基于MATLAB的理想低通滤波器的设计

    对于不同滤波器而言,每个频率的信号的强弱程度不同.当使用在音频应用时,它有时被称为高频剪切滤波器,或高音消除滤波器.低通滤波器概念有许多不同的形式,其中包括电子线路(如音频设备中使用的hiss 滤波器 ...

  9. matlab理想低通滤波器代码_自己动手,解开Matlab下AMD锐龙处理器性能封印

    性能除了需要花钱的硬件级提升方法外,还有系统管理,驱动以及应用优化等不花钱的方法.早年间硬件玩家们流行通过刷BIOS软改,覆盖驱动强行开启专属功能等各种魔改方式提升硬件性能.而对特定的应用进行优化的话 ...

  10. fir滤波器课程设计matlab,Matlab课程设计---FIR数字滤波器

    Matlab课程设计---FIR数字滤波器 课程设计任务书课程设计任务书 学生姓名学生姓名 xxxxxx 专业班级专业班级 信息信息 xxxxxx 班班 指导教师指导教师 xxxxxx 工作单位工作单 ...

最新文章

  1. python中怎么打开文件_python如何打开文件
  2. matlab中随机函数的具体使用方法
  3. Linux selinux入门
  4. 【BootStrap】初步教程
  5. 【POJ - 2255】Tree Recovery (给定树的先序中序,输出后序)
  6. mysql监控平台怎么做_MySQL监控平台的构建方法
  7. Vivado设计流程(四)设计综合
  8. python 菜鸟-python菜鸟教程
  9. idea shell 使用linux_Linux 基础操作
  10. 基于ADS500MHZ带通滤波器
  11. 渗透测试入门—— 常见术语概述
  12. 基因重组-冲刺日志(第五天)
  13. sklearn预测员工离职率
  14. Codeforces_714_A
  15. python人工智能之:多边形矩阵热图程序实战篇(二)
  16. 同一页面显示不同内容
  17. 华为鸿蒙朱丹丹,8分钟 京东用户喜提全球首台华为鸿蒙系统荣耀智慧屏
  18. ubuntu20+PHP项目运行环境搭建
  19. 基于Dockerfile制作镜像
  20. 关于校招那些事(一)—— 简历

热门文章

  1. 3D游戏建模快速制作枪械的几种方法【3Dmax,Zbrush,Maya】
  2. CORE Transport Technologies宣布蓝牙航空货物跟踪系统重大升级
  3. 数据分析方法论和数据分析方法
  4. Micropython——基于PYB的霍尔编码器电机的PID控制
  5. java保留字详解_java复习基础知识——java保留字
  6. 基于胜任力模型的项目经理岗位培训需求分析研究
  7. win7打补丁显示不适用计算机,更新win7系统提示“此更新不适用于您的计算机”如何解决...
  8. 盲目自信、能力不足、年少轻狂,这是我创业失败后总结的3条血泪事实
  9. python模拟登录京东网页
  10. Python实现音频文件格式转化