二阶低通巴特沃斯滤波系数(工程实现) 概述 工程常用滤波器通常为一阶或二阶,常用的滤波RC滤波,或均值滤波等。巴特沃斯滤波器因为其固有的特性经常用于信号提取,常用工控、图像和通信。 巴特沃斯滤波器的特点是通频带内的频率响应曲线最大限度平坦,没有起伏,而在阻频带则逐渐下降为零。 Matlab 设计滤波器 一阶巴特沃斯滤波设计 第一步:其参数A和B的求取可以通过Matlab的滤波器工具箱。 步骤:打开Matlab软件,依次Start(在Matlab界面的左下角)->Toolboxes->Filter Design->Filter Design & Analysis Tool (fdatool),打开的界面如下:(老版本英文版本)
使用2021b 版本,则主界面/APP/滤波器设计工具
可以针对自己想要的滤波器,这里都可以进行设置,得到相应的参数,假定需要一阶巴特沃斯低通滤波器,采样频率:250Hz,截止频率5Hz,设置如下:
老版本matlab的系数 然后,点Design Filter即可,接着在菜单栏Analysis->Filter Coefficients,可以看到分母A和分子B相应的
下面利用2021b matlab 版本得到的系数
未转换单节前
转换为单节后 其中,Numerator,分子,也就是传递函数中的b项们,从上到下依次为b0、b1、b2。 Denominator,分母,也就是传递函数中的a项,从上到下依次为a0、a1、a2,其中a0总是为1。 第二步:参数得到,代入公式即可了。 差分方程公式为:
c 语言代码: float LOW_PASS_FILTER1ORDER(float curr_input) { static float input[2]; static float output[2]; /*最新输入*/ input[1] = curr_input; /* Butterworth */ output[1] =B[0] * input[1] +B[1] * input[0] – A[1] * output[0]; /* 输入序列保存 */ input[0] = input[1]; /*输出序列保存 */ output[0] = output[1]; return output[1]; } 二阶巴特沃斯低通滤波器设计
第一步:二阶的话,其用Matlab参数和c语言代码得到参数都可以,Matlab参数跟上述类似,如下图所示: 第一步设置FS和FC并生成滤波器:
生成滤波器后,电机左上角的[b,a]选项模块
第三步,edit->convert to single section 获得bk和ak
最后:
图1 老版本二阶低通滤波器系数 其中,Numerator,分子,也就是传递函数中的b项们,从上到下依次为b0、b1、b2。Denominator,分母,也就是传递函数中的a项,从上到下依次为a0、a1、a2,其中a0总是为1。 用2021b matlab 生产滤波器系数
图2 2021bmatlab 二阶巴特沃斯低通滤波器系数 计算法二阶低通巴特沃斯滤波的系数 除了上述方法,现在使用c语言代码得到分子B和分母A的参数。 设置采样频率为fs,截止频率为fc,则: 采样频率与截止频率: fr=fs/fc —————(1) ohm=tan(pi/fr)(pi=3.)————-(2) c=1+2cos(pi/4) * ohm+ohm^2 —————(3) 系数: b0=ohm^2/c —————(4); b1=2*b0 ——————-(5); b2=b0 ———————(6); a0=1 ———————(7); ———–固定为1; a1= 2*(ohm^2-1)/c ————(8); a2=[1-2cos(pi/4) *ohm+ohm^2]/c ———–(9) 其公式的代码展示为: / 通过此函数可以得到二阶巴特沃斯的系数 / void Lowpassfilter2orderSetCutoffFreq(float sample_freq, float cutoff_freq) { float fr =0; float ohm =0; float c =0; fr= sample_freq/cutoff_freq; ohm=tanf(M_PI_F/fr); —–/// 公式(2) 3.14/fr , 注意计算的角度单位是弧度还是度 ————-ohm=tanf(pi/4)=1; c=1.0f+2.0f*cosf(M_PI_F/4.0f)ohm + ohmohm; —-///c=1.0+2.0*cos(45°)*ohm+ohm*ohm // _cutoff_freq1 = cutoff_freq; // if (_cutoff_freq1 > 0.0f) // { b_acc[0] = ohm*ohm/c; ——分子系数b0 b_acc[1] = 2.0f*b_acc[0]; ——分子系数b1 b_acc[2] = b_acc[0]; ——分子系数b2 a_acc[1] = 2.0f*(ohm*ohm-1.0f)/c; —-分目系数a1 a_acc[2] = (1.0f-2.0f*cosf(M_PI_F/4.0f)*ohm+ohm*ohm)/c; —-分目系数 a2 //} } 第二步:代入公式 一个二阶结构是这样的一个表达式:
这个表达式中需要过去的4个历史值: Xt-1,Xt-2,Yt-1,Yt-2 二阶的意思就是:输入和输出项最多用到过去两个阶段的历史值,要用static来描述过去的变量和过去的过去的变量。 C代码的实现如下(已验证,得到了实现): —————————-二阶巴特沃斯低通滤波器实现代码开始—————————————– float LowPassfilter2order(float curr_input) { static float input[3]; static float output[3]; /*最新输入*/ input[2] = curr_input; /* Butterworth */ output[2] =B[0] * input[2] +B[1] * input[1] +B[2] * input[0] – A[1] * output[1] – A[2] * output[0]; /* 输入序列保存 */ input[0] = input[1]; input[1] = input[2]; /*输出序列保存 */ output[0] = output[1]; output[1] = output[2]; return output[2]; } —————————-二阶巴特沃斯低通滤波器实现代码开结束—————————————– 有一个简单的技巧,可以把上面的计算简化,使得历史状态由4减为2,定义下面的表达式:
那么代码就可以写为: / 二阶巴特沃斯低通滤波函数 */ static float _delay_element_11; // buffered sample -1 static float _delay_element_21; // buffered sample -2 float LowPassfilter2order(float sample) { float delay_element_0 = 0, output=0; delay_element_0 = sample – _delay_element_11 * a_acc[1] – _delay_element_21 * a_acc[2]; if (isnan(delay_element_0) || isinf(delay_element_0)) { // don’t allow bad values to propogate via the filter delay_element_0 = sample; } output = delay_element_0 * b_acc[0] + _delay_element_11 * b_acc[1] + _delay_element_21 * b_acc[2]; _delay_element_21 = _delay_element_11; _delay_element_11 = delay_element_0; // return the value. Should be no need to check limits return output; /// 返回输出值 // } } /// 函数结束 IIR滤波器的差分方程
上述二阶低通巴特沃斯滤波器差分方程的来源:
上面的方程是通过IIR差分方程的直接型得出的。 具体的解释为: 首先,当一个系统的输入为冲激函数时,它的输出即为冲激响应。 IIR(Infinite impulse response)&FIR(Finite impulse response) (1)IIR(无限冲激响应)型数字滤波器 顾名思义,当输入为冲激函数时,输出冲激响应h[n](由于属于数字滤波器,自变量变为n)可以无限延长。 (2)FIR(有限冲激响应)型数字滤波器 当输入为冲激函数时,输出冲激响应 h[n] 可以在有限的时间长内结束。 造成这种现象的主要原因是因为IIR型的滤波器采用了递归的结构,即结构中存在回环形成反馈支路来不断地产生输入以进行无限的输出;与之相比,FIR滤波器则实现的较为简单,它的结构中不存在反馈部分,因此它的冲激响应是有限的。 结论:所以,利用左上角的差分方程带入相应的阶数k即可得到所需要的C语言函数方程了。 文章主体来源 利用MATLAB生成软件二阶低通滤波器(绝对靠谱)_matlab二阶低通滤波器-CSDN博客 该文章方便实用,方便工程师实现数字滤波器。实现数字滤波器特别要注意系数的精度,精度越高,准确度越高。
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/63427.html