转载请注明文章来源 – http://blog.csdn.net/v_hyx ,请勿用于任何商业用途
对于滤波器设计,以前虽然学过相关的理论(现代数字信号处理和DSP设计),但一直不求甚解,也没用过。趁着最近使用了一下,就来重学一回,温故而知新。
先来说说IIR滤波器设计,理论与原理参考如下博客,写得简明易懂,不错。
http://blog.csdn.net/thnh169/article/details/9034483  [数字信号处理]IIR滤波器基础
http://blog.csdn.net/thnh169/article/details/9069475  [数字信号处理]IIR滤波器的间接设计(C代码)
http://blog.csdn.net/thnh169/article/details/9076283  [数字信号处理]IIR滤波器的直接设计(C代码)
一般IIR设计可分三种:间接设计(原型转换设计)、直接设计、直接使用工具软件如MATLAB的IIR函数设计。前2种方法,上面的博客已经写得很清楚,理论比较多,设计还是很复杂的。但在实际工程应用中,多采用MATLAB的IIR函数或者FDATOOL工具进行,非常方便快捷。
OK,来个示例来说明采用MATLAB的IIR函数设计过程,花一会儿的功夫就可以快速入门,so easy!废话不多说,直接上MATLAB IIR.m文件,最后附上效果图。
IIR.m
[plain]  view plain copy
  1. % IIR滤波器设计
  2. % 目的:设计一个采样频率为1000Hz、通带截止频率为50Hz、阻带截止频率为100Hz的低通滤波器,并要求通带最大衰减为1dB,阻带最小衰减为60dB。
  3. clc;clear;close all;
  4. % 1. 产生信号(频率为10Hz和100Hz的正弦波叠加)
  5. Fs=1000; % 采样频率1000Hz
  6. t=0:1/Fs:1;
  7. s10=sin(20*pi*t); % 产生10Hz正弦波
  8. s100=sin(200*pi*t); % 产生100Hz正弦波
  9. s=s10+s100; % 信号叠加
  10. figure(1); % 画图
  11. subplot(2,1,1);plot(s);grid;
  12. title('原始信号');
  13. % 2. FFT分析信号频谱
  14. len = 512;
  15. y=fft(s,len);  % 对信号做len点FFT变换
  16. f=Fs*(0:len/2 - 1)/len;
  17. subplot(2,1,2);plot(f,abs(y(1:len/2)));grid;
  18. title('原始信号频谱')
  19. xlabel('Hz');ylabel('幅值');
  20. % 3. IIR滤波器设计
  21. N=0; % 阶数
  22. Fp=50; % 通带截止频率50Hz
  23. Fc=100; % 阻带截止频率100Hz
  24. Rp=1; % 通带波纹最大衰减为1dB
  25. Rs=60; % 阻带衰减为60dB
  26. % 3.0 计算最小滤波器阶数
  27. na=sqrt(10^(0.1*Rp)-1);
  28. ea=sqrt(10^(0.1*Rs)-1);
  29. N=ceil(log10(ea/na)/log10(Fc/Fp));
  30. % 3.1 巴特沃斯滤波器
  31. Wn=Fp*2/Fs;
  32. [Bb Ba]=butter(N,Wn,'low'); % 调用MATLAB butter函数快速设计滤波器
  33. [BH,BW]=freqz(Bb,Ba); % 绘制频率响应曲线
  34. Bf=filter(Bb,Ba,s); % 进行低通滤波
  35. By=fft(Bf,len);  % 对信号f1做len点FFT变换
  36. figure(2); % 画图
  37. subplot(2,1,1);plot(t,s10,'blue',t,Bf,'red');grid;
  38. legend('10Hz原始信号','巴特沃斯滤波器滤波后');
  39. subplot(2,1,2);plot(f,abs(By(1:len/2)));grid;
  40. title('巴特沃斯低通滤波后信号频谱');
  41. xlabel('Hz');ylabel('幅值');
  42. % 3.2 切比雪夫I型滤波器
  43. [C1b C1a]=cheby1(N,Rp,Wn,'low'); % 调用MATLAB cheby1函数快速设计低通滤波器
  44. [C1H,C1W]=freqz(C1b,C1a); % 绘制频率响应曲线
  45. C1f=filter(C1b,C1a,s); % 进行低通滤波
  46. C1y=fft(C1f,len);  % 对滤波后信号做len点FFT变换
  47. figure(3); % 画图
  48. subplot(2,1,1);plot(t,s10,'blue',t,C1f,'red');grid;
  49. legend('10Hz原始信号','切比雪夫I型滤波器滤波后');
  50. subplot(2,1,2);plot(f,abs(C1y(1:len/2)));grid;
  51. title('切比雪夫I型滤波后信号频谱');
  52. xlabel('Hz');ylabel('幅值');
  53. % 3.3 切比雪夫II型滤波器
  54. [C2b C2a]=cheby2(N,Rs,Wn,'low'); % 调用MATLAB cheby2函数快速设计低通滤波器
  55. [C2H,C2W]=freqz(C2b,C2a); % 绘制频率响应曲线
  56. C2f=filter(C2b,C2a,s); % 进行低通滤波
  57. C2y=fft(C2f,len);  % 对滤波后信号做len点FFT变换
  58. figure(4); % 画图
  59. subplot(2,1,1);plot(t,s10,'blue',t,C2f,'red');grid;
  60. legend('10Hz原始信号','切比雪夫II型滤波器滤波后');
  61. subplot(2,1,2);plot(f,abs(C2y(1:len/2)));grid;
  62. title('切比雪夫II型滤波后信号频谱');
  63. xlabel('Hz');ylabel('幅值');
  64. % 3.4 椭圆滤波器
  65. [Eb Ea]=ellip(N,Rp,Rs,Wn,'low'); % 调用MATLAB ellip函数快速设计低通滤波器
  66. [EH,EW]=freqz(Eb,Ea); % 绘制频率响应曲线
  67. Ef=filter(Eb,Ea,s); % 进行低通滤波
  68. Ey=fft(Ef,len);  % 对滤波后信号做len点FFT变换
  69. figure(5); % 画图
  70. subplot(2,1,1);plot(t,s10,'blue',t,Ef,'red');grid;
  71. legend('10Hz原始信号','椭圆滤波器滤波后');
  72. subplot(2,1,2);plot(f,abs(Ey(1:len/2)));grid;
  73. title('椭圆滤波后信号频谱');
  74. xlabel('Hz');ylabel('幅值');
  75. % 3.5 yulewalk滤波器
  76. fyule=[0 Wn Fc*2/Fs 1]; % 在此进行的是简单设计,实际需要多次仿真取最佳值
  77. myule=[1 1 0 0]; % 在此进行的是简单设计,实际需要多次仿真取最佳值
  78. [Yb Ya]=yulewalk(N,fyule,myule); % 调用MATLAB yulewalk函数快速设计低通滤波器
  79. [YH,YW]=freqz(Yb,Ya); % 绘制频率响应曲线
  80. Yf=filter(Yb,Ya,s); % 进行低通滤波
  81. Yy=fft(Yf,len);  % 对滤波后信号做len点FFT变换
  82. figure(6); % 画图
  83. subplot(2,1,1);plot(t,s10,'blue',t,Yf,'red');grid;
  84. legend('10Hz原始信号','yulewalk滤波器滤波后');
  85. subplot(2,1,2);plot(f,abs(Yy(1:len/2)));grid;
  86. title('yulewalk滤波后信号频谱');
  87. xlabel('Hz');ylabel('幅值');
  88. % 4. 各个滤波器的幅频响应对比分析
  89. A1 = BW*Fs/(2*pi);
  90. A2 = C1W*Fs/(2*pi);
  91. A3 = C2W*Fs/(2*pi);
  92. A4 = EW*Fs/(2*pi);
  93. A5 = YW*Fs/(2*pi);
  94. figure(7); % 画图
  95. subplot(1,1,1);plot(A1,abs(BH),A2,abs(C1H),A3,abs(C2H),A4,abs(EH),A5,abs(YH));grid;
  96. xlabel('频率/Hz');
  97. ylabel('频率响应幅度');
  98. legend('butter','cheby1','cheby2','ellip','yulewalk');
