博客园闪存首页新随笔联系管理订阅随笔 43 文章 0 评论 173 基于Matlab的FIR滤波器设计与实现一、摘要 前面一篇文章介绍了通过FDATool工具箱实现滤波器的设计,见“基于Matlab中FDATool工具箱的滤波器设计及相关文件的生成”,这里通过几个例子说明采用Matlab语言设计FIR滤波器的过程。二、实验平台 Matlab7.1三、实验原理 以低通滤波器为例,其常用的设计指标有:通带边缘频率fp(数字频率为Ωp)阻带边缘频率fst (数字频率为Ωst)通带内最大纹波衰减δp=20log10(1αp),单位为 dB阻带最小衰减αs=20log10(αs),单位为 dB阻带起伏αs通带峰值起伏αp 其中,以1、2、3、4条最为常用。5、6条在程序中估算滤波器阶数等参数时会用到。 数字频率 = 模拟频率/采样频率四、实例分析例1 用凯塞窗设计一FIR低通滤波器,通带边界频率Ωp=0.3pi,阻带边界频率 Ωs=0.5pi,阻带衰减δs不小于50dB。方法一:手动计算滤波器阶数N和β值,之后在通过程序设计出滤波器。第一步:通过过渡带宽度和阻带衰减,计算滤波器的阶数B和β值。第二步:通过程序设计滤波器。程序如下:b = fir1(29,0.4,kaiser(30,4.55));[h1,w1]=freqz(b,1); plot(w1/pi,20*log10(abs(h1))); axis([0,1,80,10]); grid;昵称:sunev园龄:4年4个月粉丝:196关注:0+加关注2011年11月日一二三四五六303112345678910111213141516171819202122232425262728293012345678910搜索 找找看 谷歌搜索常用链接我的随笔我的评论我的参与最新评论我的标签更多链接我的标签UDP(5)Quartus II(3)TCP(3)C#(3)网络摄像头(3)异步(3)同步(2)DIY_DE2(2)DM9000A(2)dsp_builder(2)更多随笔分类C# & OpenCV(7)DIY_DE2(18)dsp_builder(1)DSP2812(2)linux & ubuntu(2)Matlab&Simulink(5)ModelSim(1)PCB技术(2)Quartus II & Nios II(4)USB_Board(1)VxWorks & Tornado其他(2)数字信号处理及实现(5)网络技术及其编程(13)sunevxlabel('归一化频率/p') ;ylabel('幅度/dB') ; 波形如下: 方法二:采用[n,Wn,beta,ftype] = kaiserord(f,a,dev)函数来估计滤波器阶数等,得到凯塞窗滤波器。 这里的函数kaiserord(f,a,dev)或者kaiserord(f,a,dev,fs): f为对应的频率,fs为采样频率;当f用数字频率表示时,fs则不需要写。 a=[1 0]为由f指定的各个频带上的幅值向量,一般只有0和1表示;a和f长度关系为(2*a的长度) 2=(f的长度) devs=[0.05 10^(2.5)]用于指定各个频带输出滤波器的频率响应与其期望幅值之间的最大输出误差或偏差,长度与a相等,计算公式:阻带衰减误差=αs,通带衰减误差=αp,可有滤波器指标中的3、4条得到。 fs缺省为2Hz。 程序如下:fcuts = [0.3 0.5]; %归一化频率omega/pi,这里指通带截止频率、阻带起始频率mags = [1 0];devs = [0.05 10^(2.5)];[n,Wn,beta,ftype] = kaiserord(fcuts,mags,devs); %计算出凯塞窗N,beta的值hh = fir1(n,Wn,ftype,kaiser(n+1,beta),'noscale'); freqz(hh); 波形如下:随笔档案2012年11月 (2)2012年8月 (6)2012年7月 (2)2012年6月 (3)2012年5月 (3)2012年4月 (1)2012年3月 (9)2012年1月 (1)2011年12月 (1)2011年11月 (7)2011年10月 (9)最新评论1. Re:基于DSP的FIR滤波器设计与实现请教一下,CCS怎么显示图形,我做FFT的时候,mag[]数组显示是正确的,但是图形显示不对,估计没有设置好莫问奴家名2. Re:基于C#的socket编程的TCP异步实现我想问一下 你的这个案例应该对多线程也适合把疾风少年3. Re:基于C#的UDP协议的同步实现楼主,那个组播只能在ipv6上实现吗?ipv4只能用广播?我是新手,求指教陌莜柒4. Re:基于C#的socket编程的TCP异步实现这个stateobject是自定义用于在异步委托之间,但是这个东西可以自己随意写么?它的赋值机制是怎样的?烟溪秋叶5. Re:DIY_DE2之DM9000A网卡调试系列例程(二)——DM9000A测试、自收发、实现UDP为什么晨曦那道光阅读排行榜1. 基于Matlab的FIR滤波器设计与实现(48971)2. 基于C#的socket编程的TCP异步实现(31032)3. 在VMWare上安装ubuntu及VMWareTools(27806)4. Matlab中窗函数的简单使用(21520)5. 基于Matlab中FDATool工具箱的滤波器设计及相关文件的生成(21101)评论排行榜1. DIY_DE2之DM9000A网卡调试系列例程(二)——DM9000A测试、自收发、实现UDP(67)2. DIY_DE2之DM9000A网卡调试系列例程(三)——基于LWIP协议栈的TCP/IP实现(32)3. DIY_DE2之DM9000A网卡调试系列例程(四)——基于NicheStack协议栈的TCP/IP实现(15)4. 基于C#的socket编程的TCP异步实现(10)5. 基于UDP协议的网络摄像头的设计与实现(8)推荐排行榜1. 基于C#的socket编程的TCP异步实现(14) 实际中,一般调用MATLAB信号处理工具箱函数remezord来计算等波纹滤波器阶数N和加权函数W(ω),调用函数remez可进行等波纹滤波器的设计,直接求出滤波器系数。函数remezord中的数组fedge为通带和阻带边界频率,数组mval是两个边界处的幅值,而数组dev是通带和阻带的波动,fs是采样频率单位为Hz。 例2 利用雷米兹交替算法设计等波纹滤波器,设计一个线性相位低通FIR数字滤波器,其指标为:通带边界频率fc=800Hz,阻带边界fr=1000Hz,通带波动 阻带昀小衰减At=40dB,采样频率fs=4000Hz。 解:在MATLAB中可以用remezord 和remez两个函数设计 程序如下: fedge=[800 1000]; mval=[1 0]; dev=[0.0559 0.01]; fs=4000; [N,fpts,mag,wt]=remezord(fedge,mval,dev,fs); b=remez(N,fpts,mag,wt); [h,w]=freqz(b,1,256); plot(w*2000/pi,20*log10(abs(h))); 2. IIC总线的FPGA实现(7)3. DIY_DE2之DM9000A网卡调试系列例程(二)——DM9000A测试、自收发、实现UDP(6)4. Quartus II中FPGA的管脚分配保存方法(4)5. 数字信号分析仪(4) grid; xlabel('频率/Hz') ; ylabel('幅度/dB'); 波形如下:例3 利用MATLAB编程设计一个数字带通滤波器,指标要求如下:通带边缘频率:Ωp1=0.45pi,Ωp2=0.65pi,通带峰值起伏:δ1=1[dB]。阻带边缘频率:Ωs1=0.3pi,Ωs2=0.8pi,昀小阻带衰减:δ2=40[dB] 。方法一:窗函数法 程序如下:[n,wn,bta,ftype]=kaiserord([0.3 0.45 0.65 0.8],[0 1 0],[0.01 0.1087 0.01]);%用kaiserord函数估计出滤波器阶数n和beta参数h1=fir1(n,wn,ftype,kaiser(n+1,bta),'noscale');[hh1,w1]=freqz(h1,1,256);figure(1)subplot(2,1,1)plot(w1/pi,20*log10(abs(hh1)))gridxlabel('归一化频率w');ylabel('幅度/db');subplot(2,1,2)plot(w1/pi,angle(hh1))gridxlabel('归一化频率w');ylabel('相位/rad'); 波形如下: 滤波器系数为:h1 = Columns 1 through 8 0.0041 0.0055 0.0091 0.0018 0.0056 0.0000 0.0391 0.0152 Columns 9 through 16 0.0381 0.0077 0.0293 0.0940 0.0907 0.2630 0.0517 0.3500 Columns 17 through 24 0.0517 0.2630 0.0907 0.0940 0.0293 0.0077 0.0381 0.0152 Columns 25 through 31 0.0391 0.0000 0.0056 0.0018 0.0091 0.0055 0.0041 如果直接用freqz(h1,1,256),得幅频特性和相频特性曲线: 方法二:等波纹法设计 程序如下:[n,fpts,mag,wt]=remezord([0.3 0.45 0.65 0.8],[0 1 0],[0.01 0.1087 0.01]);%用remezord函数估算出remez函数要用到的阶n、归一化频带边缘矢量fpts、频带内幅值响应矢量mag及加权矢量w,使remez函数设计出的滤波器满足f、a及dev指定的性能要求。h2=remez(n,fpts,mag,wt);%设计出等波纹滤波器[hh2,w2]=freqz(h2,1,256);figure(2)subplot(2,1,1)plot(w2/pi,20*log10(abs(hh2)))gridxlabel('归一化频率w');ylabel('幅度/db');subplot(2,1,2)plot(w2/pi,angle(hh2))gridxlabel('归一化频率w');ylabel('相位/rad');h2 波形如下:滤波器系数如下:h2 = Columns 1 through 9 0.0013 0.0092 0.0255 0.0642 0.1177 0.0922 0.2466 0.0466 0.3116 Columns 10 through 17 0.0466 0.2466 0.0922 0.1177 0.0642 0.0255 0.0092 0.0013 如果直接用freqz(h2,1,256);得幅频特性和相频特性曲线: 方法三:采用FDATool工具 这种方法需要事先计算出滤波器的阶数,bate值,然后设置相应参数,最后生成滤波器。 设置界面如下图所示: 将上述圈圈的区域设置好之后,生成滤波器,最后通过analysis菜单可以观察生成的滤波器的各种特性