用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]...



相关文章推荐

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

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

C语言编写FIR数字低通滤波器

主要是获取滤波器参数和卷积算法,参数根据自己的滤波器特性用matlab上面的一个fdatool工具配置生成,然后将这些参数写入程序里面即可(参数可适当的乘以一个系数,对滤波没任何影响),我这里Fs =...

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

1. 一阶滤波算法的原理  一阶滤波,又叫一阶惯性滤波,或一阶低通滤波。是使用软件编程实现普通硬件RC低通滤波器的功能。  一阶低通滤波的算法公式为:                      ...

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

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

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

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

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

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

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

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

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

基于matlab的心电信号预处理

这是前段时间做的一个课程设计,做的比较简单,没有考虑到太细,只是初步地达到了想要的效果。这次设计主要是对心电信号进行预处理,将其信号中包含的一些干扰滤除或者抑制掉。 一、心电信号 (1)心电信号的特性...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用Matlab及C语言实现低通滤波器的设计
举报原因:
原因补充:

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