[plain]  view plain copy
  1. % IIR滤波器设计
  2. % 目的:设计一个采样频率为1000Hz、通带截止频率为50Hz、阻带截止频率为100Hz的低通滤波器,并要求通带最大衰减为1dB,阻带最小衰减为60dB。
  3. clc;clear;close all;
  4. % 1. 产生信号(频率为10Hz和100Hz的正弦波叠加)
  5. Fs=1000; % 采样频率1000Hz
  6. t=0:1/Fs:1;
  7. s10=sin(20*pi*t); % 产生10Hz正弦波
  8. s100=sin(200*pi*t); % 产生100Hz正弦波
  9. s=s10+s100; % 信号叠加
  10. figure(1); % 画图
  11. subplot(2,1,1);plot(s);grid;
  12. title('原始信号');
  13. % 2. FFT分析信号频谱
  14. len = 512;
  15. y=fft(s,len);  % 对信号做len点FFT变换
  16. f=Fs*(0:len/2 - 1)/len;
  17. subplot(2,1,2);plot(f,abs(y(1:len/2)));grid;
  18. title('原始信号频谱')
  19. xlabel('Hz');ylabel('幅值');
  20. % 3. IIR滤波器设计
  21. N=0; % 阶数
  22. Fp=50; % 通带截止频率50Hz
  23. Fc=100; % 阻带截止频率100Hz
  24. Rp=1; % 通带波纹最大衰减为1dB
  25. Rs=60; % 阻带衰减为60dB
  26. % 3.0 计算最小滤波器阶数
  27. na=sqrt(10^(0.1*Rp)-1);
  28. ea=sqrt(10^(0.1*Rs)-1);
  29. N=ceil(log10(ea/na)/log10(Fc/Fp));
  30. % 3.1 巴特沃斯滤波器
  31. Wn=Fp*2/Fs;
  32. [Bb Ba]=butter(N,Wn,'low'); % 调用MATLAB butter函数快速设计滤波器
  33. [BH,BW]=freqz(Bb,Ba); % 绘制频率响应曲线
  34. Bf=filter(Bb,Ba,s); % 进行低通滤波
  35. By=fft(Bf,len);  % 对信号f1做len点FFT变换
  36. figure(2); % 画图
  37. subplot(2,1,1);plot(t,s10,'blue',t,Bf,'red');grid;
  38. legend('10Hz原始信号','巴特沃斯滤波器滤波后');
  39. subplot(2,1,2);plot(f,abs(By(1:len/2)));grid;
  40. title('巴特沃斯低通滤波后信号频谱');
  41. xlabel('Hz');ylabel('幅值');
  42. % 3.2 切比雪夫I型滤波器
  43. [C1b C1a]=cheby1(N,Rp,Wn,'low'); % 调用MATLAB cheby1函数快速设计低通滤波器
  44. [C1H,C1W]=freqz(C1b,C1a); % 绘制频率响应曲线
  45. C1f=filter(C1b,C1a,s); % 进行低通滤波
  46. C1y=fft(C1f,len);  % 对滤波后信号做len点FFT变换
  47. figure(3); % 画图
  48. subplot(2,1,1);plot(t,s10,'blue',t,C1f,'red');grid;
  49. legend('10Hz原始信号','切比雪夫I型滤波器滤波后');
  50. subplot(2,1,2);plot(f,abs(C1y(1:len/2)));grid;
  51. title('切比雪夫I型滤波后信号频谱');
  52. xlabel('Hz');ylabel('幅值');
  53. % 3.3 切比雪夫II型滤波器
  54. [C2b C2a]=cheby2(N,Rs,Wn,'low'); % 调用MATLAB cheby2函数快速设计低通滤波器
  55. [C2H,C2W]=freqz(C2b,C2a); % 绘制频率响应曲线
  56. C2f=filter(C2b,C2a,s); % 进行低通滤波
  57. C2y=fft(C2f,len);  % 对滤波后信号做len点FFT变换
  58. figure(4); % 画图
  59. subplot(2,1,1);plot(t,s10,'blue',t,C2f,'red');grid;
  60. legend('10Hz原始信号','切比雪夫II型滤波器滤波后');
  61. subplot(2,1,2);plot(f,abs(C2y(1:len/2)));grid;
  62. title('切比雪夫II型滤波后信号频谱');
  63. xlabel('Hz');ylabel('幅值');
  64. % 3.4 椭圆滤波器
  65. [Eb Ea]=ellip(N,Rp,Rs,Wn,'low'); % 调用MATLAB ellip函数快速设计低通滤波器
  66. [EH,EW]=freqz(Eb,Ea); % 绘制频率响应曲线
  67. Ef=filter(Eb,Ea,s); % 进行低通滤波
  68. Ey=fft(Ef,len);  % 对滤波后信号做len点FFT变换
  69. figure(5); % 画图
  70. subplot(2,1,1);plot(t,s10,'blue',t,Ef,'red');grid;
  71. legend('10Hz原始信号','椭圆滤波器滤波后');
  72. subplot(2,1,2);plot(f,abs(Ey(1:len/2)));grid;
  73. title('椭圆滤波后信号频谱');
  74. xlabel('Hz');ylabel('幅值');
  75. % 3.5 yulewalk滤波器
  76. fyule=[0 Wn Fc*2/Fs 1]; % 在此进行的是简单设计,实际需要多次仿真取最佳值
  77. myule=[1 1 0 0]; % 在此进行的是简单设计,实际需要多次仿真取最佳值
  78. [Yb Ya]=yulewalk(N,fyule,myule); % 调用MATLAB yulewalk函数快速设计低通滤波器
  79. [YH,YW]=freqz(Yb,Ya); % 绘制频率响应曲线
  80. Yf=filter(Yb,Ya,s); % 进行低通滤波
  81. Yy=fft(Yf,len);  % 对滤波后信号做len点FFT变换
  82. figure(6); % 画图
  83. subplot(2,1,1);plot(t,s10,'blue',t,Yf,'red');grid;
  84. legend('10Hz原始信号','yulewalk滤波器滤波后');
  85. subplot(2,1,2);plot(f,abs(Yy(1:len/2)));grid;
  86. title('yulewalk滤波后信号频谱');
  87. xlabel('Hz');ylabel('幅值');
  88. % 4. 各个滤波器的幅频响应对比分析
  89. A1 = BW*Fs/(2*pi);
  90. A2 = C1W*Fs/(2*pi);
  91. A3 = C2W*Fs/(2*pi);
  92. A4 = EW*Fs/(2*pi);
  93. A5 = YW*Fs/(2*pi);
  94. figure(7); % 画图
  95. subplot(1,1,1);plot(A1,abs(BH),A2,abs(C1H),A3,abs(C2H),A4,abs(EH),A5,abs(YH));grid;
  96. xlabel('频率/Hz');
  97. ylabel('频率响应幅度');
  98. legend('butter','cheby1','cheby2','ellip','yulewalk');
