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

FIR数字滤波器C语言

目录(?)[-] 单位冲击响应与频响窗函数实现的FIR滤波器代码C语言频响的问题实际的滤波效果 1.单位冲击响应与频响         就如同之前所说的一样,使用下图所示的单位冲...

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

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

IIR数字滤波器C语言

IIR滤波器C语言数字信号处理滤波器设计 目录(?)[-] 模拟滤波器的设计 巴特沃斯滤波器的次数巴特沃斯滤波器的传递函数巴特沃斯滤波器的实现C语言 双1次z变换 双1次z变换的原理双1次z变...

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

一阶RC低通滤波从模拟到数字 本文整理自网络、《匠人手记》等书籍文章 模拟电路低通滤波时域、频域 软件低通滤波 典型电路 图1 典型RC电路 直流、交流、脉冲信号都可以用它时域电容电流: Ic...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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