用Matlab及C语言实现低通滤波器的设计

原创 2013年12月05日 17:52:25

已知:

低通滤波器的截止频率 fl = 35Hz;即:通带边缘为35Hz,设定通带纹波1db;

采样频率 fs = 400Hz;

设定阻带边缘为 44Hz,衰减为40DB;

Matlab编程

% 35Hz低通滤波器
Fsam = 400; %采样频率
fp = 31; %通带边缘
Rp = 1; %通带纹波
fs = 44; %阻带边缘
As = 15; %阻带衰减
wp = 2*fp/Fsam; %对奈奎斯特频率(fsam/2)归一化 
ws = 2*fs/Fsam; %对奈奎斯特频率(fsam/2)归一化
[n,Wn]= buttord(wp,ws,Rp,As);
[b,a] = butter(n,Wn)
n   %输出滤波器的阶数
Wn = Wn*Fsam/2 %将归一化的截止频率还原,单位为Hz;
[X,w] = freqz(b,a,512,Fsam); %求取系统频率响应
plot(w,abs(X)); %画解卷绕后的幅频响应
title('Butterworth Lowpass Filter');ylabel('幅度');xlabel('频率(Hz)');


这个滤波器的阶数为n =  7;  实际截止频率 = Wn*Fsam/2 = 34.9915Hz

注意:用matlab运算结果得到的Wn,这个值就像wp,ws一样,是归一化后的值;实际值要乘以奈奎斯特频率Fsam/2(200Hz);

b =
    0.0000    0.0003    0.0008    0.0014    0.0014    0.0008    0.0003    0.0000
a =
    1.0000   -4.5340    9.1151  -10.4545    7.3548   -3.1636    0.7685   -0.0812
n =     7
Wn =   34.9915

C语言实现:

/************************* IIR Lowpass Filter **********************************/
//N = 8; -3.13db@35MHz;-22.5db@50Hz; Rp<1db;
float b[8] = {0.0000,0.0003,0.0008,0.0014,0.0014,0.0008,0.0003,0.0000};
float a[8] = {1.0000,-4.5340,9.1151,-10.4545,7.3548,-3.1636,0.7685,-0.0812};
/*******************************************************************************/
float xBuf1[8];
float yBuf1[8];
float IIR35HzLP(float x)
{
int i;
//运算之前Buf向前移动一个位置,以保存之前Buf的数据;
for(i=7; i>0; i--)
{
yBuf1[i] = yBuf1[i-1]; xBuf1[i] = xBuf1[i-1];
}
xBuf1[0] = x;
yBuf1[0] = 0;
for(i=1;i<8;i++)
{
yBuf1[0] = yBuf1[0] + b[i]*xBuf1[i];//这里有相同系数,可合并来提前计算效率;
yBuf1[0] = yBuf1[0] - a[i]*yBuf1[i];
}
yBuf1[0] =  yBuf1[0] + b[0]*xBuf1[0];
return yBuf1[0];
}

函数说明:

进一个x,出一个y;
x对应差分方程的x(n),在函数中的位置为xBuf[0];n为当前最大下标;
x(n-1)对应xBuf[1]...
yBuf[0]对应y(n),
y(n-1)对应yBuf[1]...



一个设计低通巴特沃斯数字滤波器的实例

本人本科渣渣一个,前两天导师让我设计一个数字滤波器。由于本人基本没有数字信号处理基础,于是只能依靠百度和matlab,折腾了半天总算是摸索明白了。百度上有一些文章不靠谱,很容易误导别人,故在此发一篇博...
  • lingsuifenfei123
  • lingsuifenfei123
  • 2016年10月08日 21:50
  • 6832

巴特沃斯滤波器C语言实现代码

  • 2013年07月09日 23:37
  • 16KB
  • 下载

简单常用滤波算法C语言实现

1.限幅滤波算法(程序判断滤波算法) 方法解析: 根据经验判断,确定两次采样允许的最大偏差值(设定为A),每次检测到新值时判断: 如果本次值与上次值之差 如果本次值与上次值只差>A,则本次值无效,放弃...
  • xiao2yizhizai
  • xiao2yizhizai
  • 2016年03月31日 15:08
  • 17495

巴特沃斯低通滤波器设计(c语言)

  • 2016年03月09日 14:35
  • 172KB
  • 下载

数字信号处理公式变程序(四)——巴特沃斯滤波器(中)

上一篇写了巴特沃斯滤波器设计的所有理论知识,这篇文章就着手编程吧~ 注:我比较喜欢使用matlab(也喜欢自己修改matlab的源码做测试,所以重装了好几次了,囧。。。),有部分参考matlab的算...
  • shengzhadon
  • shengzhadon
  • 2015年07月07日 17:15
  • 5787

巴特沃斯低通滤波器的c语言实现

  • 2014年11月02日 10:23
  • 368KB
  • 下载

算法学习笔记之一阶低通滤波算法

1. 一阶滤波算法的原理  一阶滤波,又叫一阶惯性滤波,或一阶低通滤波。是使用软件编程实现普通硬件RC低通滤波器的功能。  一阶低通滤波的算法公式为:                      ...
  • sinat_23338865
  • sinat_23338865
  • 2016年09月27日 11:29
  • 25677

单片机中(C语言)IIR滤波器的实现

IIR是无限长单位脉冲响应数字滤波器,其系统对应函数有如下形式: 在知道滤波器相应的系数b[],a[]后可根据相应的差分方程,完成对数据的滤波,而滤波器的系数可以通过Matlab滤波器设计和分析...
  • qq_21905401
  • qq_21905401
  • 2016年12月27日 12:51
  • 2202

【滤波器学习笔记】一阶RC低通滤波

一阶RC低通滤波从模拟到数字 本文整理自网络、《匠人手记》等书籍文章 模拟电路低通滤波时域、频域 软件低通滤波 典型电路 图1 典型RC电路 直流、交流、脉冲信号都可以用它时域电容电流: Ic...
  • qq_27334499
  • qq_27334499
  • 2016年08月11日 20:38
  • 37008

C语言实现低通滤波

  • 2015年02月09日 11:26
  • 44KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用Matlab及C语言实现低通滤波器的设计
举报原因:
原因补充:

(最多只允许输入30个字)