效果图

转载请注明文章来源 – http://blog.csdn.net/v_hyx ,请勿用于任何商业用途

参考资料:
1.  http://www.cnblogs.com/sunev/archive/2011/11/23/2260579.html 基于Matlab的FIR滤波器设计与实现
2.  http://blog.csdn.net/thnh169/article/details/9034483  [数字信号处理]IIR滤波器基础
3.  http://blog.csdn.net/thnh169/article/details/9069475  [数字信号处理]IIR滤波器的间接设计(C代码)
4.  http://blog.csdn.net/thnh169/article/details/9076283  [数字信号处理]IIR滤波器的直接设计(C代码)

IIR滤波器设计(调用MATLAB IIR函数来实现)相关推荐

  1. 数字信号处理6:IIR滤波器设计

    IIR滤波器设计 文章目录 IIR滤波器设计 1. 简介 2. 设计步骤简明 3. 拉普拉斯变换和Z变换 3.1 拉普拉斯变换 3.2 Z变换 4. 双线性变换法 4.1 模拟域与数字域的映射 4.2 ...

  2. 基于MATLAB的IIR滤波器设计与实现

    基于MATLAB的IIR滤波器设计与实现 IIR滤波器的设计主要有经典设计法.直接设计法和最大平滑滤波器设计法三种方法. 1.经典设计法是基于模拟滤波器的变换原理,首先根据滤波器的技术指标设计出相应的 ...

  3. 【老生谈算法】matlab实现IIR滤波器算法源码——IIR滤波器算法

    matlab的IIR滤波器的实现算法详解 1.文档下载: 本算法已经整理成文档如下,有需要的朋友可以点击进行下载 序号 文档(点击下载) 本项目文档 [老生谈算法]matlabIIR滤波器设计.doc ...

  4. scipy Matlab-style IIR 滤波器设计上(Butterworth\Chebyshev type I \Chebyshev type II )

    scipy Matlab-style IIR 滤波器设计上(Butterworth\Chebyshev type I \Chebyshev type II ) 各种滤波接口 滤波器接口 含义 butt ...

  5. iir数字滤波器设计及matlab实现,iir数字滤波器设计及其matlab实现

    iir数字滤波器设计及其matlab实现 1IIR 数字滤波器设计及其 MATLAB 实现自动化学院 杨梅 201422070125摘 要IIR 数 字 滤 波 器 在 设 计 上 可 以 借 助 成 ...

  6. 基于FPGA的IIR滤波器设计

    基于FPGA的IIR滤波器设计,使用VHDL语言. 本设计是毕设,包括论文 下面是论文目录截图: 各模块VHDL程序 时序控制模块程序 library ieee; use ieee.std_logic ...

  7. 【音频处理】IIR滤波器设计(一)Biquad 滤波器

    系列文章目录 [音频处理]如何"认识"一个滤波器? [音频处理]IIR滤波器设计(一)Biquad 滤波器 [音频处理]IIR滤波器设计(二)模拟到数字 前言 在开始学习 IIR ...

  8. 自适应滤波器设计及matlab实现,自适应滤波器设计及Matlab实现附程序代码

    自适应滤波器设计及Matlab实现附程序代码 维纳自适应滤波器设计及 Matlab 实现摘 要本文从随机噪声的特性出发,分析了传统滤波和自适应滤波基本工作原理和性能,以及滤波技术的现状和发展前景.然后 ...

  9. matlab滤波器 代码,自适应滤波器设计及Matlab实现附程序代码整理版.doc

    自适应滤波器设计及Matlab实现附程序代码整理版.doc 维纳自适应?滤波器设计?及Matl?ab实现 摘 要 本文从随机?噪声的特性?出发,分析了传统?滤波和自适?应滤波基本?工作原理和?性能,以 ...

