提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
FPGA信号处理系列文章——窗函数法FIR滤波器设计
根据具体的滤波要求,计算出FIR滤波器的系数,或者说滤波器的单位冲激响应,是FIR滤波器设计的主要内容之一。计算滤波器系数的方法多种多样,最常用的是窗函数法、频率采样法及最优化方法。我们这里主要理解一下窗函数法的实现。
窗函数法的基本思想是要选取某一种合适的理想频率选择滤波器,这种滤波器的单位冲激响应为非因果、无线长;然后对理想的冲激响应加窗,可以得到一个线性相位和因果的FIR滤波器。这种方法的重点在于选择某种恰当的窗函数和一种合适的理想滤波器。
若用
表示理想的频率选择滤波器,它在整个通带内有单位幅度的增益和线性相位特性,并且在阻带内具有零响应。理想低通滤波器的频率响应用数学公式可以表示为:

式中,wc为截止频率,a为滤波器的群延时。其对应的单位冲激响应hd (n)为

很明显,上式所示的理想低通滤波器的单位冲激响应是非因果的,并且长度无限,而且 还关于a对称。
为了从hd (n)得到一个长度为N的线性相位FIR滤波器,必须在hd (n)两边将它截断,并且保证a=(N-1)/2。截断运算在信号处理中常称为加窗。经过截断后,无限长、非因果的理想滤波器hd (n)变为因果的FIR滤波器h(n) ,用数学公式表示为:

其中窗函数 w(n)定义为:

常用的窗函数有矩形窗(Rectangle)、汉宁窗(Hanning)、海明窗(Hamming)、布莱克曼窗(Blackman)及凯塞窗(Kaiser)等
hd(n)加窗以后,其频率响应也不再是理想的频率选择滤波器了。根据卷积定理,加窗后的频率响应等于理想频率响应与窗函数频率响应的卷积。对于如图所示的典型的窗函数响应
,理想滤波器时域加窗后的频率响应如图所示。

仔细观察下图可以发现如下特点:
1、 由于窗函数 w(n)的长度有限,所以它的响应有一个峰值主瓣,其宽度与窗函数长度N成反比,并有较小的多个旁瓣。
2、理想滤波器时域加窗后,频率响应Hd (e^jw )不再是理想的,而是有明显的失真。这种失真一方面表现为通带和阻带都有起伏,另一方面表现为有一个明显的过度带。
3、Hd (e^jw )的过度带和阻带起伏是由窗函数的主瓣引起的,其宽度由窗函数主瓣宽度所决定。主瓣越宽,过度带也越宽。
4、Hd (e^jw )的通带和阻带起伏称为吉布斯现象。这是由窗函数的旁瓣引起的,并且通带的起伏和阻带的起伏形状相同。
因此,在给定滤波器要求的情况下,用窗函数方法计算滤波器系数,就是要选择合适的窗函数类型和确定所选窗函数的长度N,使得滤波器在满足性能要求的条件下,具有尽可能小的过渡带和通带阻带起伏。
常用的窗函数,如矩形窗、三角窗、汉宁窗、海明窗及布莱克曼窗,这些窗函数与滤波器系数计算有关的主要参数都小结在下表中

从上表可以看出,窗函数的过度带宽与阻带衰减成正比,也即是过度带宽越小,对应的阻带衰减也越小。而对滤波器而言,则是希望过度带宽越小的情况下阻带衰减越大。因此,用窗函数计算滤波器系数的时候,必须要在各项参数之间进行折中选择。另外,对于表中的前4种窗函数来说,其阻带衰减、旁瓣峰值等参数是固定的,而且窗函数的通带起伏和阻带衰减相等,这些都会对滤波器性能产生一些不利的影响。
用窗函数方法设计滤波器系数通常包括如下步骤:
1、 根据给定的滤波器性能参数,确定对应理想滤波器的频率响应
2、 通过傅里叶反变换求理想滤波器的单位冲激响应
3、 根据通带起伏、阻带衰减等性能参数确定窗函数的类型
4、 根据过度带宽参数确定滤波器长度
5、 计算所选取得窗函数的值
6、 根据式子
,求得实际的FIR系数h(n)
7、由h(n)计算实际滤波器的频率响应Hd (e^jw ),并与给定的性能参数相比较。若不满足要求,则要重复上面的步骤,直到满足要求为止。
根据前面的讨论过程,可以总结窗函数方法的优缺点如下:
1、 窗函数方法最主要的优点在于其简单性,不仅原理简单,而且应用也简单
2、 窗函数方法所需的运算量非常小,即便是对于最复杂的凯塞窗也是如此
3、 窗函数方法最大的缺陷是缺乏灵活性。由于通带偏差和阻带偏差近似相等,使得窗函数很难同时满足通带起伏和阻带衰减的要求
4、 由于窗函数频谱与理想的频率响应之间的卷积效应,使得滤波器的通带边沿频率和阻带边沿频率难以精确指定
5、 对于大部分的窗函数,无论其长度多少,滤波器响应中的阻带衰减是固定不变的。只有凯塞窗的阻带衰减可以随滤波器的长度有所变化
6、 用窗函数方法计算出来的滤波器,通常系数数目较多,从而导致滤波器的运算效率降低
7、 在某些应用中,例行滤波器响应的表达式过于复杂,计算冲激响应非常困难
1、 设计一个FIR滤波器,首先需要得到其频率响应,并且希望设计的结果尽可能与其接近
假设采样率为100KHz,要求带宽内幅频响应(-25K ~ +25K)如下图,其他频率无要求,采样步进100Hz。

dB转化为幅度:

因为采样率为100KHz,将前面一个点和最后一个点进行延拓,构造整个分辨带宽内的幅频响应

2、 根据频率响应做傅里叶反变换,得到理想冲激响应
mycoe = ifftshift(ifft(fftshift(AmpFrq)));
%AmpFrq为上图幅频响应图
得到了1001个系数
3、 根据需要的滤波器阶数进行加窗处理(两端截断)
虽然理想滤波器应该是系数无限个,得到的1001个系数相当于加了矩形窗了,只不过由于系数多的话也就逼近于理想的了

假设我们只要21个系数,那么从中间进行截取加矩形窗后,得到的幅频响应:

如果是加hamming窗,则曲线有所平滑,但不一定是我们所期望的,因此需要多加几个窗进行对比

4、 最终得到结果,和预期进行对比

因为只有中间50k是我们关心的,因此只显示50k内的带宽的话

矩形窗和理论的波动差距还是较小的。
其他窗的效果就不贴到这里了,总之几个常用的窗都可以试一下,然后选取最优的一个
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我正在尝试用ruby中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了
我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin
如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称