最新文章

  1. 上热搜了!“学了Python6个月,竟然找不到工作!”
  2. Centos7上安装oracle11g/12c的安装教程推荐及注意事项
  3. 扩展欧几里得算法之双六问题
  4. Linux 源代码在线(http://lxr.linux.no/linux/)。
  5. cool venn diagram
  6. python自动答题软件_广东开放大学(广开)线上作业自动答题python-selenium
  7. 调色板栅格数据使用GDAL时注意
  8. pyqt5的runJavaScript 使用模板
  9. PicoDet论文译读笔记
  10. Redis百万级别数据迁移
  11. 量子纠缠2——CHSH不等式
  12. 苹果MacBook Pro笔记本使用U盘重装win10系统教程
  13. 国内Linux各版本占有率,Linux市场占有率知多少?
  14. 轻量化神经网络专题文献综述
  15. Node.js Cannot find module 'xxx' 问题解决
  16. 52.一文带你理解ARM程序的编译及执行过程
  17. 计算机随机数游戏抽卡,游戏抽卡概率设计:10连抽保底的概率模型
  18. matlab在数字传输系统,数字基带传输系统matlab仿真.doc
  19. 视频编码指标中的BD-BR/BD-rate和BD-PSNR的说明和计算(ExcelMatlab)
  20. 【2023】Eclipse 安装教程

热门文章

  1. laravel8.5的PHPUnit命令行解释(有时间翻译)
  2. ReactNative_Simulator com+r不能刷新模拟器
  3. YUV420格式视频下载
  4. 看完3d打印机类型及优缺点,再决定选哪款stratasys3D打印机
  5. Android仿百度贴吧客户端Loading小球
  6. 第4章第23节:异形图表:使用三角柱形图制作水果产量比例图 [PowerPoint精美幻灯片实战教程]
  7. 淘宝直通车钻展怎么做?大神导航,一个神奇的网站,从此开启大神之路!
  8. 解决系统提示msvcr71.dll文件丢失的错误
  9. 能发出外链的论坛从哪里来?
  10. ERROR 2002 (HY000): Can’t connect to local MySQL server through socket 解决办法